|
@@ -36,9 +36,6 @@ MODULE_LICENSE("GPL v2");
|
|
|
#define UCODE_EQUIV_CPU_TABLE_TYPE 0x00000000
|
|
|
#define UCODE_UCODE_TYPE 0x00000001
|
|
|
|
|
|
-const struct firmware *firmware;
|
|
|
-static int supported_cpu;
|
|
|
-
|
|
|
struct equiv_cpu_entry {
|
|
|
u32 installed_cpu;
|
|
|
u32 fixed_errata_mask;
|
|
@@ -77,12 +74,15 @@ static struct equiv_cpu_entry *equiv_cpu_table;
|
|
|
|
|
|
static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig)
|
|
|
{
|
|
|
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
u32 dummy;
|
|
|
|
|
|
- if (!supported_cpu)
|
|
|
- return -1;
|
|
|
-
|
|
|
memset(csig, 0, sizeof(*csig));
|
|
|
+ if (c->x86_vendor != X86_VENDOR_AMD || c->x86 < 0x10) {
|
|
|
+ pr_warning("microcode: CPU%d: AMD CPU family 0x%x not "
|
|
|
+ "supported\n", cpu, c->x86);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
rdmsr(MSR_AMD64_PATCH_LEVEL, csig->rev, dummy);
|
|
|
pr_info("CPU%d: patch_level=0x%x\n", cpu, csig->rev);
|
|
|
return 0;
|
|
@@ -294,10 +294,14 @@ generic_load_microcode(int cpu, const u8 *data, size_t size)
|
|
|
|
|
|
static enum ucode_state request_microcode_fw(int cpu, struct device *device)
|
|
|
{
|
|
|
+ const char *fw_name = "amd-ucode/microcode_amd.bin";
|
|
|
+ const struct firmware *firmware;
|
|
|
enum ucode_state ret;
|
|
|
|
|
|
- if (firmware == NULL)
|
|
|
+ if (request_firmware(&firmware, fw_name, device)) {
|
|
|
+ printk(KERN_ERR "microcode: failed to load file %s\n", fw_name);
|
|
|
return UCODE_NFOUND;
|
|
|
+ }
|
|
|
|
|
|
if (*(u32 *)firmware->data != UCODE_MAGIC) {
|
|
|
pr_err("invalid UCODE_MAGIC (0x%08x)\n",
|
|
@@ -307,6 +311,8 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device)
|
|
|
|
|
|
ret = generic_load_microcode(cpu, firmware->data, firmware->size);
|
|
|
|
|
|
+ release_firmware(firmware);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -325,31 +331,7 @@ static void microcode_fini_cpu_amd(int cpu)
|
|
|
uci->mc = NULL;
|
|
|
}
|
|
|
|
|
|
-void init_microcode_amd(struct device *device)
|
|
|
-{
|
|
|
- const char *fw_name = "amd-ucode/microcode_amd.bin";
|
|
|
- struct cpuinfo_x86 *c = &boot_cpu_data;
|
|
|
-
|
|
|
- WARN_ON(c->x86_vendor != X86_VENDOR_AMD);
|
|
|
-
|
|
|
- if (c->x86 < 0x10) {
|
|
|
- pr_warning("AMD CPU family 0x%x not supported\n", c->x86);
|
|
|
- return;
|
|
|
- }
|
|
|
- supported_cpu = 1;
|
|
|
-
|
|
|
- if (request_firmware(&firmware, fw_name, device))
|
|
|
- pr_err("failed to load file %s\n", fw_name);
|
|
|
-}
|
|
|
-
|
|
|
-void fini_microcode_amd(void)
|
|
|
-{
|
|
|
- release_firmware(firmware);
|
|
|
-}
|
|
|
-
|
|
|
static struct microcode_ops microcode_amd_ops = {
|
|
|
- .init = init_microcode_amd,
|
|
|
- .fini = fini_microcode_amd,
|
|
|
.request_microcode_user = request_microcode_user,
|
|
|
.request_microcode_fw = request_microcode_fw,
|
|
|
.collect_cpu_info = collect_cpu_info_amd,
|