x86: remove cpu_vendor_dev
authorYinghai Lu <yhlu.kernel@gmail.com>
Thu, 4 Sep 2008 19:09:45 +0000 (21:09 +0200)
committerIngo Molnar <mingo@elte.hu>
Thu, 4 Sep 2008 19:09:45 +0000 (21:09 +0200)
1. add c_x86_vendor into cpu_dev
2. change cpu_devs to static
3. check c_x86_vendor before put that cpu_dev into array
4. remove alignment for 64bit
5. order the sequence in cpu_devs according to link sequence...
   so could put intel at first, then amd...

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
15 files changed:
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/cpu/amd.c
arch/x86/kernel/cpu/amd_64.c
arch/x86/kernel/cpu/centaur.c
arch/x86/kernel/cpu/centaur_64.c
arch/x86/kernel/cpu/common.c
arch/x86/kernel/cpu/common_64.c
arch/x86/kernel/cpu/cpu.h
arch/x86/kernel/cpu/cyrix.c
arch/x86/kernel/cpu/intel.c
arch/x86/kernel/cpu/intel_64.c
arch/x86/kernel/cpu/transmeta.c
arch/x86/kernel/cpu/umc.c
arch/x86/kernel/vmlinux_32.lds.S
arch/x86/kernel/vmlinux_64.lds.S

index 3ede19a4e0b20c2323749d4ce8fc9ce220e50b79..403e689df0b8f2c11503cd88df5c4d4d06f79a78 100644 (file)
@@ -8,14 +8,14 @@ obj-y                 += proc.o capflags.o powerflags.o
 obj-$(CONFIG_X86_32)   += common.o bugs.o cmpxchg.o
 obj-$(CONFIG_X86_64)   += common_64.o bugs_64.o
 
+obj-$(CONFIG_CPU_SUP_INTEL_32)         += intel.o
+obj-$(CONFIG_CPU_SUP_INTEL_64)         += intel_64.o
 obj-$(CONFIG_CPU_SUP_AMD_32)           += amd.o
 obj-$(CONFIG_CPU_SUP_AMD_64)           += amd_64.o
 obj-$(CONFIG_CPU_SUP_CYRIX_32)         += cyrix.o
 obj-$(CONFIG_CPU_SUP_CENTAUR_32)       += centaur.o
 obj-$(CONFIG_CPU_SUP_CENTAUR_64)       += centaur_64.o
 obj-$(CONFIG_CPU_SUP_TRANSMETA_32)     += transmeta.o
-obj-$(CONFIG_CPU_SUP_INTEL_32)         += intel.o
-obj-$(CONFIG_CPU_SUP_INTEL_64)         += intel_64.o
 obj-$(CONFIG_CPU_SUP_UMC_32)           += umc.o
 
 obj-$(CONFIG_X86_MCE)  += mcheck/
index 18514ed261047b057104b6bc4384d0ab18908cfd..d64ea6097ca7267b39388388158dc1e6c1ea4c13 100644 (file)
@@ -298,6 +298,7 @@ static struct cpu_dev amd_cpu_dev __cpuinitdata = {
        .c_early_init   = early_init_amd,
        .c_init         = init_amd,
        .c_size_cache   = amd_size_cache,
+       .c_x86_vendor   = X86_VENDOR_AMD,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_AMD, &amd_cpu_dev);
+cpu_dev_register(amd_cpu_dev);
index d1692b2a41ffac4bf6b9423d38af42741a847b36..d1c721c0c49f4afa9a77cb0b9911d6bf523cf58e 100644 (file)
@@ -218,7 +218,7 @@ static struct cpu_dev amd_cpu_dev __cpuinitdata = {
        .c_ident        = { "AuthenticAMD" },
        .c_early_init   = early_init_amd,
        .c_init         = init_amd,
+       .c_x86_vendor   = X86_VENDOR_AMD,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_AMD, &amd_cpu_dev);
-
+cpu_dev_register(amd_cpu_dev);
index a0534c04d38a5d385072b869903eea4339553293..e5f6d89521bf65ce53cc9b816539a4546440c11a 100644 (file)
@@ -475,6 +475,7 @@ static struct cpu_dev centaur_cpu_dev __cpuinitdata = {
        .c_early_init   = early_init_centaur,
        .c_init         = init_centaur,
        .c_size_cache   = centaur_size_cache,
+       .c_x86_vendor   = X86_VENDOR_CENTAUR,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_CENTAUR, &centaur_cpu_dev);
+cpu_dev_register(centaur_cpu_dev);
index 1d181c40e2e155c2ddcd62a388d2b78738e4e8e3..49cfc6d2f2fb446d4d2332c6dffb7f14714eaf53 100644 (file)
@@ -29,7 +29,8 @@ static struct cpu_dev centaur_cpu_dev __cpuinitdata = {
        .c_ident        = { "CentaurHauls" },
        .c_early_init   = early_init_centaur,
        .c_init         = init_centaur,
+       .c_x86_vendor   = X86_VENDOR_CENTAUR,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_CENTAUR, &centaur_cpu_dev);
+cpu_dev_register(centaur_cpu_dev);
 
index 10e89ae5a600e29d2c7b14dc5d52a16f16d92828..ee1044ca481dc4ea2098af46c14cbbc205f444b4 100644 (file)
@@ -75,7 +75,7 @@ void switch_to_new_gdt(void)
 static int cachesize_override __cpuinitdata = -1;
 static int disable_x86_serial_nr __cpuinitdata = 1;
 
-struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
+static struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
 
 static void __cpuinit default_init(struct cpuinfo_x86 *c)
 {
@@ -93,8 +93,9 @@ static void __cpuinit default_init(struct cpuinfo_x86 *c)
 static struct cpu_dev __cpuinitdata default_cpu = {
        .c_init = default_init,
        .c_vendor = "Unknown",
+       .c_x86_vendor = X86_VENDOR_UNKNOWN,
 };
-static struct cpu_dev *this_cpu __cpuinitdata = &default_cpu;
+static struct cpu_dev *this_cpu __cpuinitdata;
 
 static int __init cachesize_setup(char *str)
 {
@@ -250,21 +251,24 @@ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
        static int printed;
 
        for (i = 0; i < X86_VENDOR_NUM; i++) {
-               if (cpu_devs[i]) {
-                       if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
-                           (cpu_devs[i]->c_ident[1] &&
-                            !strcmp(v, cpu_devs[i]->c_ident[1]))) {
-                               c->x86_vendor = i;
-                               this_cpu = cpu_devs[i];
-                               return;
-                       }
+               if (!cpu_devs[i])
+                       break;
+
+               if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
+                   (cpu_devs[i]->c_ident[1] &&
+                    !strcmp(v, cpu_devs[i]->c_ident[1]))) {
+                       this_cpu = cpu_devs[i];
+                       c->x86_vendor = this_cpu->c_x86_vendor;
+                       return;
                }
        }
+
        if (!printed) {
                printed++;
                printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
                printk(KERN_ERR "CPU: Your system may be unstable.\n");
        }
+
        c->x86_vendor = X86_VENDOR_UNKNOWN;
        this_cpu = &default_cpu;
 }
@@ -315,25 +319,6 @@ static int __cpuinit have_cpuid_p(void)
        return flag_is_changeable_p(X86_EFLAGS_ID);
 }
 
-static void __init early_cpu_support_print(void)
-{
-       int i,j;
-       struct cpu_dev *cpu_devx;
-
-       printk("KERNEL supported cpus:\n");
-       for (i = 0; i < X86_VENDOR_NUM; i++) {
-               cpu_devx = cpu_devs[i];
-               if (!cpu_devx)
-                       continue;
-               for (j = 0; j < 2; j++) {
-                       if (!cpu_devx->c_ident[j])
-                               continue;
-                       printk("  %s %s\n", cpu_devx->c_vendor,
-                               cpu_devx->c_ident[j]);
-               }
-       }
-}
-
 void __cpuinit cpu_detect(struct cpuinfo_x86 *c)
 {
        /* Get vendor name */
@@ -411,21 +396,35 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
 
        get_cpu_cap(c);
 
-       if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
-           cpu_devs[c->x86_vendor]->c_early_init)
-               cpu_devs[c->x86_vendor]->c_early_init(c);
+       if (this_cpu->c_early_init)
+               this_cpu->c_early_init(c);
 
        validate_pat_support(c);
 }
 
 void __init early_cpu_init(void)
 {
-       struct cpu_vendor_dev *cvdev;
+       struct cpu_dev **cdev;
+       int count = 0;
+
+       printk("KERNEL supported cpus:\n");
+       for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
+               struct cpu_dev *cpudev = *cdev;
+               unsigned int j;
 
-       for (cvdev = __x86cpuvendor_start; cvdev < __x86cpuvendor_end; cvdev++)
-               cpu_devs[cvdev->vendor] = cvdev->cpu_dev;
+               if (count >= X86_VENDOR_NUM)
+                       break;
+               cpu_devs[count] = cpudev;
+               count++;
+
+               for (j = 0; j < 2; j++) {
+                       if (!cpudev->c_ident[j])
+                               continue;
+                       printk("  %s %s\n", cpudev->c_vendor,
+                               cpudev->c_ident[j]);
+               }
+       }
 
-       early_cpu_support_print();
        early_identify_cpu(&boot_cpu_data);
 }
 
index 522a5f2e405de65e1a95e88c883af9e5c9b59fd8..b82479c108359d3326a608df8dc7e3f7c4a38daa 100644 (file)
@@ -66,7 +66,7 @@ void switch_to_new_gdt(void)
        load_gdt(&gdt_descr);
 }
 
-struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
+static struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
 
 static void __cpuinit default_init(struct cpuinfo_x86 *c)
 {
@@ -76,8 +76,9 @@ static void __cpuinit default_init(struct cpuinfo_x86 *c)
 static struct cpu_dev __cpuinitdata default_cpu = {
        .c_init = default_init,
        .c_vendor = "Unknown",
+       .c_x86_vendor = X86_VENDOR_UNKNOWN,
 };
-static struct cpu_dev *this_cpu __cpuinitdata = &default_cpu;
+static struct cpu_dev *this_cpu __cpuinitdata;
 
 int __cpuinit get_model_name(struct cpuinfo_x86 *c)
 {
@@ -178,44 +179,28 @@ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
        static int printed;
 
        for (i = 0; i < X86_VENDOR_NUM; i++) {
-               if (cpu_devs[i]) {
-                       if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
-                           (cpu_devs[i]->c_ident[1] &&
-                            !strcmp(v, cpu_devs[i]->c_ident[1]))) {
-                               c->x86_vendor = i;
-                               this_cpu = cpu_devs[i];
-                               return;
-                       }
+               if (!cpu_devs[i])
+                       break;
+
+               if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
+                   (cpu_devs[i]->c_ident[1] &&
+                    !strcmp(v, cpu_devs[i]->c_ident[1]))) {
+                       this_cpu = cpu_devs[i];
+                       c->x86_vendor = this_cpu->c_x86_vendor;
+                       return;
                }
        }
+
        if (!printed) {
                printed++;
                printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
                printk(KERN_ERR "CPU: Your system may be unstable.\n");
        }
+
        c->x86_vendor = X86_VENDOR_UNKNOWN;
        this_cpu = &default_cpu;
 }
 
-static void __init early_cpu_support_print(void)
-{
-       int i,j;
-       struct cpu_dev *cpu_devx;
-
-       printk("KERNEL supported cpus:\n");
-       for (i = 0; i < X86_VENDOR_NUM; i++) {
-               cpu_devx = cpu_devs[i];
-               if (!cpu_devx)
-                       continue;
-               for (j = 0; j < 2; j++) {
-                       if (!cpu_devx->c_ident[j])
-                               continue;
-                       printk("  %s %s\n", cpu_devx->c_vendor,
-                               cpu_devx->c_ident[j]);
-               }
-       }
-}
-
 void __cpuinit cpu_detect(struct cpuinfo_x86 *c)
 {
        /* Get vendor name */
@@ -306,21 +291,35 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
 
        get_cpu_cap(c);
 
-       if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
-           cpu_devs[c->x86_vendor]->c_early_init)
-               cpu_devs[c->x86_vendor]->c_early_init(c);
+       if (this_cpu->c_early_init)
+               this_cpu->c_early_init(c);
 
        validate_pat_support(c);
 }
 
 void __init early_cpu_init(void)
 {
-       struct cpu_vendor_dev *cvdev;
+       struct cpu_dev **cdev;
+       int count = 0;
+
+       printk("KERNEL supported cpus:\n");
+       for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
+               struct cpu_dev *cpudev = *cdev;
+               unsigned int j;
 
-       for (cvdev = __x86cpuvendor_start; cvdev < __x86cpuvendor_end; cvdev++)
-               cpu_devs[cvdev->vendor] = cvdev->cpu_dev;
+               if (count >= X86_VENDOR_NUM)
+                       break;
+               cpu_devs[count] = cpudev;
+               count++;
+
+               for (j = 0; j < 2; j++) {
+                       if (!cpudev->c_ident[j])
+                               continue;
+                       printk("  %s %s\n", cpudev->c_vendor,
+                               cpudev->c_ident[j]);
+               }
+       }
 
-       early_cpu_support_print();
        early_identify_cpu(&boot_cpu_data);
 }
 
index 4d894e8565feb6ad22b103f9c87ae51641ca0eda..3cc9d92afd8f5bc8fcc7613de0f75771056ca008 100644 (file)
@@ -21,21 +21,15 @@ struct cpu_dev {
        void            (*c_init)(struct cpuinfo_x86 * c);
        void            (*c_identify)(struct cpuinfo_x86 * c);
        unsigned int    (*c_size_cache)(struct cpuinfo_x86 * c, unsigned int size);
+       int     c_x86_vendor;
 };
 
-extern struct cpu_dev * cpu_devs [X86_VENDOR_NUM];
+#define cpu_dev_register(cpu_devX) \
+       static struct cpu_dev *__cpu_dev_##cpu_devX __used \
+       __attribute__((__section__(".x86_cpu_dev.init"))) = \
+       &cpu_devX;
 
-struct cpu_vendor_dev {
-       int vendor;
-       struct cpu_dev *cpu_dev;
-};
-
-#define cpu_vendor_dev_register(cpu_vendor_id, cpu_dev) \
-       static struct cpu_vendor_dev __cpu_vendor_dev_##cpu_vendor_id __used \
-       __attribute__((__section__(".x86cpuvendor.init"))) = \
-       { cpu_vendor_id, cpu_dev }
-
-extern struct cpu_vendor_dev __x86cpuvendor_start[], __x86cpuvendor_end[];
+extern struct cpu_dev *__x86_cpu_dev_start[], *__x86_cpu_dev_end[];
 
 extern int get_model_name(struct cpuinfo_x86 *c);
 extern void display_cacheinfo(struct cpuinfo_x86 *c);
index 13f8fa16b815f14b88165a9004257c96cb33b66e..3f8c7283d8161c71f8b8da1adcb1011350ef5510 100644 (file)
@@ -442,14 +442,16 @@ static struct cpu_dev cyrix_cpu_dev __cpuinitdata = {
        .c_early_init   = early_init_cyrix,
        .c_init         = init_cyrix,
        .c_identify     = cyrix_identify,
+       .c_x86_vendor   = X86_VENDOR_CYRIX,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_CYRIX, &cyrix_cpu_dev);
+cpu_dev_register(cyrix_cpu_dev);
 
 static struct cpu_dev nsc_cpu_dev __cpuinitdata = {
        .c_vendor       = "NSC",
        .c_ident        = { "Geode by NSC" },
        .c_init         = init_nsc,
+       .c_x86_vendor   = X86_VENDOR_NSC,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_NSC, &nsc_cpu_dev);
+cpu_dev_register(nsc_cpu_dev);
index 77618c717d768a988e6c11f9b44e8f154d25cc66..c5ac08124adc12fe29a50fabec06e4076cf1aeef 100644 (file)
@@ -303,9 +303,10 @@ static struct cpu_dev intel_cpu_dev __cpuinitdata = {
        .c_early_init   = early_init_intel,
        .c_init         = init_intel,
        .c_size_cache   = intel_size_cache,
+       .c_x86_vendor   = X86_VENDOR_INTEL,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_INTEL, &intel_cpu_dev);
+cpu_dev_register(intel_cpu_dev);
 
 /* arch_initcall(intel_cpu_init); */
 
index 1019c58d39f08b8ca440deb16e1eda1e780efb14..0a8128a240dfb3e83b82dfa52d43c0cbee038253 100644 (file)
@@ -90,6 +90,7 @@ static struct cpu_dev intel_cpu_dev __cpuinitdata = {
        .c_ident        = { "GenuineIntel" },
        .c_early_init   = early_init_intel,
        .c_init         = init_intel,
+       .c_x86_vendor   = X86_VENDOR_INTEL,
 };
-cpu_vendor_dev_register(X86_VENDOR_INTEL, &intel_cpu_dev);
 
+cpu_dev_register(intel_cpu_dev);
index b911a2c61b8fc7726bd4b431094d20c5c2bf18fb..7c46e6ecedcaad01329ab856e8b8dec0cc19d122 100644 (file)
@@ -102,6 +102,7 @@ static struct cpu_dev transmeta_cpu_dev __cpuinitdata = {
        .c_ident        = { "GenuineTMx86", "TransmetaCPU" },
        .c_init         = init_transmeta,
        .c_identify     = transmeta_identify,
+       .c_x86_vendor   = X86_VENDOR_TRANSMETA,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_TRANSMETA, &transmeta_cpu_dev);
+cpu_dev_register(transmeta_cpu_dev);
index b1fc90989d75ac132324e8f8301ff9bb553beea4..e777f79e0960d29fdaae20d800098569746450fe 100644 (file)
@@ -19,7 +19,8 @@ static struct cpu_dev umc_cpu_dev __cpuinitdata = {
                  }
                },
        },
+       .c_x86_vendor   = X86_VENDOR_UMC,
 };
 
-cpu_vendor_dev_register(X86_VENDOR_UMC, &umc_cpu_dev);
+cpu_dev_register(umc_cpu_dev);
 
index af5bdad84604abfa36a2ef7a030caaf473069e34..21b4f7eefaab61e6d52f8fa1c0b4056cb048dc8d 100644 (file)
@@ -140,10 +140,10 @@ SECTIONS
        *(.con_initcall.init)
        __con_initcall_end = .;
   }
-  .x86cpuvendor.init : AT(ADDR(.x86cpuvendor.init) - LOAD_OFFSET) {
-       __x86cpuvendor_start = .;
-       *(.x86cpuvendor.init)
-       __x86cpuvendor_end = .;
+  .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {
+       __x86_cpu_dev_start = .;
+       *(.x86_cpu_dev.init)
+       __x86_cpu_dev_end = .;
   }
   SECURITY_INIT
   . = ALIGN(4);
index 63e5c1a22e886af163574db7be03849069781b92..201e81a91a95371deeb0dc50269febc0a2714133 100644 (file)
@@ -168,13 +168,12 @@ SECTIONS
        *(.con_initcall.init)
   }
   __con_initcall_end = .;
-  . = ALIGN(16);
-  __x86cpuvendor_start = .;
-  .x86cpuvendor.init : AT(ADDR(.x86cpuvendor.init) - LOAD_OFFSET) {
-       *(.x86cpuvendor.init)
+  __x86_cpu_dev_start = .;
+  .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {
+       *(.x86_cpu_dev.init)
   }
-  __x86cpuvendor_end = .;
   SECURITY_INIT
+  __x86_cpu_dev_end = .;
 
   . = ALIGN(8);
   .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {