Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Nov 2009 20:22:09 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r198858 - in head/sys: dev/fb dev/syscons sys
Message-ID:  <200911032022.nA3KM96H003434@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Tue Nov  3 20:22:09 2009
New Revision: 198858
URL: http://svn.freebsd.org/changeset/base/198858

Log:
  Fix VESA color palette corruption:
  
  - VBE 3.0 says palette format resets to 6-bit mode when video mode changes.
  We simply set 8-bit mode when we switch modes if the adapter supports it.
  - VBE 3.0 also says if the mode is not VGA compatible, we must use VBE
  function to save/restore palette.  Otherwise, VGA function may be used.
  Thus, reinstate the save/load palette functions only for non-VGA compatible
  modes regardless of its palette format.
  - Let vesa(4) set VESA modes even if vga(4) claims to support it.
  - Reset default palette if VESA pixel mode is set initially.
  - Fix more style nits.

Modified:
  head/sys/dev/fb/vesa.c
  head/sys/dev/syscons/syscons.c
  head/sys/sys/fbio.h

Modified: head/sys/dev/fb/vesa.c
==============================================================================
--- head/sys/dev/fb/vesa.c	Tue Nov  3 19:05:05 2009	(r198857)
+++ head/sys/dev/fb/vesa.c	Tue Nov  3 20:22:09 2009	(r198858)
@@ -174,10 +174,8 @@ static int vesa_bios_save_palette2(int s
 				   u_char *b, int bits);
 static int vesa_bios_load_palette(int start, int colors, u_char *palette,
 				  int bits);
-#ifdef notyet
 static int vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g,
 				   u_char *b, int bits);
-#endif
 #define STATE_SIZE	0
 #define STATE_SAVE	1
 #define STATE_LOAD	2
@@ -415,9 +413,9 @@ vesa_bios_save_palette(int start, int co
 
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
-		palette[i*3]     = p[i*4 + 2] << bits;
-		palette[i*3 + 1] = p[i*4 + 1] << bits;
-		palette[i*3 + 2] = p[i*4] << bits;
+		palette[i * 3] = p[i * 4 + 2] << bits;
+		palette[i * 3 + 1] = p[i * 4 + 1] << bits;
+		palette[i * 3 + 2] = p[i * 4] << bits;
 	}
 	x86bios_free(p, colors * 4);
 
@@ -455,9 +453,9 @@ vesa_bios_save_palette2(int start, int c
 
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
-		r[i] = p[i*4 + 2] << bits;
-		g[i] = p[i*4 + 1] << bits;
-		b[i] = p[i*4] << bits;
+		r[i] = p[i * 4 + 2] << bits;
+		g[i] = p[i * 4 + 1] << bits;
+		b[i] = p[i * 4] << bits;
 	}
 	x86bios_free(p, colors * 4);
 
@@ -487,10 +485,10 @@ vesa_bios_load_palette(int start, int co
 
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
-		p[i*4]	   = palette[i*3 + 2] >> bits;
-		p[i*4 + 1] = palette[i*3 + 1] >> bits;
-		p[i*4 + 2] = palette[i*3] >> bits;
-		p[i*4 + 3] = 0;
+		p[i * 4] = palette[i * 3 + 2] >> bits;
+		p[i * 4 + 1] = palette[i * 3 + 1] >> bits;
+		p[i * 4 + 2] = palette[i * 3] >> bits;
+		p[i * 4 + 3] = 0;
 	}
 	x86bios_intr(&regs, 0x10);
 	x86bios_free(p, colors * 4);
@@ -498,7 +496,6 @@ vesa_bios_load_palette(int start, int co
 	return (regs.R_AX != 0x004f);
 }
 
-#ifdef notyet
 static int
 vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, u_char *b,
 			int bits)
@@ -523,17 +520,16 @@ vesa_bios_load_palette2(int start, int c
 
 	bits = 8 - bits;
 	for (i = 0; i < colors; ++i) {
-		p[i*4]	   = b[i] >> bits;
-		p[i*4 + 1] = g[i] >> bits;
-		p[i*4 + 2] = r[i] >> bits;
-		p[i*4 + 3] = 0;
+		p[i * 4] = b[i] >> bits;
+		p[i * 4 + 1] = g[i] >> bits;
+		p[i * 4 + 2] = r[i] >> bits;
+		p[i * 4 + 3] = 0;
 	}
 	x86bios_intr(&regs, 0x10);
 	x86bios_free(p, colors * 4);
 
 	return (regs.R_AX != 0x004f);
 }
-#endif
 
 static ssize_t
 vesa_bios_state_buf_size(void)
@@ -702,6 +698,7 @@ vesa_translate_flags(u_int16_t vflags)
 		{ V_MODECOLOR, V_INFO_COLOR, 0 },
 		{ V_MODEGRAPHICS, V_INFO_GRAPHICS, 0 },
 		{ V_MODELFB, V_INFO_LINEAR, 0 },
+		{ V_MODENONVGA, V_INFO_NONVGA, 0 },
 	};
 	int flags;
 	int i;
@@ -1275,7 +1272,8 @@ vesa_set_mode(video_adapter_t *adp, int 
 	 * the new mode correctly.
 	 */
 	if (VESA_MODE(adp->va_mode)) {
-		if ((*prevvidsw->get_info)(adp, mode, &info) == 0) {
+		if (!VESA_MODE(mode) &&
+		    (*prevvidsw->get_info)(adp, mode, &info) == 0) {
 			int10_set_mode(adp->va_initial_bios_mode);
 			if (adp->va_info.vi_flags & V_INFO_LINEAR)
 				vesa_unmap_buffer(adp->va_buffer,
@@ -1288,7 +1286,7 @@ vesa_set_mode(video_adapter_t *adp, int 
 	}
 
 	/* we may not need to handle this mode after all... */
-	if ((*prevvidsw->set_mode)(adp, mode) == 0)
+	if (!VESA_MODE(mode) && (*prevvidsw->set_mode)(adp, mode) == 0)
 		return (0);
 
 	/* is the new mode supported? */
@@ -1306,6 +1304,9 @@ vesa_set_mode(video_adapter_t *adp, int 
 	if (vesa_bios_set_mode(mode | ((info.vi_flags & V_INFO_LINEAR) ? 0x4000 : 0)))
 		return (1);
 
+	if ((vesa_adp_info->v_flags & V_DAC8) != 0)
+		vesa_bios_set_dac(8);
+
 	if (adp->va_info.vi_flags & V_INFO_LINEAR)
 		vesa_unmap_buffer(adp->va_buffer,
 				  vesa_adp_info->v_memsize*64*1024);
@@ -1382,17 +1383,11 @@ static int
 vesa_save_palette(video_adapter_t *adp, u_char *palette)
 {
 	int bits;
-	int error;
 
-	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8)
-	    && VESA_MODE(adp->va_mode)) {
-		bits = vesa_bios_get_dac();
-		error = vesa_bios_save_palette(0, 256, palette, bits);
-		if (error == 0)
-			return (0);
-		if (bits != 6)
-			return (error);
-	}
+	if ((adp == vesa_adp) &&
+	    (adp->va_info.vi_flags & V_INFO_NONVGA) != 0 &&
+	    (bits = vesa_bios_get_dac()) >= 6)
+		return (vesa_bios_save_palette(0, 256, palette, bits));
 
 	return ((*prevvidsw->save_palette)(adp, palette));
 }
@@ -1400,19 +1395,12 @@ vesa_save_palette(video_adapter_t *adp, 
 static int
 vesa_load_palette(video_adapter_t *adp, u_char *palette)
 {
-#ifdef notyet
 	int bits;
-	int error;
 
-	if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) 
-	    && VESA_MODE(adp->va_mode) && ((bits = vesa_bios_set_dac(8)) > 6)) {
-		error = vesa_bios_load_palette(0, 256, palette, bits);
-		if (error == 0)
-			return (0);
-		if (vesa_bios_set_dac(6) != 6)
-			return (1);
-	}
-#endif /* notyet */
+	if ((adp == vesa_adp) &&
+	    (adp->va_info.vi_flags & V_INFO_NONVGA) != 0 &&
+	    (bits = vesa_bios_get_dac()) >= 6)
+		return (vesa_bios_load_palette(0, 256, palette, bits));
 
 	return ((*prevvidsw->load_palette)(adp, palette));
 }
@@ -1637,14 +1625,11 @@ get_palette(video_adapter_t *adp, int ba
 		return (1);
 	if ((base + count) > 256)
 		return (1);
-	if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode))
+	if ((adp->va_info.vi_flags & V_INFO_NONVGA) == 0 ||
+	    (bits = vesa_bios_get_dac()) < 6)
 		return (1);
 
-	bits = vesa_bios_get_dac();
-	if (bits <= 6)
-		return (1);
-
-	r = malloc(count*3, M_DEVBUF, M_WAITOK);
+	r = malloc(count * 3, M_DEVBUF, M_WAITOK);
 	g = r + count;
 	b = g + count;
 	error = vesa_bios_save_palette2(base, count, r, g, b, bits);
@@ -1659,7 +1644,6 @@ get_palette(video_adapter_t *adp, int ba
 	}
 	free(r, M_DEVBUF);
 
-	/* if error && bits != 6 at this point, we are in trouble... XXX */
 	return (error);
 }
 
@@ -1667,8 +1651,6 @@ static int
 set_palette(video_adapter_t *adp, int base, int count,
 	    u_char *red, u_char *green, u_char *blue, u_char *trans)
 {
-	return (1);
-#ifdef notyet
 	u_char *r;
 	u_char *g;
 	u_char *b;
@@ -1677,11 +1659,11 @@ set_palette(video_adapter_t *adp, int ba
 
 	if ((base < 0) || (base >= 256) || (base + count > 256))
 		return (1);
-	if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode)
-		|| ((bits = vesa_bios_set_dac(8)) <= 6))
+	if ((adp->va_info.vi_flags & V_INFO_NONVGA) == 0 ||
+	    (bits = vesa_bios_get_dac()) < 6)
 		return (1);
 
-	r = malloc(count*3, M_DEVBUF, M_WAITOK);
+	r = malloc(count * 3, M_DEVBUF, M_WAITOK);
 	g = r + count;
 	b = g + count;
 	copyin(red, r, count);
@@ -1690,13 +1672,8 @@ set_palette(video_adapter_t *adp, int ba
 
 	error = vesa_bios_load_palette2(base, count, r, g, b, bits);
 	free(r, M_DEVBUF);
-	if (error == 0)
-		return (0);
 
-	/* if the following call fails, we are in trouble... XXX */
-	vesa_bios_set_dac(6);
-	return (1);
-#endif /* notyet */
+	return (error);
 }
 
 static int

Modified: head/sys/dev/syscons/syscons.c
==============================================================================
--- head/sys/dev/syscons/syscons.c	Tue Nov  3 19:05:05 2009	(r198857)
+++ head/sys/dev/syscons/syscons.c	Tue Nov  3 20:22:09 2009	(r198858)
@@ -414,6 +414,9 @@ sc_attach_unit(int unit, int flags)
 #endif
 	    sc_set_graphics_mode(scp, NULL, vmode);
 	    sc_set_pixel_mode(scp, NULL, 0, 0, 16, 8);
+#ifndef SC_NO_PALETTE_LOADING
+	    vidd_save_palette(sc->adp, sc->palette);
+#endif
 	    sc->initial_mode = vmode;
 #ifdef DEV_SPLASH
 	    /* put up the splash again! */

Modified: head/sys/sys/fbio.h
==============================================================================
--- head/sys/sys/fbio.h	Tue Nov  3 19:05:05 2009	(r198857)
+++ head/sys/sys/fbio.h	Tue Nov  3 20:22:09 2009	(r198858)
@@ -269,6 +269,7 @@ struct video_info {
 #define V_INFO_GRAPHICS	(1 << 1)
 #define V_INFO_LINEAR	(1 << 2)
 #define V_INFO_VESA	(1 << 3)
+#define	V_INFO_NONVGA	(1 << 4)
     int			vi_width;
     int			vi_height;
     int			vi_cwidth;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911032022.nA3KM96H003434>