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