svn commit: r327767 - in head/sys: conf i386/bios i386/conf i386/isa

Warner Losh imp at FreeBSD.org
Wed Jan 10 14:59:20 UTC 2018


Author: imp
Date: Wed Jan 10 14:59:19 2018
New Revision: 327767
URL: https://svnweb.freebsd.org/changeset/base/327767

Log:
  Retire pmtimer driver. Move time fixing into apm driver. Move
  Iwasaki-san's copyright over. Remove FIXME code that couldn't possibly
  work. Call tc_settime() with our estimate of the delta we've been
  alseep (the one we print) to adjust the time. Not sure what to do
  about callouts, so keep the small #ifdef in place there.
  
  Differential Revision: https://reviews.freebsd.org/D13823

Deleted:
  head/sys/i386/isa/pmtimer.c
Modified:
  head/sys/conf/files.i386
  head/sys/i386/bios/apm.c
  head/sys/i386/conf/GENERIC
  head/sys/i386/conf/NOTES

Modified: head/sys/conf/files.i386
==============================================================================
--- head/sys/conf/files.i386	Wed Jan 10 14:58:58 2018	(r327766)
+++ head/sys/conf/files.i386	Wed Jan 10 14:59:19 2018	(r327767)
@@ -520,7 +520,6 @@ i386/ibcs2/ibcs2_util.c		optional ibcs2
 i386/ibcs2/ibcs2_xenix.c	optional ibcs2
 i386/ibcs2/ibcs2_xenix_sysent.c	optional ibcs2
 i386/ibcs2/imgact_coff.c	optional ibcs2
-i386/isa/pmtimer.c		optional pmtimer
 i386/isa/prof_machdep.c		optional profiling-routine
 i386/linux/imgact_linux.c	optional compat_linux
 i386/linux/linux_dummy.c	optional compat_linux

Modified: head/sys/i386/bios/apm.c
==============================================================================
--- head/sys/i386/bios/apm.c	Wed Jan 10 14:58:58 2018	(r327766)
+++ head/sys/i386/bios/apm.c	Wed Jan 10 14:59:19 2018	(r327767)
@@ -16,6 +16,32 @@
  * Sep, 1994	Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
  */
 
+/*-
+ * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
@@ -38,6 +64,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/signalvar.h>
 #include <sys/sysctl.h>
 #include <sys/syslog.h>
+#include <sys/timetc.h>
 #include <sys/time.h>
 #include <sys/uio.h>
 
@@ -205,7 +232,7 @@ static int
 apm_driver_version(int version)
 {
 	struct apm_softc *sc = &apm_softc;
- 
+
 	sc->bios.r.eax = (APM_BIOS << 8) | APM_DRVVERSION;
 	sc->bios.r.ebx  = 0x0;
 	sc->bios.r.ecx  = version;
@@ -220,28 +247,28 @@ apm_driver_version(int version)
 
 	return (1);
 }
- 
+
 /* engage/disengage power management (APM 1.1 or later) */
 static int
 apm_engage_disengage_pm(int engage)
 {
 	struct apm_softc *sc = &apm_softc;
- 
+
 	sc->bios.r.eax = (APM_BIOS << 8) | APM_ENGAGEDISENGAGEPM;
 	sc->bios.r.ebx = PMDV_ALLDEV;
 	sc->bios.r.ecx = engage;
 	sc->bios.r.edx = 0;
 	return (apm_bioscall());
 }
- 
+
 /* get PM event */
 static u_int
 apm_getevent(void)
 {
 	struct apm_softc *sc = &apm_softc;
- 
+
 	sc->bios.r.eax = (APM_BIOS << 8) | APM_GETPMEVENT;
- 
+
 	sc->bios.r.ebx = 0;
 	sc->bios.r.ecx = 0;
 	sc->bios.r.edx = 0;
@@ -249,18 +276,18 @@ apm_getevent(void)
 		return (PMEV_NOEVENT);
 	return (sc->bios.r.ebx & 0xffff);
 }
- 
+
 /* suspend entire system */
 static int
 apm_suspend_system(int state)
 {
 	struct apm_softc *sc = &apm_softc;
- 
+
 	sc->bios.r.eax = (APM_BIOS << 8) | APM_SETPWSTATE;
 	sc->bios.r.ebx = PMDV_ALLDEV;
 	sc->bios.r.ecx = state;
 	sc->bios.r.edx = 0;
- 
+
 	if (apm_bioscall()) {
  		printf("Entire system suspend failure: errcode = %d\n",
 		       0xff & (sc->bios.r.eax >> 8));
@@ -280,7 +307,7 @@ int
 apm_display(int newstate)
 {
 	struct apm_softc *sc = &apm_softc;
- 
+
 	sc->bios.r.eax = (APM_BIOS << 8) | APM_SETPWSTATE;
 	sc->bios.r.ebx = PMDV_DISP0;
 	sc->bios.r.ecx = newstate ? PMST_APMENABLED:PMST_SUSPEND;
@@ -331,12 +358,10 @@ apm_battery_low(void)
 static struct apmhook *
 apm_add_hook(struct apmhook **list, struct apmhook *ah)
 {
-	int s;
 	struct apmhook *p, *prev;
 
 	APM_DPRINT("Add hook \"%s\"\n", ah->ah_name);
 
-	s = splhigh();
 	if (ah == NULL)
 		panic("illegal apm_hook!");
 	prev = NULL;
@@ -351,30 +376,25 @@ apm_add_hook(struct apmhook **list, struct apmhook *ah
 		ah->ah_next = prev->ah_next;
 		prev->ah_next = ah;
 	}
-	splx(s);
 	return ah;
 }
 
 static void
 apm_del_hook(struct apmhook **list, struct apmhook *ah)
 {
-	int s;
 	struct apmhook *p, *prev;
 
-	s = splhigh();
 	prev = NULL;
 	for (p = *list; p != NULL; prev = p, p = p->ah_next)
 		if (p == ah)
 			goto deleteit;
 	panic("Tried to delete unregistered apm_hook.");
-	goto nosuchnode;
+	return;
 deleteit:
 	if (prev != NULL)
 		prev->ah_next = p->ah_next;
 	else
 		*list = p->ah_next;
-nosuchnode:
-	splx(s);
 }
 
 
@@ -468,7 +488,7 @@ apm_do_standby(void)
 	sc->standbys = sc->standby_countdown = 0;
 
 	/*
-	 * As far as standby, we don't need to execute 
+	 * As far as standby, we don't need to execute
 	 * all of suspend hooks.
 	 */
 	if (apm_suspend_system(PMST_STANDBY) == 0)
@@ -1047,6 +1067,53 @@ apm_processevent(void)
 	} while (apm_event != PMEV_NOEVENT);
 }
 
+static struct timeval suspend_time;
+static struct timeval diff_time;
+
+static int
+apm_rtc_suspend(void *arg __unused)
+{
+
+	microtime(&diff_time);
+	inittodr(0);
+	microtime(&suspend_time);
+	timevalsub(&diff_time, &suspend_time);
+	return (0);
+}
+
+static int
+apm_rtc_resume(void *arg __unused)
+{
+	u_int second, minute, hour;
+	struct timeval resume_time, tmp_time;
+	struct timespec ts;
+
+	/* modified for adjkerntz */
+	timer_restore();		/* restore the all timers */
+	inittodr(0);			/* adjust time to RTC */
+	microtime(&resume_time);
+	getmicrotime(&tmp_time);
+	timevaladd(&tmp_time, &diff_time);
+	/* Calculate the delta time suspended */
+	timevalsub(&resume_time, &suspend_time);
+
+	second = ts.tv_sec = resume_time.tv_sec;
+	ts.tv_nsec = 0;
+	tc_setclock(&ts);
+
+#ifdef PMTIMER_FIXUP_CALLTODO
+	/* Fixup the calltodo list with the delta time. */
+	adjust_timeout_calltodo(&resume_time);
+#endif /* PMTIMER_FIXUP_CALLTODO */
+	hour = second / 3600;
+	second %= 3600;
+	minute = second / 60;
+	second %= 60;
+	log(LOG_NOTICE, "wakeup from sleeping state (slept %02d:%02d:%02d)\n",
+		hour, minute, second);
+	return (0);
+}
+
 /*
  * Attach APM:
  *
@@ -1128,7 +1195,7 @@ apm_attach(device_t dev)
 	}
 
 	/* Power the system off using APM */
-	EVENTHANDLER_REGISTER(shutdown_final, apm_power_off, NULL, 
+	EVENTHANDLER_REGISTER(shutdown_final, apm_power_off, NULL,
 			      SHUTDOWN_PRI_LAST);
 
 	/* Register APM again to pass the correct argument of pm_func. */
@@ -1142,6 +1209,15 @@ apm_attach(device_t dev)
 	    UID_ROOT, GID_OPERATOR, 0664, "apm");
 	make_dev(&apm_cdevsw, APMDEV_CTL,
 	    UID_ROOT, GID_OPERATOR, 0660, "apmctl");
+
+	sc->sc_suspend.ah_fun = apm_rtc_suspend;
+	sc->sc_suspend.ah_arg = sc;
+	apm_hook_establish(APM_HOOK_SUSPEND, &sc->sc_suspend);
+
+	sc->sc_resume.ah_fun = apm_rtc_resume;
+	sc->sc_resume.ah_arg = sc;
+	apm_hook_establish(APM_HOOK_RESUME, &sc->sc_resume);
+
 	return 0;
 }
 
@@ -1362,7 +1438,7 @@ apmwrite(struct cdev *dev, struct uio *uio, int ioflag
 	if ((error = uiomove((caddr_t)&event_type, sizeof(u_int), uio)))
 		return(error);
 
-	if (event_type < 0 || event_type >= APM_NPMEV)
+	if (event_type >= APM_NPMEV)
 		return(EINVAL);
 
 	if (sc->event_filter[event_type] == 0) {

Modified: head/sys/i386/conf/GENERIC
==============================================================================
--- head/sys/i386/conf/GENERIC	Wed Jan 10 14:58:58 2018	(r327766)
+++ head/sys/i386/conf/GENERIC	Wed Jan 10 14:59:19 2018	(r327767)
@@ -207,8 +207,6 @@ device		agp			# support several AGP chipsets
 
 # Power management support (see NOTES for more options)
 #device		apm
-# Add suspend/resume support for the i8254.
-device		pmtimer
 
 # PCCARD (PCMCIA) support
 # PCMCIA and cardbus bridge support

Modified: head/sys/i386/conf/NOTES
==============================================================================
--- head/sys/i386/conf/NOTES	Wed Jan 10 14:58:58 2018	(r327766)
+++ head/sys/i386/conf/NOTES	Wed Jan 10 14:59:19 2018	(r327767)
@@ -774,7 +774,6 @@ device 		hyperv		# HyperV drivers
 # smapi: System Management Application Program Interface driver
 # smbios: DMI/SMBIOS entry point
 # vpd: Vital Product Data kernel interface
-# pmtimer: Adjust system timer at wakeup time
 # pbio: Parallel (8255 PPI) basic I/O (mode 0) port (e.g. Advantech PCL-724)
 # asmc: Apple System Management Controller
 # si: Specialix International SI/XIO or SX intelligent serial card driver
@@ -808,7 +807,6 @@ device		ipmi
 device		smapi
 device		smbios
 device		vpd
-device		pmtimer
 device		pbio
 hint.pbio.0.at="isa"
 hint.pbio.0.port="0x360"


More information about the svn-src-head mailing list