diff --git a/sys/dev/fb/vesa.c b/sys/dev/fb/vesa.c index d1439ece8316..0698220de78b 100644 --- a/sys/dev/fb/vesa.c +++ b/sys/dev/fb/vesa.c @@ -1322,6 +1322,16 @@ vesa_set_mode(video_adapter_t *adp, int mode) #if VESA_DEBUG > 0 printf("VESA: about to set a VESA mode...\n"); #endif + /* + * The mode change should reset the palette format to 6 bits, so + * we must reset V_ADP_DAC8. Some BIOSes do an incomplete reset + * if we call them with an 8-bit palette, so reset directly. + */ + if (adp->va_flags & V_ADP_DAC8) { + vesa_bios_set_dac(6); + adp->va_flags &= ~V_ADP_DAC8; + } + /* don't use the linear frame buffer for text modes. XXX */ if (!(info.vi_flags & V_INFO_GRAPHICS)) info.vi_flags &= ~V_INFO_LINEAR; @@ -1331,9 +1341,6 @@ vesa_set_mode(video_adapter_t *adp, int mode) if (vesa_bios_set_mode(mode | 0x8000)) return (1); - /* Palette format is reset by the above VBE function call. */ - adp->va_flags &= ~V_ADP_DAC8; - if ((vesa_adp_info->v_flags & V_DAC8) != 0 && (info.vi_flags & V_INFO_GRAPHICS) != 0 && vesa_bios_set_dac(8) > 6) @@ -1928,7 +1935,6 @@ vesa_load(void) static int vesa_unload(void) { - u_char palette[256*3]; int error; /* if the adapter is currently in a VESA mode, don't unload */ @@ -1942,10 +1948,8 @@ vesa_unload(void) if ((error = vesa_unload_ioctl()) == 0) { if (vesa_adp != NULL) { if ((vesa_adp->va_flags & V_ADP_DAC8) != 0) { - vesa_bios_save_palette(0, 256, palette, 8); vesa_bios_set_dac(6); vesa_adp->va_flags &= ~V_ADP_DAC8; - vesa_bios_load_palette(0, 256, palette, 6); } vesa_adp->va_flags &= ~V_ADP_VESA; vidsw[vesa_adp->va_index] = prevvidsw;