[SeaBIOS] [PATCH 1/5] vgabios: Load the DAC palette in "packed" modes on Cirrus and BochsVGA.

Kevin O'Connor kevin at koconnor.net
Sat Nov 30 18:59:34 CET 2013


This is a port of a patch applied to the "lgpl vgabios" tree (that was
released in its v0.7a release).

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 vgasrc/bochsvga.c    | 13 ++++++-------
 vgasrc/clext.c       |  2 ++
 vgasrc/stdvga.h      |  1 +
 vgasrc/stdvgamodes.c |  7 +++++++
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c
index 9425a82..27f7615 100644
--- a/vgasrc/bochsvga.c
+++ b/vgasrc/bochsvga.c
@@ -318,14 +318,13 @@ bochsvga_set_mode(struct vgamode_s *vmode_g, int flags)
     if (!GET_GLOBAL(dispi_found))
         return -1;
 
-    u8 depth = GET_GLOBAL(vmode_g->depth);
-    if (depth == 4)
+    u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
+    if (memmodel == MM_PLANAR)
         stdvga_set_mode(stdvga_find_mode(0x6a), 0);
-    if (depth == 8)
-        // XXX load_dac_palette(3);
-        ;
+    if (memmodel == MM_PACKED && !(flags & MF_NOPALETTE))
+        stdvga_set_packed_palette();
 
-    dispi_write(VBE_DISPI_INDEX_BPP, depth);
+    dispi_write(VBE_DISPI_INDEX_BPP, GET_GLOBAL(vmode_g->depth));
     u16 width = GET_GLOBAL(vmode_g->width);
     u16 height = GET_GLOBAL(vmode_g->height);
     dispi_write(VBE_DISPI_INDEX_XRES, width);
@@ -353,7 +352,7 @@ bochsvga_set_mode(struct vgamode_s *vmode_g, int flags)
     stdvga_attr_mask(0x10, 0x00, 0x01);
     stdvga_grdc_write(0x06, 0x05);
     stdvga_sequ_write(0x02, 0x0f);
-    if (depth >= 8) {
+    if (memmodel != MM_PLANAR) {
         stdvga_crtc_mask(crtc_addr, 0x14, 0x00, 0x40);
         stdvga_attr_mask(0x10, 0x00, 0x40);
         stdvga_sequ_mask(0x04, 0x00, 0x08);
diff --git a/vgasrc/clext.c b/vgasrc/clext.c
index 93085cf..f7751a2 100644
--- a/vgasrc/clext.c
+++ b/vgasrc/clext.c
@@ -466,6 +466,8 @@ clext_set_mode(struct vgamode_s *vmode_g, int flags)
     struct cirrus_mode_s *table_g = container_of(
         vmode_g, struct cirrus_mode_s, info);
     cirrus_switch_mode(table_g);
+    if (GET_GLOBAL(vmode_g->memmodel) == MM_PACKED && !(flags & MF_NOPALETTE))
+        stdvga_set_packed_palette();
     if (!(flags & MF_LINEARFB))
         cirrus_enable_16k_granularity();
     if (!(flags & MF_NOCLEARMEM))
diff --git a/vgasrc/stdvga.h b/vgasrc/stdvga.h
index bb8b8d8..3685aba 100644
--- a/vgasrc/stdvga.h
+++ b/vgasrc/stdvga.h
@@ -50,6 +50,7 @@ void stdvga_list_modes(u16 seg, u16 *dest, u16 *last);
 void stdvga_build_video_param(void);
 void stdvga_override_crtc(int mode, u8 *crtc);
 int stdvga_set_mode(struct vgamode_s *vmode_g, int flags);
+void stdvga_set_packed_palette(void);
 
 // stdvgaio.c
 u8 stdvga_pelmask_read(void);
diff --git a/vgasrc/stdvgamodes.c b/vgasrc/stdvgamodes.c
index dda35db..a97c85f 100644
--- a/vgasrc/stdvgamodes.c
+++ b/vgasrc/stdvgamodes.c
@@ -505,3 +505,10 @@ stdvga_set_mode(struct vgamode_s *vmode_g, int flags)
 
     return 0;
 }
+
+// Load the standard palette associated with 8bpp packed pixel vga modes.
+void
+stdvga_set_packed_palette(void)
+{
+    stdvga_dac_write(get_global_seg(), palette3, 0, sizeof(palette3) / 3);
+}
-- 
1.8.3.1




More information about the SeaBIOS mailing list