Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 /*
0004  * Microcode patches for the CPM as supplied by Motorola.
0005  * This is the one for IIC/SPI.  There is a newer one that
0006  * also relocates SMC2, but this would require additional changes
0007  * to uart.c, so I am holding off on that for a moment.
0008  */
0009 #include <linux/init.h>
0010 #include <linux/errno.h>
0011 #include <linux/sched.h>
0012 #include <linux/kernel.h>
0013 #include <linux/param.h>
0014 #include <linux/string.h>
0015 #include <linux/mm.h>
0016 #include <linux/interrupt.h>
0017 #include <asm/irq.h>
0018 #include <asm/page.h>
0019 #include <asm/8xx_immap.h>
0020 #include <asm/cpm.h>
0021 #include <asm/cpm1.h>
0022 
0023 struct patch_params {
0024     ushort rccr;
0025     ushort cpmcr1;
0026     ushort cpmcr2;
0027     ushort cpmcr3;
0028     ushort cpmcr4;
0029 };
0030 
0031 /*
0032  * I2C/SPI relocation patch arrays.
0033  */
0034 
0035 #ifdef CONFIG_I2C_SPI_UCODE_PATCH
0036 
0037 static char patch_name[] __initdata = "I2C/SPI";
0038 
0039 static struct patch_params patch_params __initdata = {
0040     1, 0x802a, 0x8028, 0x802e, 0x802c,
0041 };
0042 
0043 static uint patch_2000[] __initdata = {
0044     0x7FFFEFD9, 0x3FFD0000, 0x7FFB49F7, 0x7FF90000,
0045     0x5FEFADF7, 0x5F89ADF7, 0x5FEFAFF7, 0x5F89AFF7,
0046     0x3A9CFBC8, 0xE7C0EDF0, 0x77C1E1BB, 0xF4DC7F1D,
0047     0xABAD932F, 0x4E08FDCF, 0x6E0FAFF8, 0x7CCF76CF,
0048     0xFD1FF9CF, 0xABF88DC6, 0xAB5679F7, 0xB0937383,
0049     0xDFCE79F7, 0xB091E6BB, 0xE5BBE74F, 0xB3FA6F0F,
0050     0x6FFB76CE, 0xEE0DF9CF, 0x2BFBEFEF, 0xCFEEF9CF,
0051     0x76CEAD24, 0x90B2DF9A, 0x7FDDD0BF, 0x4BF847FD,
0052     0x7CCF76CE, 0xCFEF7E1F, 0x7F1D7DFD, 0xF0B6EF71,
0053     0x7FC177C1, 0xFBC86079, 0xE722FBC8, 0x5FFFDFFF,
0054     0x5FB2FFFB, 0xFBC8F3C8, 0x94A67F01, 0x7F1D5F39,
0055     0xAFE85F5E, 0xFFDFDF96, 0xCB9FAF7D, 0x5FC1AFED,
0056     0x8C1C5FC1, 0xAFDD5FC3, 0xDF9A7EFD, 0xB0B25FB2,
0057     0xFFFEABAD, 0x5FB2FFFE, 0x5FCE600B, 0xE6BB600B,
0058     0x5FCEDFC6, 0x27FBEFDF, 0x5FC8CFDE, 0x3A9CE7C0,
0059     0xEDF0F3C8, 0x7F0154CD, 0x7F1D2D3D, 0x363A7570,
0060     0x7E0AF1CE, 0x37EF2E68, 0x7FEE10EC, 0xADF8EFDE,
0061     0xCFEAE52F, 0x7D0FE12B, 0xF1CE5F65, 0x7E0A4DF8,
0062     0xCFEA5F72, 0x7D0BEFEE, 0xCFEA5F74, 0xE522EFDE,
0063     0x5F74CFDA, 0x0B627385, 0xDF627E0A, 0x30D8145B,
0064     0xBFFFF3C8, 0x5FFFDFFF, 0xA7F85F5E, 0xBFFE7F7D,
0065     0x10D31450, 0x5F36BFFF, 0xAF785F5E, 0xBFFDA7F8,
0066     0x5F36BFFE, 0x77FD30C0, 0x4E08FDCF, 0xE5FF6E0F,
0067     0xAFF87E1F, 0x7E0FFD1F, 0xF1CF5F1B, 0xABF80D5E,
0068     0x5F5EFFEF, 0x79F730A2, 0xAFDD5F34, 0x47F85F34,
0069     0xAFED7FDD, 0x50B24978, 0x47FD7F1D, 0x7DFD70AD,
0070     0xEF717EC1, 0x6BA47F01, 0x2D267EFD, 0x30DE5F5E,
0071     0xFFFD5F5E, 0xFFEF5F5E, 0xFFDF0CA0, 0xAFED0A9E,
0072     0xAFDD0C3A, 0x5F3AAFBD, 0x7FBDB082, 0x5F8247F8
0073 };
0074 
0075 static uint patch_2f00[] __initdata = {
0076     0x3E303430, 0x34343737, 0xABF7BF9B, 0x994B4FBD,
0077     0xBD599493, 0x349FFF37, 0xFB9B177D, 0xD9936956,
0078     0xBBFDD697, 0xBDD2FD11, 0x31DB9BB3, 0x63139637,
0079     0x93733693, 0x193137F7, 0x331737AF, 0x7BB9B999,
0080     0xBB197957, 0x7FDFD3D5, 0x73B773F7, 0x37933B99,
0081     0x1D115316, 0x99315315, 0x31694BF4, 0xFBDBD359,
0082     0x31497353, 0x76956D69, 0x7B9D9693, 0x13131979,
0083     0x79376935
0084 };
0085 
0086 static uint patch_2e00[] __initdata = {};
0087 #endif
0088 
0089 /*
0090  * I2C/SPI/SMC1 relocation patch arrays.
0091  */
0092 
0093 #ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH
0094 
0095 static char patch_name[] __initdata = "I2C/SPI/SMC1";
0096 
0097 static struct patch_params patch_params __initdata = {
0098     3, 0x8080, 0x808a, 0x8028, 0x802a,
0099 };
0100 
0101 static uint patch_2000[] __initdata = {
0102     0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
0103     0x5f13eff8, 0x5eb5eff8, 0x5f88adf7, 0x5fefadf7,
0104     0x3a9cfbc8, 0x77cae1bb, 0xf4de7fad, 0xabae9330,
0105     0x4e08fdcf, 0x6e0faff8, 0x7ccf76cf, 0xfdaff9cf,
0106     0xabf88dc8, 0xab5879f7, 0xb0925d8d, 0xdfd079f7,
0107     0xb090e6bb, 0xe5bbe74f, 0x9e046f0f, 0x6ffb76ce,
0108     0xee0cf9cf, 0x2bfbefef, 0xcfeef9cf, 0x76cead23,
0109     0x90b3df99, 0x7fddd0c1, 0x4bf847fd, 0x7ccf76ce,
0110     0xcfef77ca, 0x7eaf7fad, 0x7dfdf0b7, 0xef7a7fca,
0111     0x77cafbc8, 0x6079e722, 0xfbc85fff, 0xdfff5fb3,
0112     0xfffbfbc8, 0xf3c894a5, 0xe7c9edf9, 0x7f9a7fad,
0113     0x5f36afe8, 0x5f5bffdf, 0xdf95cb9e, 0xaf7d5fc3,
0114     0xafed8c1b, 0x5fc3afdd, 0x5fc5df99, 0x7efdb0b3,
0115     0x5fb3fffe, 0xabae5fb3, 0xfffe5fd0, 0x600be6bb,
0116     0x600b5fd0, 0xdfc827fb, 0xefdf5fca, 0xcfde3a9c,
0117     0xe7c9edf9, 0xf3c87f9e, 0x54ca7fed, 0x2d3a3637,
0118     0x756f7e9a, 0xf1ce37ef, 0x2e677fee, 0x10ebadf8,
0119     0xefdecfea, 0xe52f7d9f, 0xe12bf1ce, 0x5f647e9a,
0120     0x4df8cfea, 0x5f717d9b, 0xefeecfea, 0x5f73e522,
0121     0xefde5f73, 0xcfda0b61, 0x5d8fdf61, 0xe7c9edf9,
0122     0x7e9a30d5, 0x1458bfff, 0xf3c85fff, 0xdfffa7f8,
0123     0x5f5bbffe, 0x7f7d10d0, 0x144d5f33, 0xbfffaf78,
0124     0x5f5bbffd, 0xa7f85f33, 0xbffe77fd, 0x30bd4e08,
0125     0xfdcfe5ff, 0x6e0faff8, 0x7eef7e9f, 0xfdeff1cf,
0126     0x5f17abf8, 0x0d5b5f5b, 0xffef79f7, 0x309eafdd,
0127     0x5f3147f8, 0x5f31afed, 0x7fdd50af, 0x497847fd,
0128     0x7f9e7fed, 0x7dfd70a9, 0xef7e7ece, 0x6ba07f9e,
0129     0x2d227efd, 0x30db5f5b, 0xfffd5f5b, 0xffef5f5b,
0130     0xffdf0c9c, 0xafed0a9a, 0xafdd0c37, 0x5f37afbd,
0131     0x7fbdb081, 0x5f8147f8, 0x3a11e710, 0xedf0ccdd,
0132     0xf3186d0a, 0x7f0e5f06, 0x7fedbb38, 0x3afe7468,
0133     0x7fedf4fc, 0x8ffbb951, 0xb85f77fd, 0xb0df5ddd,
0134     0xdefe7fed, 0x90e1e74d, 0x6f0dcbf7, 0xe7decfed,
0135     0xcb74cfed, 0xcfeddf6d, 0x91714f74, 0x5dd2deef,
0136     0x9e04e7df, 0xefbb6ffb, 0xe7ef7f0e, 0x9e097fed,
0137     0xebdbeffa, 0xeb54affb, 0x7fea90d7, 0x7e0cf0c3,
0138     0xbffff318, 0x5fffdfff, 0xac59efea, 0x7fce1ee5,
0139     0xe2ff5ee1, 0xaffbe2ff, 0x5ee3affb, 0xf9cc7d0f,
0140     0xaef8770f, 0x7d0fb0c6, 0xeffbbfff, 0xcfef5ede,
0141     0x7d0fbfff, 0x5ede4cf8, 0x7fddd0bf, 0x49f847fd,
0142     0x7efdf0bb, 0x7fedfffd, 0x7dfdf0b7, 0xef7e7e1e,
0143     0x5ede7f0e, 0x3a11e710, 0xedf0ccab, 0xfb18ad2e,
0144     0x1ea9bbb8, 0x74283b7e, 0x73c2e4bb, 0x2ada4fb8,
0145     0xdc21e4bb, 0xb2a1ffbf, 0x5e2c43f8, 0xfc87e1bb,
0146     0xe74ffd91, 0x6f0f4fe8, 0xc7ba32e2, 0xf396efeb,
0147     0x600b4f78, 0xe5bb760b, 0x53acaef8, 0x4ef88b0e,
0148     0xcfef9e09, 0xabf8751f, 0xefef5bac, 0x741f4fe8,
0149     0x751e760d, 0x7fdbf081, 0x741cafce, 0xefcc7fce,
0150     0x751e70ac, 0x741ce7bb, 0x3372cfed, 0xafdbefeb,
0151     0xe5bb760b, 0x53f2aef8, 0xafe8e7eb, 0x4bf8771e,
0152     0x7e247fed, 0x4fcbe2cc, 0x7fbc30a9, 0x7b0f7a0f,
0153     0x34d577fd, 0x308b5db7, 0xde553e5f, 0xaf78741f,
0154     0x741f30f0, 0xcfef5e2c, 0x741f3eac, 0xafb8771e,
0155     0x5e677fed, 0x0bd3e2cc, 0x741ccfec, 0xe5ca53cd,
0156     0x6fcb4f74, 0x5dadde4b, 0x2ab63d38, 0x4bb3de30,
0157     0x751f741c, 0x6c42effa, 0xefea7fce, 0x6ffc30be,
0158     0xefec3fca, 0x30b3de2e, 0xadf85d9e, 0xaf7daefd,
0159     0x5d9ede2e, 0x5d9eafdd, 0x761f10ac, 0x1da07efd,
0160     0x30adfffe, 0x4908fb18, 0x5fffdfff, 0xafbb709b,
0161     0x4ef85e67, 0xadf814ad, 0x7a0f70ad, 0xcfef50ad,
0162     0x7a0fde30, 0x5da0afed, 0x3c12780f, 0xefef780f,
0163     0xefef790f, 0xa7f85e0f, 0xffef790f, 0xefef790f,
0164     0x14adde2e, 0x5d9eadfd, 0x5e2dfffb, 0xe79addfd,
0165     0xeff96079, 0x607ae79a, 0xddfceff9, 0x60795dff,
0166     0x607acfef, 0xefefefdf, 0xefbfef7f, 0xeeffedff,
0167     0xebffe7ff, 0xafefafdf, 0xafbfaf7f, 0xaeffadff,
0168     0xabffa7ff, 0x6fef6fdf, 0x6fbf6f7f, 0x6eff6dff,
0169     0x6bff67ff, 0x2fef2fdf, 0x2fbf2f7f, 0x2eff2dff,
0170     0x2bff27ff, 0x4e08fd1f, 0xe5ff6e0f, 0xaff87eef,
0171     0x7e0ffdef, 0xf11f6079, 0xabf8f542, 0x7e0af11c,
0172     0x37cfae3a, 0x7fec90be, 0xadf8efdc, 0xcfeae52f,
0173     0x7d0fe12b, 0xf11c6079, 0x7e0a4df8, 0xcfea5dc4,
0174     0x7d0befec, 0xcfea5dc6, 0xe522efdc, 0x5dc6cfda,
0175     0x4e08fd1f, 0x6e0faff8, 0x7c1f761f, 0xfdeff91f,
0176     0x6079abf8, 0x761cee24, 0xf91f2bfb, 0xefefcfec,
0177     0xf91f6079, 0x761c27fb, 0xefdf5da7, 0xcfdc7fdd,
0178     0xd09c4bf8, 0x47fd7c1f, 0x761ccfcf, 0x7eef7fed,
0179     0x7dfdf093, 0xef7e7f1e, 0x771efb18, 0x6079e722,
0180     0xe6bbe5bb, 0xae0ae5bb, 0x600bae85, 0xe2bbe2bb,
0181     0xe2bbe2bb, 0xaf02e2bb, 0xe2bb2ff9, 0x6079e2bb
0182 };
0183 
0184 static uint patch_2f00[] __initdata = {
0185     0x30303030, 0x3e3e3434, 0xabbf9b99, 0x4b4fbdbd,
0186     0x59949334, 0x9fff37fb, 0x9b177dd9, 0x936956bb,
0187     0xfbdd697b, 0xdd2fd113, 0x1db9f7bb, 0x36313963,
0188     0x79373369, 0x3193137f, 0x7331737a, 0xf7bb9b99,
0189     0x9bb19795, 0x77fdfd3d, 0x573b773f, 0x737933f7,
0190     0xb991d115, 0x31699315, 0x31531694, 0xbf4fbdbd,
0191     0x35931497, 0x35376956, 0xbd697b9d, 0x96931313,
0192     0x19797937, 0x6935af78, 0xb9b3baa3, 0xb8788683,
0193     0x368f78f7, 0x87778733, 0x3ffffb3b, 0x8e8f78b8,
0194     0x1d118e13, 0xf3ff3f8b, 0x6bd8e173, 0xd1366856,
0195     0x68d1687b, 0x3daf78b8, 0x3a3a3f87, 0x8f81378f,
0196     0xf876f887, 0x77fd8778, 0x737de8d6, 0xbbf8bfff,
0197     0xd8df87f7, 0xfd876f7b, 0x8bfff8bd, 0x8683387d,
0198     0xb873d87b, 0x3b8fd7f8, 0xf7338883, 0xbb8ee1f8,
0199     0xef837377, 0x3337b836, 0x817d11f8, 0x7378b878,
0200     0xd3368b7d, 0xed731b7d, 0x833731f3, 0xf22f3f23
0201 };
0202 
0203 static uint patch_2e00[] __initdata = {
0204     0x27eeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
0205     0xee4bf4fb, 0xdbd259bb, 0x1979577f, 0xdfd2d573,
0206     0xb773f737, 0x4b4fbdbd, 0x25b9b177, 0xd2d17376,
0207     0x956bbfdd, 0x697bdd2f, 0xff9f79ff, 0xff9ff22f
0208 };
0209 #endif
0210 
0211 /*
0212  *  USB SOF patch arrays.
0213  */
0214 
0215 #ifdef CONFIG_USB_SOF_UCODE_PATCH
0216 
0217 static char patch_name[] __initdata = "USB SOF";
0218 
0219 static struct patch_params patch_params __initdata = {
0220     9,
0221 };
0222 
0223 static uint patch_2000[] __initdata = {
0224     0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b,
0225     0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe,
0226     0x3f7bbf79, 0xba5bba38, 0xe7676076, 0x60750000
0227 };
0228 
0229 static uint patch_2f00[] __initdata = {
0230     0x3030304c, 0xcab9e441, 0xa1aaf220
0231 };
0232 
0233 static uint patch_2e00[] __initdata = {};
0234 #endif
0235 
0236 /*
0237  * SMC relocation patch arrays.
0238  */
0239 
0240 #ifdef CONFIG_SMC_UCODE_PATCH
0241 
0242 static char patch_name[] __initdata = "SMC";
0243 
0244 static struct patch_params patch_params __initdata = {
0245     2, 0x8080, 0x8088,
0246 };
0247 
0248 static uint patch_2000[] __initdata = {
0249     0x3fff0000, 0x3ffd0000, 0x3ffb0000, 0x3ff90000,
0250     0x5fefeff8, 0x5f91eff8, 0x3ff30000, 0x3ff10000,
0251     0x3a11e710, 0xedf0ccb9, 0xf318ed66, 0x7f0e5fe2,
0252     0x7fedbb38, 0x3afe7468, 0x7fedf4d8, 0x8ffbb92d,
0253     0xb83b77fd, 0xb0bb5eb9, 0xdfda7fed, 0x90bde74d,
0254     0x6f0dcbd3, 0xe7decfed, 0xcb50cfed, 0xcfeddf6d,
0255     0x914d4f74, 0x5eaedfcb, 0x9ee0e7df, 0xefbb6ffb,
0256     0xe7ef7f0e, 0x9ee57fed, 0xebb7effa, 0xeb30affb,
0257     0x7fea90b3, 0x7e0cf09f, 0xbffff318, 0x5fffdfff,
0258     0xac35efea, 0x7fce1fc1, 0xe2ff5fbd, 0xaffbe2ff,
0259     0x5fbfaffb, 0xf9a87d0f, 0xaef8770f, 0x7d0fb0a2,
0260     0xeffbbfff, 0xcfef5fba, 0x7d0fbfff, 0x5fba4cf8,
0261     0x7fddd09b, 0x49f847fd, 0x7efdf097, 0x7fedfffd,
0262     0x7dfdf093, 0xef7e7e1e, 0x5fba7f0e, 0x3a11e710,
0263     0xedf0cc87, 0xfb18ad0a, 0x1f85bbb8, 0x74283b7e,
0264     0x7375e4bb, 0x2ab64fb8, 0x5c7de4bb, 0x32fdffbf,
0265     0x5f0843f8, 0x7ce3e1bb, 0xe74f7ded, 0x6f0f4fe8,
0266     0xc7ba32be, 0x73f2efeb, 0x600b4f78, 0xe5bb760b,
0267     0x5388aef8, 0x4ef80b6a, 0xcfef9ee5, 0xabf8751f,
0268     0xefef5b88, 0x741f4fe8, 0x751e760d, 0x7fdb70dd,
0269     0x741cafce, 0xefcc7fce, 0x751e7088, 0x741ce7bb,
0270     0x334ecfed, 0xafdbefeb, 0xe5bb760b, 0x53ceaef8,
0271     0xafe8e7eb, 0x4bf8771e, 0x7e007fed, 0x4fcbe2cc,
0272     0x7fbc3085, 0x7b0f7a0f, 0x34b177fd, 0xb0e75e93,
0273     0xdf313e3b, 0xaf78741f, 0x741f30cc, 0xcfef5f08,
0274     0x741f3e88, 0xafb8771e, 0x5f437fed, 0x0bafe2cc,
0275     0x741ccfec, 0xe5ca53a9, 0x6fcb4f74, 0x5e89df27,
0276     0x2a923d14, 0x4b8fdf0c, 0x751f741c, 0x6c1eeffa,
0277     0xefea7fce, 0x6ffc309a, 0xefec3fca, 0x308fdf0a,
0278     0xadf85e7a, 0xaf7daefd, 0x5e7adf0a, 0x5e7aafdd,
0279     0x761f1088, 0x1e7c7efd, 0x3089fffe, 0x4908fb18,
0280     0x5fffdfff, 0xafbbf0f7, 0x4ef85f43, 0xadf81489,
0281     0x7a0f7089, 0xcfef5089, 0x7a0fdf0c, 0x5e7cafed,
0282     0xbc6e780f, 0xefef780f, 0xefef790f, 0xa7f85eeb,
0283     0xffef790f, 0xefef790f, 0x1489df0a, 0x5e7aadfd,
0284     0x5f09fffb, 0xe79aded9, 0xeff96079, 0x607ae79a,
0285     0xded8eff9, 0x60795edb, 0x607acfef, 0xefefefdf,
0286     0xefbfef7f, 0xeeffedff, 0xebffe7ff, 0xafefafdf,
0287     0xafbfaf7f, 0xaeffadff, 0xabffa7ff, 0x6fef6fdf,
0288     0x6fbf6f7f, 0x6eff6dff, 0x6bff67ff, 0x2fef2fdf,
0289     0x2fbf2f7f, 0x2eff2dff, 0x2bff27ff, 0x4e08fd1f,
0290     0xe5ff6e0f, 0xaff87eef, 0x7e0ffdef, 0xf11f6079,
0291     0xabf8f51e, 0x7e0af11c, 0x37cfae16, 0x7fec909a,
0292     0xadf8efdc, 0xcfeae52f, 0x7d0fe12b, 0xf11c6079,
0293     0x7e0a4df8, 0xcfea5ea0, 0x7d0befec, 0xcfea5ea2,
0294     0xe522efdc, 0x5ea2cfda, 0x4e08fd1f, 0x6e0faff8,
0295     0x7c1f761f, 0xfdeff91f, 0x6079abf8, 0x761cee00,
0296     0xf91f2bfb, 0xefefcfec, 0xf91f6079, 0x761c27fb,
0297     0xefdf5e83, 0xcfdc7fdd, 0x50f84bf8, 0x47fd7c1f,
0298     0x761ccfcf, 0x7eef7fed, 0x7dfd70ef, 0xef7e7f1e,
0299     0x771efb18, 0x6079e722, 0xe6bbe5bb, 0x2e66e5bb,
0300     0x600b2ee1, 0xe2bbe2bb, 0xe2bbe2bb, 0x2f5ee2bb,
0301     0xe2bb2ff9, 0x6079e2bb,
0302 };
0303 
0304 static uint patch_2f00[] __initdata = {
0305     0x30303030, 0x3e3e3030, 0xaf79b9b3, 0xbaa3b979,
0306     0x9693369f, 0x79f79777, 0x97333fff, 0xfb3b9e9f,
0307     0x79b91d11, 0x9e13f3ff, 0x3f9b6bd9, 0xe173d136,
0308     0x695669d1, 0x697b3daf, 0x79b93a3a, 0x3f979f91,
0309     0x379ff976, 0xf99777fd, 0x9779737d, 0xe9d6bbf9,
0310     0xbfffd9df, 0x97f7fd97, 0x6f7b9bff, 0xf9bd9683,
0311     0x397db973, 0xd97b3b9f, 0xd7f9f733, 0x9993bb9e,
0312     0xe1f9ef93, 0x73773337, 0xb936917d, 0x11f87379,
0313     0xb979d336, 0x8b7ded73, 0x1b7d9337, 0x31f3f22f,
0314     0x3f2327ee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee,
0315     0xeeeeee4b, 0xf4fbdbd2, 0x58bb1878, 0x577fdfd2,
0316     0xd573b773, 0xf7374b4f, 0xbdbd25b8, 0xb177d2d1,
0317     0x7376856b, 0xbfdd687b, 0xdd2fff8f, 0x78ffff8f,
0318     0xf22f0000,
0319 };
0320 
0321 static uint patch_2e00[] __initdata = {};
0322 #endif
0323 
0324 static void __init cpm_write_patch(cpm8xx_t *cp, int offset, uint *patch, int len)
0325 {
0326     if (!len)
0327         return;
0328     memcpy_toio(cp->cp_dpmem + offset, patch, len);
0329 }
0330 
0331 void __init cpm_load_patch(cpm8xx_t *cp)
0332 {
0333     out_be16(&cp->cp_rccr, 0);
0334 
0335     cpm_write_patch(cp, 0, patch_2000, sizeof(patch_2000));
0336     cpm_write_patch(cp, 0xf00, patch_2f00, sizeof(patch_2f00));
0337     cpm_write_patch(cp, 0xe00, patch_2e00, sizeof(patch_2e00));
0338 
0339     if (IS_ENABLED(CONFIG_I2C_SPI_UCODE_PATCH) ||
0340         IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
0341         u16 rpbase = 0x500;
0342         iic_t *iip;
0343         struct spi_pram *spp;
0344 
0345         iip = (iic_t *)&cp->cp_dparam[PROFF_IIC];
0346         out_be16(&iip->iic_rpbase, rpbase);
0347 
0348         /* Put SPI above the IIC, also 32-byte aligned. */
0349         spp = (struct spi_pram *)&cp->cp_dparam[PROFF_SPI];
0350         out_be16(&spp->rpbase, (rpbase + sizeof(iic_t) + 31) & ~31);
0351 
0352         if (IS_ENABLED(CONFIG_I2C_SPI_SMC1_UCODE_PATCH)) {
0353             smc_uart_t *smp;
0354 
0355             smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
0356             out_be16(&smp->smc_rpbase, 0x1FC0);
0357         }
0358     }
0359 
0360     if (IS_ENABLED(CONFIG_SMC_UCODE_PATCH)) {
0361         smc_uart_t *smp;
0362 
0363         if (IS_ENABLED(CONFIG_PPC_EARLY_DEBUG_CPM)) {
0364             int i;
0365 
0366             for (i = 0; i < sizeof(*smp); i += 4) {
0367                 u32 __iomem *src = (u32 __iomem *)&cp->cp_dparam[PROFF_SMC1 + i];
0368                 u32 __iomem *dst = (u32 __iomem *)&cp->cp_dparam[PROFF_DSP1 + i];
0369 
0370                 out_be32(dst, in_be32(src));
0371             }
0372         }
0373 
0374         smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC1];
0375         out_be16(&smp->smc_rpbase, 0x1ec0);
0376         smp = (smc_uart_t *)&cp->cp_dparam[PROFF_SMC2];
0377         out_be16(&smp->smc_rpbase, 0x1fc0);
0378     }
0379 
0380     out_be16(&cp->cp_cpmcr1, patch_params.cpmcr1);
0381     out_be16(&cp->cp_cpmcr2, patch_params.cpmcr2);
0382     out_be16(&cp->cp_cpmcr3, patch_params.cpmcr3);
0383     out_be16(&cp->cp_cpmcr4, patch_params.cpmcr4);
0384 
0385     out_be16(&cp->cp_rccr, patch_params.rccr);
0386 
0387     pr_info("%s microcode patch installed\n", patch_name);
0388 }