[SeaBIOS] [PATCH 11/15] Add global struct geode

Christian Gmeiner christian.gmeiner at gmail.com
Sat Sep 1 17:13:02 CEST 2012


This struct is used to store some PCI BAR values, which are used
during hw init.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 vgasrc/geodevga.c | 66 ++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 41 insertions(+), 25 deletions(-)

diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c
index a0cbe1f..17d5a37 100644
--- a/vgasrc/geodevga.c
+++ b/vgasrc/geodevga.c
@@ -138,6 +138,17 @@ static void geode_memWrite(u32 addr, u32 and, u32 or )
     );
 }
 
+/****************************************************************
+ * Helper functions
+ ****************************************************************/
+
+struct geode {
+    u32 fb;
+    u32 dc;
+    u32 vp;
+};
+struct geode geode VAR16;
+
 static int legacyio_check(void)
 {
     int ret=0;
@@ -195,35 +206,33 @@ static u32 framebuffer_size(void)
 */
 static int dc_setup(void)
 {
-    u32 fb, dc_fb, dc_base;
+    u32 dc_fb;
 
     dprintf(2, "DC_SETUP\n");
 
-    dc_base = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_2);
-    geode_memWrite(dc_base + DC_UNLOCK, 0x0, DC_LOCK_UNLOCK);
+    geode_memWrite(geode.dc + DC_UNLOCK, 0x0, DC_LOCK_UNLOCK);
 
     /* zero memory config */
-    geode_memWrite(dc_base + DC_FB_ST_OFFSET, 0x0, 0x0);
-    geode_memWrite(dc_base + DC_CB_ST_OFFSET, 0x0, 0x0);
-    geode_memWrite(dc_base + DC_CURS_ST_OFFSET, 0x0, 0x0);
+    geode_memWrite(geode.dc + DC_FB_ST_OFFSET, 0x0, 0x0);
+    geode_memWrite(geode.dc + DC_CB_ST_OFFSET, 0x0, 0x0);
+    geode_memWrite(geode.dc + DC_CURS_ST_OFFSET, 0x0, 0x0);
 
     /* read fb-bar from pci, then point dc to the fb base */
-    dc_fb = geode_memRead(dc_base + DC_GLIU0_MEM_OFFSET);
-    fb = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0);
-    if (fb!=dc_fb) {
-        geode_memWrite(dc_base + DC_GLIU0_MEM_OFFSET, 0x0, fb);
+    dc_fb = geode_memRead(geode.dc + DC_GLIU0_MEM_OFFSET);
+    if (geode.fb != dc_fb) {
+        geode_memWrite(geode.dc + DC_GLIU0_MEM_OFFSET, 0x0, geode.fb);
     }
 
-    geode_memWrite(dc_base + DC_DISPLAY_CFG, DC_CFG_MSK, DC_GDEN+DC_TRUP);
-    geode_memWrite(dc_base + DC_GENERAL_CFG, 0, DC_VGAE);
+    geode_memWrite(geode.dc + DC_DISPLAY_CFG, DC_CFG_MSK, DC_GDEN+DC_TRUP);
+    geode_memWrite(geode.dc + DC_GENERAL_CFG, 0, DC_VGAE);
 
-    geode_memWrite(dc_base + DC_UNLOCK, 0x0, DC_LOCK_LOCK);
+    geode_memWrite(geode.dc + DC_UNLOCK, 0x0, DC_LOCK_LOCK);
 
     u32 fb_size = framebuffer_size(); // in byte
-    dprintf(1, "%d KB of video memory at 0x%08x\n", fb_size / 1024, fb);
+    dprintf(1, "%d KB of video memory at 0x%08x\n", fb_size / 1024, geode.fb);
 
     /* update VBE variables */
-    SET_VGA(VBE_framebuffer, fb);
+    SET_VGA(VBE_framebuffer, geode.fb);
     SET_VGA(VBE_total_memory, fb_size / 1024 / 64); // number of 64K blocks
     
     return 0;
@@ -237,7 +246,7 @@ static int dc_setup(void)
 */
 int vp_setup(void)
 {
-    u32 reg,vp;
+    u32 reg;
 
     dprintf(2,"VP_SETUP\n");
     /* set output to crt and RGB/YUV */
@@ -246,24 +255,21 @@ int vp_setup(void)
     else
         geode_msrWrite(VP_MSR_CONFIG_LX, ~0, ~0xf8, 0, 0);
 
-    /* get vp register base from pci */
-    vp = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_3);
-
     /* Set mmio registers
     * there may be some timing issues here, the reads seem
     * to slow things down enough work reliably
     */
 
-    reg = geode_memRead(vp+VP_MISC);
+    reg = geode_memRead(geode.vp + VP_MISC);
     dprintf(1,"VP_SETUP VP_MISC=0x%08x\n",reg);
-    geode_memWrite(vp+VP_MISC,0,VP_BYP_BOTH);
-    reg = geode_memRead(vp+VP_MISC);
+    geode_memWrite(geode.vp + VP_MISC,0,VP_BYP_BOTH);
+    reg = geode_memRead(geode.vp + VP_MISC);
     dprintf(1,"VP_SETUP VP_MISC=0x%08x\n",reg);
 
-    reg = geode_memRead(vp+VP_DCFG);
+    reg = geode_memRead(geode.vp + VP_DCFG);
     dprintf(1,"VP_SETUP VP_DCFG=0x%08x\n",reg);
-    geode_memWrite(vp+VP_DCFG, ~0,VP_CRT_EN+VP_HSYNC_EN+VP_VSYNC_EN+VP_DAC_BL_EN+VP_CRT_SKEW);
-    reg = geode_memRead(vp+VP_DCFG);
+    geode_memWrite(geode.vp + VP_DCFG, ~0,VP_CRT_EN+VP_HSYNC_EN+VP_VSYNC_EN+VP_DAC_BL_EN+VP_CRT_SKEW);
+    reg = geode_memRead(geode.vp + VP_DCFG);
     dprintf(1,"VP_SETUP VP_DCFG=0x%08x\n",reg);
 
     return 0;
@@ -374,6 +380,16 @@ int geodevga_init(void)
     if (GET_GLOBAL(VgaBDF) < 0)
         // Device should be at 00:01.1
         SET_VGA(VgaBDF, pci_to_bdf(0, 1, 1));
+    
+    // setup geode struct which is used for register access
+    geode.fb = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0);
+    geode.dc = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_2);
+    geode.vp = pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_3);
+    
+    dprintf(1, "fb addr: 0x%08x\n", geode.fb);
+    dprintf(1, "dc addr: 0x%08x\n", geode.dc);
+    dprintf(1, "vp addr: 0x%08x\n", geode.vp);
+    
     ret |= vp_setup();
     ret |= dc_setup();
 
-- 
1.7.11.rc2.5.g68f532f




More information about the SeaBIOS mailing list