x86: Save mtrr support flag in global data
authorBin Meng <bmeng.cn@gmail.com>
Thu, 22 Jan 2015 03:29:40 +0000 (11:29 +0800)
committerSimon Glass <sjg@chromium.org>
Sat, 24 Jan 2015 00:24:55 +0000 (17:24 -0700)
CPUID (EAX 01H) returns MTRR support flag in EDX bit 12. Probe this
flag in x86_cpu_init_f() and save it in global data.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/cpu.c
arch/x86/include/asm/global_data.h

index 30e50696984eb7be9778b571b3c32fc586a2a302..ed7905c1d7cf24c9ad9350bcd38b3ff9c9c9c727 100644 (file)
@@ -223,6 +223,11 @@ static bool has_cpuid(void)
        return flag_is_changeable_p(X86_EFLAGS_ID);
 }
 
+static bool has_mtrr(void)
+{
+       return cpuid_edx(0x00000001) & (1 << 12) ? true : false;
+}
+
 static int build_vendor_name(char *vendor_name)
 {
        struct cpuid_result result;
@@ -318,6 +323,8 @@ int x86_cpu_init_f(void)
                gd->arch.x86_model = c.x86_model;
                gd->arch.x86_mask = c.x86_mask;
                gd->arch.x86_device = cpu.device;
+
+               gd->arch.has_mtrr = has_mtrr();
        }
 
        return 0;
index 24e305239b2164c5a91cdbd73b8bbadd655557f3..243ed5c46155f7ab6c0b431dd472b989fa1eb3b9 100644 (file)
@@ -44,11 +44,11 @@ struct mtrr_request {
 
 /* Architecture-specific global data */
 struct arch_global_data {
-       struct global_data *gd_addr;            /* Location of Global Data */
-       uint8_t  x86;                   /* CPU family */
-       uint8_t  x86_vendor;            /* CPU vendor */
-       uint8_t  x86_model;
-       uint8_t  x86_mask;
+       struct global_data *gd_addr;    /* Location of Global Data */
+       uint8_t x86;                    /* CPU family */
+       uint8_t x86_vendor;             /* CPU vendor */
+       uint8_t x86_model;
+       uint8_t x86_mask;
        uint32_t x86_device;
        uint64_t tsc_base;              /* Initial value returned by rdtsc() */
        uint32_t tsc_base_kclocks;      /* Initial tsc as a kclocks value */
@@ -60,10 +60,11 @@ struct arch_global_data {
        const struct pch_gpio_map *gpio_map;    /* board GPIO map */
        struct memory_info meminfo;     /* Memory information */
 #ifdef CONFIG_HAVE_FSP
-       void    *hob_list;              /* FSP HOB list */
+       void *hob_list;                 /* FSP HOB list */
 #endif
        struct mtrr_request mtrr_req[MAX_MTRR_REQUESTS];
        int mtrr_req_count;
+       int has_mtrr;
 };
 
 #endif