powerpc/8xx: drop verify_patch()
[linux-2.6-block.git] / arch / powerpc / platforms / 8xx / micropatch.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
f2a0bd37 2
4128a89a
CL
3/*
4 * Microcode patches for the CPM as supplied by Motorola.
f2a0bd37
VB
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 */
af71bcfe 9#include <linux/init.h>
f2a0bd37
VB
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>
f2a0bd37
VB
18#include <asm/page.h>
19#include <asm/pgtable.h>
20#include <asm/8xx_immap.h>
56825c88 21#include <asm/cpm.h>
b5677d84 22#include <asm/cpm1.h>
f2a0bd37
VB
23
24/*
25 * I2C/SPI relocation patch arrays.
26 */
27
28#ifdef CONFIG_I2C_SPI_UCODE_PATCH
29
af71bcfe 30static uint patch_2000[] __initdata = {
f2a0bd37
VB
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
af71bcfe 149static uint patch_2f00[] __initdata = {
f2a0bd37
VB
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
af71bcfe 188static uint patch_2000[] __initdata = {
f2a0bd37
VB
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
af71bcfe 511static uint patch_2f00[] __initdata = {
f2a0bd37
VB
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
af71bcfe 578static uint patch_2e00[] __initdata = {
f2a0bd37
VB
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
af71bcfe 604static uint patch_2000[] __initdata = {
f2a0bd37
VB
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
af71bcfe 619static uint patch_2f00[] __initdata = {
f2a0bd37
VB
620 0x3030304c,
621 0xcab9e441,
622 0xa1aaf220
623};
624#endif
625
af71bcfe 626void __init cpm_load_patch(cpm8xx_t *cp)
f2a0bd37
VB
627{
628 volatile uint *dp; /* Dual-ported RAM. */
629 volatile cpm8xx_t *commproc;
2069a6ae
AV
630#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \
631 defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
f2a0bd37 632 volatile iic_t *iip;
56825c88 633 volatile struct spi_pram *spp;
2069a6ae 634#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
f2a0bd37 635 volatile smc_uart_t *smp;
2069a6ae
AV
636#endif
637#endif
f2a0bd37
VB
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;
56825c88
AV
678 spp = (struct spi_pram *)&commproc->cp_dparam[PROFF_SPI];
679 spp->rpbase = i;
f2a0bd37
VB
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}