Linux-2.6.12-rc2
[pandora-kernel.git] / arch / ppc / 8xx_io / micropatch.c
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/config.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/commproc.h>
21
22 /*
23  * I2C/SPI relocation patch arrays.
24  */
25
26 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
27
28 uint patch_2000[] = {
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 uint patch_2f00[] = {
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 uint patch_2000[] = {
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 uint patch_2f00[] = {
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 uint patch_2e00[] = {
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 uint patch_2000[] = {
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 uint patch_2f00[] = {
618         0x3030304c,
619         0xcab9e441,
620         0xa1aaf220
621 };
622 #endif
623
624 void
625 cpm_load_patch(volatile immap_t *immr)
626 {
627         volatile uint           *dp;            /* Dual-ported RAM. */
628         volatile cpm8xx_t       *commproc;
629         volatile iic_t          *iip;
630         volatile spi_t          *spp;
631         volatile smc_uart_t     *smp;
632         int     i;
633
634         commproc = (cpm8xx_t *)&immr->im_cpm;
635
636 #ifdef CONFIG_USB_SOF_UCODE_PATCH
637         commproc->cp_rccr = 0;
638
639         dp = (uint *)(commproc->cp_dpmem);
640         for (i=0; i<(sizeof(patch_2000)/4); i++)
641                 *dp++ = patch_2000[i];
642
643         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
644         for (i=0; i<(sizeof(patch_2f00)/4); i++)
645                 *dp++ = patch_2f00[i];
646
647         commproc->cp_rccr = 0x0009;
648
649         printk("USB SOF microcode patch installed\n");
650 #endif /* CONFIG_USB_SOF_UCODE_PATCH */
651
652 #if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
653     defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
654
655         commproc->cp_rccr = 0;
656
657         dp = (uint *)(commproc->cp_dpmem);
658         for (i=0; i<(sizeof(patch_2000)/4); i++)
659                 *dp++ = patch_2000[i];
660
661         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
662         for (i=0; i<(sizeof(patch_2f00)/4); i++)
663                 *dp++ = patch_2f00[i];
664
665         iip = (iic_t *)&commproc->cp_dparam[PROFF_IIC];
666 # define RPBASE 0x0500
667         iip->iic_rpbase = RPBASE;
668
669         /* Put SPI above the IIC, also 32-byte aligned.
670         */
671         i = (RPBASE + sizeof(iic_t) + 31) & ~31;
672         spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI];
673         spp->spi_rpbase = i;
674
675 # if defined(CONFIG_I2C_SPI_UCODE_PATCH)
676         commproc->cp_cpmcr1 = 0x802a;
677         commproc->cp_cpmcr2 = 0x8028;
678         commproc->cp_cpmcr3 = 0x802e;
679         commproc->cp_cpmcr4 = 0x802c;
680         commproc->cp_rccr = 1;
681
682         printk("I2C/SPI microcode patch installed.\n");
683 # endif /* CONFIG_I2C_SPI_UCODE_PATCH */
684
685 # if defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
686
687         dp = (uint *)&(commproc->cp_dpmem[0x0e00]);
688         for (i=0; i<(sizeof(patch_2e00)/4); i++)
689                 *dp++ = patch_2e00[i];
690
691         commproc->cp_cpmcr1 = 0x8080;
692         commproc->cp_cpmcr2 = 0x808a;
693         commproc->cp_cpmcr3 = 0x8028;
694         commproc->cp_cpmcr4 = 0x802a;
695         commproc->cp_rccr = 3;
696
697         smp = (smc_uart_t *)&commproc->cp_dparam[PROFF_SMC1];
698         smp->smc_rpbase = 0x1FC0;
699
700         printk("I2C/SPI/SMC1 microcode patch installed.\n");
701 # endif /* CONFIG_I2C_SPI_SMC1_UCODE_PATCH) */
702
703 #endif /* some variation of the I2C/SPI patch was selected */
704 }
705
706 /*
707  *  Take this entire routine out, since no one calls it and its 
708  * logic is suspect.
709  */
710
711 #if 0
712 void
713 verify_patch(volatile immap_t *immr)
714 {
715         volatile uint           *dp;
716         volatile cpm8xx_t       *commproc;
717         int i;
718
719         commproc = (cpm8xx_t *)&immr->im_cpm;
720
721         printk("cp_rccr %x\n", commproc->cp_rccr);
722         commproc->cp_rccr = 0;
723
724         dp = (uint *)(commproc->cp_dpmem);
725         for (i=0; i<(sizeof(patch_2000)/4); i++)
726                 if (*dp++ != patch_2000[i]) {
727                         printk("patch_2000 bad at %d\n", i);
728                         dp--;
729                         printk("found 0x%X, wanted 0x%X\n", *dp, patch_2000[i]);
730                         break;
731                 }
732
733         dp = (uint *)&(commproc->cp_dpmem[0x0f00]);
734         for (i=0; i<(sizeof(patch_2f00)/4); i++)
735                 if (*dp++ != patch_2f00[i]) {
736                         printk("patch_2f00 bad at %d\n", i);
737                         dp--;
738                         printk("found 0x%X, wanted 0x%X\n", *dp, patch_2f00[i]);
739                         break;
740                 }
741
742         commproc->cp_rccr = 0x0009;
743 }
744 #endif