From: Borislav Petkov <bp@xxxxxxx> ... and __ro_after_init. Since the brand string is being read earlier now, in early_identify_cpu(), get_model_name() needs to read out the extended CPUID level for the brand string. This is temporary only, until the full CPUID read out has been added. Signed-off-by: Borislav Petkov <bp@xxxxxxx> Cc: linux-pm@xxxxxxxxxxxxxxx Cc: linux-edac@xxxxxxxxxxxxxxx Cc: linux-hwmon@xxxxxxxxxxxxxxx Cc: platform-driver-x86@xxxxxxxxxxxxxxx --- arch/x86/include/asm/processor.h | 2 +- arch/x86/kernel/cpu/amd.c | 4 ++-- arch/x86/kernel/cpu/centaur.c | 2 +- arch/x86/kernel/cpu/common.c | 28 ++++++++++++++-------------- arch/x86/kernel/cpu/cyrix.c | 5 ++--- arch/x86/kernel/cpu/intel.c | 2 +- arch/x86/kernel/cpu/proc.c | 2 +- arch/x86/kernel/setup.c | 2 ++ drivers/cpufreq/powernow-k8.c | 2 +- drivers/cpufreq/speedstep-centrino.c | 6 +++--- drivers/cpufreq/speedstep-lib.c | 2 +- drivers/edac/e752x_edac.c | 3 +-- drivers/hwmon/coretemp.c | 2 +- drivers/hwmon/k10temp.c | 2 +- drivers/platform/x86/intel_ips.c | 6 +++--- 15 files changed, 35 insertions(+), 35 deletions(-) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 2f6f7939dfe0..ace1f364fb0c 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -70,6 +70,7 @@ extern u16 __read_mostly tlb_lld_4m[NR_INFO]; extern u16 __read_mostly tlb_lld_1g[NR_INFO]; extern char x86_vendor_id[16]; +extern char x86_model_id[64]; /* * CPU type and hardware bug flags. Kept separately for each CPU. @@ -95,7 +96,6 @@ struct cpuinfo_x86 { /* Maximum supported CPUID level, -1=no CPUID: */ int cpuid_level; __u32 x86_capability[NCAPINTS + NBUGINTS]; - char x86_model_id[64]; /* in KB - valid for CPUS which support this call: */ unsigned int x86_cache_size; int x86_cache_alignment; /* In bytes */ diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index eeea634bee0a..47aedc1240a2 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -737,8 +737,8 @@ static void init_amd_k8(struct cpuinfo_x86 *c) } } - if (!c->x86_model_id[0]) - strcpy(c->x86_model_id, "Hammer"); + if (!x86_model_id[0]) + strcpy(x86_model_id, "Hammer"); #ifdef CONFIG_SMP /* diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c index 14433ff5b828..bab43a1588bc 100644 --- a/arch/x86/kernel/cpu/centaur.c +++ b/arch/x86/kernel/cpu/centaur.c @@ -239,7 +239,7 @@ static void init_centaur(struct cpuinfo_x86 *c) /* Add L1 data and code cache sizes. */ c->x86_cache_size = (cc>>24)+(dd>>24); } - sprintf(c->x86_model_id, "WinChip %s", name); + sprintf(x86_model_id, "WinChip %s", name); break; #endif case 6: diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index f77ca116fba7..0a96b6d56f13 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -95,9 +95,9 @@ static void default_init(struct cpuinfo_x86 *c) if (c->cpuid_level == -1) { /* No cpuid. It must be an ancient CPU */ if (c->x86 == 4) - strcpy(c->x86_model_id, "486"); + strcpy(x86_model_id, "486"); else if (c->x86 == 3) - strcpy(c->x86_model_id, "386"); + strcpy(x86_model_id, "386"); } #endif } @@ -561,17 +561,18 @@ static void get_model_name(struct cpuinfo_x86 *c) unsigned int *v; char *p, *q, *s; + c->extended_cpuid_level = cpuid_eax(0x80000000); if (c->extended_cpuid_level < 0x80000004) return; - v = (unsigned int *)c->x86_model_id; + v = (unsigned int *)x86_model_id; cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]); cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]); cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]); - c->x86_model_id[48] = 0; + x86_model_id[48] = 0; /* Trim whitespace */ - p = q = s = &c->x86_model_id[0]; + p = q = s = x86_model_id; while (*p == ' ') p++; @@ -1089,6 +1090,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) /* cyrix could have cpuid enabled via c_identify()*/ if (have_cpuid_p()) { cpu_get_vendor_name(); + get_model_name(c); cpu_detect(c); get_cpu_vendor(c); get_cpu_cap(c); @@ -1232,8 +1234,6 @@ static void generic_identify(struct cpuinfo_x86 *c) c->phys_proc_id = c->initial_apicid; } - get_model_name(c); /* Default name */ - detect_null_seg_behavior(c); /* @@ -1308,7 +1308,6 @@ static void identify_cpu(struct cpuinfo_x86 *c) c->x86_cache_size = 0; c->x86_vendor = X86_VENDOR_UNKNOWN; c->x86_model = c->x86_stepping = 0; /* So far unknown... */ - c->x86_model_id[0] = '\0'; /* Unset */ c->x86_max_cores = 1; c->x86_coreid_bits = 0; c->cu_id = 0xff; @@ -1367,14 +1366,15 @@ static void identify_cpu(struct cpuinfo_x86 *c) filter_cpuid_features(c, true); /* If the model name is still unset, do table lookup. */ - if (!c->x86_model_id[0]) { + if (!x86_model_id[0]) { const char *p; + p = table_lookup_model(c); if (p) - strcpy(c->x86_model_id, p); + strcpy(x86_model_id, p); else /* Last resort... */ - sprintf(c->x86_model_id, "%02x/%02x", + sprintf(x86_model_id, "%02x/%02x", c->x86, c->x86_model); } @@ -1489,11 +1489,11 @@ void print_cpu_info(struct cpuinfo_x86 *c) vendor = x86_vendor_id; } - if (vendor && !strstr(c->x86_model_id, vendor)) + if (vendor && !strstr(x86_model_id, vendor)) pr_cont("%s ", vendor); - if (c->x86_model_id[0]) - pr_cont("%s", c->x86_model_id); + if (x86_model_id[0]) + pr_cont("%s", x86_model_id); else pr_cont("%d86", c->x86); diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index 1f1f724dd4c3..e5394251175c 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c @@ -191,7 +191,6 @@ static void early_init_cyrix(struct cpuinfo_x86 *c) static void init_cyrix(struct cpuinfo_x86 *c) { unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0; - char *buf = c->x86_model_id; const char *p = NULL; /* @@ -351,9 +350,9 @@ static void init_cyrix(struct cpuinfo_x86 *c) dir0_msn = 7; break; } - strcpy(buf, Cx86_model[dir0_msn & 7]); + strcpy(x86_model_id, Cx86_model[dir0_msn & 7]); if (p) - strcat(buf, p); + strcat(x86_model_id, p); return; } diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index fc3c07fe7df5..f18115779e07 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -745,7 +745,7 @@ static void init_intel(struct cpuinfo_x86 *c) } if (p) - strcpy(c->x86_model_id, p); + strcpy(x86_model_id, p); } if (c->x86 == 15) diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index 999371ddfedb..d048b22cb304 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c @@ -70,7 +70,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) x86_vendor_id[0] ? x86_vendor_id : "unknown", c->x86, c->x86_model, - c->x86_model_id[0] ? c->x86_model_id : "unknown"); + x86_model_id[0] ? x86_model_id : "unknown"); if (c->x86_stepping || c->cpuid_level >= 0) seq_printf(m, "stepping\t: %d\n", c->x86_stepping); diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 9f21f595f0de..21c372c66498 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -162,6 +162,8 @@ static struct resource bss_resource = { }; char x86_vendor_id[16] __ro_after_init; +char x86_model_id[64] __ro_after_init; +EXPORT_SYMBOL_GPL(x86_model_id); #ifdef CONFIG_X86_32 /* cpu data as detected by the assembly code in head_32.S */ diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c index fb77b39a4ce3..476bbca2fd43 100644 --- a/drivers/cpufreq/powernow-k8.c +++ b/drivers/cpufreq/powernow-k8.c @@ -1204,7 +1204,7 @@ static int powernowk8_init(void) return ret; pr_info("Found %d %s (%d cpu cores) (" VERSION ")\n", - num_online_nodes(), boot_cpu_data.x86_model_id, supported_cpus); + num_online_nodes(), x86_model_id, supported_cpus); return ret; } diff --git a/drivers/cpufreq/speedstep-centrino.c b/drivers/cpufreq/speedstep-centrino.c index a1fb735685db..c0385ffb2732 100644 --- a/drivers/cpufreq/speedstep-centrino.c +++ b/drivers/cpufreq/speedstep-centrino.c @@ -238,21 +238,21 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy) for(model = models; model->cpu_id != NULL; model++) if (centrino_verify_cpu_id(cpu, model->cpu_id) && (model->model_name == NULL || - strcmp(cpu->x86_model_id, model->model_name) == 0)) + strcmp(x86_model_id, model->model_name) == 0)) break; if (model->cpu_id == NULL) { /* No match at all */ pr_debug("no support for CPU model \"%s\": " "send /proc/cpuinfo to " MAINTAINER "\n", - cpu->x86_model_id); + x86_model_id); return -ENOENT; } if (model->op_points == NULL) { /* Matched a non-match */ pr_debug("no table support for CPU model \"%s\"\n", - cpu->x86_model_id); + x86_model_id); pr_debug("try using the acpi-cpufreq driver\n"); return -ENOENT; } diff --git a/drivers/cpufreq/speedstep-lib.c b/drivers/cpufreq/speedstep-lib.c index cabb6f48eb77..aa83496f8734 100644 --- a/drivers/cpufreq/speedstep-lib.c +++ b/drivers/cpufreq/speedstep-lib.c @@ -312,7 +312,7 @@ enum speedstep_processor speedstep_detect_processor(void) * string */ if ((ebx == 0x0e) || - (strstr(c->x86_model_id, + (strstr(x86_model_id, "Mobile Intel(R) Pentium(R) 4") != NULL)) return SPEEDSTEP_CPU_P4M; break; diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c index b5de9a13ea3f..76304cbcd55d 100644 --- a/drivers/edac/e752x_edac.c +++ b/drivers/edac/e752x_edac.c @@ -1211,14 +1211,13 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx, */ static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt) { - char *cpu_id = cpu_data(0).x86_model_id; struct pci_dev *dev = pvt->dev_d0f1; int enable = 1; /* Allow module parameter override, else see if CPU supports parity */ if (sysbus_parity != -1) { enable = sysbus_parity; - } else if (cpu_id[0] && !strstr(cpu_id, "Xeon")) { + } else if (x86_model_id[0] && !strstr(x86_model_id, "Xeon")) { e752x_printk(KERN_INFO, "System Bus Parity not " "supported by CPU, disabling\n"); enable = 0; diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 10645c9bb7be..b3e444975930 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c @@ -262,7 +262,7 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) } for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) { - if (strstr(c->x86_model_id, tjmax_table[i].id)) + if (strstr(x86_model_id, tjmax_table[i].id)) return tjmax_table[i].tjmax; } diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c index 2cef0c37ff6f..1057c14b50c9 100644 --- a/drivers/hwmon/k10temp.c +++ b/drivers/hwmon/k10temp.c @@ -343,7 +343,7 @@ static int k10temp_probe(struct pci_dev *pdev, const struct tctl_offset *entry = &tctl_offset_table[i]; if (boot_cpu_data.x86 == entry->model && - strstr(boot_cpu_data.x86_model_id, entry->id)) { + strstr(x86_model_id, entry->id)) { data->temp_offset = entry->offset; break; } diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c index 225638a1b09e..4309f198cbad 100644 --- a/drivers/platform/x86/intel_ips.c +++ b/drivers/platform/x86/intel_ips.c @@ -1367,11 +1367,11 @@ static struct ips_mcp_limits *ips_detect_cpu(struct ips_driver *ips) else ips->turbo_toggle_allowed = false; - if (strstr(boot_cpu_data.x86_model_id, "CPU M")) + if (strstr(x86_model_id, "CPU M")) limits = &ips_sv_limits; - else if (strstr(boot_cpu_data.x86_model_id, "CPU L")) + else if (strstr(x86_model_id, "CPU L")) limits = &ips_lv_limits; - else if (strstr(boot_cpu_data.x86_model_id, "CPU U")) + else if (strstr(x86_model_id, "CPU U")) limits = &ips_ulv_limits; else { dev_info(ips->dev, "No CPUID match found.\n"); -- 2.19.1