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