[SeaBIOS] [PATCH v2 1/9] seabios: make mttr UC area setup dynamic

Jason Baron jbaron at redhat.com
Tue Oct 9 05:35:10 CEST 2012


From: Jason Baron <jbaron at redhat.com>

Set up the UC area of mtrr dynamically based on mtrr_base. This allows
the bios to work for other chipsets that might want to set the mtrr.
Since BUILD_MAX_HIGHMEM is no longer used we can remove the config parameter.

This change reverses the order of pci_setup() and smm_init() with
mtrr_setup().

Signed-off-by: Jason Baron <jbaron at redhat.com>
---
 src/config.h  |    1 -
 src/mtrr.c    |    5 +++--
 src/pci.h     |    1 +
 src/pciinit.c |    2 ++
 src/post.c    |    6 +++---
 5 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/config.h b/src/config.h
index 0d4066d..71c0b7e 100644
--- a/src/config.h
+++ b/src/config.h
@@ -44,7 +44,6 @@
 #define BUILD_SMM_INIT_ADDR       0x38000
 #define BUILD_SMM_ADDR            0xa8000
 #define BUILD_SMM_SIZE            0x8000
-#define BUILD_MAX_HIGHMEM         0xe0000000
 
 #define BUILD_PCIMEM_START        0xe0000000
 #define BUILD_PCIMEM_END          0xfec00000    /* IOAPIC is mapped at */
diff --git a/src/mtrr.c b/src/mtrr.c
index 0957834..81a78c6 100644
--- a/src/mtrr.c
+++ b/src/mtrr.c
@@ -7,6 +7,7 @@
 #include "util.h" // dprintf
 #include "config.h" // CONFIG_*
 #include "xen.h" // usingXen
+#include "pci.h" // mtrr_base
 
 #define MSR_MTRRcap                    0x000000fe
 #define MSR_MTRRfix64K_00000           0x00000250
@@ -94,9 +95,9 @@ void mtrr_setup(void)
         wrmsr_smp(MTRRphysMask_MSR(i), 0);
     }
     /* Mark 3.5-4GB as UC, anything not specified defaults to WB */
-    wrmsr_smp(MTRRphysBase_MSR(0), BUILD_MAX_HIGHMEM | MTRR_MEMTYPE_UC);
+    wrmsr_smp(MTRRphysBase_MSR(0), mtrr_base | MTRR_MEMTYPE_UC);
     wrmsr_smp(MTRRphysMask_MSR(0)
-              , (-((1ull<<32)-BUILD_MAX_HIGHMEM) & phys_mask) | 0x800);
+              , (-((1ull<<32)-mtrr_base) & phys_mask) | 0x800);
 
     // Enable fixed and variable MTRRs; set default type.
     wrmsr_smp(MSR_MTRRdefType, 0xc00 | MTRR_MEMTYPE_WB);
diff --git a/src/pci.h b/src/pci.h
index fe663b8..104638d 100644
--- a/src/pci.h
+++ b/src/pci.h
@@ -56,6 +56,7 @@ struct pci_device {
     // Local information on device.
     int have_driver;
 };
+extern u64 mtrr_base;
 extern u64 pcimem_start, pcimem_end;
 extern u64 pcimem64_start, pcimem64_end;
 extern struct pci_device *PCIDevices;
diff --git a/src/pciinit.c b/src/pciinit.c
index 31115ee..0b4a9e4 100644
--- a/src/pciinit.c
+++ b/src/pciinit.c
@@ -30,6 +30,8 @@ static const char *region_type_name[] = {
     [ PCI_REGION_TYPE_PREFMEM ] = "prefmem",
 };
 
+u64 mtrr_base = BUILD_PCIMEM_START;
+
 u64 pcimem_start   = BUILD_PCIMEM_START;
 u64 pcimem_end     = BUILD_PCIMEM_END;
 u64 pcimem64_start = BUILD_PCIMEM64_START;
diff --git a/src/post.c b/src/post.c
index 924b311..c976c8e 100644
--- a/src/post.c
+++ b/src/post.c
@@ -231,13 +231,13 @@ maininit(void)
     timer_setup();
     mathcp_setup();
 
-    // Initialize mtrr
-    mtrr_setup();
-
     // Initialize pci
     pci_setup();
     smm_init();
 
+    // Initialize mtrr
+    mtrr_setup();
+
     // Setup Xen hypercalls
     xen_init_hypercalls();
 
-- 
1.7.1




More information about the SeaBIOS mailing list