vserver 1.9.3
[linux-2.6.git] / arch / i386 / kernel / cpu / intel.c
index e04e1c9..d13f9bb 100644 (file)
@@ -28,6 +28,15 @@ extern int trap_init_f00f_bug(void);
 struct movsl_mask movsl_mask;
 #endif
 
+void __init early_intel_workaround(struct cpuinfo_x86 *c)
+{
+       if (c->x86_vendor != X86_VENDOR_INTEL)
+               return;
+       /* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */
+       if (c->x86 == 15 && c->x86_cache_alignment == 64)
+               c->x86_cache_alignment = 128;
+}
+
 /*
  *     Early probe support logic for ppro memory erratum #50
  *
@@ -36,42 +45,14 @@ struct movsl_mask movsl_mask;
  
 int __init ppro_with_ram_bug(void)
 {
-       char vendor_id[16];
-       int ident;
-
-       /* Must have CPUID */
-       if(!have_cpuid_p())
-               return 0;
-       if(cpuid_eax(0)<1)
-               return 0;
-       
-       /* Must be Intel */
-       cpuid(0, &ident, 
-               (int *)&vendor_id[0],
-               (int *)&vendor_id[8],
-               (int *)&vendor_id[4]);
-       
-       if(memcmp(vendor_id, "IntelInside", 12))
-               return 0;
-       
-       ident = cpuid_eax(1);
-
-       /* Model 6 */
-
-       if(((ident>>8)&15)!=6)
-               return 0;
-       
-       /* Pentium Pro */
-
-       if(((ident>>4)&15)!=1)
-               return 0;
-       
-       if((ident&15) < 8)
-       {
+       /* Uses data from early_cpu_detect now */
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
+           boot_cpu_data.x86 == 6 &&
+           boot_cpu_data.x86_model == 1 &&
+           boot_cpu_data.x86_mask < 8) {
                printk(KERN_INFO "Pentium Pro with Errata#50 detected. Taking evasive action.\n");
                return 1;
        }
-       printk(KERN_INFO "Your Pentium Pro seems ok.\n");
        return 0;
 }
        
@@ -91,40 +72,44 @@ struct _cache_table
 /* all the cache descriptor types we care about (no TLB or trace cache entries) */
 static struct _cache_table cache_table[] __initdata =
 {
-       { 0x06, LVL_1_INST, 8 },
-       { 0x08, LVL_1_INST, 16 },
-       { 0x0a, LVL_1_DATA, 8 },
-       { 0x0c, LVL_1_DATA, 16 },
-       { 0x22, LVL_3,      512 },
-       { 0x23, LVL_3,      1024 },
-       { 0x25, LVL_3,      2048 },
-       { 0x29, LVL_3,      4096 },
-       { 0x2c, LVL_1_DATA, 32 },
-       { 0x30, LVL_1_INST, 32 },
-       { 0x39, LVL_2,      128 },
-       { 0x3b, LVL_2,      128 },
-       { 0x3c, LVL_2,      256 },
-       { 0x41, LVL_2,      128 },
-       { 0x42, LVL_2,      256 },
-       { 0x43, LVL_2,      512 },
-       { 0x44, LVL_2,      1024 },
-       { 0x45, LVL_2,      2048 },
-       { 0x66, LVL_1_DATA, 8 },
-       { 0x67, LVL_1_DATA, 16 },
-       { 0x68, LVL_1_DATA, 32 },
-       { 0x70, LVL_TRACE,  12 },
-       { 0x71, LVL_TRACE,  16 },
-       { 0x72, LVL_TRACE,  32 },
-       { 0x79, LVL_2,      128 },
-       { 0x7a, LVL_2,      256 },
-       { 0x7b, LVL_2,      512 },
-       { 0x7c, LVL_2,      1024 },
-       { 0x82, LVL_2,      256 },
-       { 0x83, LVL_2,      512 },
-       { 0x84, LVL_2,      1024 },
-       { 0x85, LVL_2,      2048 },
-       { 0x86, LVL_2,      512 },
-       { 0x87, LVL_2,      1024 },
+       { 0x06, LVL_1_INST, 8 },        /* 4-way set assoc, 32 byte line size */
+       { 0x08, LVL_1_INST, 16 },       /* 4-way set assoc, 32 byte line size */
+       { 0x0a, LVL_1_DATA, 8 },        /* 2 way set assoc, 32 byte line size */
+       { 0x0c, LVL_1_DATA, 16 },       /* 4-way set assoc, 32 byte line size */
+       { 0x22, LVL_3,      512 },      /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x23, LVL_3,      1024 },     /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x25, LVL_3,      2048 },     /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x29, LVL_3,      4096 },     /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x2c, LVL_1_DATA, 32 },       /* 8-way set assoc, 64 byte line size */
+       { 0x30, LVL_1_INST, 32 },       /* 8-way set assoc, 64 byte line size */
+       { 0x39, LVL_2,      128 },      /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x3b, LVL_2,      128 },      /* 2-way set assoc, sectored cache, 64 byte line size */
+       { 0x3c, LVL_2,      256 },      /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x41, LVL_2,      128 },      /* 4-way set assoc, 32 byte line size */
+       { 0x42, LVL_2,      256 },      /* 4-way set assoc, 32 byte line size */
+       { 0x43, LVL_2,      512 },      /* 4-way set assoc, 32 byte line size */
+       { 0x44, LVL_2,      1024 },     /* 4-way set assoc, 32 byte line size */
+       { 0x45, LVL_2,      2048 },     /* 4-way set assoc, 32 byte line size */
+       { 0x60, LVL_1_DATA, 16 },       /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x66, LVL_1_DATA, 8 },        /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x67, LVL_1_DATA, 16 },       /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x68, LVL_1_DATA, 32 },       /* 4-way set assoc, sectored cache, 64 byte line size */
+       { 0x70, LVL_TRACE,  12 },       /* 8-way set assoc */
+       { 0x71, LVL_TRACE,  16 },       /* 8-way set assoc */
+       { 0x72, LVL_TRACE,  32 },       /* 8-way set assoc */
+       { 0x78, LVL_2,    1024 },       /* 4-way set assoc, 64 byte line size */
+       { 0x79, LVL_2,     128 },       /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x7a, LVL_2,     256 },       /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x7b, LVL_2,     512 },       /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x7c, LVL_2,    1024 },       /* 8-way set assoc, sectored cache, 64 byte line size */
+       { 0x7d, LVL_2,    2048 },       /* 8-way set assoc, 64 byte line size */
+       { 0x7f, LVL_2,     512 },       /* 2-way set assoc, 64 byte line size */
+       { 0x82, LVL_2,     256 },       /* 8-way set assoc, 32 byte line size */
+       { 0x83, LVL_2,     512 },       /* 8-way set assoc, 32 byte line size */
+       { 0x84, LVL_2,    1024 },       /* 8-way set assoc, 32 byte line size */
+       { 0x85, LVL_2,    2048 },       /* 8-way set assoc, 32 byte line size */
+       { 0x86, LVL_2,     512 },       /* 4-way set assoc, 64 byte line size */
+       { 0x87, LVL_2,    1024 },       /* 8-way set assoc, 64 byte line size */
        { 0x00, 0, 0}
 };