]> xenbits.xensource.com Git - people/sstabellini/xen-unstable.git/.git/commitdiff
x86/cpu: Drop cpu_devs[] and $VENDOR_init_cpu() hooks
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 4 Apr 2019 14:51:25 +0000 (15:51 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 5 Apr 2019 10:09:07 +0000 (11:09 +0100)
These helpers each fill in a single cpu_devs[] pointer, and since c/s
00b4f4d0f "x86/cpuid: Drop get_cpu_vendor() completely", this array is read
exactly once on boot.

Delete the hooks and cpu_devs[], and have early_cpu_detect() pick the
appropriate cpu_dev structure directly.

As early_cpu_init() is empty now other than a call to early_cpu_detect(), and
this isn't expected to change moving forwards, rename the latter and delete
the former.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/cpu/amd.c
xen/arch/x86/cpu/centaur.c
xen/arch/x86/cpu/common.c
xen/arch/x86/cpu/cpu.h
xen/arch/x86/cpu/intel.c
xen/arch/x86/cpu/shanghai.c

index 7a73d62994109adb51026102570d02015f8aa49f..d58952b222ba6b3de70f4b09efe471d427cb33cd 100644 (file)
@@ -792,14 +792,8 @@ static void init_amd(struct cpuinfo_x86 *c)
        check_syscfg_dram_mod_en();
 }
 
-static const struct cpu_dev amd_cpu_dev = {
+const struct cpu_dev amd_cpu_dev = {
        .c_vendor       = "AMD",
        .c_early_init   = early_init_amd,
        .c_init         = init_amd,
 };
-
-int __init amd_init_cpu(void)
-{
-       cpu_devs[X86_VENDOR_AMD] = &amd_cpu_dev;
-       return 0;
-}
index 71f650368226aa42f685dd6eca630513d2d6b646..268f4d44d713f2edeeb235d475f5730b5f4d832b 100644 (file)
@@ -54,13 +54,7 @@ static void init_centaur(struct cpuinfo_x86 *c)
                init_c3(c);
 }
 
-static const struct cpu_dev centaur_cpu_dev = {
+const struct cpu_dev centaur_cpu_dev = {
        .c_vendor       = "Centaur",
        .c_init         = init_centaur,
 };
-
-int __init centaur_init_cpu(void)
-{
-       cpu_devs[X86_VENDOR_CENTAUR] = &centaur_cpu_dev;
-       return 0;
-}
index b2249b5b12f038618bc10a95e2030ad40b8cce85..c7b1f34239a5965d8bd8766fba91b4b4269c3073 100644 (file)
@@ -42,8 +42,6 @@ unsigned int __read_mostly levelling_caps;
 DEFINE_PER_CPU(struct cpuidmasks, cpuidmasks);
 struct cpuidmasks __read_mostly cpuidmask_defaults;
 
-const struct cpu_dev *__read_mostly cpu_devs[X86_VENDOR_NUM] = {};
-
 unsigned int paddr_bits __read_mostly = 36;
 unsigned int hap_paddr_bits __read_mostly = 36;
 unsigned int vaddr_bits __read_mostly = VADDR_BITS;
@@ -270,7 +268,7 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
 
    WARNING: this function is only called on the BP.  Don't add code here
    that is supposed to run on all CPUs. */
-static void __init early_cpu_detect(void)
+void __init early_cpu_init(void)
 {
        struct cpuinfo_x86 *c = &boot_cpu_data;
        u32 eax, ebx, ecx, edx;
@@ -284,12 +282,16 @@ static void __init early_cpu_detect(void)
        *(u32 *)&c->x86_vendor_id[4] = edx;
 
        c->x86_vendor = x86_cpuid_lookup_vendor(ebx, ecx, edx);
-       if (c->x86_vendor < ARRAY_SIZE(cpu_devs) && cpu_devs[c->x86_vendor])
-               this_cpu = cpu_devs[c->x86_vendor];
-       else
+       switch (c->x86_vendor) {
+       case X86_VENDOR_INTEL:    this_cpu = &intel_cpu_dev;    break;
+       case X86_VENDOR_AMD:      this_cpu = &amd_cpu_dev;      break;
+       case X86_VENDOR_CENTAUR:  this_cpu = &centaur_cpu_dev;  break;
+       case X86_VENDOR_SHANGHAI: this_cpu = &shanghai_cpu_dev; break;
+       default:
                printk(XENLOG_ERR
                       "Unrecognised or unsupported CPU vendor '%.12s'\n",
                       c->x86_vendor_id);
+       }
 
        cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
        c->x86 = get_cpu_family(eax, &c->x86_model, &c->x86_mask);
@@ -677,23 +679,6 @@ void print_cpu_info(unsigned int cpu)
 
 static cpumask_t cpu_initialized;
 
-/* This is hacky. :)
- * We're emulating future behavior.
- * In the future, the cpu-specific init functions will be called implicitly
- * via the magic of initcalls.
- * They will insert themselves into the cpu_devs structure.
- * Then, when cpu_init() is called, we can just iterate over that array.
- */
-
-void __init early_cpu_init(void)
-{
-       intel_cpu_init();
-       amd_init_cpu();
-       centaur_init_cpu();
-       shanghai_init_cpu();
-       early_cpu_detect();
-}
-
 /*
  * Sets up system tables and descriptors.
  *
index edc88b1eab742ed68397e9bcb48fd31b8e1f786e..62e4b03c0cbe6bbb5f4d08bb4e444ec44630796a 100644 (file)
@@ -6,7 +6,8 @@ struct cpu_dev {
        void            (*c_init)(struct cpuinfo_x86 * c);
 };
 
-extern const struct cpu_dev *cpu_devs[X86_VENDOR_NUM];
+extern const struct cpu_dev intel_cpu_dev, amd_cpu_dev, centaur_cpu_dev,
+    shanghai_cpu_dev;
 
 extern bool_t opt_arat;
 extern unsigned int opt_cpuid_mask_ecx, opt_cpuid_mask_edx;
@@ -15,8 +16,3 @@ extern unsigned int opt_cpuid_mask_ext_ecx, opt_cpuid_mask_ext_edx;
 
 extern int get_model_name(struct cpuinfo_x86 *c);
 extern void display_cacheinfo(struct cpuinfo_x86 *c);
-
-int intel_cpu_init(void);
-int amd_init_cpu(void);
-int centaur_init_cpu(void);
-int shanghai_init_cpu(void);
index f9c2ec439a6e6868668150dabad586ed6049a217..fcb37083d84527d235899f0c7b8165ba93e992b5 100644 (file)
@@ -348,17 +348,8 @@ static void init_intel(struct cpuinfo_x86 *c)
                __set_bit(X86_FEATURE_ARAT, c->x86_capability);
 }
 
-static const struct cpu_dev intel_cpu_dev = {
+const struct cpu_dev intel_cpu_dev = {
        .c_vendor       = "Intel",
        .c_early_init   = early_init_intel,
        .c_init         = init_intel,
 };
-
-int __init intel_cpu_init(void)
-{
-       cpu_devs[X86_VENDOR_INTEL] = &intel_cpu_dev;
-       return 0;
-}
-
-// arch_initcall(intel_cpu_init);
-
index 24af5c82595f3afa0c80d88c755de3c7b6935add..189e13eaef6b0d01339eb029835d14d7bc1c1fe9 100644 (file)
@@ -15,13 +15,7 @@ static void init_shanghai(struct cpuinfo_x86 *c)
     init_intel_cacheinfo(c);
 }
 
-static const struct cpu_dev shanghai_cpu_dev = {
+const struct cpu_dev shanghai_cpu_dev = {
     .c_vendor   = "  Shang",
     .c_init     = init_shanghai,
 };
-
-int __init shanghai_init_cpu(void)
-{
-    cpu_devs[X86_VENDOR_SHANGHAI] = &shanghai_cpu_dev;
-    return 0;
-}