This is the first step into moving the glxpcib driver into MI land. The following diff brings the loongson and i386 drivers as close together as possible. The only difference after applying the diff are some defines which are already handled properly (from an MI point of view) in loongson/dev/glxreg.h.
So once this gets in we can move that header into MI land as well and have the same driver for both architectures -- this is step two of course. Please test and comment. Index: i386/pci/glxpcib.c =================================================================== RCS file: /cvs/src/sys/arch/i386/pci/glxpcib.c,v retrieving revision 1.13 diff -u -p -r1.13 glxpcib.c --- i386/pci/glxpcib.c 24 Sep 2010 10:30:29 -0000 1.13 +++ i386/pci/glxpcib.c 28 Sep 2010 18:35:55 -0000 @@ -24,12 +24,15 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/proc.h> #include <sys/device.h> #include <sys/gpio.h> #include <sys/timetc.h> #include <machine/bus.h> +#ifdef __i386__ #include <machine/cpufunc.h> +#endif #include <dev/gpio/gpiovar.h> #include <dev/pci/pcireg.h> @@ -125,6 +128,15 @@ #define AMD5536_GPIO_IN_INVRT_EN 0x24 /* invert input */ #define AMD5536_GPIO_READ_BACK 0x30 /* read back value */ +/* + * MSR registers we want to preserve accross suspend/resume + */ +const uint32_t glxpcib_msrlist[] = { + GLIU_PAE, + GLCP_GLD_MSR_PM, + DIVIL_BALL_OPTS +}; + struct glxpcib_softc { struct device sc_dev; @@ -132,7 +144,9 @@ struct glxpcib_softc { bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; -#ifndef SMALL_KERNEL + uint64_t sc_msrsave[nitems(glxpcib_msrlist)]; + +#if !defined(SMALL_KERNEL) && NGPIO > 0 /* GPIO interface */ bus_space_tag_t sc_gpio_iot; bus_space_handle_t sc_gpio_ioh; @@ -160,12 +174,12 @@ struct cfattach glxpcib_ca = { void pcibattach(struct device *parent, struct device *self, void *aux); u_int glxpcib_get_timecount(struct timecounter *tc); -#ifndef SMALL_KERNEL -int glxpcib_wdogctl_cb(void *, int); +#if !defined(SMALL_KERNEL) && NGPIO > 0 +void glxpcib_gpio_pin_ctl(void *, int, int); int glxpcib_gpio_pin_read(void *, int); void glxpcib_gpio_pin_write(void *, int, int); -void glxpcib_gpio_pin_ctl(void *, int, int); +int glxpcib_wdogctl_cb(void *, int); #endif const struct pci_matchid glxpcib_devices[] = { @@ -176,8 +190,10 @@ int glxpcib_match(struct device *parent, void *match, void *aux) { if (pci_matchbyid((struct pci_attach_args *)aux, glxpcib_devices, - sizeof(glxpcib_devices) / sizeof(glxpcib_devices[0]))) + nitems(glxpcib_devices))) { + /* needs to win over pcib */ return 2; + } return 0; } @@ -187,18 +203,21 @@ glxpcib_attach(struct device *parent, st { struct glxpcib_softc *sc = (struct glxpcib_softc *)self; struct timecounter *tc = &sc->sc_timecounter; -#ifndef SMALL_KERNEL - struct pci_attach_args *pa = aux; +#ifndef !defined(SMALL_KERNEL) && NGPIO > 0 + struct pci_attach_args *pa = (struct pci_attach_args *)aux; u_int64_t wa, ga; struct gpiobus_attach_args gba; int i, gpio = 0; #endif - tc->tc_get_timecount = glxpcib_get_timecount; tc->tc_counter_mask = 0xffffffff; tc->tc_frequency = 3579545; tc->tc_name = "CS5536"; +#ifdef __loongson__ + tc->tc_quality = 0; +#else tc->tc_quality = 1000; +#endif tc->tc_priv = sc; tc_init(tc); @@ -206,14 +225,13 @@ glxpcib_attach(struct device *parent, st (int)rdmsr(AMD5536_REV) & AMD5536_REV_MASK, tc->tc_frequency); -#ifndef SMALL_KERNEL +#if !defined(SMALL_KERNEL) && NGPIO > 0 /* Attach the watchdog timer */ sc->sc_iot = pa->pa_iot; wa = rdmsr(MSR_LBAR_MFGPT); if (wa & MSR_LBAR_ENABLE && !bus_space_map(sc->sc_iot, wa & MSR_MFGPT_ADDR_MASK, MSR_MFGPT_SIZE, 0, &sc->sc_ioh)) { - /* count in seconds (as upper level desires) */ bus_space_write_2(sc->sc_iot, sc->sc_ioh, AMD5536_MFGPT0_SETUP, AMD5536_MFGPT_CNT_EN | AMD5536_MFGPT_CMP2EV | @@ -259,7 +277,8 @@ glxpcib_attach(struct device *parent, st } #endif pcibattach(parent, self, aux); -#ifndef SMALL_KERNEL + +#if !defined(SMALL_KERNEL) && NGPIO > 0 if (gpio) config_found(&sc->sc_dev, &gba, gpiobus_print); #endif @@ -272,6 +291,7 @@ glxpcib_activate(struct device *self, in struct glxpcib_softc *sc = (struct glxpcib_softc *)self; #endif int rv = 0; + uint i; switch (act) { case DVACT_QUIESCE: @@ -286,12 +306,17 @@ glxpcib_activate(struct device *self, in } #endif rv = config_activate_children(self, act); + for (i = 0; i < nitems(glxpcib_msrlist); i++) + sc->sc_msrsave[i] = rdmsr(glxpcib_msrlist[i]); + break; case DVACT_RESUME: #ifndef SMALL_KERNEL if (sc->sc_wdog) glxpcib_wdogctl_cb(sc, sc->sc_wdog_period); #endif + for (i = 0; i < nitems(glxpcib_msrlist); i++) + wrmsr(glxpcib_msrlist[i], sc->sc_msrsave[i]); rv = config_activate_children(self, act); break; } @@ -304,7 +329,7 @@ glxpcib_get_timecount(struct timecounter return rdmsr(AMD5536_TMC); } -#ifndef SMALL_KERNEL +#if !defined(SMALL_KERNEL) && NGPIO > 0 int glxpcib_wdogctl_cb(void *v, int period) { Index: loongson/dev/glxpcib.c =================================================================== RCS file: /cvs/src/sys/arch/loongson/dev/glxpcib.c,v retrieving revision 1.12 diff -u -p -r1.12 glxpcib.c --- loongson/dev/glxpcib.c 24 Sep 2010 10:30:28 -0000 1.12 +++ loongson/dev/glxpcib.c 28 Sep 2010 18:35:56 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: glxpcib.c,v 1.12 2010/09/24 10:30:28 pirofti Exp $ */ +/* $OpenBSD: glxpcib.c,v 1.11 2010/09/21 11:23:20 pirofti Exp $ */ /* * Copyright (c) 2007 Marc Balmer <mbal...@openbsd.org> @@ -30,6 +30,9 @@ #include <sys/timetc.h> #include <machine/bus.h> +#ifdef __i386__ +#include <machine/cpufunc.h> +#endif #include <dev/gpio/gpiovar.h> #include <dev/pci/pcireg.h> @@ -148,12 +151,13 @@ struct glxpcib_softc { uint64_t sc_msrsave[nitems(glxpcib_msrlist)]; -#if NGPIO > 0 +#if !defined(SMALL_KERNEL) && NGPIO > 0 /* GPIO interface */ bus_space_tag_t sc_gpio_iot; bus_space_handle_t sc_gpio_ioh; struct gpio_chipset_tag sc_gpio_gc; gpio_pin_t sc_gpio_pins[AMD5536_GPIO_NPINS]; + int sc_wdog; int sc_wdog_period; #endif }; @@ -176,7 +180,7 @@ void pcibattach(struct device *parent, s u_int glxpcib_get_timecount(struct timecounter *tc); -#if NGPIO > 0 +#if !defined(SMALL_KERNEL) && NGPIO > 0 void glxpcib_gpio_pin_ctl(void *, int, int); int glxpcib_gpio_pin_read(void *, int); void glxpcib_gpio_pin_write(void *, int, int); @@ -204,15 +208,12 @@ glxpcib_attach(struct device *parent, st { struct glxpcib_softc *sc = (struct glxpcib_softc *)self; struct timecounter *tc = &sc->sc_timecounter; -#if NGPIO > 0 +#ifndef !defined(SMALL_KERNEL) && NGPIO > 0 struct pci_attach_args *pa = (struct pci_attach_args *)aux; u_int64_t wa, ga; struct gpiobus_attach_args gba; int i, gpio = 0; #endif - - printf(": rev %d", - (int)rdmsr(AMD5536_REV) & AMD5536_REV_MASK); tc->tc_get_timecount = glxpcib_get_timecount; tc->tc_counter_mask = 0xffffffff; tc->tc_frequency = 3579545; @@ -225,9 +226,11 @@ glxpcib_attach(struct device *parent, st tc->tc_priv = sc; tc_init(tc); - printf(", 32-bit %lluHz timer", tc->tc_frequency); + printf(": rev %d, 32-bit %lluHz timer", + (int)rdmsr(AMD5536_REV) & AMD5536_REV_MASK, + tc->tc_frequency); -#if NGPIO > 0 +#if !defined(SMALL_KERNEL) && NGPIO > 0 /* Attach the watchdog timer */ sc->sc_iot = pa->pa_iot; wa = rdmsr(MSR_LBAR_MFGPT); @@ -239,6 +242,7 @@ glxpcib_attach(struct device *parent, st AMD5536_MFGPT_CNT_EN | AMD5536_MFGPT_CMP2EV | AMD5536_MFGPT_CMP2 | AMD5536_MFGPT_DIV_MASK); wdog_register(sc, glxpcib_wdogctl_cb); + sc->sc_wdog = 1; printf(", watchdog"); } @@ -279,7 +283,7 @@ glxpcib_attach(struct device *parent, st #endif pcibattach(parent, self, aux); -#if NGPIO > 0 +#if !defined(SMALL_KERNEL) && NGPIO > 0 if (gpio) config_found(&sc->sc_dev, &gba, gpiobus_print); #endif @@ -288,7 +292,9 @@ glxpcib_attach(struct device *parent, st int glxpcib_activate(struct device *self, int act) { +#ifndef SMALL_KERNEL struct glxpcib_softc *sc = (struct glxpcib_softc *)self; +#endif int rv = 0; uint i; @@ -297,25 +303,29 @@ glxpcib_activate(struct device *self, in rv = config_activate_children(self, act); break; case DVACT_SUSPEND: +#ifndef SMALL_KERNEL + if (sc->sc_wdog) { + sc->sc_wdog_period = bus_space_read_2(sc->sc_iot, + sc->sc_ioh, AMD5536_MFGPT0_CMP2); + glxpcib_wdogctl_cb(sc, 0); + } +#endif rv = config_activate_children(self, act); for (i = 0; i < nitems(glxpcib_msrlist); i++) sc->sc_msrsave[i] = rdmsr(glxpcib_msrlist[i]); - sc->sc_wdog_period = bus_space_read_2(sc->sc_iot, sc->sc_ioh, - AMD5536_MFGPT0_CMP2); - glxpcib_wdogctl_cb(sc, 0); - break; case DVACT_RESUME: - glxpcib_wdogctl_cb(sc, sc->sc_wdog_period); - +#ifndef SMALL_KERNEL + if (sc->sc_wdog) + glxpcib_wdogctl_cb(sc, sc->sc_wdog_period); +#endif for (i = 0; i < nitems(glxpcib_msrlist); i++) wrmsr(glxpcib_msrlist[i], sc->sc_msrsave[i]); rv = config_activate_children(self, act); break; } - - return rv; + return (rv); } u_int @@ -324,7 +334,7 @@ glxpcib_get_timecount(struct timecounter return rdmsr(AMD5536_TMC); } -#if NGPIO > 0 +#if !defined(SMALL_KERNEL) && NGPIO > 0 int glxpcib_wdogctl_cb(void *v, int period) {