diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc index ab91b50f80f1..8581a986efa1 100644 --- a/sys/conf/files.powerpc +++ b/sys/conf/files.powerpc @@ -72,6 +72,7 @@ crypto/blowfish/bf_enc.c optional ipsec ipsec_esp crypto/des/des_enc.c optional ipsec ipsec_esp dev/ofw/openfirm.c standard +dev/ofw/ofw_bus_if.m standard dev/ofw/ofw_console.c standard dev/ofw/ofw_disk.c optional ofwd diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64 index 148483ecd3c0..ad33b63cff6c 100644 --- a/sys/conf/files.sparc64 +++ b/sys/conf/files.sparc64 @@ -18,6 +18,7 @@ dev/fb/creator.c optional creator sc dev/fb/fb.c optional sc dev/fb/splash.c optional splash dev/kbd/kbd.c optional sc +dev/ofw/ofw_bus_if.m standard dev/ofw/ofw_console.c optional ofw_console dev/ofw/openfirm.c standard dev/ofw/openfirmio.c standard @@ -78,7 +79,7 @@ sparc64/sparc64/elf_machdep.c standard sparc64/sparc64/exception.S standard no-obj sparc64/sparc64/eeprom.c optional eeprom sparc64/sparc64/eeprom_ebus.c optional eeprom ebus -sparc64/sparc64/eeprom_fhc.c optional eeprom fhc +sparc64/sparc64/eeprom_sbus.c optional eeprom fhc sparc64/sparc64/eeprom_sbus.c optional eeprom sbus sparc64/sparc64/gdb_machdep.c optional gdb sparc64/sparc64/identcpu.c standard diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk index 39cca2c26268..6ac4035e33fa 100644 --- a/sys/conf/kmod.mk +++ b/sys/conf/kmod.mk @@ -294,6 +294,7 @@ MFILES?= kern/bus_if.m kern/device_if.m dev/iicbus/iicbb_if.m \ dev/iicbus/iicbus_if.m isa/isa_if.m \ libkern/iconv_converter_if.m \ dev/acpica/acpi_if.m dev/eisa/eisa_if.m dev/mii/miibus_if.m \ + dev/ofw/ofw_bus_if.m \ dev/pccard/card_if.m dev/pccard/power_if.m dev/pci/pci_if.m \ dev/pci/pcib_if.m dev/ppbus/ppbus_if.m dev/smbus/smbus_if.m \ dev/usb/usb_if.m dev/sound/pcm/ac97_if.m dev/sound/pcm/channel_if.m \ diff --git a/sys/dev/esp/esp_sbus.c b/sys/dev/esp/esp_sbus.c index ec1e037967a9..eb32f1dde386 100644 --- a/sys/dev/esp/esp_sbus.c +++ b/sys/dev/esp/esp_sbus.c @@ -76,8 +76,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include +#include #include #include #include @@ -168,9 +169,9 @@ static struct ncr53c9x_glue esp_sbus_glue = { static int esp_sbus_probe(device_t dev) { - char *name; + const char *name; - name = sbus_get_name(dev); + name = ofw_bus_get_name(dev); if (strcmp("SUNW,fas", name) == 0) { device_set_desc(dev, "Sun FAS366 Fast-Wide SCSI"); return (-10); @@ -189,7 +190,7 @@ esp_sbus_attach(device_t dev) int burst; esc->sc_dev = dev; - node = sbus_get_node(dev); + node = ofw_bus_get_node(dev); if (OF_getprop(node, "initiator-id", &sc->sc_id, sizeof(sc->sc_id)) == -1) sc->sc_id = 7;; diff --git a/sys/dev/hme/if_hme_sbus.c b/sys/dev/hme/if_hme_sbus.c index f2eac6d7b4da..06c0d8a6104a 100644 --- a/sys/dev/hme/if_hme_sbus.c +++ b/sys/dev/hme/if_hme_sbus.c @@ -51,8 +51,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include -#include #include #include @@ -131,9 +132,9 @@ MODULE_DEPEND(hme, ether, 1, 1, 1); static int hme_sbus_probe(device_t dev) { - char *name; + const char *name; - name = sbus_get_name(dev); + name = ofw_bus_get_name(dev); if (strcmp(name, "SUNW,qfe") == 0 || strcmp(name, "SUNW,hme") == 0) { device_set_desc(dev, "Sun HME 10/100 Ethernet"); diff --git a/sys/dev/isp/isp_sbus.c b/sys/dev/isp/isp_sbus.c index a1f912de87f1..5f87f3dbb08e 100644 --- a/sys/dev/isp/isp_sbus.c +++ b/sys/dev/isp/isp_sbus.c @@ -35,11 +35,12 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include + #include #include #include -#include -#include #include #include @@ -110,7 +111,7 @@ static int isp_sbus_probe(device_t dev) { int found = 0; - char *name = sbus_get_name(dev); + const char *name = ofw_bus_get_name(dev); if (strcmp(name, "SUNW,isp") == 0 || strcmp(name, "QLGC,isp") == 0 || strcmp(name, "ptisp") == 0 || @@ -240,8 +241,8 @@ isp_sbus_attach(device_t dev) * would fail in trying to download (via poking) * FW. We give up on them. */ - if (strcmp("PTI,ptisp", sbus_get_name(dev)) == 0 || - strcmp("ptisp", sbus_get_name(dev)) == 0) { + if (strcmp("PTI,ptisp", ofw_bus_get_name(dev)) == 0 || + strcmp("ptisp", ofw_bus_get_name(dev)) == 0) { isp->isp_confopts |= ISP_CFG_NORELOAD; } diff --git a/sys/dev/ofw/ofw_bus.h b/sys/dev/ofw/ofw_bus.h new file mode 100644 index 000000000000..3f4fbae9754d --- /dev/null +++ b/sys/dev/ofw/ofw_bus.h @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2001, 2003 by Thomas Moestl + * Copyright (c) 2004 by Marius Strobl + * 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 ``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. + * + * $FreeBSD$ + */ + +#ifndef _DEV_OFW_OFW_BUS_H_ +#define _DEV_OFW_OFW_BUS_H_ + +#include + +#include + +#include "ofw_bus_if.h" + +static __inline const char * +ofw_bus_get_compat(device_t dev) +{ + + return (OFW_BUS_GET_COMPAT(device_get_parent(dev), dev)); +} + +static __inline const char * +ofw_bus_get_model(device_t dev) +{ + + return (OFW_BUS_GET_MODEL(device_get_parent(dev), dev)); +} + +static __inline const char * +ofw_bus_get_name(device_t dev) +{ + + return (OFW_BUS_GET_NAME(device_get_parent(dev), dev)); +} + +static __inline phandle_t +ofw_bus_get_node(device_t dev) +{ + + return (OFW_BUS_GET_NODE(device_get_parent(dev), dev)); +} + +static __inline const char * +ofw_bus_get_type(device_t dev) +{ + + return (OFW_BUS_GET_TYPE(device_get_parent(dev), dev)); +} + +#endif /* !_DEV_OFW_OFW_BUS_H_ */ diff --git a/sys/dev/ofw/ofw_bus_if.m b/sys/dev/ofw/ofw_bus_if.m new file mode 100644 index 000000000000..87e4fcc41e28 --- /dev/null +++ b/sys/dev/ofw/ofw_bus_if.m @@ -0,0 +1,110 @@ +# Copyright (c) 2001, 2003 by Thomas Moestl +# Copyright (c) 2004 by Marius Strobl +# 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 ``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. +# +# $FreeBSD$ + +#include +#include + +#include + +INTERFACE ofw_bus; + +CODE { + static ofw_bus_get_compat_t ofw_bus_default_get_compat; + static ofw_bus_get_model_t ofw_bus_default_get_model; + static ofw_bus_get_name_t ofw_bus_default_get_name; + static ofw_bus_get_node_t ofw_bus_default_get_node; + static ofw_bus_get_type_t ofw_bus_default_get_type; + + static const char * + ofw_bus_default_get_compat(device_t bus, device_t dev) + { + + return (NULL); + } + + static const char * + ofw_bus_default_get_model(device_t bus, device_t dev) + { + + return (NULL); + } + + static const char * + ofw_bus_default_get_name(device_t bus, device_t dev) + { + + return (NULL); + } + + static phandle_t + ofw_bus_default_get_node(device_t bus, device_t dev) + { + + return (0); + } + + static const char * + ofw_bus_default_get_type(device_t bus, device_t dev) + { + + return (NULL); + } +}; + +# Get the alternate firmware name for the device dev on the bus. The default +# method will return NULL, which means the device doesn't have such a property. +METHOD const char * get_compat { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_compat; + +# Get the firmware model name for the device dev on the bus. The default method +# will return NULL, which means the device doesn't have such a property. +METHOD const char * get_model { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_model; + +# Get the firmware name for the device dev on the bus. The default method will +# return NULL, which means the device doesn't have such a property. +METHOD const char * get_name { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_name; + +# Get the firmware node for the device dev on the bus. The default method will +# return 0, which signals that there is no such node. +METHOD phandle_t get_node { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_node; + +# Get the firmware device type for the device dev on the bus. The default +# method will return NULL, which means the device doesn't have such a property. +METHOD const char * get_type { + device_t bus; + device_t dev; +} DEFAULT ofw_bus_default_get_type; diff --git a/sys/dev/pcf/envctrl.c b/sys/dev/pcf/envctrl.c index 74d87c7ac69e..7b5f0649a6d8 100644 --- a/sys/dev/pcf/envctrl.c +++ b/sys/dev/pcf/envctrl.c @@ -46,15 +46,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include #include -#include - -#include - #include #include #include "iicbus_if.h" @@ -95,7 +93,7 @@ static int envctrl_probe(device_t dev) { - if (strcmp("SUNW,envctrl", ebus_get_name(dev)) == 0) { + if (strcmp("SUNW,envctrl", ofw_bus_get_name(dev)) == 0) { device_set_desc(dev, "EBus SUNW,envctrl"); return (0); } diff --git a/sys/dev/pcf/pcf_ebus.c b/sys/dev/pcf/pcf_ebus.c index 13b81102095f..b23c8dd5b5b8 100644 --- a/sys/dev/pcf/pcf_ebus.c +++ b/sys/dev/pcf/pcf_ebus.c @@ -70,15 +70,14 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include + #include #include #include -#include - -#include - #include #include #include "iicbus_if.h" @@ -117,15 +116,15 @@ static driver_t pcf_ebus_driver = { static int pcf_ebus_probe(device_t dev) { - char *compat; + const char *compat; /* * We must not attach to this i2c device if this is a system with * a boot-bus controller. Additionally testing the compatibility * property will hopefully take care of this. */ - if (strcmp("i2c", ebus_get_name(dev)) == 0) { - compat = ebus_get_compat(dev); + if (strcmp("i2c", ofw_bus_get_name(dev)) == 0) { + compat = ofw_bus_get_compat(dev); if (compat != NULL && strcmp("i2cpcf,8584", compat) == 0) { device_set_desc(dev, "PCF8584 I2C bus controller"); return (0); @@ -146,7 +145,7 @@ pcf_ebus_attach(device_t dev) bzero(sc, sizeof(struct pcf_softc)); /* get OFW node of the pcf */ - if ((node = ebus_get_node(dev)) <= 0) { + if ((node = ofw_bus_get_node(dev)) <= 0) { device_printf(dev, "cannot get OFW node\n"); goto error; } diff --git a/sys/dev/puc/puc_ebus.c b/sys/dev/puc/puc_ebus.c index ce0184a73e4c..c7ddeb40153e 100644 --- a/sys/dev/puc/puc_ebus.c +++ b/sys/dev/puc/puc_ebus.c @@ -35,13 +35,13 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include + #include #include #include -#include -#include - #define PUC_ENTRAILS 1 #include @@ -50,7 +50,7 @@ puc_ebus_probe(device_t dev) { const char *nm; - nm = ebus_get_name(dev); + nm = ofw_bus_get_name(dev); if (!strcmp(nm, "se")) { device_set_desc(dev, "Siemens SAB 82532 dual channel SCC"); return (0); diff --git a/sys/dev/puc/puc_sbus.c b/sys/dev/puc/puc_sbus.c index efc55c425037..47a2fb41303a 100644 --- a/sys/dev/puc/puc_sbus.c +++ b/sys/dev/puc/puc_sbus.c @@ -35,13 +35,13 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include + #include #include #include -#include -#include - #define PUC_ENTRAILS 1 #include @@ -50,7 +50,7 @@ puc_sbus_probe(device_t dev) { const char *nm; - nm = sbus_get_name(dev); + nm = ofw_bus_get_name(dev); if (!strcmp(nm, "zs")) { device_set_desc(dev, "Zilog Z8530 dual channel SCC"); return (0); diff --git a/sys/dev/sab/sab.c b/sys/dev/sab/sab.c index eb9a4f3cf9fe..0b39f0dc3583 100644 --- a/sys/dev/sab/sab.c +++ b/sys/dev/sab/sab.c @@ -57,16 +57,18 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include +#include + #include #include + #include #include #include #include -#include -#include - #include #define SAB_READ(sc, r) \ @@ -249,9 +251,10 @@ sab_probe(device_t dev) bus_space_tag_t tag; uint8_t r; int rid; + const char *name; - if (strcmp(ebus_get_name(dev), "se") != 0 && - strcmp(ebus_get_name(dev), "serial") != 0) + name = ofw_bus_get_name(dev); + if (strcmp(name, "se") != 0 && strcmp(name, "serial") != 0) return (ENXIO); rid = 0; res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, @@ -1191,25 +1194,25 @@ sabtty_cnputc(struct sabtty_softc *sc, int c) static int sabtty_console(device_t dev, char *mode, int len) { - device_t parent; phandle_t chosen; phandle_t options; + phandle_t parent; ihandle_t stdin; ihandle_t stdout; char output[32]; char input[32]; char name[32]; - parent = device_get_parent(dev); chosen = OF_finddevice("/chosen"); options = OF_finddevice("/options"); + parent = ofw_bus_get_node(device_get_parent(dev)); if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1 || OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1 || OF_getprop(options, "input-device", input, sizeof(input)) == -1 || OF_getprop(options, "output-device", output, sizeof(output)) == -1) return (0); - if (ebus_get_node(parent) != OF_instance_to_package(stdin) || - ebus_get_node(parent) != OF_instance_to_package(stdout)) + if (parent != OF_instance_to_package(stdin) || + parent != OF_instance_to_package(stdout)) return (0); if ((strcmp(input, device_get_desc(dev)) == 0 && strcmp(output, device_get_desc(dev)) == 0) || diff --git a/sys/dev/uart/uart_bus_ebus.c b/sys/dev/uart/uart_bus_ebus.c index e6430255f708..15e8bcb9899c 100644 --- a/sys/dev/uart/uart_bus_ebus.c +++ b/sys/dev/uart/uart_bus_ebus.c @@ -32,13 +32,13 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include + #include #include #include -#include -#include - #include #include #include @@ -69,8 +69,8 @@ uart_ebus_probe(device_t dev) sc = device_get_softc(dev); sc->sc_class = NULL; - nm = ebus_get_name(dev); - cmpt = ebus_get_compat(dev); + nm = ofw_bus_get_name(dev); + cmpt = ofw_bus_get_compat(dev); if (!strcmp(nm, "su") || !strcmp(nm, "su_pnp") || (cmpt != NULL && (!strcmp(cmpt, "su") || !strcmp(cmpt, "su16550")))) { sc->sc_class = &uart_ns8250_class; diff --git a/sys/dev/zs/zs_macio.c b/sys/dev/zs/zs_macio.c index 182fe77698e3..3879a9edf5d1 100644 --- a/sys/dev/zs/zs_macio.c +++ b/sys/dev/zs/zs_macio.c @@ -37,8 +37,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include -#include #include #include @@ -132,7 +132,7 @@ static int zs_macio_probe(device_t dev) { - if (strcmp(macio_get_name(dev), "escc") != 0 || + if (strcmp(ofw_bus_get_name(dev), "escc") != 0 || device_get_unit(dev) != 0) return (ENXIO); return (zs_probe(dev)); @@ -142,10 +142,8 @@ static int zs_macio_attach(device_t dev) { struct zs_macio_softc *sc; - struct macio_reg *reg; sc = device_get_softc(dev); - reg = macio_get_regs(dev); sc->sc_memres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_memrid, RF_ACTIVE); @@ -265,16 +263,15 @@ zstty_set_speed(struct zstty_softc *sc, int ospeed) int zstty_console(device_t dev, char *mode, int len) { - device_t parent; - phandle_t chosen, options; + phandle_t chosen, options, parent; ihandle_t stdin, stdout; phandle_t stdinp, stdoutp; char input[32], output[32]; const char *desc; - parent = device_get_parent(dev); chosen = OF_finddevice("/chosen"); options = OF_finddevice("/options"); + parent = ofw_bus_get_node(device_get_parent(dev)); if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1 || OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1 || OF_getprop(options, "input-device", input, sizeof(input)) == -1 || @@ -285,8 +282,7 @@ zstty_console(device_t dev, char *mode, int len) stdinp = OF_parent(OF_instance_to_package(stdin)); stdoutp = OF_parent(OF_instance_to_package(stdout)); desc = device_get_desc(dev); - if (macio_get_node(parent) == stdinp && - macio_get_node(parent) == stdoutp && + if (parent == stdinp && parent == stdoutp && input[3] == desc[3] && output[3] == desc[3]) { if (mode != NULL) strlcpy(mode, "57600,8,n,1,-", len); diff --git a/sys/dev/zs/zs_sbus.c b/sys/dev/zs/zs_sbus.c index 796d076501eb..40b7ea4fd074 100644 --- a/sys/dev/zs/zs_sbus.c +++ b/sys/dev/zs/zs_sbus.c @@ -34,16 +34,15 @@ __FBSDID("$FreeBSD$"); #include #include #include + +#include +#include + #include #include #include -#include - #include -#include - -#include #include #include @@ -59,12 +58,6 @@ __FBSDID("$FreeBSD$"); #define ZS_SBUS_DEF_SPEED (9600) -enum zs_device_ivars { - ZS_IVAR_NODE -}; - -__BUS_ACCESSOR(zs, node, ZS, NODE, phandle_t) - struct zs_sbus_softc { struct zs_softc sc_zs; struct resource *sc_irqres; @@ -74,15 +67,10 @@ struct zs_sbus_softc { int sc_memrid; }; -static int zs_fhc_probe(device_t dev); static int zs_fhc_attach(device_t dev); -static int zs_fhc_read_ivar(device_t dev, device_t child, int which, - uintptr_t *result); static int zs_sbus_probe(device_t dev); static int zs_sbus_attach(device_t dev); -static int zs_sbus_read_ivar(device_t dev, device_t child, int which, - uintptr_t *result); static int zs_sbus_detach(device_t dev); @@ -92,12 +80,11 @@ static int zstty_sbus_probe(device_t dev); static int zstty_keyboard(device_t dev); static device_method_t zs_fhc_methods[] = { - DEVMETHOD(device_probe, zs_fhc_probe), + DEVMETHOD(device_probe, zs_sbus_probe), DEVMETHOD(device_attach, zs_fhc_attach), DEVMETHOD(device_detach, zs_sbus_detach), DEVMETHOD(bus_print_child, bus_generic_print_child), - DEVMETHOD(bus_read_ivar, zs_fhc_read_ivar), { 0, 0 } }; @@ -108,7 +95,6 @@ static device_method_t zs_sbus_methods[] = { DEVMETHOD(device_detach, zs_sbus_detach), DEVMETHOD(bus_print_child, bus_generic_print_child), - DEVMETHOD(bus_read_ivar, zs_sbus_read_ivar), { 0, 0 } }; @@ -168,21 +154,11 @@ static uint8_t zs_sbus_init_reg[16] = { ZSWR15_BREAK_IE, }; -static int -zs_fhc_probe(device_t dev) -{ - - if (strcmp(fhc_get_name(dev), "zs") != 0 || - device_get_unit(dev) != 0) - return (ENXIO); - return (zs_probe(dev)); -} - static int zs_sbus_probe(device_t dev) { - if (strcmp(sbus_get_name(dev), "zs") != 0 || + if (strcmp(ofw_bus_get_name(dev), "zs") != 0 || device_get_unit(dev) != 0) return (ENXIO); return (zs_probe(dev)); @@ -259,34 +235,6 @@ zs_sbus_detach(device_t dev) return (0); } -static int -zs_fhc_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - - switch (which) { - case ZS_IVAR_NODE: - *result = fhc_get_node(dev); - break; - default: - return (ENOENT); - } - return (0); -} - -static int -zs_sbus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - - switch (which) { - case ZS_IVAR_NODE: - *result = sbus_get_node(dev); - break; - default: - return (ENOENT); - } - return (0); -} - static int zstty_sbus_probe(device_t dev) { @@ -349,6 +297,7 @@ zstty_console(device_t dev, char *mode, int len) { phandle_t chosen; phandle_t options; + phandle_t parent; ihandle_t stdin; ihandle_t stdout; char output[32]; @@ -357,13 +306,14 @@ zstty_console(device_t dev, char *mode, int len) chosen = OF_finddevice("/chosen"); options = OF_finddevice("/options"); + parent = ofw_bus_get_node(device_get_parent(dev)); if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1 || OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) == -1 || OF_getprop(options, "input-device", input, sizeof(input)) == -1 || OF_getprop(options, "output-device", output, sizeof(output)) == -1) return (0); - if (zs_get_node(dev) != OF_instance_to_package(stdin) || - zs_get_node(dev) != OF_instance_to_package(stdout)) + if (parent != OF_instance_to_package(stdin) || + parent != OF_instance_to_package(stdout)) return (0); if ((strcmp(input, device_get_desc(dev)) == 0 && strcmp(output, device_get_desc(dev)) == 0) || @@ -382,5 +332,6 @@ static int zstty_keyboard(device_t dev) { - return (OF_getproplen(zs_get_node(dev), "keyboard") == 0); + return (OF_getproplen(ofw_bus_get_node(device_get_parent(dev)), + "keyboard") == 0); } diff --git a/sys/modules/esp/Makefile b/sys/modules/esp/Makefile index 40bbc44f916d..2b747fdd6be7 100644 --- a/sys/modules/esp/Makefile +++ b/sys/modules/esp/Makefile @@ -9,7 +9,7 @@ SRCS+= opt_ddb.h opt_cam.h SRCS+= device_if.h bus_if.h .if ${MACHINE_ARCH} == "sparc64" -SRCS+= esp_sbus.c lsi64854.c +SRCS+= esp_sbus.c lsi64854.c ofw_bus_if.h .endif .include diff --git a/sys/modules/hme/Makefile b/sys/modules/hme/Makefile index 466023152561..f99b0f727035 100644 --- a/sys/modules/hme/Makefile +++ b/sys/modules/hme/Makefile @@ -3,7 +3,7 @@ .PATH: ${.CURDIR}/../../dev/hme KMOD= if_hme -SRCS= if_hme.c if_hme_pci.c if_hme_sbus.c device_if.h bus_if.h pci_if.h -SRCS+= miibus_if.h +SRCS= if_hme.c if_hme_pci.c if_hme_sbus.c device_if.h bus_if.h ofw_bus_if.h +SRCS+= pci_if.h miibus_if.h .include diff --git a/sys/modules/isp/Makefile b/sys/modules/isp/Makefile index a71998d0be77..b3ddc3910390 100644 --- a/sys/modules/isp/Makefile +++ b/sys/modules/isp/Makefile @@ -8,7 +8,7 @@ SRCS= bus_if.h device_if.h pci_if.h \ isp.c isp_target.c isp_freebsd.c isp_pci.c .if ${MACHINE_ARCH} == sparc64 -SRCS+= isp_sbus.c +SRCS+= isp_sbus.c ofw_bus_if.h .endif .include diff --git a/sys/modules/uart/Makefile b/sys/modules/uart/Makefile index 43dd5d8d79dc..9214a73ddf7e 100644 --- a/sys/modules/uart/Makefile +++ b/sys/modules/uart/Makefile @@ -4,6 +4,7 @@ .if ${MACHINE_ARCH} == "sparc64" uart_bus_ebus= uart_bus_ebus.c +ofw_bus_if= ofw_bus_if.h .endif KMOD= uart @@ -11,7 +12,7 @@ SRCS= uart_bus_acpi.c ${uart_bus_ebus} uart_bus_isa.c uart_bus_pccard.c \ uart_bus_pci.c uart_bus_puc.c uart_core.c uart_cpu_${MACHINE}.c \ uart_dbg.c uart_dev_i8251.c uart_dev_ns8250.c uart_dev_sab82532.c \ uart_dev_z8530.c uart_if.c uart_subr.c uart_tty.c -SRCS+= bus_if.h device_if.h isa_if.h pci_if.h uart_if.h power_if.h card_if.h \ - pccarddevs.h +SRCS+= bus_if.h card_if.h device_if.h isa_if.h ${ofw_bus_if} pci_if.h \ + power_if.h uart_if.h pccarddevs.h .include diff --git a/sys/powerpc/powermac/ata_macio.c b/sys/powerpc/powermac/ata_macio.c index 127defedeccf..5fb2865b168d 100644 --- a/sys/powerpc/powermac/ata_macio.c +++ b/sys/powerpc/powermac/ata_macio.c @@ -47,8 +47,7 @@ #include #include -#include -#include +#include /* * Offset to control registers from base @@ -99,7 +98,7 @@ ata_macio_setmode(struct ata_device *atadev, int mode) static int ata_macio_probe(device_t dev) { - char *type = macio_get_devtype(dev); + const char *type = ofw_bus_get_type(dev); struct ata_channel *ch; struct resource *mem; int rid, i; diff --git a/sys/powerpc/powermac/hrowpic.c b/sys/powerpc/powermac/hrowpic.c index 6b8cafff7e88..0c1fd4b5986d 100644 --- a/sys/powerpc/powermac/hrowpic.c +++ b/sys/powerpc/powermac/hrowpic.c @@ -46,6 +46,7 @@ #include #include +#include #include #include @@ -61,7 +62,6 @@ #include -#include #include #include "pic_if.h" @@ -434,7 +434,7 @@ DRIVER_MODULE(hrowpicmacio, macio, hrowpic_macio_driver, static int hrowpic_macio_probe(device_t dev) { - char *type = macio_get_devtype(dev); + const char *type = ofw_bus_get_type(dev); /* * OpenPIC cells have a type of "open-pic", so this diff --git a/sys/powerpc/powermac/macio.c b/sys/powerpc/powermac/macio.c index 300cbe7c167b..1bf007d7cdf6 100644 --- a/sys/powerpc/powermac/macio.c +++ b/sys/powerpc/powermac/macio.c @@ -47,6 +47,7 @@ #include +#include #include #include @@ -70,8 +71,6 @@ static int macio_probe(device_t); static int macio_attach(device_t); static int macio_print_child(device_t dev, device_t child); static void macio_probe_nomatch(device_t, device_t); -static int macio_read_ivar(device_t, device_t, int, uintptr_t *); -static int macio_write_ivar(device_t, device_t, int, uintptr_t); static struct resource *macio_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); static int macio_activate_resource(device_t, device_t, int, int, @@ -81,6 +80,11 @@ static int macio_deactivate_resource(device_t, device_t, int, int, static int macio_release_resource(device_t, device_t, int, int, struct resource *); static struct resource_list *macio_get_resource_list (device_t, device_t); +static ofw_bus_get_compat_t macio_get_compat; +static ofw_bus_get_model_t macio_get_model; +static ofw_bus_get_name_t macio_get_name; +static ofw_bus_get_node_t macio_get_node; +static ofw_bus_get_type_t macio_get_type; /* * Bus interface definition @@ -97,8 +101,6 @@ static device_method_t macio_methods[] = { /* Bus interface */ DEVMETHOD(bus_print_child, macio_print_child), DEVMETHOD(bus_probe_nomatch, macio_probe_nomatch), - DEVMETHOD(bus_read_ivar, macio_read_ivar), - DEVMETHOD(bus_write_ivar, macio_write_ivar), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), @@ -108,6 +110,13 @@ static device_method_t macio_methods[] = { DEVMETHOD(bus_deactivate_resource, macio_deactivate_resource), DEVMETHOD(bus_get_resource_list, macio_get_resource_list), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, macio_get_compat), + DEVMETHOD(ofw_bus_get_model, macio_get_model), + DEVMETHOD(ofw_bus_get_name, macio_get_name), + DEVMETHOD(ofw_bus_get_node, macio_get_node), + DEVMETHOD(ofw_bus_get_type, macio_get_type), + { 0, 0 } }; @@ -206,9 +215,6 @@ macio_add_reg(phandle_t devnode, struct macio_devinfo *dinfo) if (nreg == -1) return; - dinfo->mdi_nregs = nreg; - dinfo->mdi_regs = reg; - for (i = 0; i < nreg; i++) { resource_list_add(&dinfo->mdi_resources, SYS_RES_MEMORY, i, reg[i].mr_base, reg[i].mr_base + reg[i].mr_size, @@ -250,7 +256,7 @@ macio_attach(device_t dev) phandle_t subchild; device_t cdev; u_int reg[3]; - char *name, *type; + char *name; int quirks; sc = device_get_softc(dev); @@ -281,12 +287,10 @@ macio_attach(device_t dev) */ for (child = OF_child(root); child != 0; child = OF_peer(child)) { OF_getprop_alloc(child, "name", 1, (void **)&name); - OF_getprop_alloc(child, "device_type", 1, (void **)&type); quirks = macio_get_quirks(name); if ((quirks & MACIO_QUIRK_IGNORE) != 0) { free(name, M_OFWPROP); - free(type, M_OFWPROP); continue; } @@ -297,7 +301,12 @@ macio_attach(device_t dev) resource_list_init(&dinfo->mdi_resources); dinfo->mdi_node = child; dinfo->mdi_name = name; - dinfo->mdi_device_type = type; + OF_getprop_alloc(child, "compatible", 1, + (void **)&dinfo->mdi_compat); + OF_getprop_alloc(child, "device_type", 1, + (void **)&dinfo->mdi_type); + OF_getprop_alloc(child, "model", 1, + (void **)&dinfo->mdi_model); dinfo->mdi_ninterrupts = 0; macio_add_intr(child, dinfo); macio_add_reg(child, dinfo); @@ -313,7 +322,6 @@ macio_attach(device_t dev) device_set_ivars(cdev, dinfo); } else { free(name, M_OFWPROP); - free(type, M_OFWPROP); } } @@ -347,13 +355,15 @@ macio_probe_nomatch(device_t dev, device_t child) { struct macio_devinfo *dinfo; struct resource_list *rl; + const char *type; if (bootverbose) { dinfo = device_get_ivars(child); rl = &dinfo->mdi_resources; - device_printf(dev, "<%s, %s>", macio_get_devtype(child), - macio_get_name(child)); + if ((type = ofw_bus_get_type(child)) == NULL) + type = "(unknown)"; + device_printf(dev, "<%s, %s>", type, ofw_bus_get_name(child)); resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx"); resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld"); printf(" (no driver attached)\n"); @@ -361,45 +371,6 @@ macio_probe_nomatch(device_t dev, device_t child) } -static int -macio_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - struct macio_devinfo *dinfo; - - if ((dinfo = device_get_ivars(child)) == 0) - return (ENOENT); - - switch (which) { - case MACIO_IVAR_NODE: - *result = dinfo->mdi_node; - break; - case MACIO_IVAR_NAME: - *result = (uintptr_t)dinfo->mdi_name; - break; - case MACIO_IVAR_DEVTYPE: - *result = (uintptr_t)dinfo->mdi_device_type; - break; - case MACIO_IVAR_NREGS: - *result = dinfo->mdi_nregs; - break; - case MACIO_IVAR_REGS: - *result = (uintptr_t)dinfo->mdi_regs; - break; - default: - return (ENOENT); - } - - return (0); -} - - -static int -macio_write_ivar(device_t dev, device_t child, int which, uintptr_t value) -{ - return (EINVAL); -} - - static struct resource * macio_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -572,3 +543,48 @@ macio_get_resource_list (device_t dev, device_t child) return (rl); } + +const char * +macio_get_compat(device_t bus, device_t dev) +{ + struct macio_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->mdi_compat); +} + +const char * +macio_get_model(device_t bus, device_t dev) +{ + struct macio_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->mdi_model); +} + +const char * +macio_get_name(device_t bus, device_t dev) +{ + struct macio_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->mdi_name); +} + +static phandle_t +macio_get_node(device_t bus, device_t dev) +{ + struct macio_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->mdi_node); +} + +const char * +macio_get_type(device_t bus, device_t dev) +{ + struct macio_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->mdi_type); +} diff --git a/sys/powerpc/powermac/maciovar.h b/sys/powerpc/powermac/maciovar.h index d28f94685efc..2de15e2822af 100644 --- a/sys/powerpc/powermac/maciovar.h +++ b/sys/powerpc/powermac/maciovar.h @@ -30,29 +30,6 @@ #ifndef _MACIO_MACIOVAR_H_ #define _MACIO_MACIOVAR_H_ -/* - * Accessors for macio devices - */ - -enum macio_ivars { - MACIO_IVAR_NODE, - MACIO_IVAR_NAME, - MACIO_IVAR_DEVTYPE, - MACIO_IVAR_NREGS, - MACIO_IVAR_REGS, -}; - -#define MACIO_ACCESSOR(var, ivar, type) \ - __BUS_ACCESSOR(macio, var, MACIO, ivar, type) - -MACIO_ACCESSOR(node, NODE, phandle_t) -MACIO_ACCESSOR(name, NAME, char *) -MACIO_ACCESSOR(devtype, DEVTYPE, char *) -MACIO_ACCESSOR(nregs, NREGS, u_int) -MACIO_ACCESSOR(regs, REGS, struct macio_reg *) - -#undef MACIO_ACCESSOR - /* * The addr space size * XXX it would be better if this could be determined by querying the @@ -72,14 +49,14 @@ struct macio_reg { * Per macio device structure. */ struct macio_devinfo { + char *mdi_compat; + char *mdi_model; + char *mdi_name; phandle_t mdi_node; - char *mdi_name; - char *mdi_device_type; + char *mdi_type; int mdi_interrupts[5]; int mdi_ninterrupts; int mdi_base; - int mdi_nregs; - struct macio_reg *mdi_regs; struct resource_list mdi_resources; }; diff --git a/sys/powerpc/powermac/openpic_macio.c b/sys/powerpc/powermac/openpic_macio.c index 0f8b0e255200..fac08d84249b 100644 --- a/sys/powerpc/powermac/openpic_macio.c +++ b/sys/powerpc/powermac/openpic_macio.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -61,7 +62,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include "pic_if.h" @@ -186,7 +186,7 @@ DRIVER_MODULE(openpicmacio, macio, openpic_macio_driver, static int openpic_macio_probe(device_t dev) { - char *type = macio_get_devtype(dev); + const char *type = ofw_bus_get_type(dev); if (strcmp(type, "open-pic") != 0) return (ENXIO); diff --git a/sys/sparc64/central/central.c b/sys/sparc64/central/central.c index b886d0c80e75..d26f9af55e08 100644 --- a/sys/sparc64/central/central.c +++ b/sys/sparc64/central/central.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -42,11 +43,12 @@ #include -#include #include #include struct central_devinfo { + char *cdi_compat; + char *cdi_model; char *cdi_name; char *cdi_type; phandle_t cdi_node; @@ -62,10 +64,13 @@ static int central_probe(device_t dev); static int central_attach(device_t dev); static void central_probe_nomatch(device_t dev, device_t child); -static int central_read_ivar(device_t, device_t, int, uintptr_t *); -static int central_write_ivar(device_t, device_t, int, uintptr_t); static struct resource *central_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); +static ofw_bus_get_compat_t central_get_compat; +static ofw_bus_get_model_t central_get_model; +static ofw_bus_get_name_t central_get_name; +static ofw_bus_get_node_t central_get_node; +static ofw_bus_get_type_t central_get_type; static device_method_t central_methods[] = { /* Device interface. */ @@ -75,8 +80,6 @@ static device_method_t central_methods[] = { /* Bus interface. */ DEVMETHOD(bus_print_child, bus_generic_print_child), DEVMETHOD(bus_probe_nomatch, central_probe_nomatch), - DEVMETHOD(bus_read_ivar, central_read_ivar), - DEVMETHOD(bus_write_ivar, central_write_ivar), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), DEVMETHOD(bus_alloc_resource, central_alloc_resource), @@ -84,6 +87,13 @@ static device_method_t central_methods[] = { DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, central_get_compat), + DEVMETHOD(ofw_bus_get_model, central_get_model), + DEVMETHOD(ofw_bus_get_name, central_get_name), + DEVMETHOD(ofw_bus_get_node, central_get_node), + DEVMETHOD(ofw_bus_get_type, central_get_type), + { NULL, NULL } }; @@ -138,8 +148,12 @@ central_attach(device_t dev) M_WAITOK | M_ZERO); cdi->cdi_name = name; cdi->cdi_node = child; + OF_getprop_alloc(child, "compatible", 1, + (void **)&cdi->cdi_compat); OF_getprop_alloc(child, "device_type", 1, (void **)&cdi->cdi_type); + OF_getprop_alloc(child, "model", 1, + (void **)&cdi->cdi_model); device_set_ivars(cdev, cdi); } else free(name, M_OFWPROP); @@ -158,47 +172,6 @@ central_probe_nomatch(device_t dev, device_t child) cdi->cdi_name, cdi->cdi_type != NULL ? cdi->cdi_type : "unknown"); } -static int -central_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - struct central_devinfo *cdi; - - if ((cdi = device_get_ivars(child)) == 0) - return (ENOENT); - switch (which) { - case CENTRAL_IVAR_NAME: - *result = (uintptr_t)cdi->cdi_name; - break; - case CENTRAL_IVAR_NODE: - *result = cdi->cdi_node; - break; - case CENTRAL_IVAR_TYPE: - *result = (uintptr_t)cdi->cdi_type; - break; - default: - return (ENOENT); - } - return (0); -} - -static int -central_write_ivar(device_t dev, device_t child, int which, uintptr_t value) -{ - struct central_devinfo *cdi; - - if ((cdi = device_get_ivars(child)) == 0) - return (ENOENT); - switch (which) { - case CENTRAL_IVAR_NAME: - case CENTRAL_IVAR_NODE: - case CENTRAL_IVAR_TYPE: - return (EINVAL); - default: - return (ENOENT); - } - return (0); -} - static struct resource * central_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -231,3 +204,48 @@ central_alloc_resource(device_t bus, device_t child, int type, int *rid, } return (res); } + +static const char * +central_get_compat(device_t bus, device_t dev) +{ + struct central_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->cdi_compat); +} + +static const char * +central_get_model(device_t bus, device_t dev) +{ + struct central_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->cdi_model); +} + +static const char * +central_get_name(device_t bus, device_t dev) +{ + struct central_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->cdi_name); +} + +static phandle_t +central_get_node(device_t bus, device_t dev) +{ + struct central_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->cdi_node); +} + +static const char * +central_get_type(device_t bus, device_t dev) +{ + struct central_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->cdi_type); +} diff --git a/sys/sparc64/central/centralvar.h b/sys/sparc64/central/centralvar.h deleted file mode 100644 index a3b03c611e7e..000000000000 --- a/sys/sparc64/central/centralvar.h +++ /dev/null @@ -1,47 +0,0 @@ -/*- - * Copyright (c) 2003 Jake Burkholder. - * 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. - * - * $FreeBSD$ - */ - -#ifndef _SPARC64_CENTRAL_CENTRALVAR_H_ -#define _SPARC64_CENTRAL_CENTRALVAR_H_ - -enum central_device_ivars { - CENTRAL_IVAR_NAME, - CENTRAL_IVAR_NODE, - CENTRAL_IVAR_TYPE -}; - -#define CENTRAL_ACCESSOR(var, ivar, type) \ - __BUS_ACCESSOR(central, var, CENTRAL, ivar, type) - -CENTRAL_ACCESSOR(name, NAME, char *) -CENTRAL_ACCESSOR(node, NODE, phandle_t) -CENTRAL_ACCESSOR(type, TYPE, char *) - -#undef CENTRAL_ACCESSOR - -#endif diff --git a/sys/sparc64/ebus/ebus.c b/sys/sparc64/ebus/ebus.c index 10b98bc99384..bf12a26db2de 100644 --- a/sys/sparc64/ebus/ebus.c +++ b/sys/sparc64/ebus/ebus.c @@ -57,6 +57,7 @@ #include +#include #include #include @@ -72,11 +73,12 @@ * ones. */ #include -#include struct ebus_devinfo { + char *edi_compat; /* PROM compatible */ + char *edi_model; /* PROM model */ char *edi_name; /* PROM name */ - char *edi_compat; + char *edi_type; /* PROM device_type */ phandle_t edi_node; /* PROM node */ struct resource_list edi_rl; @@ -104,11 +106,14 @@ static device_probe_t ebus_probe; static device_attach_t ebus_attach; static bus_print_child_t ebus_print_child; static bus_probe_nomatch_t ebus_probe_nomatch; -static bus_read_ivar_t ebus_read_ivar; -static bus_write_ivar_t ebus_write_ivar; static bus_alloc_resource_t ebus_alloc_resource; static bus_release_resource_t ebus_release_resource; static bus_get_resource_list_t ebus_get_resource_list; +static ofw_bus_get_compat_t ebus_get_compat; +static ofw_bus_get_model_t ebus_get_model; +static ofw_bus_get_name_t ebus_get_name; +static ofw_bus_get_node_t ebus_get_node; +static ofw_bus_get_type_t ebus_get_type; static struct ebus_devinfo *ebus_setup_dinfo(device_t, struct ebus_softc *, phandle_t, char *); @@ -123,8 +128,6 @@ static device_method_t ebus_methods[] = { /* Bus interface */ DEVMETHOD(bus_print_child, ebus_print_child), DEVMETHOD(bus_probe_nomatch, ebus_probe_nomatch), - DEVMETHOD(bus_read_ivar, ebus_read_ivar), - DEVMETHOD(bus_write_ivar, ebus_write_ivar), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), DEVMETHOD(bus_alloc_resource, ebus_alloc_resource), @@ -134,6 +137,13 @@ static device_method_t ebus_methods[] = { DEVMETHOD(bus_release_resource, ebus_release_resource), DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, ebus_get_compat), + DEVMETHOD(ofw_bus_get_model, ebus_get_model), + DEVMETHOD(ofw_bus_get_name, ebus_get_name), + DEVMETHOD(ofw_bus_get_node, ebus_get_node), + DEVMETHOD(ofw_bus_get_type, ebus_get_type), + { 0, 0 } }; @@ -153,7 +163,7 @@ ebus_probe(device_t dev) char name[10]; phandle_t node; - if ((node = ofw_pci_get_node(dev)) == 0) + if ((node = ofw_bus_get_node(dev)) == 0) return (ENXIO); OF_getprop(node, "name", &name, sizeof(name)); @@ -184,7 +194,7 @@ ebus_attach(device_t dev) int i, rnum, rid; sc = device_get_softc(dev); - sc->sc_node = node = ofw_pci_get_node(dev); + sc->sc_node = node = ofw_bus_get_node(dev); sc->sc_nrange = OF_getprop_alloc(node, "ranges", sizeof(*sc->sc_range), (void **)&sc->sc_range); @@ -281,47 +291,6 @@ ebus_probe_nomatch(device_t dev, device_t child) printf(" (no driver attached)\n"); } -static int -ebus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - struct ebus_devinfo *dinfo; - - if ((dinfo = device_get_ivars(child)) == NULL) - return (ENOENT); - switch (which) { - case EBUS_IVAR_COMPAT: - *result = (uintptr_t)dinfo->edi_compat; - break; - case EBUS_IVAR_NAME: - *result = (uintptr_t)dinfo->edi_name; - break; - case EBUS_IVAR_NODE: - *result = dinfo->edi_node; - break; - default: - return (ENOENT); - } - return 0; -} - -static int -ebus_write_ivar(device_t dev, device_t child, int which, uintptr_t value) -{ - struct ebus_devinfo *dinfo; - - if ((dinfo = device_get_ivars(child)) == NULL) - return (ENOENT); - switch (which) { - case EBUS_IVAR_COMPAT: - case EBUS_IVAR_NAME: - case EBUS_IVAR_NODE: - return (EINVAL); - default: - return (ENOENT); - } - return 0; -} - static struct resource * ebus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -452,6 +421,8 @@ ebus_setup_dinfo(device_t dev, struct ebus_softc *sc, phandle_t node, edi->edi_node = node; OF_getprop_alloc(node, "compatible", 1, (void **)&edi->edi_compat); + OF_getprop_alloc(node, "device_type", 1, (void **)&edi->edi_type); + OF_getprop_alloc(node, "model", 1, (void **)&edi->edi_model); nreg = OF_getprop_alloc(node, "reg", sizeof(*reg), (void **)®); if (nreg == -1) { ebus_destroy_dinfo(edi); @@ -492,6 +463,12 @@ static void ebus_destroy_dinfo(struct ebus_devinfo *edi) { + if (edi->edi_compat != NULL) + free(edi->edi_compat, M_OFWPROP); + if (edi->edi_type != NULL) + free(edi->edi_type, M_OFWPROP); + if (edi->edi_model != NULL) + free(edi->edi_model, M_OFWPROP); resource_list_free(&edi->edi_rl); free(edi, M_DEVBUF); } @@ -508,3 +485,48 @@ ebus_print_res(struct ebus_devinfo *edi) "%ld"); return (retval); } + +static const char * +ebus_get_compat(device_t bus, device_t dev) +{ + struct ebus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->edi_compat); +} + +static const char * +ebus_get_model(device_t bus, device_t dev) +{ + struct ebus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->edi_model); +} + +static const char * +ebus_get_name(device_t bus, device_t dev) +{ + struct ebus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->edi_name); +} + +static phandle_t +ebus_get_node(device_t bus, device_t dev) +{ + struct ebus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->edi_node); +} + +static const char * +ebus_get_type(device_t bus, device_t dev) +{ + struct ebus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->edi_type); +} diff --git a/sys/sparc64/ebus/ebusvar.h b/sys/sparc64/ebus/ebusvar.h deleted file mode 100644 index c8fd7c630fda..000000000000 --- a/sys/sparc64/ebus/ebusvar.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 1999, 2000 Matthew R. Green - * 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. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. - * - * from: NetBSD: ebusvar.h,v 1.5 2001/07/20 00:07:13 eeh Exp - * and - * from: FreeBSD: src/sys/dev/pci/pcivar.h,v 1.51 2001/02/27 - * - * $FreeBSD$ - */ - -#ifndef _SPARC64_EBUS_EBUSVAR_H_ -#define _SPARC64_EBUS_EBUSVAR_H_ - -enum ebus_device_ivars { - EBUS_IVAR_COMPAT, - EBUS_IVAR_NAME, - EBUS_IVAR_NODE, -}; - -/* - * Simplified accessors for ebus devices - */ -#define EBUS_ACCESSOR(var, ivar, type) \ - __BUS_ACCESSOR(ebus, var, EBUS, ivar, type) - -EBUS_ACCESSOR(compat, COMPAT, char *) -EBUS_ACCESSOR(name, NAME, char *) -EBUS_ACCESSOR(node, NODE, phandle_t) - -#undef EBUS_ACCESSOR - -#endif /* !_SPARC64_EBUS_EBUSVAR_H_ */ diff --git a/sys/sparc64/fhc/fhc.c b/sys/sparc64/fhc/fhc.c index def890463c80..69e7aab18075 100644 --- a/sys/sparc64/fhc/fhc.c +++ b/sys/sparc64/fhc/fhc.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -56,6 +57,8 @@ struct fhc_clr { }; struct fhc_devinfo { + char *fdi_compat; + char *fdi_model; char *fdi_name; char *fdi_type; phandle_t fdi_node; @@ -127,8 +130,12 @@ fhc_attach(device_t dev) M_WAITOK | M_ZERO); fdi->fdi_name = name; fdi->fdi_node = child; + OF_getprop_alloc(child, "compatible", 1, + (void **)&fdi->fdi_compat); OF_getprop_alloc(child, "device_type", 1, (void **)&fdi->fdi_type); + OF_getprop_alloc(child, "model", 1, + (void **)&fdi->fdi_model); resource_list_init(&fdi->fdi_rl); nreg = OF_getprop_alloc(child, "reg", sizeof(*reg), (void **)®); @@ -176,47 +183,6 @@ fhc_probe_nomatch(device_t dev, device_t child) fdi->fdi_type != NULL ? fdi->fdi_type : "unknown"); } -int -fhc_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) -{ - struct fhc_devinfo *fdi; - - if ((fdi = device_get_ivars(child)) == 0) - return (ENOENT); - switch (which) { - case FHC_IVAR_NAME: - *result = (uintptr_t)fdi->fdi_name; - break; - case FHC_IVAR_NODE: - *result = fdi->fdi_node; - break; - case FHC_IVAR_TYPE: - *result = (uintptr_t)fdi->fdi_type; - break; - default: - return (ENOENT); - } - return (0); -} - -int -fhc_write_ivar(device_t dev, device_t child, int which, uintptr_t value) -{ - struct fhc_devinfo *fdi; - - if ((fdi = device_get_ivars(child)) == 0) - return (ENOENT); - switch (which) { - case FHC_IVAR_NAME: - case FHC_IVAR_NODE: - case FHC_IVAR_TYPE: - return (EINVAL); - default: - return (ENOENT); - } - return (0); -} - int fhc_setup_intr(device_t bus, device_t child, struct resource *r, int flags, driver_intr_t *func, void *arg, void **cookiep) @@ -372,3 +338,48 @@ fhc_release_resource(device_t bus, device_t child, int type, int rid, rle->res = NULL; return (error); } + +const char * +fhc_get_compat(device_t bus, device_t dev) +{ + struct fhc_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->fdi_compat); +} + +const char * +fhc_get_model(device_t bus, device_t dev) +{ + struct fhc_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->fdi_model); +} + +const char * +fhc_get_name(device_t bus, device_t dev) +{ + struct fhc_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->fdi_name); +} + +phandle_t +fhc_get_node(device_t bus, device_t dev) +{ + struct fhc_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->fdi_node); +} + +const char * +fhc_get_type(device_t bus, device_t dev) +{ + struct fhc_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->fdi_type); +} diff --git a/sys/sparc64/fhc/fhc_central.c b/sys/sparc64/fhc/fhc_central.c index ce35c0d75c87..50dc6696791b 100644 --- a/sys/sparc64/fhc/fhc_central.c +++ b/sys/sparc64/fhc/fhc_central.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -40,7 +41,6 @@ #include -#include #include #include #include @@ -56,8 +56,6 @@ static device_method_t fhc_central_methods[] = { /* Bus interface. */ DEVMETHOD(bus_print_child, fhc_print_child), DEVMETHOD(bus_probe_nomatch, fhc_probe_nomatch), - DEVMETHOD(bus_read_ivar, fhc_read_ivar), - DEVMETHOD(bus_write_ivar, fhc_write_ivar), DEVMETHOD(bus_setup_intr, fhc_setup_intr), DEVMETHOD(bus_teardown_intr, fhc_teardown_intr), DEVMETHOD(bus_alloc_resource, fhc_alloc_resource), @@ -65,6 +63,13 @@ static device_method_t fhc_central_methods[] = { DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, fhc_get_compat), + DEVMETHOD(ofw_bus_get_model, fhc_get_model), + DEVMETHOD(ofw_bus_get_name, fhc_get_name), + DEVMETHOD(ofw_bus_get_node, fhc_get_node), + DEVMETHOD(ofw_bus_get_type, fhc_get_type), + { NULL, NULL } }; @@ -82,7 +87,7 @@ static int fhc_central_probe(device_t dev) { - if (strcmp(central_get_name(dev), "fhc") == 0) { + if (strcmp(ofw_bus_get_name(dev), "fhc") == 0) { device_set_desc(dev, "fhc"); return (fhc_probe(dev)); } @@ -103,7 +108,7 @@ fhc_central_attach(device_t dev) int i; sc = device_get_softc(dev); - node = central_get_node(dev); + node = ofw_bus_get_node(dev); sc->sc_node = node; sc->sc_flags |= FHC_CENTRAL; diff --git a/sys/sparc64/fhc/fhc_nexus.c b/sys/sparc64/fhc/fhc_nexus.c index f5d095172b96..4943329dea96 100644 --- a/sys/sparc64/fhc/fhc_nexus.c +++ b/sys/sparc64/fhc/fhc_nexus.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -56,8 +57,6 @@ static device_method_t fhc_nexus_methods[] = { /* Bus interface. */ DEVMETHOD(bus_print_child, fhc_print_child), DEVMETHOD(bus_probe_nomatch, fhc_probe_nomatch), - DEVMETHOD(bus_read_ivar, fhc_read_ivar), - DEVMETHOD(bus_write_ivar, fhc_write_ivar), DEVMETHOD(bus_setup_intr, fhc_setup_intr), DEVMETHOD(bus_teardown_intr, fhc_teardown_intr), DEVMETHOD(bus_alloc_resource, fhc_alloc_resource), @@ -65,6 +64,13 @@ static device_method_t fhc_nexus_methods[] = { DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, fhc_get_compat), + DEVMETHOD(ofw_bus_get_model, fhc_get_model), + DEVMETHOD(ofw_bus_get_name, fhc_get_name), + DEVMETHOD(ofw_bus_get_node, fhc_get_node), + DEVMETHOD(ofw_bus_get_type, fhc_get_type), + { NULL, NULL } }; diff --git a/sys/sparc64/fhc/fhcvar.h b/sys/sparc64/fhc/fhcvar.h index ad4a72dc64bd..55665651a8da 100644 --- a/sys/sparc64/fhc/fhcvar.h +++ b/sys/sparc64/fhc/fhcvar.h @@ -29,12 +29,6 @@ #ifndef _SPARC64_FHC_FHCVAR_H_ #define _SPARC64_FHC_FHCVAR_H_ -enum fhc_device_ivars { - FHC_IVAR_NAME, - FHC_IVAR_NODE, - FHC_IVAR_TYPE -}; - #define FHC_CENTRAL (1<<0) struct fhc_softc { @@ -54,22 +48,16 @@ int fhc_attach(device_t dev); int fhc_print_child(device_t dev, device_t child); void fhc_probe_nomatch(device_t dev, device_t child); -int fhc_read_ivar(device_t, device_t, int, uintptr_t *); -int fhc_write_ivar(device_t, device_t, int, uintptr_t); int fhc_setup_intr(device_t, device_t, struct resource *, int, driver_intr_t *, void *, void **); int fhc_teardown_intr(device_t, device_t, struct resource *, void *); struct resource *fhc_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); int fhc_release_resource(device_t, device_t, int, int, struct resource *); - -#define FHC_ACCESSOR(var, ivar, type) \ - __BUS_ACCESSOR(fhc, var, FHC, ivar, type) - -FHC_ACCESSOR(name, NAME, char *) -FHC_ACCESSOR(node, NODE, phandle_t) -FHC_ACCESSOR(type, TYPE, char *) - -#undef FHC_ACCESSOR +ofw_bus_get_compat_t fhc_get_compat; +ofw_bus_get_model_t fhc_get_model; +ofw_bus_get_name_t fhc_get_name; +ofw_bus_get_node_t fhc_get_node; +ofw_bus_get_type_t fhc_get_type; #endif diff --git a/sys/sparc64/include/eeprom.h b/sys/sparc64/include/eeprom.h index 8e494190444e..57a7ff519a9e 100644 --- a/sys/sparc64/include/eeprom.h +++ b/sys/sparc64/include/eeprom.h @@ -59,6 +59,7 @@ struct eeprom_softc { extern devclass_t eeprom_devclass; -int eeprom_attach(device_t, phandle_t, bus_space_tag_t, bus_space_handle_t); +int eeprom_probe(device_t); +int eeprom_attach(device_t, bus_space_tag_t, bus_space_handle_t); #endif /* _MACHINE_EEPROM_H_ */ diff --git a/sys/sparc64/isa/isa.c b/sys/sparc64/isa/isa.c index a8b440a400c8..cfe9e8726733 100644 --- a/sys/sparc64/isa/isa.c +++ b/sys/sparc64/isa/isa.c @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -111,7 +112,7 @@ isa_init(device_t dev) /* The parent of the bus must be a PCI-ISA bridge. */ bridge = device_get_parent(dev); - isab_node = ofw_pci_get_node(bridge); + isab_node = ofw_bus_get_node(bridge); nbr = OF_getprop_alloc(isab_node, "ranges", sizeof(*br), (void **)&br); if (nbr <= 0) panic("isa_init: cannot get bridge range property"); diff --git a/sys/sparc64/pci/apb.c b/sys/sparc64/pci/apb.c index be43974d9dc1..4fc8fd24cfd5 100644 --- a/sys/sparc64/pci/apb.c +++ b/sys/sparc64/pci/apb.c @@ -48,6 +48,7 @@ #include #include +#include #include #include @@ -101,8 +102,10 @@ static device_method_t apb_methods[] = { DEVMETHOD(pcib_write_config, pcib_write_config), DEVMETHOD(pcib_route_interrupt, ofw_pcib_gen_route_interrupt), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_node, ofw_pcib_gen_get_node), + /* ofw_pci interface */ - DEVMETHOD(ofw_pci_get_node, ofw_pcib_gen_get_node), DEVMETHOD(ofw_pci_adjust_busrange, ofw_pcib_gen_adjust_busrange), { 0, 0 } diff --git a/sys/sparc64/pci/ofw_pci.h b/sys/sparc64/pci/ofw_pci.h index d1b66232c476..d5fdf127190a 100644 --- a/sys/sparc64/pci/ofw_pci.h +++ b/sys/sparc64/pci/ofw_pci.h @@ -48,11 +48,4 @@ typedef u_int32_t ofw_pci_intr_t; u_int8_t ofw_pci_alloc_busno(phandle_t); -static __inline phandle_t -ofw_pci_get_node(device_t dev) -{ - - return (OFW_PCI_GET_NODE(device_get_parent(dev), dev)); -} - #endif /* ! _SPARC64_PCI_OFW_PCI_H_ */ diff --git a/sys/sparc64/pci/ofw_pci_if.m b/sys/sparc64/pci/ofw_pci_if.m index adbb8cf43bb4..ef203b6c6f96 100644 --- a/sys/sparc64/pci/ofw_pci_if.m +++ b/sys/sparc64/pci/ofw_pci_if.m @@ -35,7 +35,6 @@ INTERFACE ofw_pci; CODE { static ofw_pci_intr_pending_t ofw_pci_default_intr_pending; static ofw_pci_get_bus_handle_t ofw_pci_default_get_bus_handle; - static ofw_pci_get_node_t ofw_pci_default_get_node; static ofw_pci_adjust_busrange_t ofw_pci_default_adjust_busrange; static int @@ -54,13 +53,6 @@ CODE { childhdl, tag)); } - static phandle_t - ofw_pci_default_get_node(device_t bus, device_t dev) - { - - return (0); - } - static void ofw_pci_default_adjust_busrange(device_t dev, u_int busno) { @@ -85,15 +77,6 @@ METHOD bus_space_handle_t get_bus_handle { bus_space_tag_t *tag; } DEFAULT ofw_pci_default_get_bus_handle; -# Get the firmware node for the device dev on the bus. The default method will -# return 0, which signals that there is no such node. -# This could be an ivar, but isn't to avoid numbering conflicts with standard -# pci/pcib ones. -METHOD phandle_t get_node { - device_t bus; - device_t dev; -} DEFAULT ofw_pci_default_get_node; - # Make sure that all PCI bridges up in the hierarchy contain this bus in their # subordinate bus range. This is required because we reenumerate all PCI # buses. diff --git a/sys/sparc64/pci/ofw_pcib.c b/sys/sparc64/pci/ofw_pcib.c index 66ef81f58f11..bf2f1d7236b7 100644 --- a/sys/sparc64/pci/ofw_pcib.c +++ b/sys/sparc64/pci/ofw_pcib.c @@ -40,6 +40,7 @@ #include #include +#include #include #include @@ -82,8 +83,10 @@ static device_method_t ofw_pcib_methods[] = { DEVMETHOD(pcib_write_config, pcib_write_config), DEVMETHOD(pcib_route_interrupt, ofw_pcib_gen_route_interrupt), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_node, ofw_pcib_gen_get_node), + /* ofw_pci interface */ - DEVMETHOD(ofw_pci_get_node, ofw_pcib_gen_get_node), DEVMETHOD(ofw_pci_adjust_busrange, ofw_pcib_gen_adjust_busrange), { 0, 0 } @@ -102,7 +105,7 @@ ofw_pcib_probe(device_t dev) { if ((pci_get_class(dev) == PCIC_BRIDGE) && (pci_get_subclass(dev) == PCIS_BRIDGE_PCI) && - ofw_pci_get_node(dev) != 0) { + ofw_bus_get_node(dev) != 0) { device_set_desc(dev, "OFW PCI-PCI bridge"); return (0); } diff --git a/sys/sparc64/pci/ofw_pcib_subr.c b/sys/sparc64/pci/ofw_pcib_subr.c index daf7e0b7f7a8..b297d3402c95 100644 --- a/sys/sparc64/pci/ofw_pcib_subr.c +++ b/sys/sparc64/pci/ofw_pcib_subr.c @@ -31,8 +31,9 @@ #include #include -#include +#include #include +#include #include #include @@ -53,7 +54,7 @@ ofw_pcib_gen_setup(device_t bridge) u_int secbus; sc->ops_pcib_sc.dev = bridge; - sc->ops_node = ofw_pci_get_node(bridge); + sc->ops_node = ofw_bus_get_node(bridge); KASSERT(sc->ops_node != 0, ("ofw_pcib_gen_setup: no ofw pci parent bus!")); @@ -81,7 +82,7 @@ ofw_pcib_gen_route_interrupt(device_t bridge, device_t dev, int intpin) struct ofw_bus_iinfo *ii = &sc->ops_iinfo; struct ofw_pci_register reg; device_t pbridge = device_get_parent(device_get_parent(bridge)); - phandle_t node = ofw_pci_get_node(dev); + phandle_t node = ofw_bus_get_node(dev); ofw_pci_intr_t pintr, mintr; u_int8_t maskbuf[sizeof(reg) + sizeof(pintr)]; diff --git a/sys/sparc64/pci/ofw_pcib_subr.h b/sys/sparc64/pci/ofw_pcib_subr.h index f925cbe34c6e..8c17e2caeae3 100644 --- a/sys/sparc64/pci/ofw_pcib_subr.h +++ b/sys/sparc64/pci/ofw_pcib_subr.h @@ -41,7 +41,7 @@ struct ofw_pcib_gen_softc { void ofw_pcib_gen_setup(device_t); pcib_route_interrupt_t ofw_pcib_gen_route_interrupt; -ofw_pci_get_node_t ofw_pcib_gen_get_node; +ofw_bus_get_node_t ofw_pcib_gen_get_node; ofw_pci_adjust_busrange_t ofw_pcib_gen_adjust_busrange; #endif /* !_SPARC64_PCI_OFW_PCI_SUBR_H */ diff --git a/sys/sparc64/pci/ofw_pcibus.c b/sys/sparc64/pci/ofw_pcibus.c index 597b65657a89..85369d1f4cd4 100644 --- a/sys/sparc64/pci/ofw_pcibus.c +++ b/sys/sparc64/pci/ofw_pcibus.c @@ -30,6 +30,7 @@ */ #include "opt_ofw_pci.h" + #include #include #include @@ -37,8 +38,9 @@ #include #include -#include +#include #include +#include #include #include @@ -62,7 +64,11 @@ static void ofw_pcibus_setup_device(device_t, u_int, u_int, u_int); static device_probe_t ofw_pcibus_probe; static device_attach_t ofw_pcibus_attach; static pci_assign_interrupt_t ofw_pcibus_assign_interrupt; -static ofw_pci_get_node_t ofw_pcibus_get_node; +static ofw_bus_get_compat_t ofw_pcibus_get_compat; +static ofw_bus_get_model_t ofw_pcibus_get_model; +static ofw_bus_get_name_t ofw_pcibus_get_name; +static ofw_bus_get_node_t ofw_pcibus_get_node; +static ofw_bus_get_type_t ofw_pcibus_get_type; static device_method_t ofw_pcibus_methods[] = { /* Device interface */ @@ -103,14 +109,22 @@ static device_method_t ofw_pcibus_methods[] = { DEVMETHOD(pci_set_powerstate, pci_set_powerstate_method), DEVMETHOD(pci_assign_interrupt, ofw_pcibus_assign_interrupt), - /* OFW PCI interface */ - DEVMETHOD(ofw_pci_get_node, ofw_pcibus_get_node), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, ofw_pcibus_get_compat), + DEVMETHOD(ofw_bus_get_model, ofw_pcibus_get_model), + DEVMETHOD(ofw_bus_get_name, ofw_pcibus_get_name), + DEVMETHOD(ofw_bus_get_node, ofw_pcibus_get_node), + DEVMETHOD(ofw_bus_get_type, ofw_pcibus_get_type), { 0, 0 } }; struct ofw_pcibus_devinfo { struct pci_devinfo opd_dinfo; + char *opd_compat; + char *opd_model; + char *opd_name; + char *opd_type; phandle_t opd_node; }; @@ -132,7 +146,7 @@ static int ofw_pcibus_probe(device_t dev) { - if (ofw_pci_get_node(dev) == 0) + if (ofw_bus_get_node(dev) == 0) return (ENXIO); device_set_desc(dev, "OFW PCI bus"); @@ -205,7 +219,7 @@ ofw_pcibus_attach(device_t dev) if (bootverbose) device_printf(dev, "physical bus=%d\n", busno); - node = ofw_pci_get_node(dev); + node = ofw_bus_get_node(dev); for (child = OF_child(node); child != 0; child = OF_peer(child)) { if (OF_getprop(child, "reg", &pcir, sizeof(pcir)) == -1) panic("ofw_pci_attach: OF_getprop failed"); @@ -216,6 +230,14 @@ ofw_pcibus_attach(device_t dev) busno, slot, func, sizeof(*dinfo)); if (dinfo != NULL) { dinfo->opd_node = child; + OF_getprop_alloc(child, "compatible", 1, + (void **)&dinfo->opd_compat); + OF_getprop_alloc(child, "device_type", 1, + (void **)&dinfo->opd_type); + OF_getprop_alloc(child, "model", 1, + (void **)&dinfo->opd_model); + OF_getprop_alloc(child, "name", 1, + (void **)&dinfo->opd_name); pci_add_child(dev, (struct pci_devinfo *)dinfo); } } @@ -228,11 +250,10 @@ ofw_pcibus_assign_interrupt(device_t dev, device_t child) { struct ofw_pcibus_devinfo *dinfo = device_get_ivars(child); pcicfgregs *cfg = &dinfo->opd_dinfo.cfg; - phandle_t node = ofw_pci_get_node(child); ofw_pci_intr_t intr; int isz; - isz = OF_getprop(node, "interrupts", &intr, sizeof(intr)); + isz = OF_getprop(dinfo->opd_node, "interrupts", &intr, sizeof(intr)); if (isz != sizeof(intr)) { /* No property; our best guess is the intpin. */ intr = cfg->intpin; @@ -255,10 +276,47 @@ ofw_pcibus_assign_interrupt(device_t dev, device_t child) return (PCIB_ROUTE_INTERRUPT(device_get_parent(dev), child, intr)); } +static const char * +ofw_pcibus_get_compat(device_t bus, device_t dev) +{ + struct ofw_pcibus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->opd_compat); +} + +static const char * +ofw_pcibus_get_model(device_t bus, device_t dev) +{ + struct ofw_pcibus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->opd_model); +} + +static const char * +ofw_pcibus_get_name(device_t bus, device_t dev) +{ + struct ofw_pcibus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->opd_name); +} + static phandle_t ofw_pcibus_get_node(device_t bus, device_t dev) { - struct ofw_pcibus_devinfo *dinfo = device_get_ivars(dev); + struct ofw_pcibus_devinfo *dinfo; + dinfo = device_get_ivars(dev); return (dinfo->opd_node); } + +static const char * +ofw_pcibus_get_type(device_t bus, device_t dev) +{ + struct ofw_pcibus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->opd_type); +} diff --git a/sys/sparc64/pci/psycho.c b/sys/sparc64/pci/psycho.c index aa002cc19708..6b42f014b1c9 100644 --- a/sys/sparc64/pci/psycho.c +++ b/sys/sparc64/pci/psycho.c @@ -48,8 +48,9 @@ #include #include -#include +#include #include +#include #include #include @@ -113,7 +114,7 @@ static pcib_write_config_t psycho_write_config; static pcib_route_interrupt_t psycho_route_interrupt; static ofw_pci_intr_pending_t psycho_intr_pending; static ofw_pci_get_bus_handle_t psycho_get_bus_handle; -static ofw_pci_get_node_t psycho_get_node; +static ofw_bus_get_node_t psycho_get_node; static ofw_pci_adjust_busrange_t psycho_adjust_busrange; static device_method_t psycho_methods[] = { @@ -137,10 +138,12 @@ static device_method_t psycho_methods[] = { DEVMETHOD(pcib_write_config, psycho_write_config), DEVMETHOD(pcib_route_interrupt, psycho_route_interrupt), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_node, psycho_get_node), + /* ofw_pci interface */ DEVMETHOD(ofw_pci_intr_pending, psycho_intr_pending), DEVMETHOD(ofw_pci_get_bus_handle, psycho_get_bus_handle), - DEVMETHOD(ofw_pci_get_node, psycho_get_node), DEVMETHOD(ofw_pci_adjust_busrange, psycho_adjust_busrange), { 0, 0 } @@ -840,7 +843,7 @@ psycho_route_interrupt(device_t bridge, device_t dev, int pin) struct psycho_softc *sc = device_get_softc(bridge); struct ofw_pci_register reg; bus_addr_t intrmap; - phandle_t node = ofw_pci_get_node(dev); + phandle_t node = ofw_bus_get_node(dev); ofw_pci_intr_t pintr, mintr; u_int8_t maskbuf[sizeof(reg) + sizeof(pintr)]; diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c index 89c7ac9ca5b7..4ae43d1210a7 100644 --- a/sys/sparc64/sbus/sbus.c +++ b/sys/sparc64/sbus/sbus.c @@ -112,6 +112,7 @@ #include #include +#include #include #include @@ -132,7 +133,6 @@ #include #include - #ifdef DEBUG #define SDB_DVMA 0x1 #define SDB_INTR 0x2 @@ -144,11 +144,12 @@ int sbus_debug = 0; struct sbus_devinfo { int sdi_burstsz; - char *sdi_compat; + char *sdi_compat; /* PROM compatible */ + char *sdi_model; /* PROM model */ char *sdi_name; /* PROM name */ phandle_t sdi_node; /* PROM node */ int sdi_slot; - char *sdi_type; /* PROM name */ + char *sdi_type; /* PROM device_type */ struct resource_list sdi_rl; }; @@ -219,6 +220,11 @@ static int sbus_deactivate_resource(device_t, device_t, int, int, struct resource *); static int sbus_release_resource(device_t, device_t, int, int, struct resource *); +static ofw_bus_get_compat_t sbus_get_compat; +static ofw_bus_get_model_t sbus_get_model; +static ofw_bus_get_name_t sbus_get_name; +static ofw_bus_get_node_t sbus_get_node; +static ofw_bus_get_type_t sbus_get_type; static struct sbus_devinfo * sbus_setup_dinfo(struct sbus_softc *sc, phandle_t node, char *name); @@ -246,6 +252,13 @@ static device_method_t sbus_methods[] = { DEVMETHOD(bus_get_resource_list, sbus_get_resource_list), DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_compat, sbus_get_compat), + DEVMETHOD(ofw_bus_get_model, sbus_get_model), + DEVMETHOD(ofw_bus_get_name, sbus_get_name), + DEVMETHOD(ofw_bus_get_node, sbus_get_node), + DEVMETHOD(ofw_bus_get_type, sbus_get_type), + { 0, 0 } }; @@ -460,6 +473,7 @@ sbus_setup_dinfo(struct sbus_softc *sc, phandle_t node, char *name) sdi->sdi_node = node; OF_getprop_alloc(node, "compatible", 1, (void **)&sdi->sdi_compat); OF_getprop_alloc(node, "device_type", 1, (void **)&sdi->sdi_type); + OF_getprop_alloc(node, "model", 1, (void **)&sdi->sdi_model); slot = -1; nreg = OF_getprop_alloc(node, "reg", sizeof(*reg), (void **)®); if (nreg == -1) { @@ -524,6 +538,8 @@ sbus_destroy_dinfo(struct sbus_devinfo *dinfo) resource_list_free(&dinfo->sdi_rl); if (dinfo->sdi_compat != NULL) free(dinfo->sdi_compat, M_OFWPROP); + if (dinfo->sdi_model != NULL) + free(dinfo->sdi_model, M_OFWPROP); if (dinfo->sdi_type != NULL) free(dinfo->sdi_type, M_OFWPROP); free(dinfo, M_DEVBUF); @@ -548,19 +564,12 @@ sbus_print_child(device_t dev, device_t child) static void sbus_probe_nomatch(device_t dev, device_t child) { - char *name; - char *type; + const char *type; - if (BUS_READ_IVAR(dev, child, SBUS_IVAR_NAME, - (uintptr_t *)&name) != 0 || - BUS_READ_IVAR(dev, child, SBUS_IVAR_DEVICE_TYPE, - (uintptr_t *)&type) != 0) - return; - - if (type == NULL) + if ((type = ofw_bus_get_type(child)) == NULL) type = "(unknown)"; device_printf(dev, "<%s>, type %s (no driver attached)\n", - name, type); + ofw_bus_get_name(child), type); } static int @@ -578,21 +587,9 @@ sbus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) case SBUS_IVAR_CLOCKFREQ: *result = sc->sc_clockfreq; break; - case SBUS_IVAR_COMPAT: - *result = (uintptr_t)dinfo->sdi_compat; - break; - case SBUS_IVAR_NAME: - *result = (uintptr_t)dinfo->sdi_name; - break; - case SBUS_IVAR_NODE: - *result = dinfo->sdi_node; - break; case SBUS_IVAR_SLOT: *result = dinfo->sdi_slot; break; - case SBUS_IVAR_DEVICE_TYPE: - *result = (uintptr_t)dinfo->sdi_type; - break; default: return (ENOENT); } @@ -890,3 +887,48 @@ sbus_alloc_bustag(struct sbus_softc *sc) sbt->bst_type = SBUS_BUS_SPACE; return (sbt); } + +const char * +sbus_get_compat(device_t bus, device_t dev) +{ + struct sbus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->sdi_compat); +} + +const char * +sbus_get_model(device_t bus, device_t dev) +{ + struct sbus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->sdi_model); +} + +const char * +sbus_get_name(device_t bus, device_t dev) +{ + struct sbus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->sdi_name); +} + +static phandle_t +sbus_get_node(device_t bus, device_t dev) +{ + struct sbus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->sdi_node); +} + +const char * +sbus_get_type(device_t bus, device_t dev) +{ + struct sbus_devinfo *dinfo; + + dinfo = device_get_ivars(dev); + return (dinfo->sdi_type); +} diff --git a/sys/sparc64/sbus/sbusvar.h b/sys/sparc64/sbus/sbusvar.h index 6b5a4380465f..1f4a05dd065b 100644 --- a/sys/sparc64/sbus/sbusvar.h +++ b/sys/sparc64/sbus/sbusvar.h @@ -98,11 +98,7 @@ enum sbus_device_ivars { SBUS_IVAR_BURSTSZ, SBUS_IVAR_CLOCKFREQ, - SBUS_IVAR_COMPAT, - SBUS_IVAR_NAME, - SBUS_IVAR_NODE, SBUS_IVAR_SLOT, - SBUS_IVAR_DEVICE_TYPE, }; /* @@ -113,11 +109,7 @@ enum sbus_device_ivars { SBUS_ACCESSOR(burstsz, BURSTSZ, int) SBUS_ACCESSOR(clockfreq, CLOCKFREQ, int) -SBUS_ACCESSOR(compat, COMPAT, char *) -SBUS_ACCESSOR(name, NAME, char *) -SBUS_ACCESSOR(node, NODE, phandle_t) SBUS_ACCESSOR(slot, SLOT, int) -SBUS_ACCESSOR(device_type, DEVICE_TYPE, char *) #undef SBUS_ACCESSOR diff --git a/sys/sparc64/sparc64/eeprom.c b/sys/sparc64/sparc64/eeprom.c index 266cbdb40243..5f67a31c0e23 100644 --- a/sys/sparc64/sparc64/eeprom.c +++ b/sys/sparc64/sparc64/eeprom.c @@ -57,14 +57,14 @@ #include #include +#include + #include #include #include #include -#include - #include #include @@ -73,26 +73,34 @@ devclass_t eeprom_devclass; - #define IDPROM_OFFSET (8 * 1024 - 40) /* XXX - get nvram size from driver */ int -eeprom_attach(device_t dev, phandle_t node, bus_space_tag_t bt, - bus_space_handle_t bh) +eeprom_probe(device_t dev) +{ + + if (strcmp("eeprom", ofw_bus_get_name(dev)) == 0) { + device_set_desc(dev, "EEPROM/clock"); + return (0); + } + return (ENXIO); +} + +int +eeprom_attach(device_t dev, bus_space_tag_t bt, bus_space_handle_t bh) { struct timespec ts; struct idprom *idp; - char *model; + const char *model; int error, i; u_int32_t h; - if (OF_getprop_alloc(node, "model", 1, (void **)&model) == -1) + if ((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); - free(model, M_OFWPROP); return (error); } /* XXX: register clock device */ @@ -115,4 +123,3 @@ eeprom_attach(device_t dev, phandle_t node, bus_space_tag_t bt, return (0); } - diff --git a/sys/sparc64/sparc64/eeprom_ebus.c b/sys/sparc64/sparc64/eeprom_ebus.c index 7f6e495c1a62..645602bfb62a 100644 --- a/sys/sparc64/sparc64/eeprom_ebus.c +++ b/sys/sparc64/sparc64/eeprom_ebus.c @@ -58,32 +58,29 @@ #include #include +#include + #include #include #include #include -#include - #include #include -#include - #include "clock_if.h" /* * clock (eeprom) attaches at the sbus or the ebus */ -static int eeprom_ebus_probe(device_t); static int eeprom_ebus_attach(device_t); static device_method_t eeprom_ebus_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, eeprom_ebus_probe), + DEVMETHOD(device_probe, eeprom_probe), DEVMETHOD(device_attach, eeprom_ebus_attach), /* clock interface */ @@ -101,18 +98,6 @@ static driver_t eeprom_ebus_driver = { DRIVER_MODULE(eeprom, ebus, eeprom_ebus_driver, eeprom_devclass, 0, 0); - -static int -eeprom_ebus_probe(device_t dev) -{ - - if (strcmp("eeprom", ebus_get_name(dev)) == 0) { - device_set_desc(dev, "EBus EEPROM/clock"); - return (0); - } - return (ENXIO); -} - /* * Attach a clock (really `eeprom') to the ebus. * @@ -134,7 +119,7 @@ eeprom_ebus_attach(device_t dev) device_printf(dev, "could not allocate resources\n"); return (ENXIO); } - error = eeprom_attach(dev, ebus_get_node(dev), rman_get_bustag(res), + error = eeprom_attach(dev, rman_get_bustag(res), rman_get_bushandle(res)); return (error); } diff --git a/sys/sparc64/sparc64/eeprom_fhc.c b/sys/sparc64/sparc64/eeprom_fhc.c deleted file mode 100644 index b1f320f81de8..000000000000 --- a/sys/sparc64/sparc64/eeprom_fhc.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1994 Gordon W. Ross - * Copyright (c) 1993 Adam Glass - * Copyright (c) 1996 Paul Kranenburg - * Copyright (c) 1996 - * The President and Fellows of Harvard College. All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Harvard University. - * - * 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Paul Kranenburg. - * This product includes software developed by Harvard University. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. - * - * from: @(#)clock.c 8.1 (Berkeley) 6/11/93 - * from: NetBSD: clock.c,v 1.41 2001/07/24 19:29:25 eeh Exp - * - * $FreeBSD$ - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#include - -#include - -#include -#include - -#include "clock_if.h" - -static int eeprom_fhc_probe(device_t); -static int eeprom_fhc_attach(device_t); - -static device_method_t eeprom_fhc_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, eeprom_fhc_probe), - DEVMETHOD(device_attach, eeprom_fhc_attach), - - /* clock interface */ - DEVMETHOD(clock_gettime, mk48txx_gettime), - DEVMETHOD(clock_settime, mk48txx_settime), - - { 0, 0 } -}; - -static driver_t eeprom_fhc_driver = { - "eeprom", - eeprom_fhc_methods, - 0, -}; - -DRIVER_MODULE(eeprom, fhc, eeprom_fhc_driver, eeprom_devclass, 0, 0); - -static int -eeprom_fhc_probe(device_t dev) -{ - - if (strcmp("eeprom", fhc_get_name(dev)) == 0) { - device_set_desc(dev, "FHC EEPROM/clock"); - return (0); - } - return (ENXIO); -} - -/* - * Attach a clock (really `eeprom') to the fhc. - * - * This is mapped read-only on NetBSD for safety, but this is not possible - * with the current FreeBSD bus code. - * - * the MK48T02 is 2K. the MK48T08 is 8K, and the MK48T59 is supposed to be - * identical to it. - */ -static int -eeprom_fhc_attach(device_t dev) -{ - struct resource *res; - int rid, error; - - rid = 0; - res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); - if (res == NULL) { - device_printf(dev, "could not allocate resources\n"); - return (ENXIO); - } - error = eeprom_attach(dev, fhc_get_node(dev), rman_get_bustag(res), - rman_get_bushandle(res)); - return (error); -} diff --git a/sys/sparc64/sparc64/eeprom_sbus.c b/sys/sparc64/sparc64/eeprom_sbus.c index 3bf0116b8676..9273193294fd 100644 --- a/sys/sparc64/sparc64/eeprom_sbus.c +++ b/sys/sparc64/sparc64/eeprom_sbus.c @@ -58,28 +58,25 @@ #include #include +#include + #include #include #include #include -#include - #include #include -#include - #include "clock_if.h" -static int eeprom_sbus_probe(device_t); static int eeprom_sbus_attach(device_t); static device_method_t eeprom_sbus_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, eeprom_sbus_probe), + DEVMETHOD(device_probe, eeprom_probe), DEVMETHOD(device_attach, eeprom_sbus_attach), /* clock interface */ @@ -95,22 +92,11 @@ static driver_t eeprom_sbus_driver = { 0, }; +DRIVER_MODULE(eeprom, fhc, eeprom_sbus_driver, eeprom_devclass, 0, 0); DRIVER_MODULE(eeprom, sbus, eeprom_sbus_driver, eeprom_devclass, 0, 0); - -static int -eeprom_sbus_probe(device_t dev) -{ - - if (strcmp("eeprom", sbus_get_name(dev)) == 0) { - device_set_desc(dev, "SBus EEPROM/clock"); - return (0); - } - return (ENXIO); -} - /* - * Attach a clock (really `eeprom') to the sbus. + * Attach a clock (really `eeprom') to fhc or sbus. * * This is mapped read-only on NetBSD for safety, but this is not possible * with the current FreeBSD bus code. @@ -130,7 +116,7 @@ eeprom_sbus_attach(device_t dev) device_printf(dev, "could not allocate resources\n"); return (ENXIO); } - error = eeprom_attach(dev, sbus_get_node(dev), rman_get_bustag(res), + error = eeprom_attach(dev, rman_get_bustag(res), rman_get_bushandle(res)); return (error); } diff --git a/sys/sparc64/sparc64/ofw_machdep.c b/sys/sparc64/sparc64/ofw_machdep.c index 482fcb54a45f..f4ba52a3c4a9 100644 --- a/sys/sparc64/sparc64/ofw_machdep.c +++ b/sys/sparc64/sparc64/ofw_machdep.c @@ -30,10 +30,12 @@ */ #include +#include #include #include +#include #include #include @@ -63,7 +65,7 @@ OF_getetheraddr2(device_t dev, u_char *addr) { phandle_t node; - node = ofw_pci_get_node(dev); + node = ofw_bus_get_node(dev); if (node <= 0) return (-1); return (OF_getprop(node, "local-mac-address", addr, ETHER_ADDR_LEN));