MTRR: get physical address size from CPUID
[coreboot.git] / src / arch / x86 / lib / cpu.c
index 3732ae296e96d7f0573b572d497b0640d27c496c..aaa0a161853f51a81aae13da66b7b0a24e7838d5 100644 (file)
@@ -131,6 +131,26 @@ static const char *cpu_vendor_name(int vendor)
        return name;
 }
 
+static int cpu_cpuid_extended_level(void)
+{
+       return cpuid_eax(0x80000000);
+}
+
+#define CPUID_FEATURE_PAE (1 << 6)
+#define CPUID_FEATURE_PSE36 (1 << 17)
+
+int cpu_phys_address_size(void)
+{
+       if (!(have_cpuid_p()))
+               return 32;
+
+       if (cpu_cpuid_extended_level() > 0x80000008)
+               return cpuid_eax(0x80000008) & 0xff;
+
+       if (cpuid_eax(1) & (CPUID_FEATURE_PAE | CPUID_FEATURE_PSE36))
+               return 36;
+       return 32;
+}
 static void identify_cpu(struct device *cpu)
 {
        char vendor_name[16];