http://perforce.freebsd.org/chv.cgi?CH=119510
Change 119510 by bms at bms_anglepoise on 2007/05/08 20:54:18
Add release/deactivate primitives.
siba needs to be able to remap itself once it discovers how big
its bus space is during probe.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips/nexus.c#9 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips/nexus.c#9 (text+ko) ====
@@ -71,6 +71,20 @@
static struct rman irq_rman;
static struct rman mem_rman;
+#ifdef notyet
+/*
+ * XXX: TODO: Implement bus space barrier functions.
+ * Currently tag and handle are set when memory resources
+ * are activated.
+ */
+struct bus_space_tag nexus_bustag = {
+ NULL, /* cookie */
+ NULL, /* parent bus tag */
+ NEXUS_BUS_SPACE, /* type */
+ nexus_bus_barrier, /* bus_space_barrier */
+};
+#endif
+
static struct resource *
nexus_alloc_resource(device_t, device_t, int, int *, u_long,
u_long, u_long, u_int);
@@ -78,6 +92,8 @@
struct resource *);
static device_t nexus_add_child(device_t, int, const char *, int);
static int nexus_attach(device_t);
+static int nexus_deactivate_resource(device_t, device_t, int, int,
+ struct resource *);
static void nexus_delete_resource(device_t, device_t, int, int);
static struct resource_list *
nexus_get_reslist(device_t, device_t);
@@ -87,6 +103,8 @@
static int nexus_print_child(device_t, device_t);
static int nexus_print_all_resources(device_t dev);
static int nexus_probe(device_t);
+static int nexus_release_resource(device_t, device_t, int, int,
+ struct resource *);
static int nexus_set_resource(device_t, device_t, int, int, u_long,
u_long);
static int nexus_setup_intr(device_t dev, device_t child,
@@ -104,11 +122,13 @@
DEVMETHOD(bus_add_child, nexus_add_child),
DEVMETHOD(bus_activate_resource,nexus_activate_resource),
DEVMETHOD(bus_alloc_resource, nexus_alloc_resource),
+ DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
DEVMETHOD(bus_delete_resource, nexus_delete_resource),
DEVMETHOD(bus_get_resource, nexus_get_resource),
DEVMETHOD(bus_get_resource_list, nexus_get_reslist),
DEVMETHOD(bus_hinted_child, nexus_hinted_child),
DEVMETHOD(bus_print_child, nexus_print_child),
+ DEVMETHOD(bus_release_resource, nexus_release_resource),
DEVMETHOD(bus_set_resource, nexus_set_resource),
DEVMETHOD(bus_setup_intr, nexus_setup_intr),
DEVMETHOD(bus_teardown_intr, nexus_teardown_intr),
@@ -123,16 +143,12 @@
};
static devclass_t nexus_devclass;
-extern int rman_debug; /* XXX XXX */
-
static int
nexus_probe(device_t dev)
{
device_set_desc(dev, "MIPS32 root nexus");
- rman_debug = 1; /* XXX XXX */
-
irq_rman.rm_start = 0;
irq_rman.rm_end = NUM_MIPS_IRQS - 1;
irq_rman.rm_type = RMAN_ARRAY;
@@ -335,12 +351,6 @@
}
rman_set_rid(rv, *rid);
-#if 0
- if (type == SYS_RES_MEMORY) {
- rman_set_bustag(rv, &nexus_bustag);
- rman_set_bushandle(rv, rman_get_start(rv));
- }
-#endif
if (needactivate) {
if (bus_activate_resource(child, type, *rid, rv)) {
@@ -426,7 +436,32 @@
struct nexus_device *ndev = DEVTONX(child);
struct resource_list *rl = &ndev->nx_resources;
+ printf("%s: entry\n", __func__);
+
resource_list_delete(rl, type, rid);
}
+static int
+nexus_release_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+ printf("%s: entry\n", __func__);
+
+ if (rman_get_flags(r) & RF_ACTIVE) {
+ int error = bus_deactivate_resource(child, type, rid, r);
+ if (error)
+ return error;
+ }
+
+ return (rman_release_resource(r));
+}
+
+static int
+nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+
+ return (rman_deactivate_resource(r));
+}
+
DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);