diff options
-rw-r--r-- | sys/kern/bus_if.m | 9 | ||||
-rw-r--r-- | sys/kern/subr_bus.c | 92 | ||||
-rw-r--r-- | sys/sys/bus.h | 9 |
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, |