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:
Matthew N. Dodd 2000-10-18 05:15:40 +00:00
parent 6672edd320
commit 0cb53e2487
3 changed files with 110 additions and 0 deletions

View File

@ -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;

View File

@ -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

View File

@ -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,