Add new bus method 'GET_RESOURCE_LIST' and appropriate generic
implementation. Add bus_generic_rl_{get,set,delete,release,alloc}_resource() functions which provide generic operations for devices using resource list style resource management. This should simplify a number of bus drivers. Further commits to follow.
This commit is contained in:
parent
6672edd320
commit
0cb53e2487
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user