Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Apr 2015 12:53:42 +0000 (UTC)
From:      Roger Pau Monné <royger@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282216 - head/sys/dev/vt/hw/vga
Message-ID:  <201504291253.t3TCrgL4088051@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: royger
Date: Wed Apr 29 12:53:41 2015
New Revision: 282216
URL: https://svnweb.freebsd.org/changeset/base/282216

Log:
  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

Modified:
  head/sys/dev/vt/hw/vga/vt_vga.c

Modified: head/sys/dev/vt/hw/vga/vt_vga.c
==============================================================================
--- head/sys/dev/vt/hw/vga/vt_vga.c	Wed Apr 29 12:37:45 2015	(r282215)
+++ head/sys/dev/vt/hw/vga/vt_vga.c	Wed Apr 29 12:53:41 2015	(r282216)
@@ -1035,11 +1035,12 @@ vga_initialize_graphics(struct vt_device
 	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
 	 * 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
 		 */
 		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);



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