|
@@ -145,10 +145,9 @@ static int collect_cpu_info_amd(int cpu, struct cpu_signature *csig)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
|
|
+static unsigned int verify_patch_size(u8 family, u32 patch_size,
|
|
|
unsigned int size)
|
|
|
{
|
|
|
- struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
u32 max_size;
|
|
|
|
|
|
#define F1XH_MPB_MAX_SIZE 2048
|
|
@@ -156,7 +155,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
|
|
#define F15H_MPB_MAX_SIZE 4096
|
|
|
#define F16H_MPB_MAX_SIZE 3458
|
|
|
|
|
|
- switch (c->x86) {
|
|
|
+ switch (family) {
|
|
|
case 0x14:
|
|
|
max_size = F14H_MPB_MAX_SIZE;
|
|
|
break;
|
|
@@ -277,9 +276,8 @@ static void cleanup(void)
|
|
|
* driver cannot continue functioning normally. In such cases, we tear
|
|
|
* down everything we've used up so far and exit.
|
|
|
*/
|
|
|
-static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
|
|
+static int verify_and_add_patch(u8 family, u8 *fw, unsigned int leftover)
|
|
|
{
|
|
|
- struct cpuinfo_x86 *c = &cpu_data(cpu);
|
|
|
struct microcode_header_amd *mc_hdr;
|
|
|
struct ucode_patch *patch;
|
|
|
unsigned int patch_size, crnt_size, ret;
|
|
@@ -299,7 +297,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
|
|
|
|
|
/* check if patch is for the current family */
|
|
|
proc_fam = ((proc_fam >> 8) & 0xf) + ((proc_fam >> 20) & 0xff);
|
|
|
- if (proc_fam != c->x86)
|
|
|
+ if (proc_fam != family)
|
|
|
return crnt_size;
|
|
|
|
|
|
if (mc_hdr->nb_dev_id || mc_hdr->sb_dev_id) {
|
|
@@ -308,7 +306,7 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
|
|
return crnt_size;
|
|
|
}
|
|
|
|
|
|
- ret = verify_patch_size(cpu, patch_size, leftover);
|
|
|
+ ret = verify_patch_size(family, patch_size, leftover);
|
|
|
if (!ret) {
|
|
|
pr_err("Patch-ID 0x%08x: size mismatch.\n", mc_hdr->patch_id);
|
|
|
return crnt_size;
|
|
@@ -339,7 +337,8 @@ static int verify_and_add_patch(unsigned int cpu, u8 *fw, unsigned int leftover)
|
|
|
return crnt_size;
|
|
|
}
|
|
|
|
|
|
-static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t size)
|
|
|
+static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
|
|
|
+ size_t size)
|
|
|
{
|
|
|
enum ucode_state ret = UCODE_ERROR;
|
|
|
unsigned int leftover;
|
|
@@ -362,7 +361,7 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz
|
|
|
}
|
|
|
|
|
|
while (leftover) {
|
|
|
- crnt_size = verify_and_add_patch(cpu, fw, leftover);
|
|
|
+ crnt_size = verify_and_add_patch(family, fw, leftover);
|
|
|
if (crnt_size < 0)
|
|
|
return ret;
|
|
|
|
|
@@ -373,22 +372,22 @@ static enum ucode_state __load_microcode_amd(int cpu, const u8 *data, size_t siz
|
|
|
return UCODE_OK;
|
|
|
}
|
|
|
|
|
|
-enum ucode_state load_microcode_amd(int cpu, const u8 *data, size_t size)
|
|
|
+enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size)
|
|
|
{
|
|
|
enum ucode_state ret;
|
|
|
|
|
|
/* free old equiv table */
|
|
|
free_equiv_cpu_table();
|
|
|
|
|
|
- ret = __load_microcode_amd(cpu, data, size);
|
|
|
+ ret = __load_microcode_amd(family, data, size);
|
|
|
|
|
|
if (ret != UCODE_OK)
|
|
|
cleanup();
|
|
|
|
|
|
#if defined(CONFIG_MICROCODE_AMD_EARLY) && defined(CONFIG_X86_32)
|
|
|
/* save BSP's matching patch for early load */
|
|
|
- if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) {
|
|
|
- struct ucode_patch *p = find_patch(cpu);
|
|
|
+ if (cpu_data(smp_processor_id()).cpu_index == boot_cpu_data.cpu_index) {
|
|
|
+ struct ucode_patch *p = find_patch(smp_processor_id());
|
|
|
if (p) {
|
|
|
memset(amd_bsp_mpb, 0, MPB_MAX_SIZE);
|
|
|
memcpy(amd_bsp_mpb, p->data, min_t(u32, ksize(p->data),
|
|
@@ -441,7 +440,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
|
|
|
goto fw_release;
|
|
|
}
|
|
|
|
|
|
- ret = load_microcode_amd(cpu, fw->data, fw->size);
|
|
|
+ ret = load_microcode_amd(c->x86, fw->data, fw->size);
|
|
|
|
|
|
fw_release:
|
|
|
release_firmware(fw);
|