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