summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/bus_if.m9
-rw-r--r--sys/kern/subr_bus.c92
-rw-r--r--sys/sys/bus.h9
3 files changed, 110 insertions, 0 deletions
diff --git a/sys/kern/bus_if.m b/sys/kern/bus_if.m
index 48d4dc8..e1b808f 100644
--- a/sys/kern/bus_if.m
+++ b/sys/kern/bus_if.m
@@ -236,3 +236,12 @@ METHOD void delete_resource {
int type;
int rid;
};
+
+#
+# Return a struct resource_list.
+#
+METHOD int get_resource_list {
+ device_t dev;
+ device_t child;
+ struct resource_list *rl;
+} DEFAULT bus_generic_get_resource_list;
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 9bd6688..b315a2a 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -1964,6 +1964,13 @@ bus_generic_write_ivar(device_t dev, device_t child, int index,
return ENOENT;
}
+int
+bus_generic_get_resource_list (device_t dev, device_t child,
+ struct resource_list *rl)
+{
+ return ENOENT;
+}
+
void
bus_generic_driver_added(device_t dev, driver_t *driver)
{
@@ -2048,6 +2055,91 @@ bus_generic_deactivate_resource(device_t dev, device_t child, int type,
return (EINVAL);
}
+int
+bus_generic_rl_get_resource (device_t dev, device_t child, int type, int rid,
+ u_long *startp, u_long *countp)
+{
+ struct resource_list * rl = NULL;
+ struct resource_list_entry * rle = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (retval);
+
+ rle = resource_list_find(rl, type, rid);
+ if (!rle)
+ return ENOENT;
+
+ if (startp)
+ *startp = rle->start;
+ if (countp)
+ *countp = rle->count;
+
+ return (0);
+}
+
+int
+bus_generic_rl_set_resource (device_t dev, device_t child, int type, int rid,
+ u_long start, u_long count)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (retval);
+
+ resource_list_add(rl, type, rid, start, (start + count - 1), count);
+
+ return (0);
+}
+
+void
+bus_generic_rl_delete_resource (device_t dev, device_t child, int type, int rid)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return;
+
+ resource_list_delete(rl, type, rid);
+
+ return;
+}
+
+int
+bus_generic_rl_release_resource (device_t dev, device_t child, int type,
+ int rid, struct resource *r)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (retval);
+
+ return (resource_list_release(rl, dev, child, type, rid, r));
+}
+
+struct resource *
+bus_generic_rl_alloc_resource (device_t dev, device_t child, int type,
+ int *rid, u_long start, u_long end,
+ u_long count, u_int flags)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (0);
+
+ return resource_list_alloc(rl, dev, child, type, rid,
+ start, end, count, flags);
+}
+
/*
* Some convenience functions to make it easier for drivers to use the
* resource-management functions. All these really do is hide the
diff --git a/sys/sys/bus.h b/sys/sys/bus.h
index 171728d..17be243 100644
--- a/sys/sys/bus.h
+++ b/sys/sys/bus.h
@@ -179,6 +179,7 @@ int bus_generic_deactivate_resource(device_t dev, device_t child, int type,
int rid, struct resource *r);
int bus_generic_detach(device_t dev);
void bus_generic_driver_added(device_t dev, driver_t *driver);
+int bus_generic_get_resource_list (device_t, device_t, struct resource_list *);
int bus_print_child_header(device_t dev, device_t child);
int bus_print_child_footer(device_t dev, device_t child);
int bus_generic_print_child(device_t dev, device_t child);
@@ -191,6 +192,14 @@ int bus_generic_resume(device_t dev);
int bus_generic_setup_intr(device_t dev, device_t child,
struct resource *irq, int flags,
driver_intr_t *intr, void *arg, void **cookiep);
+
+struct resource *bus_generic_rl_alloc_resource (device_t, device_t, int, int *,
+ u_long, u_long, u_long, u_int);
+void bus_generic_rl_delete_resource (device_t, device_t, int, int);
+int bus_generic_rl_get_resource (device_t, device_t, int, int, u_long *, u_long *);
+int bus_generic_rl_set_resource (device_t, device_t, int, int, u_long, u_long);
+int bus_generic_rl_release_resource(device_t, device_t, int, int, struct resource *);
+
int bus_generic_shutdown(device_t dev);
int bus_generic_suspend(device_t dev);
int bus_generic_teardown_intr(device_t dev, device_t child,
OpenPOWER on IntegriCloud