diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2013-11-29 18:43:35 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2013-12-04 10:34:17 -0500 |
commit | 5b6936e0e8a2dcee62cf789f25c0e18796268c42 (patch) | |
tree | 1ae66b18872c4ff5a4a9f90faa40c85c2c94cfdb /vgasrc | |
parent | 4cd522e673426e68a96e8d2a026b99e58a821ca0 (diff) | |
download | seabios-5b6936e0e8a2dcee62cf789f25c0e18796268c42.tar.gz |
vgabios: Load the DAC palette in "packed" modes on Cirrus and BochsVGA.
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>
Diffstat (limited to 'vgasrc')
-rw-r--r-- | vgasrc/bochsvga.c | 13 | ||||
-rw-r--r-- | vgasrc/clext.c | 2 | ||||
-rw-r--r-- | vgasrc/stdvga.h | 1 | ||||
-rw-r--r-- | vgasrc/stdvgamodes.c | 7 |
4 files changed, 16 insertions, 7 deletions
diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c index 9425a828..27f7615e 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 93085cf1..f7751a2f 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 bb8b8d86..3685abab 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 dda35db1..a97c85fe 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); +} |