1#- 2# Copyright (c) 1998-2004 Doug Rabson 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24# SUCH DAMAGE. 25# 26# 27 28#include <sys/types.h> 29#include <sys/systm.h> 30#include <sys/bus.h> 31 32/** 33 * @defgroup BUS bus - KObj methods for drivers of devices with children 34 * @brief A set of methods required device drivers that support 35 * child devices. 36 * @{ 37 */ 38INTERFACE bus; 39 40# 41# Default implementations of some methods. 42# 43CODE { 44 static struct resource * 45 null_alloc_resource(device_t dev, device_t child, 46 int type, int *rid, rman_res_t start, rman_res_t end, 47 rman_res_t count, u_int flags) 48 { 49 return (0); 50 } 51 52 static int 53 null_remap_intr(device_t bus, device_t dev, u_int irq) 54 { 55 56 if (dev != NULL) 57 return (BUS_REMAP_INTR(dev, NULL, irq)); 58 return (ENXIO); 59 } 60 61 static device_t 62 null_add_child(device_t bus, int order, const char *name, 63 int unit) 64 { 65 66 panic("bus_add_child is not implemented"); 67 } 68 69 static int 70 null_reset_post(device_t bus, device_t dev) 71 { 72 return (0); 73 } 74 75 static int 76 null_reset_prepare(device_t bus, device_t dev) 77 { 78 return (0); 79 } 80 81 static struct rman * 82 null_get_rman(device_t bus, int type, u_int flags) 83 { 84 return (NULL); 85 } 86}; 87 88/** 89 * @brief Print a description of a child device 90 * 91 * This is called from system code which prints out a description of a 92 * device. It should describe the attachment that the child has with 93 * the parent. For instance the TurboLaser bus prints which node the 94 * device is attached to. See bus_generic_print_child() for more 95 * information. 96 * 97 * @param _dev the device whose child is being printed 98 * @param _child the child device to describe 99 * 100 * @returns the number of characters output. 101 */ 102METHOD int print_child { 103 device_t _dev; 104 device_t _child; 105} DEFAULT bus_generic_print_child; 106 107/** 108 * @brief Print a notification about an unprobed child device. 109 * 110 * Called for each child device that did not succeed in probing for a 111 * driver. 112 * 113 * @param _dev the device whose child was being probed 114 * @param _child the child device which failed to probe 115 */ 116METHOD void probe_nomatch { 117 device_t _dev; 118 device_t _child; 119}; 120 121/** 122 * @brief Read the value of a bus-specific attribute of a device 123 * 124 * This method, along with BUS_WRITE_IVAR() manages a bus-specific set 125 * of instance variables of a child device. The intention is that 126 * each different type of bus defines a set of appropriate instance 127 * variables (such as ports and irqs for ISA bus etc.) 128 * 129 * This information could be given to the child device as a struct but 130 * that makes it hard for a bus to add or remove variables without 131 * forcing an edit and recompile for all drivers which may not be 132 * possible for vendor supplied binary drivers. 133 * 134 * This method copies the value of an instance variable to the 135 * location specified by @p *_result. 136 * 137 * @param _dev the device whose child was being examined 138 * @param _child the child device whose instance variable is 139 * being read 140 * @param _index the instance variable to read 141 * @param _result a location to receive the instance variable 142 * value 143 * 144 * @retval 0 success 145 * @retval ENOENT no such instance variable is supported by @p 146 * _dev 147 */ 148METHOD int read_ivar { 149 device_t _dev; 150 device_t _child; 151 int _index; 152 uintptr_t *_result; 153}; 154 155/** 156 * @brief Write the value of a bus-specific attribute of a device 157 * 158 * This method sets the value of an instance variable to @p _value. 159 * 160 * @param _dev the device whose child was being updated 161 * @param _child the child device whose instance variable is 162 * being written 163 * @param _index the instance variable to write 164 * @param _value the value to write to that instance variable 165 * 166 * @retval 0 success 167 * @retval ENOENT no such instance variable is supported by @p 168 * _dev 169 * @retval EINVAL the instance variable was recognised but 170 * contains a read-only value 171 */ 172METHOD int write_ivar { 173 device_t _dev; 174 device_t _child; 175 int _indx; 176 uintptr_t _value; 177}; 178 179/** 180 * @brief Notify a bus that a child was deleted 181 * 182 * Called at the beginning of device_delete_child() to allow the parent 183 * to teardown any bus-specific state for the child. 184 * 185 * @param _dev the device whose child is being deleted 186 * @param _child the child device which is being deleted 187 */ 188METHOD void child_deleted { 189 device_t _dev; 190 device_t _child; 191}; 192 193/** 194 * @brief Notify a bus that a child was detached 195 * 196 * Called after the child's DEVICE_DETACH() method to allow the parent 197 * to reclaim any resources allocated on behalf of the child. 198 * 199 * @param _dev the device whose child changed state 200 * @param _child the child device which changed state 201 */ 202METHOD void child_detached { 203 device_t _dev; 204 device_t _child; 205}; 206 207/** 208 * @brief Notify a bus that a new driver was added 209 * 210 * Called when a new driver is added to the devclass which owns this 211 * bus. The generic implementation of this method attempts to probe and 212 * attach any un-matched children of the bus. 213 * 214 * @param _dev the device whose devclass had a new driver 215 * added to it 216 * @param _driver the new driver which was added 217 */ 218METHOD void driver_added { 219 device_t _dev; 220 driver_t *_driver; 221} DEFAULT bus_generic_driver_added; 222 223/** 224 * @brief Create a new child device 225 * 226 * For buses which use use drivers supporting DEVICE_IDENTIFY() to 227 * enumerate their devices, this method is used to create new 228 * device instances. The new device will be added after the last 229 * existing child with the same order. Implementations of bus_add_child 230 * call device_add_child_ordered to add the child and often add 231 * a suitable ivar to the device specific to that bus. 232 * 233 * @param _dev the bus device which will be the parent of the 234 * new child device 235 * @param _order a value which is used to partially sort the 236 * children of @p _dev - devices created using 237 * lower values of @p _order appear first in @p 238 * _dev's list of children 239 * @param _name devclass name for new device or @c NULL if not 240 * specified 241 * @param _unit unit number for new device or @c -1 if not 242 * specified 243 */ 244METHOD device_t add_child { 245 device_t _dev; 246 u_int _order; 247 const char *_name; 248 int _unit; 249} DEFAULT null_add_child; 250 251/** 252 * @brief Rescan the bus 253 * 254 * This method is called by a parent bridge or devctl to trigger a bus 255 * rescan. The rescan should delete devices no longer present and 256 * enumerate devices that have newly arrived. 257 * 258 * @param _dev the bus device 259 */ 260METHOD int rescan { 261 device_t _dev; 262} DEFAULT bus_null_rescan; 263 264/** 265 * @brief Allocate a system resource 266 * 267 * This method is called by child devices of a bus to allocate resources. 268 * The types are defined in <machine/resource.h>; the meaning of the 269 * resource-ID field varies from bus to bus (but @p *rid == 0 is always 270 * valid if the resource type is). If a resource was allocated and the 271 * caller did not use the RF_ACTIVE to specify that it should be 272 * activated immediately, the caller is responsible for calling 273 * BUS_ACTIVATE_RESOURCE() when it actually uses the resource. 274 * 275 * @param _dev the parent device of @p _child 276 * @param _child the device which is requesting an allocation 277 * @param _type the type of resource to allocate 278 * @param _rid a pointer to the resource identifier 279 * @param _start hint at the start of the resource range - pass 280 * @c 0 for any start address 281 * @param _end hint at the end of the resource range - pass 282 * @c ~0 for any end address 283 * @param _count hint at the size of range required - pass @c 1 284 * for any size 285 * @param _flags any extra flags to control the resource 286 * allocation - see @c RF_XXX flags in 287 * <sys/rman.h> for details 288 * 289 * @returns the resource which was allocated or @c NULL if no 290 * resource could be allocated 291 */ 292METHOD struct resource * alloc_resource { 293 device_t _dev; 294 device_t _child; 295 int _type; 296 int *_rid; 297 rman_res_t _start; 298 rman_res_t _end; 299 rman_res_t _count; 300 u_int _flags; 301} DEFAULT null_alloc_resource; 302 303/** 304 * @brief Activate a resource 305 * 306 * Activate a resource previously allocated with 307 * BUS_ALLOC_RESOURCE(). This may enable decoding of this resource in a 308 * device for instance. It will also establish a mapping for the resource 309 * unless RF_UNMAPPED was set when allocating the resource. 310 * 311 * @param _dev the parent device of @p _child 312 * @param _child the device which allocated the resource 313 * @param _type the type of resource 314 * @param _rid the resource identifier 315 * @param _r the resource to activate 316 */ 317METHOD int activate_resource { 318 device_t _dev; 319 device_t _child; 320 int _type; 321 int _rid; 322 struct resource *_r; 323}; 324 325 326/** 327 * @brief Map a resource 328 * 329 * Allocate a mapping for a range of an active resource. The mapping 330 * is described by a struct resource_map object. This may for instance 331 * map a memory region into the kernel's virtual address space. 332 * 333 * @param _dev the parent device of @p _child 334 * @param _child the device which allocated the resource 335 * @param _type the type of resource 336 * @param _r the resource to map 337 * @param _args optional attributes of the mapping 338 * @param _map the mapping 339 */ 340METHOD int map_resource { 341 device_t _dev; 342 device_t _child; 343 int _type; 344 struct resource *_r; 345 struct resource_map_request *_args; 346 struct resource_map *_map; 347} DEFAULT bus_generic_map_resource; 348 349 350/** 351 * @brief Unmap a resource 352 * 353 * Release a mapping previously allocated with 354 * BUS_MAP_RESOURCE(). This may for instance unmap a memory region 355 * from the kernel's virtual address space. 356 * 357 * @param _dev the parent device of @p _child 358 * @param _child the device which allocated the resource 359 * @param _type the type of resource 360 * @param _r the resource 361 * @param _map the mapping to release 362 */ 363METHOD int unmap_resource { 364 device_t _dev; 365 device_t _child; 366 int _type; 367 struct resource *_r; 368 struct resource_map *_map; 369} DEFAULT bus_generic_unmap_resource; 370 371 372/** 373 * @brief Deactivate a resource 374 * 375 * Deactivate a resource previously allocated with 376 * BUS_ALLOC_RESOURCE(). 377 * 378 * @param _dev the parent device of @p _child 379 * @param _child the device which allocated the resource 380 * @param _type the type of resource 381 * @param _rid the resource identifier 382 * @param _r the resource to deactivate 383 */ 384METHOD int deactivate_resource { 385 device_t _dev; 386 device_t _child; 387 int _type; 388 int _rid; 389 struct resource *_r; 390}; 391 392/** 393 * @brief Adjust a resource 394 * 395 * Adjust the start and/or end of a resource allocated by 396 * BUS_ALLOC_RESOURCE. At least part of the new address range must overlap 397 * with the existing address range. If the successful, the resource's range 398 * will be adjusted to [start, end] on return. 399 * 400 * @param _dev the parent device of @p _child 401 * @param _child the device which allocated the resource 402 * @param _res the resource to adjust 403 * @param _start the new starting address of the resource range 404 * @param _end the new ending address of the resource range 405 */ 406METHOD int adjust_resource { 407 device_t _dev; 408 device_t _child; 409 struct resource *_res; 410 rman_res_t _start; 411 rman_res_t _end; 412}; 413 414/** 415 * @brief translate a resource value 416 * 417 * Give a bus driver the opportunity to translate resource ranges. If 418 * successful, the host's view of the resource starting at @p _start is 419 * returned in @p _newstart, otherwise an error is returned. 420 * 421 * @param _dev the device associated with the resource 422 * @param _type the type of resource 423 * @param _start the starting address of the resource range 424 * @param _newstart the new starting address of the resource range 425 */ 426METHOD int translate_resource { 427 device_t _dev; 428 int _type; 429 rman_res_t _start; 430 rman_res_t *_newstart; 431} DEFAULT bus_generic_translate_resource; 432 433/** 434 * @brief Release a resource 435 * 436 * Free a resource allocated by the BUS_ALLOC_RESOURCE. The @p _rid 437 * value must be the same as the one returned by BUS_ALLOC_RESOURCE() 438 * (which is not necessarily the same as the one the client passed). 439 * 440 * @param _dev the parent device of @p _child 441 * @param _child the device which allocated the resource 442 * @param _type the type of resource 443 * @param _rid the resource identifier 444 * @param _r the resource to release 445 */ 446METHOD int release_resource { 447 device_t _dev; 448 device_t _child; 449 int _type; 450 int _rid; 451 struct resource *_res; 452}; 453 454/** 455 * @brief Install an interrupt handler 456 * 457 * This method is used to associate an interrupt handler function with 458 * an irq resource. When the interrupt triggers, the function @p _intr 459 * will be called with the value of @p _arg as its single 460 * argument. The value returned in @p *_cookiep is used to cancel the 461 * interrupt handler - the caller should save this value to use in a 462 * future call to BUS_TEARDOWN_INTR(). 463 * 464 * @param _dev the parent device of @p _child 465 * @param _child the device which allocated the resource 466 * @param _irq the resource representing the interrupt 467 * @param _flags a set of bits from enum intr_type specifying 468 * the class of interrupt 469 * @param _intr the function to call when the interrupt 470 * triggers 471 * @param _arg a value to use as the single argument in calls 472 * to @p _intr 473 * @param _cookiep a pointer to a location to receive a cookie 474 * value that may be used to remove the interrupt 475 * handler 476 */ 477METHOD int setup_intr { 478 device_t _dev; 479 device_t _child; 480 struct resource *_irq; 481 int _flags; 482 driver_filter_t *_filter; 483 driver_intr_t *_intr; 484 void *_arg; 485 void **_cookiep; 486}; 487 488/** 489 * @brief Uninstall an interrupt handler 490 * 491 * This method is used to disassociate an interrupt handler function 492 * with an irq resource. The value of @p _cookie must be the value 493 * returned from a previous call to BUS_SETUP_INTR(). 494 * 495 * @param _dev the parent device of @p _child 496 * @param _child the device which allocated the resource 497 * @param _irq the resource representing the interrupt 498 * @param _cookie the cookie value returned when the interrupt 499 * was originally registered 500 */ 501METHOD int teardown_intr { 502 device_t _dev; 503 device_t _child; 504 struct resource *_irq; 505 void *_cookie; 506}; 507 508/** 509 * @brief Suspend an interrupt handler 510 * 511 * This method is used to mark a handler as suspended in the case 512 * that the associated device is powered down and cannot be a source 513 * for the, typically shared, interrupt. 514 * The value of @p _irq must be the interrupt resource passed 515 * to a previous call to BUS_SETUP_INTR(). 516 * 517 * @param _dev the parent device of @p _child 518 * @param _child the device which allocated the resource 519 * @param _irq the resource representing the interrupt 520 */ 521METHOD int suspend_intr { 522 device_t _dev; 523 device_t _child; 524 struct resource *_irq; 525} DEFAULT bus_generic_suspend_intr; 526 527/** 528 * @brief Resume an interrupt handler 529 * 530 * This method is used to clear suspended state of a handler when 531 * the associated device is powered up and can be an interrupt source 532 * again. 533 * The value of @p _irq must be the interrupt resource passed 534 * to a previous call to BUS_SETUP_INTR(). 535 * 536 * @param _dev the parent device of @p _child 537 * @param _child the device which allocated the resource 538 * @param _irq the resource representing the interrupt 539 */ 540METHOD int resume_intr { 541 device_t _dev; 542 device_t _child; 543 struct resource *_irq; 544} DEFAULT bus_generic_resume_intr; 545 546/** 547 * @brief Define a resource which can be allocated with 548 * BUS_ALLOC_RESOURCE(). 549 * 550 * This method is used by some buses (typically ISA) to allow a 551 * driver to describe a resource range that it would like to 552 * allocate. The resource defined by @p _type and @p _rid is defined 553 * to start at @p _start and to include @p _count indices in its 554 * range. 555 * 556 * @param _dev the parent device of @p _child 557 * @param _child the device which owns the resource 558 * @param _type the type of resource 559 * @param _rid the resource identifier 560 * @param _start the start of the resource range 561 * @param _count the size of the resource range 562 */ 563METHOD int set_resource { 564 device_t _dev; 565 device_t _child; 566 int _type; 567 int _rid; 568 rman_res_t _start; 569 rman_res_t _count; 570}; 571 572/** 573 * @brief Describe a resource 574 * 575 * This method allows a driver to examine the range used for a given 576 * resource without actually allocating it. 577 * 578 * @param _dev the parent device of @p _child 579 * @param _child the device which owns the resource 580 * @param _type the type of resource 581 * @param _rid the resource identifier 582 * @param _start the address of a location to receive the start 583 * index of the resource range 584 * @param _count the address of a location to receive the size 585 * of the resource range 586 */ 587METHOD int get_resource { 588 device_t _dev; 589 device_t _child; 590 int _type; 591 int _rid; 592 rman_res_t *_startp; 593 rman_res_t *_countp; 594}; 595 596/** 597 * @brief Delete a resource. 598 * 599 * Use this to delete a resource (possibly one previously added with 600 * BUS_SET_RESOURCE()). 601 * 602 * @param _dev the parent device of @p _child 603 * @param _child the device which owns the resource 604 * @param _type the type of resource 605 * @param _rid the resource identifier 606 */ 607METHOD void delete_resource { 608 device_t _dev; 609 device_t _child; 610 int _type; 611 int _rid; 612}; 613 614/** 615 * @brief Return a struct resource_list. 616 * 617 * Used by drivers which use bus_generic_rl_alloc_resource() etc. to 618 * implement their resource handling. It should return the resource 619 * list of the given child device. 620 * 621 * @param _dev the parent device of @p _child 622 * @param _child the device which owns the resource list 623 */ 624METHOD struct resource_list * get_resource_list { 625 device_t _dev; 626 device_t _child; 627} DEFAULT bus_generic_get_resource_list; 628 629/** 630 * @brief Return a struct rman. 631 * 632 * Used by drivers which use bus_generic_rman_alloc_resource() etc. to 633 * implement their resource handling. It should return the resource 634 * manager used for the given resource type. 635 * 636 * @param _dev the bus device 637 * @param _type the resource type 638 * @param _flags resource flags (@c RF_XXX flags in 639 * <sys/rman.h>) 640 */ 641METHOD struct rman * get_rman { 642 device_t _dev; 643 int _type; 644 u_int _flags; 645} DEFAULT null_get_rman; 646 647/** 648 * @brief Is the hardware described by @p _child still attached to the 649 * system? 650 * 651 * This method should return 0 if the device is not present. It 652 * should return -1 if it is present. Any errors in determining 653 * should be returned as a normal errno value. Client drivers are to 654 * assume that the device is present, even if there is an error 655 * determining if it is there. Buses are to try to avoid returning 656 * errors, but newcard will return an error if the device fails to 657 * implement this method. 658 * 659 * @param _dev the parent device of @p _child 660 * @param _child the device which is being examined 661 */ 662METHOD int child_present { 663 device_t _dev; 664 device_t _child; 665} DEFAULT bus_generic_child_present; 666 667/** 668 * @brief Returns the pnp info for this device. 669 * 670 * Return it as a string, appended to @p _sb 671 * 672 * The string must be formatted as a space-separated list of 673 * name=value pairs. Names may only contain alphanumeric characters, 674 * underscores ('_') and hyphens ('-'). Values can contain any 675 * non-whitespace characters. Values containing whitespace can be 676 * quoted with double quotes ('"'). Double quotes and backslashes in 677 * quoted values can be escaped with backslashes ('\'). 678 * 679 * @param _dev the parent device of @p _child 680 * @param _child the device which is being examined 681 * @param _sb sbuf for results string 682 */ 683METHOD int child_pnpinfo { 684 device_t _dev; 685 device_t _child; 686 struct sbuf *_sb; 687} DEFAULT bus_generic_child_pnpinfo; 688 689/** 690 * @brief Returns the location for this device. 691 * 692 * Return it as a string, appended to @p _sb 693 * 694 * The string must be formatted as a space-separated list of 695 * name=value pairs. Names may only contain alphanumeric characters, 696 * underscores ('_') and hyphens ('-'). Values can contain any 697 * non-whitespace characters. Values containing whitespace can be 698 * quoted with double quotes ('"'). Double quotes and backslashes in 699 * quoted values can be escaped with backslashes ('\'). 700 * 701 * @param _dev the parent device of @p _child 702 * @param _child the device which is being examined 703 * @param _sb sbuf for results string 704 */ 705METHOD int child_location { 706 device_t _dev; 707 device_t _child; 708 struct sbuf *_sb; 709} DEFAULT bus_generic_child_location; 710 711/** 712 * @brief Allow drivers to request that an interrupt be bound to a specific 713 * CPU. 714 * 715 * @param _dev the parent device of @p _child 716 * @param _child the device which allocated the resource 717 * @param _irq the resource representing the interrupt 718 * @param _cpu the CPU to bind the interrupt to 719 */ 720METHOD int bind_intr { 721 device_t _dev; 722 device_t _child; 723 struct resource *_irq; 724 int _cpu; 725} DEFAULT bus_generic_bind_intr; 726 727/** 728 * @brief Allow (bus) drivers to specify the trigger mode and polarity 729 * of the specified interrupt. 730 * 731 * @param _dev the bus device 732 * @param _irq the interrupt number to modify 733 * @param _trig the trigger mode required 734 * @param _pol the interrupt polarity required 735 */ 736METHOD int config_intr { 737 device_t _dev; 738 int _irq; 739 enum intr_trigger _trig; 740 enum intr_polarity _pol; 741} DEFAULT bus_generic_config_intr; 742 743/** 744 * @brief Allow drivers to associate a description with an active 745 * interrupt handler. 746 * 747 * @param _dev the parent device of @p _child 748 * @param _child the device which allocated the resource 749 * @param _irq the resource representing the interrupt 750 * @param _cookie the cookie value returned when the interrupt 751 * was originally registered 752 * @param _descr the description to associate with the interrupt 753 */ 754METHOD int describe_intr { 755 device_t _dev; 756 device_t _child; 757 struct resource *_irq; 758 void *_cookie; 759 const char *_descr; 760} DEFAULT bus_generic_describe_intr; 761 762/** 763 * @brief Notify a (bus) driver about a child that the hints mechanism 764 * believes it has discovered. 765 * 766 * The bus is responsible for then adding the child in the right order 767 * and discovering other things about the child. The bus driver is 768 * free to ignore this hint, to do special things, etc. It is all up 769 * to the bus driver to interpret. 770 * 771 * This method is only called in response to the parent bus asking for 772 * hinted devices to be enumerated. 773 * 774 * @param _dev the bus device 775 * @param _dname the name of the device w/o unit numbers 776 * @param _dunit the unit number of the device 777 */ 778METHOD void hinted_child { 779 device_t _dev; 780 const char *_dname; 781 int _dunit; 782}; 783 784/** 785 * @brief Returns bus_dma_tag_t for use w/ devices on the bus. 786 * 787 * @param _dev the parent device of @p _child 788 * @param _child the device to which the tag will belong 789 */ 790METHOD bus_dma_tag_t get_dma_tag { 791 device_t _dev; 792 device_t _child; 793} DEFAULT bus_generic_get_dma_tag; 794 795/** 796 * @brief Returns bus_space_tag_t for use w/ devices on the bus. 797 * 798 * @param _dev the parent device of @p _child 799 * @param _child the device to which the tag will belong 800 */ 801METHOD bus_space_tag_t get_bus_tag { 802 device_t _dev; 803 device_t _child; 804} DEFAULT bus_generic_get_bus_tag; 805 806/** 807 * @brief Allow the bus to determine the unit number of a device. 808 * 809 * @param _dev the parent device of @p _child 810 * @param _child the device whose unit is to be wired 811 * @param _name the name of the device's new devclass 812 * @param _unitp a pointer to the device's new unit value 813 */ 814METHOD void hint_device_unit { 815 device_t _dev; 816 device_t _child; 817 const char *_name; 818 int *_unitp; 819}; 820 821/** 822 * @brief Notify a bus that the bus pass level has been changed 823 * 824 * @param _dev the bus device 825 */ 826METHOD void new_pass { 827 device_t _dev; 828} DEFAULT bus_generic_new_pass; 829 830/** 831 * @brief Notify a bus that specified child's IRQ should be remapped. 832 * 833 * @param _dev the bus device 834 * @param _child the child device 835 * @param _irq the irq number 836 */ 837METHOD int remap_intr { 838 device_t _dev; 839 device_t _child; 840 u_int _irq; 841} DEFAULT null_remap_intr; 842 843/** 844 * @brief Suspend a given child 845 * 846 * @param _dev the parent device of @p _child 847 * @param _child the device to suspend 848 */ 849METHOD int suspend_child { 850 device_t _dev; 851 device_t _child; 852} DEFAULT bus_generic_suspend_child; 853 854/** 855 * @brief Resume a given child 856 * 857 * @param _dev the parent device of @p _child 858 * @param _child the device to resume 859 */ 860METHOD int resume_child { 861 device_t _dev; 862 device_t _child; 863} DEFAULT bus_generic_resume_child; 864 865/** 866 * @brief Get the VM domain handle for the given bus and child. 867 * 868 * @param _dev the bus device 869 * @param _child the child device 870 * @param _domain a pointer to the bus's domain handle identifier 871 */ 872METHOD int get_domain { 873 device_t _dev; 874 device_t _child; 875 int *_domain; 876} DEFAULT bus_generic_get_domain; 877 878/** 879 * @brief Request a set of CPUs 880 * 881 * @param _dev the bus device 882 * @param _child the child device 883 * @param _op type of CPUs to request 884 * @param _setsize the size of the set passed in _cpuset 885 * @param _cpuset a pointer to a cpuset to receive the requested 886 * set of CPUs 887 */ 888METHOD int get_cpus { 889 device_t _dev; 890 device_t _child; 891 enum cpu_sets _op; 892 size_t _setsize; 893 struct _cpuset *_cpuset; 894} DEFAULT bus_generic_get_cpus; 895 896/** 897 * @brief Prepares the given child of the bus for reset 898 * 899 * Typically bus detaches or suspends children' drivers, and then 900 * calls this method to save bus-specific information, for instance, 901 * PCI config space, which is damaged by reset. 902 * 903 * The bus_helper_reset_prepare() helper is provided to ease 904 * implementing bus reset methods. 905 * 906 * @param _dev the bus device 907 * @param _child the child device 908 */ 909METHOD int reset_prepare { 910 device_t _dev; 911 device_t _child; 912} DEFAULT null_reset_prepare; 913 914/** 915 * @brief Restores the child operations after the reset 916 * 917 * The bus_helper_reset_post() helper is provided to ease 918 * implementing bus reset methods. 919 * 920 * @param _dev the bus device 921 * @param _child the child device 922 */ 923METHOD int reset_post { 924 device_t _dev; 925 device_t _child; 926} DEFAULT null_reset_post; 927 928/** 929 * @brief Performs reset of the child 930 * 931 * @param _dev the bus device 932 * @param _child the child device 933 * @param _flags DEVF_RESET_ flags 934 */ 935METHOD int reset_child { 936 device_t _dev; 937 device_t _child; 938 int _flags; 939}; 940 941/** 942 * @brief Gets child's specific property 943 * 944 * The bus_get_property can be used to access device 945 * specific properties stored on the bus. If _propvalue 946 * is NULL or _size is 0, then method only returns size 947 * of the property. 948 * 949 * @param _dev the bus device 950 * @param _child the child device 951 * @param _propname property name 952 * @param _propvalue property value destination 953 * @param _size property value size 954 * 955 * @returns size of property if successful otherwise -1 956 */ 957METHOD ssize_t get_property { 958 device_t _dev; 959 device_t _child; 960 const char *_propname; 961 void *_propvalue; 962 size_t _size; 963 device_property_type_t type; 964} DEFAULT bus_generic_get_property; 965 966/** 967 * @brief Gets a child's full path to the device 968 * 969 * The get_device_path method retrieves a device's 970 * full path to the device using one of several 971 * locators present in the system. 972 * 973 * @param _bus the bus device 974 * @param _child the child device 975 * @param _locator locator name 976 * @param _sb buffer loaction string 977 */ 978METHOD int get_device_path { 979 device_t _bus; 980 device_t _child; 981 const char *_locator; 982 struct sbuf *_sb; 983} DEFAULT bus_generic_get_device_path; 984