Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 5b42e00..9fab5e9 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -218,22 +218,10 @@ static void dc_setup(void) geode_dc_write(DC_CB_ST_OFFSET, 0x0); geode_dc_write(DC_CURS_ST_OFFSET, 0x0);
- /* read fb-bar from pci, then point dc to the fb base */ - u32 fb = GET_GLOBAL(GeodeFB); - if (geode_dc_read(DC_GLIU0_MEM_OFFSET) != fb) - geode_dc_write(DC_GLIU0_MEM_OFFSET, fb); - geode_dc_mask(DC_DISPLAY_CFG, ~DC_CFG_MSK, DC_DISPLAY_CFG_GDEN|DC_DISPLAY_CFG_TRUP); geode_dc_write(DC_GENERAL_CFG, DC_DISPLAY_CFG_VGAE);
geode_dc_write(DC_UNLOCK, 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); - - /* update VBE variables */ - SET_VGA(VBE_framebuffer, fb); - SET_VGA(VBE_total_memory, fb_size / 1024 / 64); // number of 64K blocks }
/* Setup the vp (video processor) portion of the geodelx @@ -408,6 +396,23 @@ int geodevga_init(void) dprintf(1, "dc addr: 0x%08x\n", GET_GLOBAL(GeodeDC)); dprintf(1, "vp addr: 0x%08x\n", GET_GLOBAL(GeodeVP));
+ /* setup framebuffer */ + geode_dc_write(DC_UNLOCK, DC_LOCK_UNLOCK); + + /* read fb-bar from pci, then point dc to the fb base */ + u32 fb = GET_GLOBAL(GeodeFB); + if (geode_dc_read(DC_GLIU0_MEM_OFFSET) != fb) + geode_dc_write(DC_GLIU0_MEM_OFFSET, fb); + + geode_dc_write(DC_UNLOCK, 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); + + /* update VBE variables */ + SET_VGA(VBE_framebuffer, fb); + SET_VGA(VBE_total_memory, fb_size / 1024 / 64); // number of 64K blocks + vp_setup(); dc_setup();
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 63 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 9fab5e9..469adf9 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -204,6 +204,38 @@ static u32 framebuffer_size(void) * Init Functions ****************************************************************/
+static void geodevga_set_ouput_mode(void) +{ + u64 msr_addr; + u64 msr; + + /* set output to crt and RGB/YUV */ + if (CONFIG_VGA_GEODEGX2) + msr_addr = VP_MSR_CONFIG_GX2; + else + msr_addr = VP_MSR_CONFIG_LX; + + /* set output mode (RGB/YUV) */ + msr = geode_msr_read(msr_addr); + msr &= ~VP_MSR_CONFIG_FMT; // mask out FMT (bits 5:3) + + if (CONFIG_VGA_OUTPUT_PANEL || CONFIG_VGA_OUTPUT_CRT_PANEL) { + msr |= VP_MSR_CONFIG_FMT_FP; // flat panel + + if (CONFIG_VGA_OUTPUT_CRT_PANEL) { + msr |= VP_MSR_CONFIG_FPC; // simultaneous Flat Panel and CRT + dprintf(1, "output: simultaneous Flat Panel and CRT\n"); + } else { + msr &= ~VP_MSR_CONFIG_FPC; // no simultaneous Flat Panel and CRT + dprintf(1, "ouput: flat panel\n"); + } + } else { + msr |= VP_MSR_CONFIG_FMT_CRT; // CRT only + dprintf(1, "output: CRT\n"); + } + geode_msr_mask(msr_addr, ~msr, msr); +} + /* Set up the dc (display controller) portion of the geodelx * The dc provides hardware support for VGA graphics. */ @@ -232,37 +264,9 @@ static void dc_setup(void) */ static void vp_setup(void) { - u32 msr_addr; - u64 msr; - dprintf(2,"VP_SETUP\n");
- /* set output to crt and RGB/YUV */ - if (CONFIG_VGA_GEODEGX2) - msr_addr = VP_MSR_CONFIG_GX2; - else - msr_addr = VP_MSR_CONFIG_LX; - - /* set output mode (RGB/YUV) */ - msr = geode_msr_read(msr_addr); - msr &= ~VP_MSR_CONFIG_FMT; // mask out FMT (bits 5:3) - - if (CONFIG_VGA_OUTPUT_PANEL || CONFIG_VGA_OUTPUT_CRT_PANEL) { - msr |= VP_MSR_CONFIG_FMT_FP; // flat panel - - if (CONFIG_VGA_OUTPUT_CRT_PANEL) { - msr |= VP_MSR_CONFIG_FPC; // simultaneous Flat Panel and CRT - dprintf(1, "output: simultaneous Flat Panel and CRT\n"); - } else { - msr &= ~VP_MSR_CONFIG_FPC; // no simultaneous Flat Panel and CRT - dprintf(1, "ouput: flat panel\n"); - } - } else { - msr |= VP_MSR_CONFIG_FMT_CRT; // CRT only - dprintf(1, "output: CRT\n"); - } - geode_msr_mask(msr_addr, ~msr, msr); - + geodevga_set_ouput_mode();
/* Set mmio registers * there may be some timing issues here, the reads seem @@ -289,6 +293,7 @@ static void vp_setup(void) geode_fp_write(FP_PT2, FP_PT2_SCRC);
/* set pad select for TFT/LVDS */ + u64 msr; msr = VP_MSR_PADSEL_TFT_SEL_HIGH; msr = msr << 32; msr |= VP_MSR_PADSEL_TFT_SEL_LOW;
On Fri, Oct 05, 2012 at 06:07:25PM +0200, Christian Gmeiner wrote:
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com
vgasrc/geodevga.c | 63 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 9fab5e9..469adf9 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -204,6 +204,38 @@ static u32 framebuffer_size(void)
- Init Functions
****************************************************************/
+static void geodevga_set_ouput_mode(void)
Typo?
Otherwise the patchset looks okay to me.
-Kevin
2012/10/8 Kevin O'Connor kevin@koconnor.net:
On Fri, Oct 05, 2012 at 06:07:25PM +0200, Christian Gmeiner wrote:
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com
vgasrc/geodevga.c | 63 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 9fab5e9..469adf9 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -204,6 +204,38 @@ static u32 framebuffer_size(void)
- Init Functions
****************************************************************/
+static void geodevga_set_ouput_mode(void)
Typo?
yes.. should be geodevga_set_output_mode.
Shall I send an other patch fixing this typo or will you fix it before applying my patches?
Otherwise the patchset looks okay to me.
Fine.. I have stared on VESA support minutes ago :)
-- Christian Gmeiner, MSc
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 5 +++++ vgasrc/geodevga.h | 1 + 2 files changed, 6 insertions(+)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 469adf9..5d85dc2 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -306,6 +306,11 @@ static void vp_setup(void) } }
+int geodevga_set_mode(struct vgamode_s *vmode_g, int flags) +{ + return stdvga_set_mode(vmode_g, flags); +} + static u8 geode_crtc_01[] VAR16 = { 0x2d, 0x27, 0x28, 0x90, 0x29, 0x8e, 0xbf, 0x1f, 0x00, 0x4f, 0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, diff --git a/vgasrc/geodevga.h b/vgasrc/geodevga.h index 5993b23..5ab7119 100644 --- a/vgasrc/geodevga.h +++ b/vgasrc/geodevga.h @@ -85,5 +85,6 @@ #define DC_CFG_MSK 0xf000a6
int geodevga_init(); +int geodevga_set_mode(struct vgamode_s *vmode_g, int flags);
#endif
I will enable this only for LX systems as I dont have access to a GX system.
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/vgahw.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/vgasrc/vgahw.h b/vgasrc/vgahw.h index 044cd32..43cfaee 100644 --- a/vgasrc/vgahw.h +++ b/vgasrc/vgahw.h @@ -22,6 +22,8 @@ static inline int vgahw_set_mode(struct vgamode_s *vmode_g, int flags) { return clext_set_mode(vmode_g, flags); if (CONFIG_VGA_BOCHS) return bochsvga_set_mode(vmode_g, flags); + if (CONFIG_VGA_GEODELX) + return geodevga_set_mode(vmode_g, flags); return stdvga_set_mode(vmode_g, flags); }
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 5d85dc2..7689c43 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -245,11 +245,6 @@ static void dc_setup(void)
geode_dc_write(DC_UNLOCK, DC_LOCK_UNLOCK);
- /* zero memory config */ - geode_dc_write(DC_FB_ST_OFFSET, 0x0); - geode_dc_write(DC_CB_ST_OFFSET, 0x0); - geode_dc_write(DC_CURS_ST_OFFSET, 0x0); - geode_dc_mask(DC_DISPLAY_CFG, ~DC_CFG_MSK, DC_DISPLAY_CFG_GDEN|DC_DISPLAY_CFG_TRUP); geode_dc_write(DC_GENERAL_CFG, DC_DISPLAY_CFG_VGAE);
@@ -308,6 +303,17 @@ static void vp_setup(void)
int geodevga_set_mode(struct vgamode_s *vmode_g, int flags) { + /* unlock dc register */ + geode_dc_write(DC_UNLOCK, DC_LOCK_UNLOCK); + + /* zero memory config */ + geode_dc_write(DC_FB_ST_OFFSET, 0x0); + geode_dc_write(DC_CB_ST_OFFSET, 0x0); + geode_dc_write(DC_CURS_ST_OFFSET, 0x0); + + /* lock dc register */ + geode_dc_write(DC_UNLOCK, DC_LOCK_LOCK); + return stdvga_set_mode(vmode_g, flags); }
This function is used to turn on/enable graphics output. It takes care about different supported output modes.
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 55 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 26 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 7689c43..648d557 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -236,6 +236,33 @@ static void geodevga_set_ouput_mode(void) geode_msr_mask(msr_addr, ~msr, msr); }
+static void geodevga_graphics_enable(void) +{ + /* setup flat panel */ + if (CONFIG_VGA_OUTPUT_PANEL || CONFIG_VGA_OUTPUT_CRT_PANEL) { + dprintf(1, "Setting up flat panel\n"); + /* write timing register */ + geode_fp_write(FP_PT1, 0x0); + geode_fp_write(FP_PT2, FP_PT2_SCRC); + + /* set pad select for TFT/LVDS */ + u64 msr; + msr = VP_MSR_PADSEL_TFT_SEL_HIGH; + msr = msr << 32; + msr |= VP_MSR_PADSEL_TFT_SEL_LOW; + geode_msr_mask(VP_MSR_PADSEL, ~msr, msr); + + /* turn the panel on (if it isn't already) */ + u32 reg = geode_fp_read(FP_PM); + reg |= FP_PM_P; + geode_fp_write(FP_PM, reg); + } + + if (CONFIG_VGA_OUTPUT_CRT) { + geode_vp_mask(VP_DCFG, 0, VP_DCFG_CRT_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN | VP_DCFG_DAC_BL_EN | VP_DCFG_CRT_SKEW); + } +} + /* Set up the dc (display controller) portion of the geodelx * The dc provides hardware support for VGA graphics. */ @@ -273,32 +300,8 @@ static void vp_setup(void) geode_vp_write(VP_MISC, VP_DCFG_BYP_BOTH); reg = geode_vp_read(VP_MISC); dprintf(1,"VP_SETUP VP_MISC=0x%08x\n",reg); - - reg = geode_vp_read(VP_DCFG); - dprintf(1,"VP_SETUP VP_DCFG=0x%08x\n",reg); - geode_vp_mask(VP_DCFG, 0, VP_DCFG_CRT_EN|VP_DCFG_HSYNC_EN|VP_DCFG_VSYNC_EN|VP_DCFG_DAC_BL_EN|VP_DCFG_CRT_SKEW); - reg = geode_vp_read(VP_DCFG); - dprintf(1,"VP_SETUP VP_DCFG=0x%08x\n",reg); - - /* setup flat panel */ - if (CONFIG_VGA_OUTPUT_PANEL || CONFIG_VGA_OUTPUT_CRT_PANEL) { - dprintf(1, "Setting up flat panel\n"); - /* write timing register */ - geode_fp_write(FP_PT1, 0x0); - geode_fp_write(FP_PT2, FP_PT2_SCRC); - - /* set pad select for TFT/LVDS */ - u64 msr; - msr = VP_MSR_PADSEL_TFT_SEL_HIGH; - msr = msr << 32; - msr |= VP_MSR_PADSEL_TFT_SEL_LOW; - geode_msr_mask(VP_MSR_PADSEL, ~msr, msr); - - /* turn the panel on (if it isn't already) */ - reg = geode_fp_read(FP_PM); - reg |= FP_PM_P; - geode_fp_write(FP_PM, reg); - } + + geodevga_graphics_enable(); }
int geodevga_set_mode(struct vgamode_s *vmode_g, int flags)
This change makes it easy to support VESA.
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 648d557..47e717e 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -269,13 +269,6 @@ static void geodevga_graphics_enable(void) static void dc_setup(void) { dprintf(2, "DC_SETUP\n"); - - geode_dc_write(DC_UNLOCK, DC_LOCK_UNLOCK); - - geode_dc_mask(DC_DISPLAY_CFG, ~DC_CFG_MSK, DC_DISPLAY_CFG_GDEN|DC_DISPLAY_CFG_TRUP); - geode_dc_write(DC_GENERAL_CFG, DC_DISPLAY_CFG_VGAE); - - geode_dc_write(DC_UNLOCK, DC_LOCK_LOCK); }
/* Setup the vp (video processor) portion of the geodelx @@ -306,6 +299,9 @@ static void vp_setup(void)
int geodevga_set_mode(struct vgamode_s *vmode_g, int flags) { + u32 dcfg = 0; + u32 gcfg = 0; + /* unlock dc register */ geode_dc_write(DC_UNLOCK, DC_LOCK_UNLOCK);
@@ -313,7 +309,16 @@ int geodevga_set_mode(struct vgamode_s *vmode_g, int flags) geode_dc_write(DC_FB_ST_OFFSET, 0x0); geode_dc_write(DC_CB_ST_OFFSET, 0x0); geode_dc_write(DC_CURS_ST_OFFSET, 0x0); - + + dcfg |= DC_DISPLAY_CFG_GDEN; /* enable graphics */ + dcfg |= DC_DISPLAY_CFG_TRUP; /* update working timing registers */ + + gcfg |= DC_DISPLAY_CFG_VGAE; /* enable VGA */ + + /* write main configuration register */ + geode_dc_mask(DC_DISPLAY_CFG, ~DC_CFG_MSK, dcfg); + geode_dc_write(DC_GENERAL_CFG, gcfg); + /* lock dc register */ geode_dc_write(DC_UNLOCK, DC_LOCK_LOCK);
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 9 --------- 1 file changed, 9 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 47e717e..3004be1 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -263,14 +263,6 @@ static void geodevga_graphics_enable(void) } }
-/* Set up the dc (display controller) portion of the geodelx -* The dc provides hardware support for VGA graphics. -*/ -static void dc_setup(void) -{ - dprintf(2, "DC_SETUP\n"); -} - /* Setup the vp (video processor) portion of the geodelx * Under VGA modes the vp was handled by softvg from inside VSA2. * Without a softvg module, access is only available through a pci bar. @@ -438,7 +430,6 @@ int geodevga_init(void) SET_VGA(VBE_total_memory, fb_size / 1024 / 64); // number of 64K blocks
vp_setup(); - dc_setup();
return 0; }
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 3004be1..e5cd39c 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -273,19 +273,7 @@ static void vp_setup(void) { dprintf(2,"VP_SETUP\n");
- geodevga_set_ouput_mode(); - - /* Set mmio registers - * there may be some timing issues here, the reads seem - * to slow things down enough work reliably - */ - - u32 reg = geode_vp_read(VP_MISC); - dprintf(1,"VP_SETUP VP_MISC=0x%08x\n",reg); - geode_vp_write(VP_MISC, VP_DCFG_BYP_BOTH); - reg = geode_vp_read(VP_MISC); - dprintf(1,"VP_SETUP VP_MISC=0x%08x\n",reg); - + geodevga_set_ouput_mode(); geodevga_graphics_enable(); }
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index e5cd39c..8462ebd 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -263,20 +263,6 @@ static void geodevga_graphics_enable(void) } }
-/* Setup the vp (video processor) portion of the geodelx -* Under VGA modes the vp was handled by softvg from inside VSA2. -* Without a softvg module, access is only available through a pci bar. -* The High Mem Access virtual register is used to configure the -* pci mmio bar from 16bit friendly io space. -*/ -static void vp_setup(void) -{ - dprintf(2,"VP_SETUP\n"); - - geodevga_set_ouput_mode(); - geodevga_graphics_enable(); -} - int geodevga_set_mode(struct vgamode_s *vmode_g, int flags) { u32 dcfg = 0; @@ -417,7 +403,8 @@ int geodevga_init(void) SET_VGA(VBE_framebuffer, fb); SET_VGA(VBE_total_memory, fb_size / 1024 / 64); // number of 64K blocks
- vp_setup(); + geodevga_set_ouput_mode(); + geodevga_graphics_enable();
return 0; }
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 8462ebd..5afe37a 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -33,6 +33,9 @@ static u64 geode_msr_read(u32 msrAddr) : "c"(msrAddr) : "cc" ); + + dprintf(4, "%s(0x%08x) = 0x%08x-0x%08x\n" + , __func__, msrAddr, val.hi, val.lo); return val.val; }
@@ -41,6 +44,10 @@ static void geode_msr_mask(u32 msrAddr, u64 off, u64 on) union u64_u32_u uand, uor; uand.val = ~off; uor.val = on; + + dprintf(4, "%s(0x%08x, 0x%016llx, 0x%016llx)\n" + , __func__, msrAddr, off, on); + asm __volatile__ ( "push %%eax \n" "movw $0x0AC1C, %%dx \n"
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 5afe37a..3104a08 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -147,7 +147,7 @@ static u32 geode_fp_read(int reg) { u32 val = geode_mem_read(GET_GLOBAL(GeodeVP) + VP_FP_START + reg); dprintf(4, "%s(0x%08x) = 0x%08x\n" - , __func__, GET_GLOBAL(GeodeVP) + reg, val); + , __func__, GET_GLOBAL(GeodeVP) + VP_FP_START + reg, val); return val; }
@@ -155,7 +155,7 @@ static void geode_fp_write(int reg, u32 val) { dprintf(4, "%s(0x%08x, 0x%08x)\n" , __func__, GET_GLOBAL(GeodeVP) + VP_FP_START + reg, val); - geode_mem_mask(GET_GLOBAL(GeodeVP) + reg, ~0, val); + geode_mem_mask(GET_GLOBAL(GeodeVP) + VP_FP_START + reg, ~0, val); }
/****************************************************************
It turns out that the CRT bits needs to be enabled for flat panel usage too.
Signed-off-by: Christian Gmeiner christian.gmeiner@gmail.com --- vgasrc/geodevga.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/vgasrc/geodevga.c b/vgasrc/geodevga.c index 3104a08..512184e 100644 --- a/vgasrc/geodevga.c +++ b/vgasrc/geodevga.c @@ -265,9 +265,7 @@ static void geodevga_graphics_enable(void) geode_fp_write(FP_PM, reg); }
- if (CONFIG_VGA_OUTPUT_CRT) { - geode_vp_mask(VP_DCFG, 0, VP_DCFG_CRT_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN | VP_DCFG_DAC_BL_EN | VP_DCFG_CRT_SKEW); - } + geode_vp_mask(VP_DCFG, 0, VP_DCFG_CRT_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN | VP_DCFG_DAC_BL_EN | VP_DCFG_CRT_SKEW); }
int geodevga_set_mode(struct vgamode_s *vmode_g, int flags)