void __cpuinit validate_pat_support(struct cpuinfo_x86 *c) { if (!cpu_has_pat) pat_disable("PAT not supported by CPU."); switch (c->x86_vendor) { case X86_VENDOR_INTEL: /* * There is a known erratum on Pentium III and Core Solo * and Core Duo CPUs. * " Page with PAT set to WC while associated MTRR is UC * may consolidate to UC " * Because of this erratum, it is better to stick with * setting WC in MTRR rather than using PAT on these CPUs. * * Enable PAT WC only on P4, Core 2 or later CPUs. */ if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15)) return; pat_disable("PAT WC disabled due to known CPU erratum."); return; case X86_VENDOR_AMD: case X86_VENDOR_CENTAUR: case X86_VENDOR_TRANSMETA: return; } pat_disable("PAT disabled. Not yet verified on this CPU type."); }
void pat_init(void) { u64 pat; bool boot_cpu = !boot_pat_state; if (!pat_enabled) return; if (!cpu_has_pat) { if (!boot_pat_state) { pat_disable("PAT not supported by CPU."); return; } else { printk(KERN_ERR "PAT enabled, " "but not supported by secondary CPU\n"); BUG(); } } pat = PAT(0, WB) | PAT(1, WC) | PAT(2, UC_MINUS) | PAT(3, UC) | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); if (!boot_pat_state) rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); wrmsrl(MSR_IA32_CR_PAT, pat); if (boot_cpu) printk(KERN_INFO "x86 PAT enabled: cpu %d, old 0x%Lx, new 0x%Lx\n", smp_processor_id(), boot_pat_state, pat); }
void pat_init(void) { u64 pat; bool boot_cpu = !boot_pat_state; if (!pat_enabled) return; if (!cpu_has_pat) { if (!boot_pat_state) { pat_disable("PAT not supported by CPU."); return; } else { /* * If this happens we are on a secondary CPU, but * switched to PAT on the boot CPU. We have no way to * undo PAT. */ printk(KERN_ERR "PAT enabled, " "but not supported by secondary CPU\n"); BUG(); } } /* Set PWT to Write-Combining. All other bits stay the same */ /* * PTE encoding used in Linux: * PAT * |PCD * ||PWT * ||| * 000 WB _PAGE_CACHE_WB * 001 WC _PAGE_CACHE_WC * 010 UC- _PAGE_CACHE_UC_MINUS * 011 UC _PAGE_CACHE_UC * PAT bit unused */ pat = PAT(0, WB) | PAT(1, WC) | PAT(2, UC_MINUS) | PAT(3, UC) | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); /* Boot CPU check */ if (!boot_pat_state) rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); wrmsrl(MSR_IA32_CR_PAT, pat); if (boot_cpu) printk(KERN_INFO "x86 PAT enabled: cpu %d, old 0x%Lx, new 0x%Lx\n", smp_processor_id(), boot_pat_state, pat); }
static int __init nopat(char *str) { pat_disable("PAT support disabled."); return 0; }