cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

micropatch.c (13995B)


      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
     23struct 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
     37static char patch_name[] __initdata = "I2C/SPI";
     38
     39static struct patch_params patch_params __initdata = {
     40	1, 0x802a, 0x8028, 0x802e, 0x802c,
     41};
     42
     43static 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
     75static 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
     86static 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
     95static char patch_name[] __initdata = "I2C/SPI/SMC1";
     96
     97static struct patch_params patch_params __initdata = {
     98	3, 0x8080, 0x808a, 0x8028, 0x802a,
     99};
    100
    101static 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
    184static 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
    203static 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
    217static char patch_name[] __initdata = "USB SOF";
    218
    219static struct patch_params patch_params __initdata = {
    220	9,
    221};
    222
    223static uint patch_2000[] __initdata = {
    224	0x7fff0000, 0x7ffd0000, 0x7ffb0000, 0x49f7ba5b,
    225	0xba383ffb, 0xf9b8b46d, 0xe5ab4e07, 0xaf77bffe,
    226	0x3f7bbf79, 0xba5bba38, 0xe7676076, 0x60750000
    227};
    228
    229static uint patch_2f00[] __initdata = {
    230	0x3030304c, 0xcab9e441, 0xa1aaf220
    231};
    232
    233static uint patch_2e00[] __initdata = {};
    234#endif
    235
    236/*
    237 * SMC relocation patch arrays.
    238 */
    239
    240#ifdef CONFIG_SMC_UCODE_PATCH
    241
    242static char patch_name[] __initdata = "SMC";
    243
    244static struct patch_params patch_params __initdata = {
    245	2, 0x8080, 0x8088,
    246};
    247
    248static 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
    304static 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
    321static uint patch_2e00[] __initdata = {};
    322#endif
    323
    324static 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
    331void __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}