Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/platforms/8xx/micropatch.c
26481 views
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
}
389
390