aboutsummaryrefslogtreecommitdiffstats
path: root/vgasrc/geodevga.c
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2012-09-01 17:13:02 +0200
committerKevin O'Connor <kevin@koconnor.net>2012-09-03 12:04:56 -0400
commit7bec6dba5195fafa8b80fdf297e2da1e7dac940a (patch)
tree881e0e7a7695a3b306558d04ae1103799a85a4fd /vgasrc/geodevga.c
parent517f7426a9a429e594e5895eb11364a49abb8039 (diff)
downloadseabios-7bec6dba5195fafa8b80fdf297e2da1e7dac940a.tar.gz
Add global struct geode
This struct is used to store some PCI BAR values, which are used during hw init. Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Diffstat (limited to 'vgasrc/geodevga.c')
-rw-r--r--vgasrc/geodevga.c66
1 files changed, 41 insertions, 25 deletions
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c
index 247ad22a..d44b7c16 100644
--- a/vgasrc/geodevga.c
+++ b/vgasrc/geodevga.c
@@ -83,6 +83,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;
@@ -140,35 +151,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;
@@ -182,7 +191,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 */
@@ -191,24 +200,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;
@@ -299,6 +305,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();