aboutsummaryrefslogtreecommitdiff
path: root/vgasrc
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2013-11-29 18:43:35 -0500
committerKevin O'Connor <kevin@koconnor.net>2013-12-04 10:34:17 -0500
commit5b6936e0e8a2dcee62cf789f25c0e18796268c42 (patch)
tree1ae66b18872c4ff5a4a9f90faa40c85c2c94cfdb /vgasrc
parent4cd522e673426e68a96e8d2a026b99e58a821ca0 (diff)
downloadseabios-hppa-5b6936e0e8a2dcee62cf789f25c0e18796268c42.zip
seabios-hppa-5b6936e0e8a2dcee62cf789f25c0e18796268c42.tar.gz
seabios-hppa-5b6936e0e8a2dcee62cf789f25c0e18796268c42.tar.bz2
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.c13
-rw-r--r--vgasrc/clext.c2
-rw-r--r--vgasrc/stdvga.h1
-rw-r--r--vgasrc/stdvgamodes.c7
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);
+}