|
@@ -311,13 +311,33 @@ out:
|
|
|
return state;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * AMD microcode firmware naming convention, up to family 15h they are in
|
|
|
+ * the legacy file:
|
|
|
+ *
|
|
|
+ * amd-ucode/microcode_amd.bin
|
|
|
+ *
|
|
|
+ * This legacy file is always smaller than 2K in size.
|
|
|
+ *
|
|
|
+ * Starting at family 15h they are in family specific firmware files:
|
|
|
+ *
|
|
|
+ * amd-ucode/microcode_amd_fam15h.bin
|
|
|
+ * amd-ucode/microcode_amd_fam16h.bin
|
|
|
+ * ...
|
|
|
+ *
|
|
|
+ * These might be larger than 2K.
|
|
|
+ */
|
|
|
static enum ucode_state request_microcode_amd(int cpu, struct device *device)
|
|
|
{
|
|
|
- const char *fw_name = "amd-ucode/microcode_amd.bin";
|
|
|
+ char fw_name[36] = "amd-ucode/microcode_amd.bin";
|
|
|
const struct firmware *fw;
|
|
|
enum ucode_state ret = UCODE_NFOUND;
|
|
|
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
+
|
|
|
+ if (c->x86 >= 0x15)
|
|
|
+ snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86);
|
|
|
|
|
|
- if (request_firmware(&fw, fw_name, device)) {
|
|
|
+ if (request_firmware(&fw, (const char *)fw_name, device)) {
|
|
|
pr_err("failed to load file %s\n", fw_name);
|
|
|
goto out;
|
|
|
}
|