|
@@ -126,6 +126,37 @@ static size_t compute_container_size(u8 *data, u32 total_size)
|
|
|
return size;
|
|
|
}
|
|
|
|
|
|
+static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table,
|
|
|
+ unsigned int sig)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ if (!equiv_cpu_table)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ while (equiv_cpu_table[i].installed_cpu != 0) {
|
|
|
+ if (sig == equiv_cpu_table[i].installed_cpu)
|
|
|
+ return equiv_cpu_table[i].equiv_cpu;
|
|
|
+
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int __apply_microcode_amd(struct microcode_amd *mc_amd)
|
|
|
+{
|
|
|
+ u32 rev, dummy;
|
|
|
+
|
|
|
+ native_wrmsrl(MSR_AMD64_PATCH_LOADER, (u64)(long)&mc_amd->hdr.data_code);
|
|
|
+
|
|
|
+ /* verify patch application was successful */
|
|
|
+ native_rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
|
|
|
+ if (rev != mc_amd->hdr.patch_id)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Early load occurs before we can vmalloc(). So we look for the microcode
|
|
|
* patch container file in initrd, traverse equivalent cpu table, look for a
|
|
@@ -395,6 +426,9 @@ void load_ucode_amd_ap(unsigned int family)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static enum ucode_state
|
|
|
+load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size);
|
|
|
+
|
|
|
int __init save_microcode_in_initrd_amd(unsigned int family)
|
|
|
{
|
|
|
unsigned long cont;
|
|
@@ -649,21 +683,7 @@ bool check_current_patch_level(u32 *rev, bool early)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-int __apply_microcode_amd(struct microcode_amd *mc_amd)
|
|
|
-{
|
|
|
- u32 rev, dummy;
|
|
|
-
|
|
|
- native_wrmsrl(MSR_AMD64_PATCH_LOADER, (u64)(long)&mc_amd->hdr.data_code);
|
|
|
-
|
|
|
- /* verify patch application was successful */
|
|
|
- native_rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
|
|
|
- if (rev != mc_amd->hdr.patch_id)
|
|
|
- return -1;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int apply_microcode_amd(int cpu)
|
|
|
+static int apply_microcode_amd(int cpu)
|
|
|
{
|
|
|
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
struct microcode_amd *mc_amd;
|
|
@@ -846,7 +866,8 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
|
|
|
return UCODE_OK;
|
|
|
}
|
|
|
|
|
|
-enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size)
|
|
|
+static enum ucode_state
|
|
|
+load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size)
|
|
|
{
|
|
|
enum ucode_state ret;
|
|
|
|