77 int refs; /* # devclasses containing driver */ 78}; 79 80typedef enum device_state { 81 DS_NOTPRESENT, /* not probed or probe failed */ 82 DS_ALIVE, /* probe succeeded */ 83 DS_ATTACHED, /* attach method called */ 84 DS_BUSY /* device is open */ 85} device_state_t; 86 87/* 88 * Definitions for drivers which need to keep simple lists of resources 89 * for their child devices. 90 */ 91struct resource; 92 93struct resource_list_entry { 94 SLIST_ENTRY(resource_list_entry) link; 95 int type; /* type argument to alloc_resource */ 96 int rid; /* resource identifier */ 97 struct resource *res; /* the real resource when allocated */ 98 u_long start; /* start of resource range */ 99 u_long end; /* end of resource range */ 100 u_long count; /* count within range */ 101}; 102SLIST_HEAD(resource_list, resource_list_entry); 103 104/* 105 * Initialise a resource list. 106 */ 107void resource_list_init(struct resource_list *rl); 108 109/* 110 * Reclaim memory used by a resource list. 111 */ 112void resource_list_free(struct resource_list *rl); 113 114/* 115 * Add a resource entry or modify an existing entry if one exists with 116 * the same type and rid. 117 */ 118void resource_list_add(struct resource_list *rl, 119 int type, int rid, 120 u_long start, u_long end, u_long count); 121 122/* 123 * Find a resource entry by type and rid. 124 */ 125struct resource_list_entry* 126 resource_list_find(struct resource_list *rl, 127 int type, int rid); 128 129/* 130 * Delete a resource entry. 131 */ 132void resource_list_delete(struct resource_list *rl, 133 int type, int rid); 134 135/* 136 * Implement BUS_ALLOC_RESOURCE by looking up a resource from the list 137 * and passing the allocation up to the parent of bus. This assumes 138 * that the first entry of device_get_ivars(child) is a struct 139 * resource_list. This also handles 'passthrough' allocations where a 140 * child is a remote descendant of bus by passing the allocation up to 141 * the parent of bus. 142 */ 143struct resource * 144 resource_list_alloc(struct resource_list *rl, 145 device_t bus, device_t child, 146 int type, int *rid, 147 u_long start, u_long end, 148 u_long count, u_int flags); 149 150/* 151 * Implement BUS_RELEASE_RESOURCE. 152 */ 153int resource_list_release(struct resource_list *rl, 154 device_t bus, device_t child, 155 int type, int rid, struct resource *res); 156 157/* 158 * The root bus, to which all top-level busses are attached. 159 */ 160extern device_t root_bus; 161extern devclass_t root_devclass; 162void root_bus_configure(void); 163 164/* 165 * Useful functions for implementing busses. 166 */ 167 168int bus_generic_activate_resource(device_t dev, device_t child, int type, 169 int rid, struct resource *r); 170struct resource *bus_generic_alloc_resource(device_t bus, device_t child, 171 int type, int *rid, 172 u_long start, u_long end, 173 u_long count, u_int flags); 174int bus_generic_attach(device_t dev); 175int bus_generic_deactivate_resource(device_t dev, device_t child, int type, 176 int rid, struct resource *r); 177int bus_generic_detach(device_t dev); 178void bus_generic_driver_added(device_t dev, driver_t *driver); 179int bus_print_child_header(device_t dev, device_t child); 180int bus_print_child_footer(device_t dev, device_t child); 181int bus_generic_print_child(device_t dev, device_t child); 182int bus_generic_probe(device_t dev); 183int bus_generic_read_ivar(device_t dev, device_t child, int which, 184 uintptr_t *result); 185int bus_generic_release_resource(device_t bus, device_t child, 186 int type, int rid, struct resource *r); 187int bus_generic_resume(device_t dev); 188int bus_generic_setup_intr(device_t dev, device_t child, 189 struct resource *irq, int flags, 190 driver_intr_t *intr, void *arg, void **cookiep); 191int bus_generic_shutdown(device_t dev); 192int bus_generic_suspend(device_t dev); 193int bus_generic_teardown_intr(device_t dev, device_t child, 194 struct resource *irq, void *cookie); 195int bus_generic_write_ivar(device_t dev, device_t child, int which, 196 uintptr_t value); 197 198/* 199 * Wrapper functions for the BUS_*_RESOURCE methods to make client code 200 * a little simpler. 201 */ 202struct resource *bus_alloc_resource(device_t dev, int type, int *rid, 203 u_long start, u_long end, u_long count, 204 u_int flags); 205int bus_activate_resource(device_t dev, int type, int rid, 206 struct resource *r); 207int bus_deactivate_resource(device_t dev, int type, int rid, 208 struct resource *r); 209int bus_release_resource(device_t dev, int type, int rid, 210 struct resource *r); 211int bus_setup_intr(device_t dev, struct resource *r, int flags, 212 driver_intr_t handler, void *arg, void **cookiep); 213int bus_teardown_intr(device_t dev, struct resource *r, void *cookie); 214int bus_set_resource(device_t dev, int type, int rid, 215 u_long start, u_long count); 216int bus_get_resource(device_t dev, int type, int rid, 217 u_long *startp, u_long *countp); 218u_long bus_get_resource_start(device_t dev, int type, int rid); 219u_long bus_get_resource_count(device_t dev, int type, int rid); 220void bus_delete_resource(device_t dev, int type, int rid); 221 222/* 223 * Access functions for device. 224 */ 225device_t device_add_child(device_t dev, const char *name, int unit); 226device_t device_add_child_ordered(device_t dev, int order, 227 const char *name, int unit); 228void device_busy(device_t dev); 229int device_delete_child(device_t dev, device_t child); 230int device_detach(device_t dev); 231void device_disable(device_t dev); 232void device_enable(device_t dev); 233device_t device_find_child(device_t dev, const char *classname, 234 int unit); 235const char *device_get_desc(device_t dev); 236devclass_t device_get_devclass(device_t dev); 237driver_t *device_get_driver(device_t dev); 238u_int32_t device_get_flags(device_t dev); 239device_t device_get_parent(device_t dev); 240int device_get_children(device_t dev, device_t **listp, int *countp); 241void *device_get_ivars(device_t dev); 242void device_set_ivars(device_t dev, void *ivars); 243const char *device_get_name(device_t dev); 244const char *device_get_nameunit(device_t dev); 245void *device_get_softc(device_t dev); 246device_state_t device_get_state(device_t dev); 247int device_get_unit(device_t dev); 248int device_is_alive(device_t dev); /* did probe succeed? */ 249int device_is_enabled(device_t dev); 250int device_is_quiet(device_t dev); 251int device_print_prettyname(device_t dev); 252int device_printf(device_t dev, const char *, ...) __printflike(2, 3); 253int device_probe_and_attach(device_t dev); 254void device_quiet(device_t dev); 255void device_set_desc(device_t dev, const char* desc); 256void device_set_desc_copy(device_t dev, const char* desc); 257int device_set_devclass(device_t dev, const char *classname); 258int device_set_driver(device_t dev, driver_t *driver); 259void device_set_flags(device_t dev, u_int32_t flags); 260int device_set_unit(device_t dev, int unit); /* XXX DONT USE XXX */ 261int device_shutdown(device_t dev); 262void device_unbusy(device_t dev); 263void device_verbose(device_t dev); 264 265/* 266 * Access functions for devclass. 267 */ 268int devclass_add_driver(devclass_t dc, driver_t *driver); 269int devclass_delete_driver(devclass_t dc, driver_t *driver); 270devclass_t devclass_create(const char *classname); 271devclass_t devclass_find(const char *classname); 272driver_t *devclass_find_driver(devclass_t dc, const char *classname); 273const char *devclass_get_name(devclass_t dc); 274device_t devclass_get_device(devclass_t dc, int unit); 275void *devclass_get_softc(devclass_t dc, int unit); 276int devclass_get_devices(devclass_t dc, device_t **listp, int *countp); 277int devclass_get_maxunit(devclass_t dc); 278 279/* 280 * Access functions for device resources. 281 */ 282 283int resource_int_value(const char *name, int unit, const char *resname, 284 int *result); 285int resource_long_value(const char *name, int unit, const char *resname, 286 long *result); 287int resource_string_value(const char *name, int unit, const char *resname, 288 char **result); 289int resource_query_string(int i, const char *resname, const char *value); 290char *resource_query_name(int i); 291int resource_query_unit(int i); 292int resource_locate(int i, const char *resname); 293int resource_set_int(const char *name, int unit, const char *resname, 294 int value); 295int resource_set_long(const char *name, int unit, const char *resname, 296 long value); 297int resource_set_string(const char *name, int unit, const char *resname, 298 const char *value); 299int resource_count(void); 300 301/* 302 * Shorthand for constructing method tables. 303 */
| 68 int refs; /* # devclasses containing driver */ 69}; 70 71typedef enum device_state { 72 DS_NOTPRESENT, /* not probed or probe failed */ 73 DS_ALIVE, /* probe succeeded */ 74 DS_ATTACHED, /* attach method called */ 75 DS_BUSY /* device is open */ 76} device_state_t; 77 78/* 79 * Definitions for drivers which need to keep simple lists of resources 80 * for their child devices. 81 */ 82struct resource; 83 84struct resource_list_entry { 85 SLIST_ENTRY(resource_list_entry) link; 86 int type; /* type argument to alloc_resource */ 87 int rid; /* resource identifier */ 88 struct resource *res; /* the real resource when allocated */ 89 u_long start; /* start of resource range */ 90 u_long end; /* end of resource range */ 91 u_long count; /* count within range */ 92}; 93SLIST_HEAD(resource_list, resource_list_entry); 94 95/* 96 * Initialise a resource list. 97 */ 98void resource_list_init(struct resource_list *rl); 99 100/* 101 * Reclaim memory used by a resource list. 102 */ 103void resource_list_free(struct resource_list *rl); 104 105/* 106 * Add a resource entry or modify an existing entry if one exists with 107 * the same type and rid. 108 */ 109void resource_list_add(struct resource_list *rl, 110 int type, int rid, 111 u_long start, u_long end, u_long count); 112 113/* 114 * Find a resource entry by type and rid. 115 */ 116struct resource_list_entry* 117 resource_list_find(struct resource_list *rl, 118 int type, int rid); 119 120/* 121 * Delete a resource entry. 122 */ 123void resource_list_delete(struct resource_list *rl, 124 int type, int rid); 125 126/* 127 * Implement BUS_ALLOC_RESOURCE by looking up a resource from the list 128 * and passing the allocation up to the parent of bus. This assumes 129 * that the first entry of device_get_ivars(child) is a struct 130 * resource_list. This also handles 'passthrough' allocations where a 131 * child is a remote descendant of bus by passing the allocation up to 132 * the parent of bus. 133 */ 134struct resource * 135 resource_list_alloc(struct resource_list *rl, 136 device_t bus, device_t child, 137 int type, int *rid, 138 u_long start, u_long end, 139 u_long count, u_int flags); 140 141/* 142 * Implement BUS_RELEASE_RESOURCE. 143 */ 144int resource_list_release(struct resource_list *rl, 145 device_t bus, device_t child, 146 int type, int rid, struct resource *res); 147 148/* 149 * The root bus, to which all top-level busses are attached. 150 */ 151extern device_t root_bus; 152extern devclass_t root_devclass; 153void root_bus_configure(void); 154 155/* 156 * Useful functions for implementing busses. 157 */ 158 159int bus_generic_activate_resource(device_t dev, device_t child, int type, 160 int rid, struct resource *r); 161struct resource *bus_generic_alloc_resource(device_t bus, device_t child, 162 int type, int *rid, 163 u_long start, u_long end, 164 u_long count, u_int flags); 165int bus_generic_attach(device_t dev); 166int bus_generic_deactivate_resource(device_t dev, device_t child, int type, 167 int rid, struct resource *r); 168int bus_generic_detach(device_t dev); 169void bus_generic_driver_added(device_t dev, driver_t *driver); 170int bus_print_child_header(device_t dev, device_t child); 171int bus_print_child_footer(device_t dev, device_t child); 172int bus_generic_print_child(device_t dev, device_t child); 173int bus_generic_probe(device_t dev); 174int bus_generic_read_ivar(device_t dev, device_t child, int which, 175 uintptr_t *result); 176int bus_generic_release_resource(device_t bus, device_t child, 177 int type, int rid, struct resource *r); 178int bus_generic_resume(device_t dev); 179int bus_generic_setup_intr(device_t dev, device_t child, 180 struct resource *irq, int flags, 181 driver_intr_t *intr, void *arg, void **cookiep); 182int bus_generic_shutdown(device_t dev); 183int bus_generic_suspend(device_t dev); 184int bus_generic_teardown_intr(device_t dev, device_t child, 185 struct resource *irq, void *cookie); 186int bus_generic_write_ivar(device_t dev, device_t child, int which, 187 uintptr_t value); 188 189/* 190 * Wrapper functions for the BUS_*_RESOURCE methods to make client code 191 * a little simpler. 192 */ 193struct resource *bus_alloc_resource(device_t dev, int type, int *rid, 194 u_long start, u_long end, u_long count, 195 u_int flags); 196int bus_activate_resource(device_t dev, int type, int rid, 197 struct resource *r); 198int bus_deactivate_resource(device_t dev, int type, int rid, 199 struct resource *r); 200int bus_release_resource(device_t dev, int type, int rid, 201 struct resource *r); 202int bus_setup_intr(device_t dev, struct resource *r, int flags, 203 driver_intr_t handler, void *arg, void **cookiep); 204int bus_teardown_intr(device_t dev, struct resource *r, void *cookie); 205int bus_set_resource(device_t dev, int type, int rid, 206 u_long start, u_long count); 207int bus_get_resource(device_t dev, int type, int rid, 208 u_long *startp, u_long *countp); 209u_long bus_get_resource_start(device_t dev, int type, int rid); 210u_long bus_get_resource_count(device_t dev, int type, int rid); 211void bus_delete_resource(device_t dev, int type, int rid); 212 213/* 214 * Access functions for device. 215 */ 216device_t device_add_child(device_t dev, const char *name, int unit); 217device_t device_add_child_ordered(device_t dev, int order, 218 const char *name, int unit); 219void device_busy(device_t dev); 220int device_delete_child(device_t dev, device_t child); 221int device_detach(device_t dev); 222void device_disable(device_t dev); 223void device_enable(device_t dev); 224device_t device_find_child(device_t dev, const char *classname, 225 int unit); 226const char *device_get_desc(device_t dev); 227devclass_t device_get_devclass(device_t dev); 228driver_t *device_get_driver(device_t dev); 229u_int32_t device_get_flags(device_t dev); 230device_t device_get_parent(device_t dev); 231int device_get_children(device_t dev, device_t **listp, int *countp); 232void *device_get_ivars(device_t dev); 233void device_set_ivars(device_t dev, void *ivars); 234const char *device_get_name(device_t dev); 235const char *device_get_nameunit(device_t dev); 236void *device_get_softc(device_t dev); 237device_state_t device_get_state(device_t dev); 238int device_get_unit(device_t dev); 239int device_is_alive(device_t dev); /* did probe succeed? */ 240int device_is_enabled(device_t dev); 241int device_is_quiet(device_t dev); 242int device_print_prettyname(device_t dev); 243int device_printf(device_t dev, const char *, ...) __printflike(2, 3); 244int device_probe_and_attach(device_t dev); 245void device_quiet(device_t dev); 246void device_set_desc(device_t dev, const char* desc); 247void device_set_desc_copy(device_t dev, const char* desc); 248int device_set_devclass(device_t dev, const char *classname); 249int device_set_driver(device_t dev, driver_t *driver); 250void device_set_flags(device_t dev, u_int32_t flags); 251int device_set_unit(device_t dev, int unit); /* XXX DONT USE XXX */ 252int device_shutdown(device_t dev); 253void device_unbusy(device_t dev); 254void device_verbose(device_t dev); 255 256/* 257 * Access functions for devclass. 258 */ 259int devclass_add_driver(devclass_t dc, driver_t *driver); 260int devclass_delete_driver(devclass_t dc, driver_t *driver); 261devclass_t devclass_create(const char *classname); 262devclass_t devclass_find(const char *classname); 263driver_t *devclass_find_driver(devclass_t dc, const char *classname); 264const char *devclass_get_name(devclass_t dc); 265device_t devclass_get_device(devclass_t dc, int unit); 266void *devclass_get_softc(devclass_t dc, int unit); 267int devclass_get_devices(devclass_t dc, device_t **listp, int *countp); 268int devclass_get_maxunit(devclass_t dc); 269 270/* 271 * Access functions for device resources. 272 */ 273 274int resource_int_value(const char *name, int unit, const char *resname, 275 int *result); 276int resource_long_value(const char *name, int unit, const char *resname, 277 long *result); 278int resource_string_value(const char *name, int unit, const char *resname, 279 char **result); 280int resource_query_string(int i, const char *resname, const char *value); 281char *resource_query_name(int i); 282int resource_query_unit(int i); 283int resource_locate(int i, const char *resname); 284int resource_set_int(const char *name, int unit, const char *resname, 285 int value); 286int resource_set_long(const char *name, int unit, const char *resname, 287 long value); 288int resource_set_string(const char *name, int unit, const char *resname, 289 const char *value); 290int resource_count(void); 291 292/* 293 * Shorthand for constructing method tables. 294 */
|
305 306/* 307 * Some common device interfaces. 308 */ 309#include "device_if.h" 310#include "bus_if.h" 311 312struct module; 313 314int driver_module_handler(struct module *, int, void *); 315 316/* 317 * Module support for automatically adding drivers to busses. 318 */ 319struct driver_module_data { 320 int (*dmd_chainevh)(struct module *, int, void *); 321 void *dmd_chainarg; 322 const char *dmd_busname; 323 driver_t **dmd_drivers; 324 int dmd_ndrivers; 325 devclass_t *dmd_devclass; 326}; 327 328#define DRIVER_MODULE(name, busname, driver, devclass, evh, arg) \ 329 \ 330static driver_t *name##_##busname##_driver_list[] = { &driver }; \ 331static struct driver_module_data name##_##busname##_driver_mod = { \ 332 evh, arg, \ 333 #busname, \ 334 name##_##busname##_driver_list, \ 335 (sizeof name##_##busname##_driver_list) / \ 336 (sizeof name##_##busname##_driver_list[0]), \ 337 &devclass \ 338}; \ 339 \ 340static moduledata_t name##_##busname##_mod = { \ 341 #busname "/" #name, \ 342 driver_module_handler, \ 343 &name##_##busname##_driver_mod \ 344}; \ 345DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \ 346 SI_SUB_DRIVERS, SI_ORDER_MIDDLE) 347 348#define MULTI_DRIVER_MODULE(name, busname, drivers, devclass, evh, arg) \ 349 \ 350static driver_t name##_##busname##_driver_list[] = drivers; \ 351static struct driver_module_data name##_##busname##_driver_mod = { \ 352 evh, arg, \ 353 #busname, \ 354 name##_##busname##_driver_list, \ 355 (sizeof name##_##busname##_driver_list) / \ 356 (sizeof name##_##busname##_driver_list[0]), \ 357 &devclass \ 358}; \ 359 \ 360static moduledata_t name##_##busname##_mod = { \ 361 #busname "/" #name, \ 362 driver_module_handler, \ 363 &name##_##busname##_driver_mod \ 364}; \ 365DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \ 366 SI_SUB_DRIVERS, SI_ORDER_MIDDLE) 367 368#endif /* _KERNEL */ 369 370#endif /* !_SYS_BUS_H_ */
| 296 297/* 298 * Some common device interfaces. 299 */ 300#include "device_if.h" 301#include "bus_if.h" 302 303struct module; 304 305int driver_module_handler(struct module *, int, void *); 306 307/* 308 * Module support for automatically adding drivers to busses. 309 */ 310struct driver_module_data { 311 int (*dmd_chainevh)(struct module *, int, void *); 312 void *dmd_chainarg; 313 const char *dmd_busname; 314 driver_t **dmd_drivers; 315 int dmd_ndrivers; 316 devclass_t *dmd_devclass; 317}; 318 319#define DRIVER_MODULE(name, busname, driver, devclass, evh, arg) \ 320 \ 321static driver_t *name##_##busname##_driver_list[] = { &driver }; \ 322static struct driver_module_data name##_##busname##_driver_mod = { \ 323 evh, arg, \ 324 #busname, \ 325 name##_##busname##_driver_list, \ 326 (sizeof name##_##busname##_driver_list) / \ 327 (sizeof name##_##busname##_driver_list[0]), \ 328 &devclass \ 329}; \ 330 \ 331static moduledata_t name##_##busname##_mod = { \ 332 #busname "/" #name, \ 333 driver_module_handler, \ 334 &name##_##busname##_driver_mod \ 335}; \ 336DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \ 337 SI_SUB_DRIVERS, SI_ORDER_MIDDLE) 338 339#define MULTI_DRIVER_MODULE(name, busname, drivers, devclass, evh, arg) \ 340 \ 341static driver_t name##_##busname##_driver_list[] = drivers; \ 342static struct driver_module_data name##_##busname##_driver_mod = { \ 343 evh, arg, \ 344 #busname, \ 345 name##_##busname##_driver_list, \ 346 (sizeof name##_##busname##_driver_list) / \ 347 (sizeof name##_##busname##_driver_list[0]), \ 348 &devclass \ 349}; \ 350 \ 351static moduledata_t name##_##busname##_mod = { \ 352 #busname "/" #name, \ 353 driver_module_handler, \ 354 &name##_##busname##_driver_mod \ 355}; \ 356DECLARE_MODULE(name##_##busname, name##_##busname##_mod, \ 357 SI_SUB_DRIVERS, SI_ORDER_MIDDLE) 358 359#endif /* _KERNEL */ 360 361#endif /* !_SYS_BUS_H_ */
|