|
@@ -339,7 +339,7 @@ int __init save_microcode_in_initrd_amd(unsigned int cpuid_1_eax)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
ret = load_microcode_amd(true, x86_family(cpuid_1_eax), desc.data, desc.size);
|
|
ret = load_microcode_amd(true, x86_family(cpuid_1_eax), desc.data, desc.size);
|
|
- if (ret != UCODE_OK)
|
|
|
|
|
|
+ if (ret > UCODE_UPDATED)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -683,27 +683,35 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
|
|
static enum ucode_state
|
|
static enum ucode_state
|
|
load_microcode_amd(bool save, u8 family, const u8 *data, size_t size)
|
|
load_microcode_amd(bool save, u8 family, const u8 *data, size_t size)
|
|
{
|
|
{
|
|
|
|
+ struct ucode_patch *p;
|
|
enum ucode_state ret;
|
|
enum ucode_state ret;
|
|
|
|
|
|
/* free old equiv table */
|
|
/* free old equiv table */
|
|
free_equiv_cpu_table();
|
|
free_equiv_cpu_table();
|
|
|
|
|
|
ret = __load_microcode_amd(family, data, size);
|
|
ret = __load_microcode_amd(family, data, size);
|
|
-
|
|
|
|
- if (ret != UCODE_OK)
|
|
|
|
|
|
+ if (ret != UCODE_OK) {
|
|
cleanup();
|
|
cleanup();
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
|
|
-#ifdef CONFIG_X86_32
|
|
|
|
- /* save BSP's matching patch for early load */
|
|
|
|
- if (save) {
|
|
|
|
- struct ucode_patch *p = find_patch(0);
|
|
|
|
- if (p) {
|
|
|
|
- memset(amd_ucode_patch, 0, PATCH_MAX_SIZE);
|
|
|
|
- memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data),
|
|
|
|
- PATCH_MAX_SIZE));
|
|
|
|
- }
|
|
|
|
|
|
+ p = find_patch(0);
|
|
|
|
+ if (!p) {
|
|
|
|
+ return ret;
|
|
|
|
+ } else {
|
|
|
|
+ if (boot_cpu_data.microcode == p->patch_id)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ ret = UCODE_NEW;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
+
|
|
|
|
+ /* save BSP's matching patch for early load */
|
|
|
|
+ if (!save)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ memset(amd_ucode_patch, 0, PATCH_MAX_SIZE);
|
|
|
|
+ memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data), PATCH_MAX_SIZE));
|
|
|
|
+
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|