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@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); +}