vt_vga: add a timeout while waiting for vertical retrace

On one of my systems FreeBSD will fail to boot because vt_vga gets stuck
waiting for the vertical retrace if there's no monitor attached. Fix this by
adding a timeout and exiting if the vertical retrace times out.

Sponsored by: Citrix Systems R&D
Reviewed by: emaste, dumbbell
Differential Revision: https://reviews.freebsd.org/D2397
This commit is contained in:
Roger Pau Monné 2015-04-29 12:53:41 +00:00
parent 3e126de6bd
commit f0e31fe074

View File

@ -1035,11 +1035,12 @@ vga_initialize_graphics(struct vt_device *vd)
REG_WRITE1(sc, VGA_GC_DATA, 0xff);
}
static void
static int
vga_initialize(struct vt_device *vd, int textmode)
{
struct vga_softc *sc = vd->vd_softc;
uint8_t x;
int timeout;
/* Make sure the VGA adapter is not in monochrome emulation mode. */
x = REG_READ1(sc, VGA_GEN_MISC_OUTPUT_R);
@ -1060,10 +1061,16 @@ vga_initialize(struct vt_device *vd, int textmode)
* code therefore also removes that guarantee and appropriate measures
* need to be taken.
*/
timeout = 10000;
do {
DELAY(10);
x = REG_READ1(sc, VGA_GEN_INPUT_STAT_1);
x &= VGA_GEN_IS1_VR | VGA_GEN_IS1_DE;
} while (x != (VGA_GEN_IS1_VR | VGA_GEN_IS1_DE));
} while (x != (VGA_GEN_IS1_VR | VGA_GEN_IS1_DE) && --timeout != 0);
if (timeout == 0) {
printf("Timeout initializing vt_vga\n");
return (ENXIO);
}
/* Now, disable the sync. signals. */
REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MODE_CONTROL);
@ -1194,6 +1201,8 @@ vga_initialize(struct vt_device *vd, int textmode)
*/
sc->vga_curfg = sc->vga_curbg = 0xff;
}
return (0);
}
static int
@ -1235,7 +1244,8 @@ vga_init(struct vt_device *vd)
vd->vd_width = VT_VGA_WIDTH;
vd->vd_height = VT_VGA_HEIGHT;
}
vga_initialize(vd, textmode);
if (vga_initialize(vd, textmode) != 0)
return (CN_DEAD);
sc->vga_enabled = true;
return (CN_INTERNAL);