1
2
3
4
5
6
7#include <linux/init.h>
8#include <linux/errno.h>
9#include <linux/sched.h>
10#include <linux/kernel.h>
11#include <linux/param.h>
12#include <linux/string.h>
13#include <linux/mm.h>
14#include <linux/interrupt.h>
15#include <asm/irq.h>
16#include <asm/mpc8xx.h>
17#include <asm/page.h>
18#include <asm/pgtable.h>
19#include <asm/8xx_immap.h>
20#include <asm/cpm.h>
21#include <asm/cpm1.h>
22
23
24
25
26
27#ifdef CONFIG_I2C_SPI_UCODE_PATCH
28
29static uint patch_2000[] __initdata = {
30 0x7FFFEFD9,
31 0x3FFD0000,
32 0x7FFB49F7,
33 0x7FF90000,
34 0x5FEFADF7,
35 0x5F89ADF7,
36 0x5FEFAFF7,
37 0x5F89AFF7,
38 0x3A9CFBC8,
39 0xE7C0EDF0,
40 0x77C1E1BB,
41 0xF4DC7F1D,
42 0xABAD932F,
43 0x4E08FDCF,
44 0x6E0FAFF8,
45 0x7CCF76CF,
46 0xFD1FF9CF,
47 0xABF88DC6,
48 0xAB5679F7,
49 0xB0937383,
50 0xDFCE79F7,
51 0xB091E6BB,
52 0xE5BBE74F,
53 0xB3FA6F0F,
54 0x6FFB76CE,
55 0xEE0DF9CF,
56 0x2BFBEFEF,
57 0xCFEEF9CF,
58 0x76CEAD24,
59 0x90B2DF9A,
60 0x7FDDD0BF,
61 0x4BF847FD,
62 0x7CCF76CE,
63 0xCFEF7E1F,
64 0x7F1D7DFD,
65 0xF0B6EF71,
66 0x7FC177C1,
67 0xFBC86079,
68 0xE722FBC8,
69 0x5FFFDFFF,
70 0x5FB2FFFB,
71 0xFBC8F3C8,
72 0x94A67F01,
73 0x7F1D5F39,
74 0xAFE85F5E,
75 0xFFDFDF96,
76 0xCB9FAF7D,
77 0x5FC1AFED,
78 0x8C1C5FC1,
79 0xAFDD5FC3,
80 0xDF9A7EFD,
81 0xB0B25FB2,
82 0xFFFEABAD,
83 0x5FB2FFFE,
84 0x5FCE600B,
85 0xE6BB600B,
86 0x5FCEDFC6,
87 0x27FBEFDF,
88 0x5FC8CFDE,
89 0x3A9CE7C0,
90 0xEDF0F3C8,
91 0x7F0154CD,
92 0x7F1D2D3D,
93 0x363A7570,
94 0x7E0AF1CE,
95 0x37EF2E68,
96 0x7FEE10EC,
97 0xADF8EFDE,
98 0xCFEAE52F,
99 0x7D0FE12B,
100 0xF1CE5F65,
101 0x7E0A4DF8,
102 0xCFEA5F72,
103 0x7D0BEFEE,
104 0xCFEA5F74,
105 0xE522EFDE,
106 0x5F74CFDA,
107 0x0B627385,
108 0xDF627E0A,
109 0x30D8145B,
110 0xBFFFF3C8,
111 0x5FFFDFFF,
112 0xA7F85F5E,
113 0xBFFE7F7D,
114 0x10D31450,
115 0x5F36BFFF,
116 0xAF785F5E,
117 0xBFFDA7F8,
118 0x5F36BFFE,
119 0x77FD30C0,
120 0x4E08FDCF,
121 0xE5FF6E0F,
122 0xAFF87E1F,
123 0x7E0FFD1F,
124 0xF1CF5F1B,
125 0xABF80D5E,
126 0x5F5EFFEF,
127 0x79F730A2,
128 0xAFDD5F34,
129 0x47F85F34,
130 0xAFED7FDD,
131 0x50B24978,
132 0x47FD7F1D,
133 0x7DFD70AD,
134 0xEF717EC1,
135 0x6BA47F01,
136 0x2D267EFD,
137 0x30DE5F5E,
138 0xFFFD5F5E,
139 0xFFEF5F5E,
140 0xFFDF0CA0,
141 0xAFED0A9E,
142 0xAFDD0C3A,
143 0x5F3AAFBD,
144 0x7FBDB082,
145 0x5F8247F8
146};
147
148static uint patch_2f00[] __initdata = {
149 0x3E303430,
150 0x34343737,
151 0xABF7BF9B,
152 0x994B4FBD,
153 0xBD599493,
154 0x349FFF37,
155 0xFB9B177D,
156 0xD9936956,
157 0xBBFDD697,
158 0xBDD2FD11,
159 0x31DB9BB3,
160 0x63139637,
161 0x93733693,
162 0x193137F7,
163 0x331737AF,
164 0x7BB9B999,
165 0xBB197957,
166 0x7FDFD3D5,
167 0x73B773F7,
168 0x37933B99,
169 0x1D115316,
170 0x99315315,
171 0x31694BF4,
172 0xFBDBD359,
173 0x31497353,
174 0x76956D69,
175 0x7B9D9693,
176 0x13131979,
177 0x79376935
178};
179#endif
180
181
182
183
184
185#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
186
187static uint patch_2000[] __initdata = {
188 0x3fff0000,
189 0x3ffd0000,
190 0x3ffb0000,
191 0x3ff90000,
192 0x5f13eff8,
193 0x5eb5eff8,
194 0x5f88adf7,
195 0x5fefadf7,
196 0x3a9cfbc8,
197 0x77cae1bb,
198 0xf4de7fad,
199 0xabae9330,
200 0x4e08fdcf,
201 0x6e0faff8,
202 0x7ccf76cf,
203 0xfdaff9cf,
204 0xabf88dc8,
205 0xab5879f7,
206 0xb0925d8d,
207 0xdfd079f7,
208 0xb090e6bb,
209 0xe5bbe74f,
210 0x9e046f0f,
211 0x6ffb76ce,
212 0xee0cf9cf,
213 0x2bfbefef,
214 0xcfeef9cf,
215 0x76cead23,
216 0x90b3df99,
217 0x7fddd0c1,
218 0x4bf847fd,
219 0x7ccf76ce,
220 0xcfef77ca,
221 0x7eaf7fad,
222 0x7dfdf0b7,
223 0xef7a7fca,
224 0x77cafbc8,
225 0x6079e722,
226 0xfbc85fff,
227 0xdfff5fb3,
228 0xfffbfbc8,
229 0xf3c894a5,
230 0xe7c9edf9,
231 0x7f9a7fad,
232 0x5f36afe8,
233 0x5f5bffdf,
234 0xdf95cb9e,
235 0xaf7d5fc3,
236 0xafed8c1b,
237 0x5fc3afdd,
238 0x5fc5df99,
239 0x7efdb0b3,
240 0x5fb3fffe,
241 0xabae5fb3,
242 0xfffe5fd0,
243 0x600be6bb,
244 0x600b5fd0,
245 0xdfc827fb,
246 0xefdf5fca,
247 0xcfde3a9c,
248 0xe7c9edf9,
249 0xf3c87f9e,
250 0x54ca7fed,
251 0x2d3a3637,
252 0x756f7e9a,
253 0xf1ce37ef,
254 0x2e677fee,
255 0x10ebadf8,
256 0xefdecfea,
257 0xe52f7d9f,
258 0xe12bf1ce,
259 0x5f647e9a,
260 0x4df8cfea,
261 0x5f717d9b,
262 0xefeecfea,
263 0x5f73e522,
264 0xefde5f73,
265 0xcfda0b61,
266 0x5d8fdf61,
267 0xe7c9edf9,
268 0x7e9a30d5,
269 0x1458bfff,
270 0xf3c85fff,
271 0xdfffa7f8,
272 0x5f5bbffe,
273 0x7f7d10d0,
274 0x144d5f33,
275 0xbfffaf78,
276 0x5f5bbffd,
277 0xa7f85f33,
278 0xbffe77fd,
279 0x30bd4e08,
280 0xfdcfe5ff,
281 0x6e0faff8,
282 0x7eef7e9f,
283 0xfdeff1cf,
284 0x5f17abf8,
285 0x0d5b5f5b,
286 0xffef79f7,
287 0x309eafdd,
288 0x5f3147f8,
289 0x5f31afed,
290 0x7fdd50af,
291 0x497847fd,
292 0x7f9e7fed,
293 0x7dfd70a9,
294 0xef7e7ece,
295 0x6ba07f9e,
296 0x2d227efd,
297 0x30db5f5b,
298 0xfffd5f5b,
299 0xffef5f5b,
300 0xffdf0c9c,
301 0xafed0a9a,
302 0xafdd0c37,
303 0x5f37afbd,
304 0x7fbdb081,
305 0x5f8147f8,
306 0x3a11e710,
307 0xedf0ccdd,
308 0xf3186d0a,
309 0x7f0e5f06,
310 0x7fedbb38,
311 0x3afe7468,
312 0x7fedf4fc,
313 0x8ffbb951,
314 0xb85f77fd,
315 0xb0df5ddd,
316 0xdefe7fed,
317 0x90e1e74d,
318 0x6f0dcbf7,
319 0xe7decfed,
320 0xcb74cfed,
321 0xcfeddf6d,
322 0x91714f74,
323 0x5dd2deef,
324 0x9e04e7df,
325 0xefbb6ffb,
326 0xe7ef7f0e,
327 0x9e097fed,
328 0xebdbeffa,
329 0xeb54affb,
330 0x7fea90d7,
331 0x7e0cf0c3,
332 0xbffff318,
333 0x5fffdfff,
334 0xac59efea,
335 0x7fce1ee5,
336 0xe2ff5ee1,
337 0xaffbe2ff,
338 0x5ee3affb,
339 0xf9cc7d0f,
340 0xaef8770f,
341 0x7d0fb0c6,
342 0xeffbbfff,
343 0xcfef5ede,
344 0x7d0fbfff,
345 0x5ede4cf8,
346 0x7fddd0bf,
347 0x49f847fd,
348 0x7efdf0bb,
349 0x7fedfffd,
350 0x7dfdf0b7,
351 0xef7e7e1e,
352 0x5ede7f0e,
353 0x3a11e710,
354 0xedf0ccab,
355 0xfb18ad2e,
356 0x1ea9bbb8,
357 0x74283b7e,
358 0x73c2e4bb,
359 0x2ada4fb8,
360 0xdc21e4bb,
361 0xb2a1ffbf,
362 0x5e2c43f8,
363 0xfc87e1bb,
364 0xe74ffd91,
365 0x6f0f4fe8,
366 0xc7ba32e2,
367 0xf396efeb,
368 0x600b4f78,
369 0xe5bb760b,
370 0x53acaef8,
371 0x4ef88b0e,
372 0xcfef9e09,
373 0xabf8751f,
374 0xefef5bac,
375 0x741f4fe8,
376 0x751e760d,
377 0x7fdbf081,
378 0x741cafce,
379 0xefcc7fce,
380 0x751e70ac,
381 0x741ce7bb,
382 0x3372cfed,
383 0xafdbefeb,
384 0xe5bb760b,
385 0x53f2aef8,
386 0xafe8e7eb,
387 0x4bf8771e,
388 0x7e247fed,
389 0x4fcbe2cc,
390 0x7fbc30a9,
391 0x7b0f7a0f,
392 0x34d577fd,
393 0x308b5db7,
394 0xde553e5f,
395 0xaf78741f,
396 0x741f30f0,
397 0xcfef5e2c,
398 0x741f3eac,
399 0xafb8771e,
400 0x5e677fed,
401 0x0bd3e2cc,
402 0x741ccfec,
403 0xe5ca53cd,
404 0x6fcb4f74,
405 0x5dadde4b,
406 0x2ab63d38,
407 0x4bb3de30,
408 0x751f741c,
409 0x6c42effa,
410 0xefea7fce,
411 0x6ffc30be,
412 0xefec3fca,
413 0x30b3de2e,
414 0xadf85d9e,
415 0xaf7daefd,
416 0x5d9ede2e,
417 0x5d9eafdd,
418 0x761f10ac,
419 0x1da07efd,
420 0x30adfffe,
421 0x4908fb18,
422 0x5fffdfff,
423 0xafbb709b,
424 0x4ef85e67,
425 0xadf814ad,
426 0x7a0f70ad,
427 0xcfef50ad,
428 0x7a0fde30,
429 0x5da0afed,
430 0x3c12780f,
431 0xefef780f,
432 0xefef790f,
433 0xa7f85e0f,
434 0xffef790f,
435 0xefef790f,
436 0x14adde2e,
437 0x5d9eadfd,
438 0x5e2dfffb,
439 0xe79addfd,
440 0xeff96079,
441 0x607ae79a,
442 0xddfceff9,
443 0x60795dff,
444 0x607acfef,
445 0xefefefdf,
446 0xefbfef7f,
447 0xeeffedff,
448 0xebffe7ff,
449 0xafefafdf,
450 0xafbfaf7f,
451 0xaeffadff,
452 0xabffa7ff,
453 0x6fef6fdf,
454 0x6fbf6f7f,
455 0x6eff6dff,
456 0x6bff67ff,
457 0x2fef2fdf,
458 0x2fbf2f7f,
459 0x2eff2dff,
460 0x2bff27ff,
461 0x4e08fd1f,
462 0xe5ff6e0f,
463 0xaff87eef,
464 0x7e0ffdef,
465 0xf11f6079,
466 0xabf8f542,
467 0x7e0af11c,
468 0x37cfae3a,
469 0x7fec90be,
470 0xadf8efdc,
471 0xcfeae52f,
472 0x7d0fe12b,
473 0xf11c6079,
474 0x7e0a4df8,
475 0xcfea5dc4,
476 0x7d0befec,
477 0xcfea5dc6,
478 0xe522efdc,
479 0x5dc6cfda,
480 0x4e08fd1f,
481 0x6e0faff8,
482 0x7c1f761f,
483 0xfdeff91f,
484 0x6079abf8,
485 0x761cee24,
486 0xf91f2bfb,
487 0xefefcfec,
488 0xf91f6079,
489 0x761c27fb,
490 0xefdf5da7,
491 0xcfdc7fdd,
492 0xd09c4bf8,
493 0x47fd7c1f,
494 0x761ccfcf,
495 0x7eef7fed,
496 0x7dfdf093,
497 0xef7e7f1e,
498 0x771efb18,
499 0x6079e722,
500 0xe6bbe5bb,
501 0xae0ae5bb,
502 0x600bae85,
503 0xe2bbe2bb,
504 0xe2bbe2bb,
505 0xaf02e2bb,
506 0xe2bb2ff9,
507 0x6079e2bb
508};
509
510static uint patch_2f00[] __initdata = {
511 0x30303030,
512 0x3e3e3434,
513 0xabbf9b99,
514 0x4b4fbdbd,
515 0x59949334,
516 0x9fff37fb,
517 0x9b177dd9,
518 0x936956bb,
519 0xfbdd697b,
520 0xdd2fd113,
521 0x1db9f7bb,
522 0x36313963,
523 0x79373369,
524 0x3193137f,
525 0x7331737a,
526 0xf7bb9b99,
527 0x9bb19795,
528 0x77fdfd3d,
529 0x573b773f,
530 0x737933f7,
531 0xb991d115,
532 0x31699315,
533 0x31531694,
534 0xbf4fbdbd,
535 0x35931497,
536 0x35376956,
537 0xbd697b9d,
538 0x96931313,
539 0x19797937,
540 0x6935af78,
541 0xb9b3baa3,
542 0xb8788683,
543 0x368f78f7,
544 0x87778733,
545 0x3ffffb3b,
546 0x8e8f78b8,
547 0x1d118e13,
548 0xf3ff3f8b,
549 0x6bd8e173,
550 0xd1366856,
551 0x68d1687b,
552 0x3daf78b8,
553 0x3a3a3f87,
554 0x8f81378f,
555 0xf876f887,
556 0x77fd8778,
557 0x737de8d6,
558 0xbbf8bfff,
559 0xd8df87f7,
560 0xfd876f7b,
561 0x8bfff8bd,
562 0x8683387d,
563 0xb873d87b,
564 0x3b8fd7f8,
565 0xf7338883,
566 0xbb8ee1f8,
567 0xef837377,
568 0x3337b836,
569 0x817d11f8,
570 0x7378b878,
571 0xd3368b7d,
572 0xed731b7d,
573 0x833731f3,
574 0xf22f3f23
575};
576
577static uint patch_2e00[] __initdata = {
578 0x27eeeeee,
579 0xeeeeeeee,
580 0xeeeeeeee,
581 0xeeeeeeee,
582 0xee4bf4fb,
583 0xdbd259bb,
584 0x1979577f,
585 0xdfd2d573,
586 0xb773f737,
587 0x4b4fbdbd,
588 0x25b9b177,
589 0xd2d17376,
590 0x956bbfdd,
591 0x697bdd2f,
592 0xff9f79ff,
593 0xff9ff22f
594};
595#endif
596
597
598
599
600
601#ifdef CONFIG_USB_SOF_UCODE_PATCH
602
603static uint patch_2000[] __initdata = {
604 0x7fff0000,
605 0x7ffd0000,
606 0x7ffb0000,
607 0x49f7ba5b,
608 0xba383ffb,
609 0xf9b8b46d,
610 0xe5ab4e07,
611 0xaf77bffe,
612 0x3f7bbf79,
613 0xba5bba38,
614 0xe7676076,
615 0x60750000
616};
617
618static uint patch_2f00[] __initdata = {
619 0x3030304c,
620 0xcab9e441,
621 0xa1aaf220
622};
623#endif
624
625void __init cpm_load_patch(cpm8xx_t *cp)
626{
627 volatile uint *dp;
628 volatile cpm8xx_t *commproc;
629#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
630 defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
631 volatile iic_t *iip;
632 volatile struct spi_pram *spp;
633#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
634 volatile smc_uart_t *smp;
635#endif
636#endif
637 int i;
638
639 commproc = cp;
640
641#ifdef CONFIG_USB_SOF_UCODE_PATCH
642 commproc->cp_rccr = 0;
643
644 dp = (uint *)(commproc->cp_dpmem);
645 for (i=0; i<(sizeof(patch_2000)/4); i++)
646 *dp++ = patch_2000[i];
647
648 dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
649 for (i=0; i<(sizeof(patch_2f00)/4); i++)
650 *dp++ = patch_2f00[i];
651
652 commproc->cp_rccr = 0x0009;
653
654 printk("USB SOF microcode patch installed\n");
655#endif
656
657#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
658 defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
659
660 commproc->cp_rccr = 0;
661
662 dp = (uint *)(commproc->cp_dpmem);
663 for (i=0; i<(sizeof(patch_2000)/4); i++)
664 *dp++ = patch_2000[i];
665
666 dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
667 for (i=0; i<(sizeof(patch_2f00)/4); i++)
668 *dp++ = patch_2f00[i];
669
670 iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
671# define RPBASE 0x0500
672 iip->iic_rpbase = RPBASE;
673
674
675
676 i = (RPBASE + sizeof(iic_t) + 31) & ~31;
677 spp = (struct spi_pram *)&commproc->cp_dparam[PROFF_SPI];
678 spp->rpbase = i;
679
680# if defined(CONFIG_I2C_SPI_UCODE_PATCH)
681 commproc->cp_cpmcr1 = 0x802a;
682 commproc->cp_cpmcr2 = 0x8028;
683 commproc->cp_cpmcr3 = 0x802e;
684 commproc->cp_cpmcr4 = 0x802c;
685 commproc->cp_rccr = 1;
686
687 printk("I2C/SPI microcode patch installed.\n");
688# endif
689
690# if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
691
692 dp = (uint *)&(commproc->cp_dpmem[0x0e00]);
693 for (i=0; i<(sizeof(patch_2e00)/4); i++)
694 *dp++ = patch_2e00[i];
695
696 commproc->cp_cpmcr1 = 0x8080;
697 commproc->cp_cpmcr2 = 0x808a;
698 commproc->cp_cpmcr3 = 0x8028;
699 commproc->cp_cpmcr4 = 0x802a;
700 commproc->cp_rccr = 3;
701
702 smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
703 smp->smc_rpbase = 0x1FC0;
704
705 printk("I2C/SPI/SMC1 microcode patch installed.\n");
706# endif
707
708#endif
709}
710
711
712
713
714
715
716#if 0
717void
718verify_patch(volatile immap_t *immr)
719{
720 volatile uint *dp;
721 volatile cpm8xx_t *commproc;
722 int i;
723
724 commproc = (cpm8xx_t *)&immr->im_cpm;
725
726 printk("cp_rccr %x\n", commproc->cp_rccr);
727 commproc->cp_rccr = 0;
728
729 dp = (uint *)(commproc->cp_dpmem);
730 for (i=0; i<(sizeof(patch_2000)/4); i++)
731 if (*dp++ != patch_2000[i]) {
732 printk("patch_2000 bad at %d\n", i);
733 dp--;
734 printk("found 0x%X, wanted 0x%X\n", *dp, patch_2000[i]);
735 break;
736 }
737
738 dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
739 for (i=0; i<(sizeof(patch_2f00)/4); i++)
740 if (*dp++ != patch_2f00[i]) {
741 printk("patch_2f00 bad at %d\n", i);
742 dp--;
743 printk("found 0x%X, wanted 0x%X\n", *dp, patch_2f00[i]);
744 break;
745 }
746
747 commproc->cp_rccr = 0x0009;
748}
749#endif
750