Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
micropatch.c
Go to the documentation of this file.
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/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  * I2C/SPI relocation patch arrays.
25  */
26 
27 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
28 
29 static 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 
148 static 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  * I2C/SPI/SMC1 relocation patch arrays.
183  */
184 
185 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
186 
187 static 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 
510 static 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 
577 static 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  * USB SOF patch arrays.
599  */
600 
601 #ifdef CONFIG_USB_SOF_UCODE_PATCH
602 
603 static 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 
618 static uint patch_2f00[] __initdata = {
619  0x3030304c,
620  0xcab9e441,
621  0xa1aaf220
622 };
623 #endif
624 
625 void __init cpm_load_patch(cpm8xx_t *cp)
626 {
627  volatile uint *dp; /* Dual-ported RAM. */
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 /* CONFIG_USB_SOF_UCODE_PATCH */
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  /* Put SPI above the IIC, also 32-byte aligned.
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 /* CONFIG_I2C_SPI_UCODE_PATCH */
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 /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
707 
708 #endif /* some variation of the I2C/SPI patch was selected */
709 }
710 
711 /*
712  * Take this entire routine out, since no one calls it and its
713  * logic is suspect.
714  */
715 
716 #if 0
717 void
718 verify_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