summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/ebus/ebus.c
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2005-05-19 18:11:46 +0000
committermarius <marius@FreeBSD.org>2005-05-19 18:11:46 +0000
commit59995514a3766dccab4efad08e3822d43b36d6e0 (patch)
tree9d261221ef07f6e07266b83859f0d687621bba96 /sys/sparc64/ebus/ebus.c
parent0ef27299c3538d580cf75375e746f66dce6fd6e1 (diff)
downloadFreeBSD-src-59995514a3766dccab4efad08e3822d43b36d6e0.zip
FreeBSD-src-59995514a3766dccab4efad08e3822d43b36d6e0.tar.gz
- Artificially using SYS_RES_IOPORT for EBus devices for reasons of
compatibility with ISA devices while in fact all known EBus devices actually use memory space turned out to be not a good idea as so far there is only the 'rtc' device known to show up either on an EBus or ISA bus but not on any of the other busses used on sparc64. However there are quite a couple of them that show up on either EBus, FireHose or SBus. In order to save extra code in the respective drivers switch ebus(4) to actually use SYS_RES_MEMORY for the memory resources of its children. At least for transition still accept SYS_RES_IOPORT and silently change it to SYS_RES_MEMORY. [1] - In ebus_probe() use ofw_bus_get_name() instead of re-implementing it via ofw_bus_get_node() and OF_getprop(). - Remove some unused variables. - Use FBSDID. Discussed with: tmm (some time ago)
Diffstat (limited to 'sys/sparc64/ebus/ebus.c')
-rw-r--r--sys/sparc64/ebus/ebus.c67
1 files changed, 43 insertions, 24 deletions
diff --git a/sys/sparc64/ebus/ebus.c b/sys/sparc64/ebus/ebus.c
index 410ed6d..da03495 100644
--- a/sys/sparc64/ebus/ebus.c
+++ b/sys/sparc64/ebus/ebus.c
@@ -27,12 +27,13 @@
* SUCH DAMAGE.
*
* from: NetBSD: ebus.c,v 1.26 2001/09/10 16:27:53 eeh Exp
- *
- * $FreeBSD$
*/
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
/*
- * UltraSPARC 5 and beyond ebus support.
+ * UltraSPARC 5 and beyond Ebus support.
*
* note that this driver is not complete:
* - ebus2 dma code is completely unwritten
@@ -109,6 +110,7 @@ static bus_probe_nomatch_t ebus_probe_nomatch;
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 bus_get_resource_t ebus_get_resource;
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;
@@ -135,7 +137,7 @@ static device_method_t ebus_methods[] = {
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_release_resource, ebus_release_resource),
- DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource),
+ DEVMETHOD(bus_get_resource, ebus_get_resource),
/* ofw_bus interface */
DEVMETHOD(ofw_bus_get_compat, ebus_get_compat),
@@ -160,16 +162,10 @@ DRIVER_MODULE(ebus, pci, ebus_driver, ebus_devclass, 0, 0);
static int
ebus_probe(device_t dev)
{
- char name[10];
- phandle_t node;
-
- if ((node = ofw_bus_get_node(dev)) == 0)
- return (ENXIO);
- OF_getprop(node, "name", &name, sizeof(name));
if (pci_get_class(dev) != PCIC_BRIDGE ||
pci_get_vendor(dev) != 0x108e ||
- strcmp(name, "ebus") != 0)
+ strcmp(ofw_bus_get_name(dev), "ebus") != 0)
return (ENXIO);
if (pci_get_device(dev) == 0x1000)
@@ -304,7 +300,7 @@ ebus_alloc_resource(device_t bus, device_t child, int type, int *rid,
bus_space_handle_t bh;
int passthrough = (device_get_parent(child) != bus);
int isdefault = (start == 0UL && end == ~0UL);
- int ptype, ridx, rv;
+ int ridx, rv;
sc = (struct ebus_softc *)device_get_softc(bus);
rl = BUS_GET_RESOURCE_LIST(bus, child);
@@ -314,10 +310,11 @@ ebus_alloc_resource(device_t bus, device_t child, int type, int *rid,
*/
switch (type) {
case SYS_RES_IOPORT:
+ case SYS_RES_MEMORY:
KASSERT(!(isdefault && passthrough),
("ebus_alloc_resource: passthrough of default alloc"));
if (!passthrough) {
- rle = resource_list_find(rl, type, *rid);
+ rle = resource_list_find(rl, SYS_RES_MEMORY, *rid);
if (rle == NULL)
return (NULL);
KASSERT(rle->res == NULL,
@@ -329,7 +326,7 @@ ebus_alloc_resource(device_t bus, device_t child, int type, int *rid,
}
}
- ptype = ofw_isa_range_map(sc->sc_range, sc->sc_nrange,
+ (void)ofw_isa_range_map(sc->sc_range, sc->sc_nrange,
&start, &end, &ridx);
ri = &sc->sc_rinfo[ridx];
@@ -362,20 +359,19 @@ int
ebus_release_resource(device_t bus, device_t child, int type, int rid,
struct resource *res)
{
- struct ebus_softc *sc;
struct resource_list *rl;
struct resource_list_entry *rle;
int passthrough = (device_get_parent(child) != bus);
int rv;
- sc = (struct ebus_softc *)device_get_softc(bus);
rl = BUS_GET_RESOURCE_LIST(bus, child);
switch (type) {
case SYS_RES_IOPORT:
+ case SYS_RES_MEMORY:
if ((rv = rman_release_resource(res)) != 0)
return (rv);
if (!passthrough) {
- rle = resource_list_find(rl, type, rid);
+ rle = resource_list_find(rl, SYS_RES_MEMORY, rid);
KASSERT(rle != NULL, ("ebus_release_resource: "
"resource entry not found!"));
KASSERT(rle->res != NULL, ("ebus_alloc_resource: "
@@ -401,6 +397,34 @@ ebus_get_resource_list(device_t dev, device_t child)
return (&edi->edi_rl);
}
+static int
+ebus_get_resource(device_t dev, device_t child, int type, int rid,
+ u_long *startp, u_long *countp)
+{
+ struct resource_list *rl;
+ struct resource_list_entry *rle;
+
+ switch (type) {
+ case SYS_RES_IOPORT:
+ case SYS_RES_MEMORY:
+ rl = BUS_GET_RESOURCE_LIST(dev, child);
+ if (!rl)
+ return (EINVAL);
+ rle = resource_list_find(rl, SYS_RES_MEMORY, rid);
+ if (!rle)
+ return (ENOENT);
+ if (startp)
+ *startp = rle->start;
+ if (countp)
+ *countp = rle->count;
+ return (0);
+ case SYS_RES_IRQ:
+ return (bus_generic_rl_get_resource(dev, child, type, rid,
+ startp, countp));
+ }
+ return (EINVAL);
+}
+
static struct ebus_devinfo *
ebus_setup_dinfo(device_t dev, struct ebus_softc *sc, phandle_t node,
char *name)
@@ -429,12 +453,7 @@ ebus_setup_dinfo(device_t dev, struct ebus_softc *sc, phandle_t node,
}
for (i = 0; i < nreg; i++) {
start = ISA_REG_PHYS(reg + i);
- /*
- * XXX: use SYS_RES_IOPORT for compatability with ISA drivers -
- * probably, SYS_RES_MEMORY would be more apporpriate, although
- * that does not really matter.
- */
- resource_list_add(&edi->edi_rl, SYS_RES_IOPORT, i,
+ resource_list_add(&edi->edi_rl, SYS_RES_MEMORY, i,
start, start + reg[i].size - 1, reg[i].size);
}
free(reg, M_OFWPROP);
@@ -478,7 +497,7 @@ ebus_print_res(struct ebus_devinfo *edi)
int retval;
retval = 0;
- retval += resource_list_print_type(&edi->edi_rl, "addr", SYS_RES_IOPORT,
+ retval += resource_list_print_type(&edi->edi_rl, "addr", SYS_RES_MEMORY,
"%#lx");
retval += resource_list_print_type(&edi->edi_rl, "irq", SYS_RES_IRQ,
"%ld");
OpenPOWER on IntegriCloud