svn commit: r210303 - in stable/8/sys: dev/syscons isa

Jung-uk Kim jkim at FreeBSD.org
Tue Jul 20 18:28:35 UTC 2010


Author: jkim
Date: Tue Jul 20 18:28:34 2010
New Revision: 210303
URL: http://svn.freebsd.org/changeset/base/210303

Log:
  MFC:	r208411, r208412, r208413, r208564, r208567, r210149
  
  - Suspend screen updates when the video controller is powered down.
  - Let the first device suspend and the last device resume syscons(4).
  - Do not attempt to switch to the same VTs between suspend and resume.
  - When we are not switching VTs, just mark all buffer to be updated.
  - Fix some style(9) nits.

Modified:
  stable/8/sys/dev/syscons/syscons.c
  stable/8/sys/dev/syscons/syscons.h
  stable/8/sys/isa/syscons_isa.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/syscons/syscons.c
==============================================================================
--- stable/8/sys/dev/syscons/syscons.c	Tue Jul 20 17:57:10 2010	(r210302)
+++ stable/8/sys/dev/syscons/syscons.c	Tue Jul 20 18:28:34 2010	(r210303)
@@ -1688,7 +1688,7 @@ sccnupdate(scr_stat *scp)
 {
     /* this is a cut-down version of scrn_timer()... */
 
-    if (scp->sc->font_loading_in_progress)
+    if (scp->sc->suspend_in_progress || scp->sc->font_loading_in_progress)
 	return;
 
     if (debugger > 0 || panicstr || shutdown_in_progress) {
@@ -1738,7 +1738,7 @@ scrn_timer(void *arg)
 	return;
 
     /* don't do anything when we are performing some I/O operations */
-    if (sc->font_loading_in_progress) {
+    if (sc->suspend_in_progress || sc->font_loading_in_progress) {
 	if (again)
 	    timeout(scrn_timer, sc, hz / 10);
 	return;

Modified: stable/8/sys/dev/syscons/syscons.h
==============================================================================
--- stable/8/sys/dev/syscons/syscons.h	Tue Jul 20 17:57:10 2010	(r210302)
+++ stable/8/sys/dev/syscons/syscons.h	Tue Jul 20 18:28:34 2010	(r210303)
@@ -230,6 +230,7 @@ typedef struct sc_softc {
 	char        	switch_in_progress;
 	char        	write_in_progress;
 	char        	blink_in_progress;
+	char		suspend_in_progress;
 	struct mtx	video_mtx;
 
 	long		scrn_time_stamp;

Modified: stable/8/sys/isa/syscons_isa.c
==============================================================================
--- stable/8/sys/isa/syscons_isa.c	Tue Jul 20 17:57:10 2010	(r210302)
+++ stable/8/sys/isa/syscons_isa.c	Tue Jul 20 18:28:34 2010	(r210303)
@@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$");
 
 static devclass_t	sc_devclass;
 
-static sc_softc_t main_softc;
+static sc_softc_t	main_softc;
 #ifdef SC_NO_SUSPEND_VTYSWITCH
 static int sc_no_suspend_vtswitch = 1;
 #else
@@ -76,26 +76,28 @@ static int sc_no_suspend_vtswitch = 0;
 #endif
 static int sc_cur_scr;
 
-TUNABLE_INT("hw.syscons.sc_no_suspend_vtswitch", (int *)&sc_no_suspend_vtswitch);
+TUNABLE_INT("hw.syscons.sc_no_suspend_vtswitch", &sc_no_suspend_vtswitch);
 SYSCTL_DECL(_hw_syscons);
 SYSCTL_INT(_hw_syscons, OID_AUTO, sc_no_suspend_vtswitch, CTLFLAG_RW,
-	&sc_no_suspend_vtswitch, 0, "Disable VT switch before suspend.");
+    &sc_no_suspend_vtswitch, 0, "Disable VT switch before suspend.");
 
 static void
-scidentify (driver_t *driver, device_t parent)
+scidentify(driver_t *driver, device_t parent)
 {
+
 	BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "sc", 0);
 }
 
 static int
 scprobe(device_t dev)
 {
+
 	/* No pnp support */
 	if (isa_get_vendorid(dev))
 		return (ENXIO);
 
 	device_set_desc(dev, "System console");
-	return sc_probe_unit(device_get_unit(dev), device_get_flags(dev));
+	return (sc_probe_unit(device_get_unit(dev), device_get_flags(dev)));
 }
 
 static int
@@ -117,18 +119,17 @@ scsuspend(device_t dev)
 	if (sc->cur_scp == NULL)
 		return (0);
 
-	sc_cur_scr = sc->cur_scp->index;
-
-	if (sc_no_suspend_vtswitch)
-		return (0);
-
-	do {
-		sc_switch_scr(sc, 0);
-		if (!sc->switch_in_progress) {
-			break;
-		}
-		pause("scsuspend", hz);
-	} while (retry--);
+	if (sc->suspend_in_progress == 0) {
+		sc_cur_scr = sc->cur_scp->index;
+		if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
+			do {
+				sc_switch_scr(sc, 0);
+				if (!sc->switch_in_progress)
+					break;
+				pause("scsuspend", hz);
+			} while (retry--);
+	}
+	sc->suspend_in_progress++;
 
 	return (0);
 }
@@ -138,11 +139,18 @@ scresume(device_t dev)
 {
 	sc_softc_t	*sc;
 
-	if (sc_no_suspend_vtswitch)
+	sc = &main_softc;
+
+	if (sc->cur_scp == NULL)
 		return (0);
 
-	sc = &main_softc;
-	sc_switch_scr(sc, sc_cur_scr);
+	sc->suspend_in_progress--;
+	if (sc->suspend_in_progress == 0) {
+		if (!sc_no_suspend_vtswitch && sc_cur_scr != 0)
+			sc_switch_scr(sc, sc_cur_scr);
+		else
+			mark_all(sc->cur_scp);
+	}
 
 	return (0);
 }
@@ -150,7 +158,8 @@ scresume(device_t dev)
 int
 sc_max_unit(void)
 {
-	return devclass_get_maxunit(sc_devclass);
+
+	return (devclass_get_maxunit(sc_devclass));
 }
 
 sc_softc_t
@@ -159,53 +168,53 @@ sc_softc_t
 	sc_softc_t *sc;
 
 	if (unit < 0)
-		return NULL;
-	if (flags & SC_KERNEL_CONSOLE) {
+		return (NULL);
+	if ((flags & SC_KERNEL_CONSOLE) != 0) {
 		/* FIXME: clear if it is wired to another unit! */
 		sc = &main_softc;
 	} else {
-	        sc = (sc_softc_t *)device_get_softc(devclass_get_device(sc_devclass, unit));
+	        sc = device_get_softc(devclass_get_device(sc_devclass, unit));
 		if (sc == NULL)
-			return NULL;
+			return (NULL);
 	}
 	sc->unit = unit;
-	if (!(sc->flags & SC_INIT_DONE)) {
+	if ((sc->flags & SC_INIT_DONE) == 0) {
 		sc->keyboard = -1;
 		sc->adapter = -1;
 		sc->cursor_char = SC_CURSOR_CHAR;
 		sc->mouse_char = SC_MOUSE_CHAR;
 	}
-	return sc;
+	return (sc);
 }
 
 sc_softc_t
 *sc_find_softc(struct video_adapter *adp, struct keyboard *kbd)
 {
 	sc_softc_t *sc;
-	int units;
 	int i;
+	int units;
 
 	sc = &main_softc;
-	if (((adp == NULL) || (adp == sc->adp))
-	    && ((kbd == NULL) || (kbd == sc->kbd)))
-		return sc;
+	if ((adp == NULL || adp == sc->adp) &&
+	    (kbd == NULL || kbd == sc->kbd))
+		return (sc);
 	units = devclass_get_maxunit(sc_devclass);
 	for (i = 0; i < units; ++i) {
-	        sc = (sc_softc_t *)device_get_softc(devclass_get_device(sc_devclass, i));
+	        sc = device_get_softc(devclass_get_device(sc_devclass, i));
 		if (sc == NULL)
 			continue;
-		if (((adp == NULL) || (adp == sc->adp))
-		    && ((kbd == NULL) || (kbd == sc->kbd)))
-			return sc;
+		if ((adp == NULL || adp == sc->adp) &&
+		    (kbd == NULL || kbd == sc->kbd))
+			return (sc);
 	}
-	return NULL;
+	return (NULL);
 }
 
 int
 sc_get_cons_priority(int *unit, int *flags)
 {
 	const char *at;
-	int u, f;
+	int f, u;
 
 #ifdef XBOX
 	/*
@@ -216,7 +225,7 @@ sc_get_cons_priority(int *unit, int *fla
 	if (arch_i386_is_xbox) {
 		*unit = 0;
 		*flags = SC_KERNEL_CONSOLE;
-		return CN_INTERNAL;
+		return (CN_INTERNAL);
 	}
 #endif
 
@@ -245,24 +254,24 @@ sc_get_cons_priority(int *unit, int *fla
 		*flags = 0;
 	}
 #if 0
-	return ((*flags & SC_KERNEL_CONSOLE) ? CN_INTERNAL : CN_NORMAL);
+	return ((*flags & SC_KERNEL_CONSOLE) != 0 ? CN_INTERNAL : CN_NORMAL);
 #endif
-	return CN_INTERNAL;
+	return (CN_INTERNAL);
 }
 
 void
 sc_get_bios_values(bios_values_t *values)
 {
 #if defined(__i386__) || defined(__amd64__)
-	u_int8_t shift;
+	uint8_t shift;
 
-	values->cursor_start = *(u_int8_t *)BIOS_PADDRTOVADDR(0x461);
-	values->cursor_end = *(u_int8_t *)BIOS_PADDRTOVADDR(0x460);
-	shift = *(u_int8_t *)BIOS_PADDRTOVADDR(0x417);
-	values->shift_state = ((shift & BIOS_CLKED) ? CLKED : 0)
-			       | ((shift & BIOS_NLKED) ? NLKED : 0)
-			       | ((shift & BIOS_SLKED) ? SLKED : 0)
-			       | ((shift & BIOS_ALKED) ? ALKED : 0);
+	values->cursor_start = *(uint8_t *)BIOS_PADDRTOVADDR(0x461);
+	values->cursor_end = *(uint8_t *)BIOS_PADDRTOVADDR(0x460);
+	shift = *(uint8_t *)BIOS_PADDRTOVADDR(0x417);
+	values->shift_state = ((shift & BIOS_CLKED) != 0 ? CLKED : 0) |
+	    ((shift & BIOS_NLKED) != 0 ? NLKED : 0) |
+	    ((shift & BIOS_SLKED) != 0 ? SLKED : 0) |
+	    ((shift & BIOS_ALKED) != 0 ? ALKED : 0);
 #else
 	values->cursor_start = 0;
 	values->cursor_end = 32;
@@ -274,17 +283,17 @@ sc_get_bios_values(bios_values_t *values
 int
 sc_tone(int herz)
 {
+
 #if defined(HAS_TIMER_SPKR)
 	if (herz) {
 		if (timer_spkr_acquire())
-			return EBUSY;
+			return (EBUSY);
 		timer_spkr_setfreq(herz);
-	} else {
+	} else
 		timer_spkr_release();
-	}
 #endif
 
-	return 0;
+	return (0);
 }
 
 static device_method_t sc_methods[] = {
@@ -303,3 +312,70 @@ static driver_t sc_driver = {
 };
 
 DRIVER_MODULE(sc, isa, sc_driver, sc_devclass, 0, 0);
+
+static devclass_t	scpm_devclass;
+
+static void
+scpm_identify(driver_t *driver, device_t parent)
+{
+
+	device_add_child(parent, "scpm", 0);
+}
+
+static int
+scpm_probe(device_t dev)
+{
+
+	device_set_desc(dev, SC_DRIVER_NAME " suspend/resume");
+	device_quiet(dev);
+
+	return (BUS_PROBE_DEFAULT);
+}
+
+static int
+scpm_attach(device_t dev)
+{
+
+	bus_generic_probe(dev);
+	bus_generic_attach(dev);
+
+	return (0);
+}
+
+static int
+scpm_suspend(device_t dev)
+{
+	int error;
+
+	error = bus_generic_suspend(dev);
+	if (error != 0)
+		return (error);
+
+	return (scsuspend(dev));
+}
+
+static int
+scpm_resume(device_t dev)
+{
+
+	scresume(dev);
+
+	return (bus_generic_resume(dev));
+}
+
+static device_method_t scpm_methods[] = {
+	DEVMETHOD(device_identify,	scpm_identify),
+	DEVMETHOD(device_probe,		scpm_probe),
+	DEVMETHOD(device_attach,	scpm_attach),
+	DEVMETHOD(device_suspend,	scpm_suspend),
+	DEVMETHOD(device_resume,	scpm_resume),
+	{ 0, 0 }
+};
+
+static driver_t scpm_driver = {
+	"scpm",
+	scpm_methods,
+	0
+};
+
+DRIVER_MODULE(scpm, vgapm, scpm_driver, scpm_devclass, 0, 0);


More information about the svn-src-stable-8 mailing list