|
@@ -610,6 +610,39 @@ static void __cpuinit intel_tlb_lookup(const unsigned char desc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void __cpuinit intel_tlb_flushall_shift_set(struct cpuinfo_x86 *c)
|
|
|
+{
|
|
|
+ if (!cpu_has_invlpg) {
|
|
|
+ tlb_flushall_shift = -1;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ switch ((c->x86 << 8) + c->x86_model) {
|
|
|
+ case 0x60f: /* original 65 nm celeron/pentium/core2/xeon, "Merom"/"Conroe" */
|
|
|
+ case 0x616: /* single-core 65 nm celeron/core2solo "Merom-L"/"Conroe-L" */
|
|
|
+ case 0x617: /* current 45 nm celeron/core2/xeon "Penryn"/"Wolfdale" */
|
|
|
+ case 0x61d: /* six-core 45 nm xeon "Dunnington" */
|
|
|
+ tlb_flushall_shift = -1;
|
|
|
+ break;
|
|
|
+ case 0x61a: /* 45 nm nehalem, "Bloomfield" */
|
|
|
+ case 0x61e: /* 45 nm nehalem, "Lynnfield" */
|
|
|
+ case 0x625: /* 32 nm nehalem, "Clarkdale" */
|
|
|
+ case 0x62c: /* 32 nm nehalem, "Gulftown" */
|
|
|
+ case 0x62e: /* 45 nm nehalem-ex, "Beckton" */
|
|
|
+ case 0x62f: /* 32 nm Xeon E7 */
|
|
|
+ tlb_flushall_shift = 6;
|
|
|
+ break;
|
|
|
+ case 0x62a: /* SandyBridge */
|
|
|
+ case 0x62d: /* SandyBridge, "Romely-EP" */
|
|
|
+ tlb_flushall_shift = 5;
|
|
|
+ break;
|
|
|
+ case 0x63a: /* Ivybridge */
|
|
|
+ tlb_flushall_shift = 1;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ tlb_flushall_shift = 6;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void __cpuinit intel_detect_tlb(struct cpuinfo_x86 *c)
|
|
|
{
|
|
|
int i, j, n;
|
|
@@ -630,6 +663,7 @@ static void __cpuinit intel_detect_tlb(struct cpuinfo_x86 *c)
|
|
|
for (j = 1 ; j < 16 ; j++)
|
|
|
intel_tlb_lookup(desc[j]);
|
|
|
}
|
|
|
+ intel_tlb_flushall_shift_set(c);
|
|
|
}
|
|
|
|
|
|
static const struct cpu_dev __cpuinitconst intel_cpu_dev = {
|