Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6-microblaze.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/8xx_immap.h>
20 #include <asm/cpm.h>
21 #include <asm/cpm1.h>
22
23 struct patch_params {
24         ushort rccr;
25         ushort cpmcr1;
26         ushort cpmcr2;
27         ushort cpmcr3;
28         ushort cpmcr4;
29 };
30
31 /*
32  * I2C/SPI relocation patch arrays.
33  */
34
35 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
36
37 static char patch_name[] __initdata = "I2C/SPI";
38
39 static struct patch_params patch_params __initdata = {
40         1, 0x802a, 0x8028, 0x802e, 0x802c,
41 };
42
43 static uint patch_2000[] __initdata = {
44         0x7FFFEFD9, 0x3FFD0000, 0x7FFB49F7, 0x7FF90000,
45         0x5FEFADF7, 0x5F89ADF7, 0x5FEFAFF7, 0x5F89AFF7,
46         0x3A9CFBC8, 0xE7C0EDF0, 0x77C1E1BB, 0xF4DC7F1D,
47         0xABAD932F, 0x4E08FDCF, 0x6E0FAFF8, 0x7CCF76CF,
48         0xFD1FF9CF, 0xABF88DC6, 0xAB5679F7, 0xB0937383,
49         0xDFCE79F7, 0xB091E6BB, 0xE5BBE74F, 0xB3FA6F0F,
50         0x6FFB76CE, 0xEE0DF9CF, 0x2BFBEFEF, 0xCFEEF9CF,
51         0x76CEAD24, 0x90B2DF9A, 0x7FDDD0BF, 0x4BF847FD,
52         0x7CCF76CE, 0xCFEF7E1F, 0x7F1D7DFD, 0xF0B6EF71,
53         0x7FC177C1, 0xFBC86079, 0xE722FBC8, 0x5FFFDFFF,
54         0x5FB2FFFB, 0xFBC8F3C8, 0x94A67F01, 0x7F1D5F39,
55         0xAFE85F5E, 0xFFDFDF96, 0xCB9FAF7D, 0x5FC1AFED,
56         0x8C1C5FC1, 0xAFDD5FC3, 0xDF9A7EFD, 0xB0B25FB2,
57         0xFFFEABAD, 0x5FB2FFFE, 0x5FCE600B, 0xE6BB600B,
58         0x5FCEDFC6, 0x27FBEFDF, 0x5FC8CFDE, 0x3A9CE7C0,
59         0xEDF0F3C8, 0x7F0154CD, 0x7F1D2D3D, 0x363A7570,
60         0x7E0AF1CE, 0x37EF2E68, 0x7FEE10EC, 0xADF8EFDE,
61         0xCFEAE52F, 0x7D0FE12B, 0xF1CE5F65, 0x7E0A4DF8,
62         0xCFEA5F72, 0x7D0BEFEE, 0xCFEA5F74, 0xE522EFDE,
63         0x5F74CFDA, 0x0B627385, 0xDF627E0A, 0x30D8145B,
64         0xBFFFF3C8, 0x5FFFDFFF, 0xA7F85F5E, 0xBFFE7F7D,
65         0x10D31450, 0x5F36BFFF, 0xAF785F5E, 0xBFFDA7F8,
66         0x5F36BFFE, 0x77FD30C0, 0x4E08FDCF, 0xE5FF6E0F,
67         0xAFF87E1F, 0x7E0FFD1F, 0xF1CF5F1B, 0xABF80D5E,
68         0x5F5EFFEF, 0x79F730A2, 0xAFDD5F34, 0x47F85F34,
69         0xAFED7FDD, 0x50B24978, 0x47FD7F1D, 0x7DFD70AD,
70         0xEF717EC1, 0x6BA47F01, 0x2D267EFD, 0x30DE5F5E,
71         0xFFFD5F5E, 0xFFEF5F5E, 0xFFDF0CA0, 0xAFED0A9E,
72         0xAFDD0C3A, 0x5F3AAFBD, 0x7FBDB082, 0x5F8247F8
73 };
74
75 static uint patch_2f00[] __initdata = {
76         0x3E303430, 0x34343737, 0xABF7BF9B, 0x994B4FBD,
77         0xBD599493, 0x349FFF37, 0xFB9B177D, 0xD9936956,
78         0xBBFDD697, 0xBDD2FD11, 0x31DB9BB3, 0x63139637,
79         0x93733693, 0x193137F7, 0x331737AF, 0x7BB9B999,
80         0xBB197957, 0x7FDFD3D5, 0x73B773F7, 0x37933B99,
81         0x1D115316, 0x99315315, 0x31694BF4, 0xFBDBD359,
82         0x31497353, 0x76956D69, 0x7B9D9693, 0x13131979,
83         0x79376935
84 };
85
86 static uint patch_2e00[] __initdata = {};
87 #endif
88
89 /*
90  * I2C/SPI/SMC1 relocation patch arrays.
91  */
92
93 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
94
95 static char patch_name[] __initdata = "I2C/SPI/SMC1";
96
97 static struct patch_params patch_params __initdata = {
98         3, 0x8080, 0x808a, 0x8028, 0x802a,
99 };
100
101 static uint patch_2000[] __initdata = {
102         0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
103         0x5f13eff8, 0x5eb5eff8, 0x5f88adf7, 0x5fefadf7,
104         0x3a9cfbc8, 0x77cae1bb, 0xf4de7fad, 0xabae9330,
105         0x4e08fdcf, 0x6e0faff8, 0x7ccf76cf, 0xfdaff9cf,
106         0xabf88dc8, 0xab5879f7, 0xb0925d8d, 0xdfd079f7,
107         0xb090e6bb, 0xe5bbe74f, 0x9e046f0f, 0x6ffb76ce,
108         0xee0cf9cf, 0x2bfbefef, 0xcfeef9cf, 0x76cead23,
109         0x90b3df99, 0x7fddd0c1, 0x4bf847fd, 0x7ccf76ce,
110         0xcfef77ca, 0x7eaf7fad, 0x7dfdf0b7, 0xef7a7fca,
111         0x77cafbc8, 0x6079e722, 0xfbc85fff, 0xdfff5fb3,
112         0xfffbfbc8, 0xf3c894a5, 0xe7c9edf9, 0x7f9a7fad,
113         0x5f36afe8, 0x5f5bffdf, 0xdf95cb9e, 0xaf7d5fc3,
114         0xafed8c1b, 0x5fc3afdd, 0x5fc5df99, 0x7efdb0b3,
115         0x5fb3fffe, 0xabae5fb3, 0xfffe5fd0, 0x600be6bb,
116         0x600b5fd0, 0xdfc827fb, 0xefdf5fca, 0xcfde3a9c,
117         0xe7c9edf9, 0xf3c87f9e, 0x54ca7fed, 0x2d3a3637,
118         0x756f7e9a, 0xf1ce37ef, 0x2e677fee, 0x10ebadf8,
119         0xefdecfea, 0xe52f7d9f, 0xe12bf1ce, 0x5f647e9a,
120         0x4df8cfea, 0x5f717d9b, 0xefeecfea, 0x5f73e522,
121         0xefde5f73, 0xcfda0b61, 0x5d8fdf61, 0xe7c9edf9,
122         0x7e9a30d5, 0x1458bfff, 0xf3c85fff, 0xdfffa7f8,
123         0x5f5bbffe, 0x7f7d10d0, 0x144d5f33, 0xbfffaf78,
124         0x5f5bbffd, 0xa7f85f33, 0xbffe77fd, 0x30bd4e08,
125         0xfdcfe5ff, 0x6e0faff8, 0x7eef7e9f, 0xfdeff1cf,
126         0x5f17abf8, 0x0d5b5f5b, 0xffef79f7, 0x309eafdd,
127         0x5f3147f8, 0x5f31afed, 0x7fdd50af, 0x497847fd,
128         0x7f9e7fed, 0x7dfd70a9, 0xef7e7ece, 0x6ba07f9e,
129         0x2d227efd, 0x30db5f5b, 0xfffd5f5b, 0xffef5f5b,
130         0xffdf0c9c, 0xafed0a9a, 0xafdd0c37, 0x5f37afbd,
131         0x7fbdb081, 0x5f8147f8, 0x3a11e710, 0xedf0ccdd,
132         0xf3186d0a, 0x7f0e5f06, 0x7fedbb38, 0x3afe7468,
133         0x7fedf4fc, 0x8ffbb951, 0xb85f77fd, 0xb0df5ddd,
134         0xdefe7fed, 0x90e1e74d, 0x6f0dcbf7, 0xe7decfed,
135         0xcb74cfed, 0xcfeddf6d, 0x91714f74, 0x5dd2deef,
136         0x9e04e7df, 0xefbb6ffb, 0xe7ef7f0e, 0x9e097fed,
137         0xebdbeffa, 0xeb54affb, 0x7fea90d7, 0x7e0cf0c3,
138         0xbffff318, 0x5fffdfff, 0xac59efea, 0x7fce1ee5,
139         0xe2ff5ee1, 0xaffbe2ff, 0x5ee3affb, 0xf9cc7d0f,
140         0xaef8770f, 0x7d0fb0c6, 0xeffbbfff, 0xcfef5ede,
141         0x7d0fbfff, 0x5ede4cf8, 0x7fddd0bf, 0x49f847fd,
142         0x7efdf0bb, 0x7fedfffd, 0x7dfdf0b7, 0xef7e7e1e,
143         0x5ede7f0e, 0x3a11e710, 0xedf0ccab, 0xfb18ad2e,
144         0x1ea9bbb8, 0x74283b7e, 0x73c2e4bb, 0x2ada4fb8,
145         0xdc21e4bb, 0xb2a1ffbf, 0x5e2c43f8, 0xfc87e1bb,
146         0xe74ffd91, 0x6f0f4fe8, 0xc7ba32e2, 0xf396efeb,
147         0x600b4f78, 0xe5bb760b, 0x53acaef8, 0x4ef88b0e,
148         0xcfef9e09, 0xabf8751f, 0xefef5bac, 0x741f4fe8,
149         0x751e760d, 0x7fdbf081, 0x741cafce, 0xefcc7fce,
150         0x751e70ac, 0x741ce7bb, 0x3372cfed, 0xafdbefeb,
151         0xe5bb760b, 0x53f2aef8, 0xafe8e7eb, 0x4bf8771e,
152         0x7e247fed, 0x4fcbe2cc, 0x7fbc30a9, 0x7b0f7a0f,
153         0x34d577fd, 0x308b5db7, 0xde553e5f, 0xaf78741f,
154         0x741f30f0, 0xcfef5e2c, 0x741f3eac, 0xafb8771e,
155         0x5e677fed, 0x0bd3e2cc, 0x741ccfec, 0xe5ca53cd,
156         0x6fcb4f74, 0x5dadde4b, 0x2ab63d38, 0x4bb3de30,
157         0x751f741c, 0x6c42effa, 0xefea7fce, 0x6ffc30be,
158         0xefec3fca, 0x30b3de2e, 0xadf85d9e, 0xaf7daefd,
159         0x5d9ede2e, 0x5d9eafdd, 0x761f10ac, 0x1da07efd,
160         0x30adfffe, 0x4908fb18, 0x5fffdfff, 0xafbb709b,
161         0x4ef85e67, 0xadf814ad, 0x7a0f70ad, 0xcfef50ad,
162         0x7a0fde30, 0x5da0afed, 0x3c12780f, 0xefef780f,
163         0xefef790f, 0xa7f85e0f, 0xffef790f, 0xefef790f,
164         0x14adde2e, 0x5d9eadfd, 0x5e2dfffb, 0xe79addfd,
165         0xeff96079, 0x607ae79a, 0xddfceff9, 0x60795dff,
166         0x607acfef, 0xefefefdf, 0xefbfef7f, 0xeeffedff,
167         0xebffe7ff, 0xafefafdf, 0xafbfaf7f, 0xaeffadff,
168         0xabffa7ff, 0x6fef6fdf, 0x6fbf6f7f, 0x6eff6dff,
169         0x6bff67ff, 0x2fef2fdf, 0x2fbf2f7f, 0x2eff2dff,
170         0x2bff27ff, 0x4e08fd1f, 0xe5ff6e0f, 0xaff87eef,
171         0x7e0ffdef, 0xf11f6079, 0xabf8f542, 0x7e0af11c,
172         0x37cfae3a, 0x7fec90be, 0xadf8efdc, 0xcfeae52f,
173         0x7d0fe12b, 0xf11c6079, 0x7e0a4df8, 0xcfea5dc4,
174         0x7d0befec, 0xcfea5dc6, 0xe522efdc, 0x5dc6cfda,
175         0x4e08fd1f, 0x6e0faff8, 0x7c1f761f, 0xfdeff91f,
176         0x6079abf8, 0x761cee24, 0xf91f2bfb, 0xefefcfec,
177         0xf91f6079, 0x761c27fb, 0xefdf5da7, 0xcfdc7fdd,
178         0xd09c4bf8, 0x47fd7c1f, 0x761ccfcf, 0x7eef7fed,
179         0x7dfdf093, 0xef7e7f1e, 0x771efb18, 0x6079e722,
180         0xe6bbe5bb, 0xae0ae5bb, 0x600bae85, 0xe2bbe2bb,
181         0xe2bbe2bb, 0xaf02e2bb, 0xe2bb2ff9, 0x6079e2bb
182 };
183
184 static uint patch_2f00[] __initdata = {
185         0x30303030, 0x3e3e3434, 0xabbf9b99, 0x4b4fbdbd,
186         0x59949334, 0x9fff37fb, 0x9b177dd9, 0x936956bb,
187         0xfbdd697b, 0xdd2fd113, 0x1db9f7bb, 0x36313963,
188         0x79373369, 0x3193137f, 0x7331737a, 0xf7bb9b99,
189         0x9bb19795, 0x77fdfd3d, 0x573b773f, 0x737933f7,
190         0xb991d115, 0x31699315, 0x31531694, 0xbf4fbdbd,
191         0x35931497, 0x35376956, 0xbd697b9d, 0x96931313,
192         0x19797937, 0x6935af78, 0xb9b3baa3, 0xb8788683,
193         0x368f78f7, 0x87778733, 0x3ffffb3b, 0x8e8f78b8,
194         0x1d118e13, 0xf3ff3f8b, 0x6bd8e173, 0xd1366856,
195         0x68d1687b, 0x3daf78b8, 0x3a3a3f87, 0x8f81378f,
196         0xf876f887, 0x77fd8778, 0x737de8d6, 0xbbf8bfff,
197         0xd8df87f7, 0xfd876f7b, 0x8bfff8bd, 0x8683387d,
198         0xb873d87b, 0x3b8fd7f8, 0xf7338883, 0xbb8ee1f8,
199         0xef837377, 0x3337b836, 0x817d11f8, 0x7378b878,
200         0xd3368b7d, 0xed731b7d, 0x833731f3, 0xf22f3f23
201 };
202
203 static uint patch_2e00[] __initdata = {
204         0x27eeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
205         0xee4bf4fb, 0xdbd259bb, 0x1979577f, 0xdfd2d573,
206         0xb773f737, 0x4b4fbdbd, 0x25b9b177, 0xd2d17376,
207         0x956bbfdd, 0x697bdd2f, 0xff9f79ff, 0xff9ff22f
208 };
209 #endif
210
211 /*
212  *  USB SOF patch arrays.
213  */
214
215 #ifdef CONFIG_USB_SOF_UCODE_PATCH
216
217 static char patch_name[] __initdata = "USB SOF";
218
219 static struct patch_params patch_params __initdata = {
220         9,
221 };
222
223 static uint patch_2000[] __initdata = {
224         0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b,
225         0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe,
226         0x3f7bbf79, 0xba5bba38, 0xe7676076, 0x60750000
227 };
228
229 static uint patch_2f00[] __initdata = {
230         0x3030304c, 0xcab9e441, 0xa1aaf220
231 };
232
233 static uint patch_2e00[] __initdata = {};
234 #endif
235
236 /*
237  * SMC relocation patch arrays.
238  */
239
240 #ifdef CONFIG_SMC_UCODE_PATCH
241
242 static char patch_name[] __initdata = "SMC";
243
244 static struct patch_params patch_params __initdata = {
245         2, 0x8080, 0x8088,
246 };
247
248 static uint patch_2000[] __initdata = {
249         0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
250         0x5fefeff8, 0x5f91eff8, 0x3ff30000, 0x3ff10000,
251         0x3a11e710, 0xedf0ccb9, 0xf318ed66, 0x7f0e5fe2,
252         0x7fedbb38, 0x3afe7468, 0x7fedf4d8, 0x8ffbb92d,
253         0xb83b77fd, 0xb0bb5eb9, 0xdfda7fed, 0x90bde74d,
254         0x6f0dcbd3, 0xe7decfed, 0xcb50cfed, 0xcfeddf6d,
255         0x914d4f74, 0x5eaedfcb, 0x9ee0e7df, 0xefbb6ffb,
256         0xe7ef7f0e, 0x9ee57fed, 0xebb7effa, 0xeb30affb,
257         0x7fea90b3, 0x7e0cf09f, 0xbffff318, 0x5fffdfff,
258         0xac35efea, 0x7fce1fc1, 0xe2ff5fbd, 0xaffbe2ff,
259         0x5fbfaffb, 0xf9a87d0f, 0xaef8770f, 0x7d0fb0a2,
260         0xeffbbfff, 0xcfef5fba, 0x7d0fbfff, 0x5fba4cf8,
261         0x7fddd09b, 0x49f847fd, 0x7efdf097, 0x7fedfffd,
262         0x7dfdf093, 0xef7e7e1e, 0x5fba7f0e, 0x3a11e710,
263         0xedf0cc87, 0xfb18ad0a, 0x1f85bbb8, 0x74283b7e,
264         0x7375e4bb, 0x2ab64fb8, 0x5c7de4bb, 0x32fdffbf,
265         0x5f0843f8, 0x7ce3e1bb, 0xe74f7ded, 0x6f0f4fe8,
266         0xc7ba32be, 0x73f2efeb, 0x600b4f78, 0xe5bb760b,
267         0x5388aef8, 0x4ef80b6a, 0xcfef9ee5, 0xabf8751f,
268         0xefef5b88, 0x741f4fe8, 0x751e760d, 0x7fdb70dd,
269         0x741cafce, 0xefcc7fce, 0x751e7088, 0x741ce7bb,
270         0x334ecfed, 0xafdbefeb, 0xe5bb760b, 0x53ceaef8,
271         0xafe8e7eb, 0x4bf8771e, 0x7e007fed, 0x4fcbe2cc,
272         0x7fbc3085, 0x7b0f7a0f, 0x34b177fd, 0xb0e75e93,
273         0xdf313e3b, 0xaf78741f, 0x741f30cc, 0xcfef5f08,
274         0x741f3e88, 0xafb8771e, 0x5f437fed, 0x0bafe2cc,
275         0x741ccfec, 0xe5ca53a9, 0x6fcb4f74, 0x5e89df27,
276         0x2a923d14, 0x4b8fdf0c, 0x751f741c, 0x6c1eeffa,
277         0xefea7fce, 0x6ffc309a, 0xefec3fca, 0x308fdf0a,
278         0xadf85e7a, 0xaf7daefd, 0x5e7adf0a, 0x5e7aafdd,
279         0x761f1088, 0x1e7c7efd, 0x3089fffe, 0x4908fb18,
280         0x5fffdfff, 0xafbbf0f7, 0x4ef85f43, 0xadf81489,
281         0x7a0f7089, 0xcfef5089, 0x7a0fdf0c, 0x5e7cafed,
282         0xbc6e780f, 0xefef780f, 0xefef790f, 0xa7f85eeb,
283         0xffef790f, 0xefef790f, 0x1489df0a, 0x5e7aadfd,
284         0x5f09fffb, 0xe79aded9, 0xeff96079, 0x607ae79a,
285         0xded8eff9, 0x60795edb, 0x607acfef, 0xefefefdf,
286         0xefbfef7f, 0xeeffedff, 0xebffe7ff, 0xafefafdf,
287         0xafbfaf7f, 0xaeffadff, 0xabffa7ff, 0x6fef6fdf,
288         0x6fbf6f7f, 0x6eff6dff, 0x6bff67ff, 0x2fef2fdf,
289         0x2fbf2f7f, 0x2eff2dff, 0x2bff27ff, 0x4e08fd1f,
290         0xe5ff6e0f, 0xaff87eef, 0x7e0ffdef, 0xf11f6079,
291         0xabf8f51e, 0x7e0af11c, 0x37cfae16, 0x7fec909a,
292         0xadf8efdc, 0xcfeae52f, 0x7d0fe12b, 0xf11c6079,
293         0x7e0a4df8, 0xcfea5ea0, 0x7d0befec, 0xcfea5ea2,
294         0xe522efdc, 0x5ea2cfda, 0x4e08fd1f, 0x6e0faff8,
295         0x7c1f761f, 0xfdeff91f, 0x6079abf8, 0x761cee00,
296         0xf91f2bfb, 0xefefcfec, 0xf91f6079, 0x761c27fb,
297         0xefdf5e83, 0xcfdc7fdd, 0x50f84bf8, 0x47fd7c1f,
298         0x761ccfcf, 0x7eef7fed, 0x7dfd70ef, 0xef7e7f1e,
299         0x771efb18, 0x6079e722, 0xe6bbe5bb, 0x2e66e5bb,
300         0x600b2ee1, 0xe2bbe2bb, 0xe2bbe2bb, 0x2f5ee2bb,
301         0xe2bb2ff9, 0x6079e2bb,
302 };
303
304 static uint patch_2f00[] __initdata = {
305         0x30303030, 0x3e3e3030, 0xaf79b9b3, 0xbaa3b979,
306         0x9693369f, 0x79f79777, 0x97333fff, 0xfb3b9e9f,
307         0x79b91d11, 0x9e13f3ff, 0x3f9b6bd9, 0xe173d136,
308         0x695669d1, 0x697b3daf, 0x79b93a3a, 0x3f979f91,
309         0x379ff976, 0xf99777fd, 0x9779737d, 0xe9d6bbf9,
310         0xbfffd9df, 0x97f7fd97, 0x6f7b9bff, 0xf9bd9683,
311         0x397db973, 0xd97b3b9f, 0xd7f9f733, 0x9993bb9e,
312         0xe1f9ef93, 0x73773337, 0xb936917d, 0x11f87379,
313         0xb979d336, 0x8b7ded73, 0x1b7d9337, 0x31f3f22f,
314         0x3f2327ee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
315         0xeeeeee4b, 0xf4fbdbd2, 0x58bb1878, 0x577fdfd2,
316         0xd573b773, 0xf7374b4f, 0xbdbd25b8, 0xb177d2d1,
317         0x7376856b, 0xbfdd687b, 0xdd2fff8f, 0x78ffff8f,
318         0xf22f0000,
319 };
320
321 static uint patch_2e00[] __initdata = {};
322 #endif
323
324 static void __init cpm_write_patch(cpm8xx_t *cp, int offset, uint *patch, int len)
325 {
326         if (!len)
327                 return;
328         memcpy_toio(cp->cp_dpmem + offset, patch, len);
329 }
330
331 void __init cpm_load_patch(cpm8xx_t *cp)
332 {
333         out_be16(&cp->cp_rccr, 0);
334
335         cpm_write_patch(cp, 0, patch_2000, sizeof(patch_2000));
336         cpm_write_patch(cp, 0xf00, patch_2f00, sizeof(patch_2f00));
337         cpm_write_patch(cp, 0xe00, patch_2e00, sizeof(patch_2e00));
338
339         if (IS_ENABLED(CONFIG_I2C_SPI_UCODE_PATCH) ||
340             IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
341                 u16 rpbase = 0x500;
342                 iic_t *iip;
343                 struct spi_pram *spp;
344
345                 iip = (iic_t *)&cp->cp_dparam[PROFF_IIC];
346                 out_be16(&iip->iic_rpbase, rpbase);
347
348                 /* Put SPI above the IIC, also 32-byte aligned. */
349                 spp = (struct spi_pram *)&cp->cp_dparam[PROFF_SPI];
350                 out_be16(&spp->rpbase, (rpbase + sizeof(iic_t) + 31) & ~31);
351
352                 if (IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
353                         smc_uart_t *smp;
354
355                         smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
356                         out_be16(&smp->smc_rpbase, 0x1FC0);
357                 }
358         }
359
360         if (IS_ENABLED(CONFIG_SMC_UCODE_PATCH)) {
361                 smc_uart_t *smp;
362
363                 if (IS_ENABLED(CONFIG_PPC_EARLY_DEBUG_CPM)) {
364                         int i;
365
366                         for (i = 0; i < sizeof(*smp); i += 4) {
367                                 u32 __iomem *src = (u32 __iomem *)&cp->cp_dparam[PROFF_SMC1 + i];
368                                 u32 __iomem *dst = (u32 __iomem *)&cp->cp_dparam[PROFF_DSP1 + i];
369
370                                 out_be32(dst, in_be32(src));
371                         }
372                 }
373
374                 smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
375                 out_be16(&smp->smc_rpbase, 0x1ec0);
376                 smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC2];
377                 out_be16(&smp->smc_rpbase, 0x1fc0);
378         }
379
380         out_be16(&cp->cp_cpmcr1, patch_params.cpmcr1);
381         out_be16(&cp->cp_cpmcr2, patch_params.cpmcr2);
382         out_be16(&cp->cp_cpmcr3, patch_params.cpmcr3);
383         out_be16(&cp->cp_cpmcr4, patch_params.cpmcr4);
384
385         out_be16(&cp->cp_rccr, patch_params.rccr);
386
387         pr_info("%s microcode patch installed\n", patch_name);
388 }