diff options
Diffstat (limited to 'arch/x86/kernel/microcode_amd.c')
-rw-r--r-- | arch/x86/kernel/microcode_amd.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 47ebb1dbfbcb..7123b5df479d 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
@@ -145,10 +145,9 @@ static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig) | |||
145 | return 0; | 145 | return 0; |
146 | } | 146 | } |
147 | 147 | ||
148 | static unsigned int verify_patch_size(int cpu, u32 patch_size, | 148 | static unsigned int verify_patch_size(u8 family, u32 patch_size, |
149 | unsigned int size) | 149 | unsigned int size) |
150 | { | 150 | { |
151 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
152 | u32 max_size; | 151 | u32 max_size; |
153 | 152 | ||
154 | #define F1XH_MPB_MAX_SIZE 2048 | 153 | #define F1XH_MPB_MAX_SIZE 2048 |
@@ -156,7 +155,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size, | |||
156 | #define F15H_MPB_MAX_SIZE 4096 | 155 | #define F15H_MPB_MAX_SIZE 4096 |
157 | #define F16H_MPB_MAX_SIZE 3458 | 156 | #define F16H_MPB_MAX_SIZE 3458 |
158 | 157 | ||
159 | switch (c->x86) { | 158 | switch (family) { |
160 | case 0x14: | 159 | case 0x14: |
161 | max_size = F14H_MPB_MAX_SIZE; | 160 | max_size = F14H_MPB_MAX_SIZE; |
162 | break; | 161 | break; |
@@ -220,12 +219,13 @@ int apply_microcode_amd(int cpu) | |||
220 | return 0; | 219 | return 0; |
221 | } | 220 | } |
222 | 221 | ||
223 | if (__apply_microcode_amd(mc_amd)) | 222 | if (__apply_microcode_amd(mc_amd)) { |
224 | pr_err("CPU%d: update failed for patch_level=0x%08x\n", | 223 | pr_err("CPU%d: update failed for patch_level=0x%08x\n", |
225 | cpu, mc_amd->hdr.patch_id); | 224 | cpu, mc_amd->hdr.patch_id); |
226 | else | 225 | return -1; |
227 | pr_info("CPU%d: new patch_level=0x%08x\n", cpu, | 226 | } |
228 | mc_amd->hdr.patch_id); | 227 | pr_info("CPU%d: new patch_level=0x%08x\n", cpu, |
228 | mc_amd->hdr.patch_id); | ||
229 | 229 | ||
230 | uci->cpu_sig.rev = mc_amd->hdr.patch_id; | 230 | uci->cpu_sig.rev = mc_amd->hdr.patch_id; |
231 | c->microcode = mc_amd->hdr.patch_id; | 231 | c->microcode = mc_amd->hdr.patch_id; |
@@ -276,9 +276,8 @@ static void cleanup(void) | |||
276 | * driver cannot continue functioning normally. In such cases, we tear | 276 | * driver cannot continue functioning normally. In such cases, we tear |
277 | * down everything we've used up so far and exit. | 277 | * down everything we've used up so far and exit. |
278 | */ | 278 | */ |
279 | static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | 279 | static int verify_and_add_patch(u8 family, u8 *fw, unsigned int leftover) |
280 | { | 280 | { |
281 | struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
282 | struct microcode_header_amd *mc_hdr; | 281 | struct microcode_header_amd *mc_hdr; |
283 | struct ucode_patch *patch; | 282 | struct ucode_patch *patch; |
284 | unsigned int patch_size, crnt_size, ret; | 283 | unsigned int patch_size, crnt_size, ret; |
@@ -298,7 +297,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
298 | 297 | ||
299 | /* check if patch is for the current family */ | 298 | /* check if patch is for the current family */ |
300 | proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff); | 299 | proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff); |
301 | if (proc_fam != c->x86) | 300 | if (proc_fam != family) |
302 | return crnt_size; | 301 | return crnt_size; |
303 | 302 | ||
304 | if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) { | 303 | if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) { |
@@ -307,7 +306,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
307 | return crnt_size; | 306 | return crnt_size; |
308 | } | 307 | } |
309 | 308 | ||
310 | ret = verify_patch_size(cpu, patch_size, leftover); | 309 | ret = verify_patch_size(family, patch_size, leftover); |
311 | if (!ret) { | 310 | if (!ret) { |
312 | pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id); | 311 | pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id); |
313 | return crnt_size; | 312 | return crnt_size; |
@@ -338,7 +337,8 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover) | |||
338 | return crnt_size; | 337 | return crnt_size; |
339 | } | 338 | } |
340 | 339 | ||
341 | static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t size) | 340 | static enum ucode_state __load_microcode_amd(u8 family, const u8 *data, |
341 | size_t size) | ||
342 | { | 342 | { |
343 | enum ucode_state ret = UCODE_ERROR; | 343 | enum ucode_state ret = UCODE_ERROR; |
344 | unsigned int leftover; | 344 | unsigned int leftover; |
@@ -361,7 +361,7 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz | |||
361 | } | 361 | } |
362 | 362 | ||
363 | while (leftover) { | 363 | while (leftover) { |
364 | crnt_size = verify_and_add_patch(cpu, fw, leftover); | 364 | crnt_size = verify_and_add_patch(family, fw, leftover); |
365 | if (crnt_size < 0) | 365 | if (crnt_size < 0) |
366 | return ret; | 366 | return ret; |
367 | 367 | ||
@@ -372,22 +372,22 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz | |||
372 | return UCODE_OK; | 372 | return UCODE_OK; |
373 | } | 373 | } |
374 | 374 | ||
375 | enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size) | 375 | enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size) |
376 | { | 376 | { |
377 | enum ucode_state ret; | 377 | enum ucode_state ret; |
378 | 378 | ||
379 | /* free old equiv table */ | 379 | /* free old equiv table */ |
380 | free_equiv_cpu_table(); | 380 | free_equiv_cpu_table(); |
381 | 381 | ||
382 | ret = __load_microcode_amd(cpu, data, size); | 382 | ret = __load_microcode_amd(family, data, size); |
383 | 383 | ||
384 | if (ret != UCODE_OK) | 384 | if (ret != UCODE_OK) |
385 | cleanup(); | 385 | cleanup(); |
386 | 386 | ||
387 | #if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32) | 387 | #if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32) |
388 | /* save BSP's matching patch for early load */ | 388 | /* save BSP's matching patch for early load */ |
389 | if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) { | 389 | if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) { |
390 | struct ucode_patch *p = find_patch(cpu); | 390 | struct ucode_patch *p = find_patch(smp_processor_id()); |
391 | if (p) { | 391 | if (p) { |
392 | memset(amd_bsp_mpb, 0, MPB_MAX_SIZE); | 392 | memset(amd_bsp_mpb, 0, MPB_MAX_SIZE); |
393 | memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data), | 393 | memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data), |
@@ -440,7 +440,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, | |||
440 | goto fw_release; | 440 | goto fw_release; |
441 | } | 441 | } |
442 | 442 | ||
443 | ret = load_microcode_amd(cpu, fw->data, fw->size); | 443 | ret = load_microcode_amd(c->x86, fw->data, fw->size); |
444 | 444 | ||
445 | fw_release: | 445 | fw_release: |
446 | release_firmware(fw); | 446 | release_firmware(fw); |