diff options
author | marius <marius@FreeBSD.org> | 2004-11-17 12:54:12 +0000 |
---|---|---|
committer | marius <marius@FreeBSD.org> | 2004-11-17 12:54:12 +0000 |
commit | 2686579ad5a500820a0201b64388f2961bb1f9fc (patch) | |
tree | 5c5676a797dec7f8d747b5904812c05bbcb4338e /sys/sparc64 | |
parent | 03daabfd53b688217a7c372346a879e5c3b5162b (diff) | |
download | FreeBSD-src-2686579ad5a500820a0201b64388f2961bb1f9fc.zip FreeBSD-src-2686579ad5a500820a0201b64388f2961bb1f9fc.tar.gz |
o Sync with the NetBSD mk48txx driver (the result simplyfies some changes
I have in mind for the genclock interface):
- Recognize the MK48T18 as well (differs from the MK48T08 only in
packaging options and voltages).
- Allow MD code to provide functions for reading/writing NVRAM/RTC
locations.
If passed NULL, the old behaviour using bus_space_{read,write}_1() is
used. Otherwise, all access to the chip goes via the MD functions.
This is necessary for mvmeppc boards where the mk48txx NVRAM/RTC is
not directly addressable.
- Cleanup MI mk48txx(4) todclock driver:
- Prepare mk48txxvar.h and leave only register definitions in
mk48txxreg.h.
- Define struct mk48txx_softc as usual devices and allocate necessary
members in it.
- Change mk48txx_attach() to only take a device_t.
o While converting the sparc64 eeprom driver to the above changes:
- Remove some dead code and stale comments.
- Use the NVRAM size provided by the mk48txx driver instead of hardcoding
it as suggested by a comment.
- Add a comment about why it doesn't make much sense to read the hostid
directly from the NVRAM except for displaying it when attaching.
- Don't print the hostid if it reads all zero because it's stored
elsewhere.
Diffstat (limited to 'sys/sparc64')
-rw-r--r-- | sys/sparc64/include/eeprom.h | 6 | ||||
-rw-r--r-- | sys/sparc64/sparc64/eeprom.c | 48 | ||||
-rw-r--r-- | sys/sparc64/sparc64/eeprom_ebus.c | 21 | ||||
-rw-r--r-- | sys/sparc64/sparc64/eeprom_sbus.c | 21 |
4 files changed, 52 insertions, 44 deletions
diff --git a/sys/sparc64/include/eeprom.h b/sys/sparc64/include/eeprom.h index 57a7ff5..21bd3d3 100644 --- a/sys/sparc64/include/eeprom.h +++ b/sys/sparc64/include/eeprom.h @@ -53,13 +53,9 @@ #ifndef _MACHINE_EEPROM_H_ #define _MACHINE_EEPROM_H_ -struct eeprom_softc { - struct mk48txx_softc *sc_mksoftc; -}; - extern devclass_t eeprom_devclass; int eeprom_probe(device_t); -int eeprom_attach(device_t, bus_space_tag_t, bus_space_handle_t); +int eeprom_attach(device_t); #endif /* _MACHINE_EEPROM_H_ */ diff --git a/sys/sparc64/sparc64/eeprom.c b/sys/sparc64/sparc64/eeprom.c index 5f67a31..8a81101 100644 --- a/sys/sparc64/sparc64/eeprom.c +++ b/sys/sparc64/sparc64/eeprom.c @@ -54,7 +54,6 @@ #include <sys/systm.h> #include <sys/bus.h> #include <sys/kernel.h> -#include <sys/malloc.h> #include <sys/resource.h> #include <dev/ofw/ofw_bus.h> @@ -67,13 +66,13 @@ #include <machine/eeprom.h> -#include <dev/mk48txx/mk48txxreg.h> +#include <dev/mk48txx/mk48txxvar.h> #include "clock_if.h" devclass_t eeprom_devclass; -#define IDPROM_OFFSET (8 * 1024 - 40) /* XXX - get nvram size from driver */ +#define IDPROM_OFFSET 40 int eeprom_probe(device_t dev) @@ -87,34 +86,45 @@ eeprom_probe(device_t dev) } int -eeprom_attach(device_t dev, bus_space_tag_t bt, bus_space_handle_t bh) +eeprom_attach(device_t dev) { + struct mk48txx_softc *sc; struct timespec ts; - struct idprom *idp; - const char *model; - int error, i; u_int32_t h; + int error, i; - if ((model = ofw_bus_get_model(dev)) == NULL) + sc = device_get_softc(dev); + + if ((sc->sc_model = ofw_bus_get_model(dev)) == NULL) panic("eeprom_attach: no model property"); /* Our TOD clock year 0 is 1968 */ - if ((error = mk48txx_attach(dev, bt, bh, model, 1968)) != 0) { - device_printf(dev, "Can't attach %s tod clock", model); + sc->sc_year0 = 1968; + sc->sc_flag = 0; + /* Default register read/write functions are used. */ + if ((error = mk48txx_attach(dev)) != 0) { + device_printf(dev, "cannot attach time of day clock\n"); return (error); } - /* XXX: register clock device */ - /* Get the host ID from the prom. */ - idp = (struct idprom *)((u_long)bh + IDPROM_OFFSET); - h = bus_space_read_1(bt, bh, IDPROM_OFFSET + - offsetof(struct idprom, id_machine)) << 24; + /* + * Get the hostid from the NVRAM. This serves no real purpose other + * than being able to display it below as not all sparc64 models + * have an `eeprom' device and even some that do store the hostid + * elsewhere. The hostid in the NVRAM of the MK48Txx reads all zero + * on the latter models. A generic way to retrieve the hostid is to + * use the `idprom' node. + */ + h = bus_space_read_1(sc->sc_bst, sc->sc_bsh, sc->sc_nvramsz - + IDPROM_OFFSET + offsetof(struct idprom, id_machine)) << 24; for (i = 0; i < 3; i++) { - h |= bus_space_read_1(bt, bh, IDPROM_OFFSET + - offsetof(struct idprom, id_hostid[i])) << ((2 - i) * 8); + h |= bus_space_read_1(sc->sc_bst, sc->sc_bsh, sc->sc_nvramsz - + IDPROM_OFFSET + offsetof(struct idprom, id_hostid[i])) << + ((2 - i) * 8); } - /* XXX: register host id */ - device_printf(dev, "hostid %x\n", (u_int)h); + if (h != 0) + device_printf(dev, "hostid %x\n", (u_int)h); + if (bootverbose) { mk48txx_gettime(dev, &ts); device_printf(dev, "current time: %ld.%09ld\n", (long)ts.tv_sec, diff --git a/sys/sparc64/sparc64/eeprom_ebus.c b/sys/sparc64/sparc64/eeprom_ebus.c index 645602b..a614ec4 100644 --- a/sys/sparc64/sparc64/eeprom_ebus.c +++ b/sys/sparc64/sparc64/eeprom_ebus.c @@ -54,21 +54,17 @@ #include <sys/systm.h> #include <sys/bus.h> #include <sys/kernel.h> -#include <sys/malloc.h> #include <sys/module.h> #include <sys/resource.h> -#include <dev/ofw/ofw_bus.h> - #include <machine/bus.h> -#include <machine/idprom.h> #include <machine/resource.h> #include <sys/rman.h> #include <machine/eeprom.h> -#include <dev/mk48txx/mk48txxreg.h> +#include <dev/mk48txx/mk48txxvar.h> #include "clock_if.h" @@ -93,7 +89,7 @@ static device_method_t eeprom_ebus_methods[] = { static driver_t eeprom_ebus_driver = { "eeprom", eeprom_ebus_methods, - 0, + sizeof(struct mk48txx_softc), }; DRIVER_MODULE(eeprom, ebus, eeprom_ebus_driver, eeprom_devclass, 0, 0); @@ -110,8 +106,12 @@ DRIVER_MODULE(eeprom, ebus, eeprom_ebus_driver, eeprom_devclass, 0, 0); static int eeprom_ebus_attach(device_t dev) { + struct mk48txx_softc *sc; struct resource *res; - int rid, error; + int rid; + + sc = device_get_softc(dev); + bzero(sc, sizeof(struct mk48txx_softc)); rid = 0; res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE); @@ -119,7 +119,8 @@ eeprom_ebus_attach(device_t dev) device_printf(dev, "could not allocate resources\n"); return (ENXIO); } - error = eeprom_attach(dev, rman_get_bustag(res), - rman_get_bushandle(res)); - return (error); + sc->sc_bst = rman_get_bustag(res); + sc->sc_bsh = rman_get_bushandle(res); + + return (eeprom_attach(dev)); } diff --git a/sys/sparc64/sparc64/eeprom_sbus.c b/sys/sparc64/sparc64/eeprom_sbus.c index 9273193..7732573 100644 --- a/sys/sparc64/sparc64/eeprom_sbus.c +++ b/sys/sparc64/sparc64/eeprom_sbus.c @@ -54,21 +54,17 @@ #include <sys/systm.h> #include <sys/bus.h> #include <sys/kernel.h> -#include <sys/malloc.h> #include <sys/module.h> #include <sys/resource.h> -#include <dev/ofw/ofw_bus.h> - #include <machine/bus.h> -#include <machine/idprom.h> #include <machine/resource.h> #include <sys/rman.h> #include <machine/eeprom.h> -#include <dev/mk48txx/mk48txxreg.h> +#include <dev/mk48txx/mk48txxvar.h> #include "clock_if.h" @@ -89,7 +85,7 @@ static device_method_t eeprom_sbus_methods[] = { static driver_t eeprom_sbus_driver = { "eeprom", eeprom_sbus_methods, - 0, + sizeof(struct mk48txx_softc), }; DRIVER_MODULE(eeprom, fhc, eeprom_sbus_driver, eeprom_devclass, 0, 0); @@ -107,8 +103,12 @@ DRIVER_MODULE(eeprom, sbus, eeprom_sbus_driver, eeprom_devclass, 0, 0); static int eeprom_sbus_attach(device_t dev) { + struct mk48txx_softc *sc; struct resource *res; - int rid, error; + int rid; + + sc = device_get_softc(dev); + bzero(sc, sizeof(struct mk48txx_softc)); rid = 0; res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); @@ -116,7 +116,8 @@ eeprom_sbus_attach(device_t dev) device_printf(dev, "could not allocate resources\n"); return (ENXIO); } - error = eeprom_attach(dev, rman_get_bustag(res), - rman_get_bushandle(res)); - return (error); + sc->sc_bst = rman_get_bustag(res); + sc->sc_bsh = rman_get_bushandle(res); + + return (eeprom_attach(dev)); } |