svn commit: r327767 - in head/sys: conf i386/bios i386/conf i386/isa
Warner Losh
imp at bsdimp.com
Wed Jan 10 16:48:07 UTC 2018
On Wed, Jan 10, 2018 at 9:31 AM, Rodney W. Grimes <
freebsd at pdx.rh.cn85.dnsmgr.net> wrote:
> [ Charset UTF-8 unsupported, converting... ]
> > 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
>
> RELNOTES: ?
> Reason I ask is this effects custom kernel config file(s)
Don't know. We don't normally document every kernel config file changes
that's required.
Warner
> > 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"
> >
> >
>
> --
> Rod Grimes
> rgrimes at freebsd.org
>
More information about the svn-src-all
mailing list