Re: [U-Boot] [PATCH v2 14/22] x86: Add support for MTRRs

2015-01-05 Thread Simon Glass
On 1 January 2015 at 16:18, Simon Glass s...@chromium.org wrote:
 Memory Type Range Registers are used to tell the CPU whether memory is
 cacheable and if so the cache write mode to use.

 Clean up the existing header file to follow style, and remove the unneeded
 code.

 These can speed up booting so should be supported. Add these to global_data
 so they can be requested while booting. We will apply the changes during
 relocation (in a later commit).

 Signed-off-by: Simon Glass s...@chromium.org
 ---

 Changes in v2: None

  arch/x86/cpu/Makefile  |   1 +
  arch/x86/cpu/coreboot/coreboot.c   |  22 +++---
  arch/x86/cpu/ivybridge/car.S   |  12 +--
  arch/x86/cpu/mtrr.c|  81 +++
  arch/x86/include/asm/global_data.h |  15 
  arch/x86/include/asm/mtrr.h| 157 
 +
  6 files changed, 187 insertions(+), 101 deletions(-)
  create mode 100644 arch/x86/cpu/mtrr.c

Applied to u-boot-x86/next.
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH v2 14/22] x86: Add support for MTRRs

2015-01-01 Thread Simon Glass
Memory Type Range Registers are used to tell the CPU whether memory is
cacheable and if so the cache write mode to use.

Clean up the existing header file to follow style, and remove the unneeded
code.

These can speed up booting so should be supported. Add these to global_data
so they can be requested while booting. We will apply the changes during
relocation (in a later commit).

Signed-off-by: Simon Glass s...@chromium.org
---

Changes in v2: None

 arch/x86/cpu/Makefile  |   1 +
 arch/x86/cpu/coreboot/coreboot.c   |  22 +++---
 arch/x86/cpu/ivybridge/car.S   |  12 +--
 arch/x86/cpu/mtrr.c|  81 +++
 arch/x86/include/asm/global_data.h |  15 
 arch/x86/include/asm/mtrr.h| 157 +
 6 files changed, 187 insertions(+), 101 deletions(-)
 create mode 100644 arch/x86/cpu/mtrr.c

diff --git a/arch/x86/cpu/Makefile b/arch/x86/cpu/Makefile
index 5033d2b..62e43c0 100644
--- a/arch/x86/cpu/Makefile
+++ b/arch/x86/cpu/Makefile
@@ -17,5 +17,6 @@ obj-$(CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE) += ivybridge/
 obj-$(CONFIG_NORTHBRIDGE_INTEL_IVYBRIDGE) += ivybridge/
 obj-$(CONFIG_INTEL_QUEENSBAY) += queensbay/
 obj-y += lapic.o
+obj-y += mtrr.o
 obj-$(CONFIG_PCI) += pci.o
 obj-y += turbo.o
diff --git a/arch/x86/cpu/coreboot/coreboot.c b/arch/x86/cpu/coreboot/coreboot.c
index cfacc05..6d06d5a 100644
--- a/arch/x86/cpu/coreboot/coreboot.c
+++ b/arch/x86/cpu/coreboot/coreboot.c
@@ -15,6 +15,7 @@
 #include asm/cache.h
 #include asm/cpu.h
 #include asm/io.h
+#include asm/mtrr.h
 #include asm/arch/tables.h
 #include asm/arch/sysinfo.h
 #include asm/arch/timestamp.h
@@ -64,11 +65,6 @@ int board_eth_init(bd_t *bis)
return pci_eth_init(bis);
 }
 
-#define MTRR_TYPE_WP  5
-#define MTRRcap_MSR   0xfe
-#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
-#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
-
 void board_final_cleanup(void)
 {
/* Un-cache the ROM so the kernel has one
@@ -77,15 +73,17 @@ void board_final_cleanup(void)
 * Coreboot should have assigned this to the
 * top available variable MTRR.
 */
-   u8 top_mtrr = (native_read_msr(MTRRcap_MSR)  0xff) - 1;
-   u8 top_type = native_read_msr(MTRRphysBase_MSR(top_mtrr))  0xff;
+   u8 top_mtrr = (native_read_msr(MTRR_CAP_MSR)  0xff) - 1;
+   u8 top_type = native_read_msr(MTRR_PHYS_BASE_MSR(top_mtrr))  0xff;
 
/* Make sure this MTRR is the correct Write-Protected type */
-   if (top_type == MTRR_TYPE_WP) {
-   disable_caches();
-   wrmsrl(MTRRphysBase_MSR(top_mtrr), 0);
-   wrmsrl(MTRRphysMask_MSR(top_mtrr), 0);
-   enable_caches();
+   if (top_type == MTRR_TYPE_WRPROT) {
+   struct mtrr_state state;
+
+   mtrr_open(state);
+   wrmsrl(MTRR_PHYS_BASE_MSR(top_mtrr), 0);
+   wrmsrl(MTRR_PHYS_MASK_MSR(top_mtrr), 0);
+   mtrr_close(state);
}
 
/* Issue SMI to Coreboot to lock down ME and registers */
diff --git a/arch/x86/cpu/ivybridge/car.S b/arch/x86/cpu/ivybridge/car.S
index dca68e4..72b22ea 100644
--- a/arch/x86/cpu/ivybridge/car.S
+++ b/arch/x86/cpu/ivybridge/car.S
@@ -61,7 +61,7 @@ clear_mtrrs:
 
post_code(POST_CAR_MTRR)
/* Configure the default memory type to uncacheable */
-   movl$MTRRdefType_MSR, %ecx
+   movl$MTRR_DEF_TYPE_MSR, %ecx
rdmsr
andl$(~0x0cff), %eax
wrmsr
@@ -76,16 +76,16 @@ clear_mtrrs:
post_code(POST_CAR_BASE_ADDRESS)
/* Set Cache-as-RAM mask */
movl$(MTRR_PHYS_MASK_MSR(0)), %ecx
-   movl$(~(CACHE_AS_RAM_SIZE - 1) | MTRRphysMaskValid), %eax
+   movl$(~(CACHE_AS_RAM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
movl$CPU_PHYSMASK_HI, %edx
wrmsr
 
post_code(POST_CAR_MASK)
 
/* Enable MTRR */
-   movl$MTRRdefType_MSR, %ecx
+   movl$MTRR_DEF_TYPE_MSR, %ecx
rdmsr
-   orl $MTRRdefTypeEn, %eax
+   orl $MTRR_DEF_TYPE_EN, %eax
wrmsr
 
/* Enable cache (CR0.CD = 0, CR0.NW = 0) */
@@ -130,7 +130,7 @@ clear_mtrrs:
 
movl$MTRR_PHYS_MASK_MSR(1), %ecx
movl$CPU_PHYSMASK_HI, %edx
-   movl$(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
+   movl$(~(CONFIG_XIP_ROM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
wrmsr
 
post_code(POST_CAR_ROM_CACHE)
@@ -141,7 +141,7 @@ clear_mtrrs:
xorl%edx, %edx
wrmsr
movl$MTRR_PHYS_MASK_MSR(2), %ecx
-   movl$(CACHE_MRC_MASK | MTRRphysMaskValid), %eax
+   movl$(CACHE_MRC_MASK | MTRR_PHYS_MASK_VALID), %eax
movl$CPU_PHYSMASK_HI, %edx
wrmsr
 #endif
diff --git a/arch/x86/cpu/mtrr.c b/arch/x86/cpu/mtrr.c
new file mode 100644
index 000..d5a825d1
--- /dev/null
+++ b/arch/x86/cpu/mtrr.c
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2014 Google,