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
28static 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
147static 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
186static 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
509static 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
576static 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
602static 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
617static uint patch_2f00[] __initdata = {
618	0x3030304c,
619	0xcab9e441,
620	0xa1aaf220
621};
622#endif
623
624void __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
716void
717verify_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