2 .\" Copyright (c) 2005 Bruce M Simpson <bms@FreeBSD.org>
3 .\" All rights reserved.
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
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.
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
35 .Nm pci_disable_busmaster ,
37 .Nm pci_enable_busmaster ,
45 .Nm pci_find_pcie_root_port ,
46 .Nm pci_get_max_read_req ,
47 .Nm pci_get_powerstate ,
48 .Nm pci_get_vpd_ident ,
49 .Nm pci_get_vpd_readonly ,
54 .Nm pci_msix_pba_bar ,
55 .Nm pci_msix_table_bar ,
56 .Nm pci_pending_msix ,
60 .Nm pci_restore_state ,
62 .Nm pci_set_max_read_req ,
63 .Nm pci_set_powerstate ,
64 .Nm pci_write_config ,
65 .Nm pcie_adjust_config ,
66 .Nm pcie_read_config ,
74 .Fn pci_alloc_msi "device_t dev" "int *count"
76 .Fn pci_alloc_msix "device_t dev" "int *count"
78 .Fn pci_disable_busmaster "device_t dev"
80 .Fn pci_disable_io "device_t dev" "int space"
82 .Fn pci_enable_busmaster "device_t dev"
84 .Fn pci_enable_io "device_t dev" "int space"
86 .Fn pci_find_bsf "uint8_t bus" "uint8_t slot" "uint8_t func"
88 .Fn pci_find_cap "device_t dev" "int capability" "int *capreg"
90 .Fn pci_find_dbsf "uint32_t domain" "uint8_t bus" "uint8_t slot" "uint8_t func"
92 .Fn pci_find_device "uint16_t vendor" "uint16_t device"
94 .Fn pci_find_extcap "device_t dev" "int capability" "int *capreg"
96 .Fn pci_find_htcap "device_t dev" "int capability" "int *capreg"
98 .Fn pci_find_pcie_root_port "device_t dev"
100 .Fn pci_get_max_read_req "device_t dev"
102 .Fn pci_get_powerstate "device_t dev"
104 .Fn pci_get_vpd_ident "device_t dev" "const char **identptr"
106 .Fn pci_get_vpd_readonly "device_t dev" "const char *kw" "const char **vptr"
108 .Fn pci_msi_count "device_t dev"
110 .Fn pci_msix_count "device_t dev"
112 .Fn pci_msix_pba_bar "device_t dev"
114 .Fn pci_msix_table_bar "device_t dev"
116 .Fn pci_pending_msix "device_t dev" "u_int index"
118 .Fn pci_read_config "device_t dev" "int reg" "int width"
120 .Fn pci_release_msi "device_t dev"
122 .Fn pci_remap_msix "device_t dev" "int count" "const u_int *vectors"
124 .Fn pci_restore_state "device_t dev"
126 .Fn pci_save_state "device_t dev"
128 .Fn pci_set_max_read_req "device_t dev" "int size"
130 .Fn pci_set_powerstate "device_t dev" "int state"
132 .Fn pci_write_config "device_t dev" "int reg" "uint32_t val" "int width"
134 .Fo pcie_adjust_config
142 .Fn pcie_read_config "device_t dev" "int reg" "int width"
144 .Fn pcie_write_config "device_t dev" "int reg" "uint32_t val" "int width"
145 .In dev/pci/pci_iov.h
147 .Fn pci_iov_attach "device_t dev" "nvlist_t *pf_schema" "nvlist_t *vf_schema"
149 .Fn pci_iov_detach "device_t dev"
153 set of functions are used for managing PCI devices.
154 The functions are split into several groups:
155 raw configuration access,
158 device configuration,
160 message signaled interrupts.
161 .Ss Raw Configuration Access
164 function is used to read data from the PCI configuration
171 specifying the size of the access.
175 function is used to write the value
177 to the PCI configuration
184 specifying the size of the access.
187 .Fn pcie_adjust_config
188 function is used to modify the value of a register in the PCI-express
189 capability register set of device
193 specifies a relative offset in the register set with
195 specifying the size of the access.
196 The new value of the register is computed by modifying bits set in
200 Any bits not specified in
203 The previous value of the register is returned.
207 function is used to read the value of a register in the PCI-express
208 capability register set of device
212 specifies a relative offset in the register set with
214 specifying the size of the access.
217 .Fn pcie_write_config
218 function is used to write the value
220 to a register in the PCI-express capability register set of device
224 specifies a relative offset in the register set with
226 specifying the size of the access.
229 Device drivers should only use these functions for functionality that
230 is not available via another
236 function looks up the
238 of a PCI device, given its
245 number actually refers to the number of the device on the bus,
246 which does not necessarily indicate its geographic location
247 in terms of a physical slot.
248 Note that in case the system has multiple PCI domains,
251 function only searches the first one.
252 Actually, it is equivalent to:
253 .Bd -literal -offset indent
254 pci_find_dbsf(0, bus, slot, func);
259 function looks up the
261 of a PCI device, given its
269 number actually refers to the number of the device on the bus,
270 which does not necessarily indicate its geographic location
271 in terms of a physical slot.
275 function looks up the
277 of a PCI device, given its
282 Note that there can be multiple matches for this search; this function
283 only returns the first matching device.
284 .Ss Device Information
287 function is used to locate the first instance of a PCI capability
288 register set for the device
290 The capability to locate is specified by ID via
292 Constant macros of the form
294 for standard capability IDs are defined in
295 .In dev/pci/pcireg.h .
296 If the capability is found, then
298 is set to the offset in configuration space of the capability register set,
302 If the capability is not found or the device does not support capabilities,
308 function is used to locate the first instance of a PCI-express
309 extended capability register set for the device
311 The extended capability to locate is specified by ID via
313 Constant macros of the form
315 for standard extended capability IDs are defined in
316 .In dev/pci/pcireg.h .
317 If the extended capability is found, then
319 is set to the offset in configuration space of the extended capability
323 If the extended capability is not found or the device is not a
330 function is used to locate the first instance of a HyperTransport capability
331 register set for the device
333 The capability to locate is specified by type via
335 Constant macros of the form
337 for standard HyperTransport capability types are defined in
338 .In dev/pci/pcireg.h .
339 If the capability is found, then
341 is set to the offset in configuration space of the capability register set,
345 If the capability is not found or the device is not a HyperTransport device,
350 .Fn pci_find_pcie_root_port
351 function walks up the PCI device hierarchy to locate the PCI-express root
354 If a root port is not found,
355 .Fn pci_find_pcie_root_port
360 .Fn pci_get_vpd_ident
361 function is used to fetch a device's Vital Product Data
366 supports VPD and provides an identifier string,
369 is set to point at a read-only, null-terminated copy of the identifier
372 .Fn pci_get_vpd_ident
374 If the device does not support VPD or does not provide an identifier
377 .Fn pci_get_vpd_ident
381 .Fn pci_get_vpd_readonly
382 function is used to fetch the value of a single VPD read-only keyword
385 The keyword to fetch is identified by the two character string
387 If the device supports VPD and provides a read-only value for the
391 is set to point at a read-only, null-terminated copy of the value,
393 .Fn pci_get_vpd_readonly
395 If the device does not support VPD or does not provide the requested
398 .Fn pci_get_vpd_readonly
400 .Ss Device Configuration
402 .Fn pci_enable_busmaster
403 function enables PCI bus mastering for the device
406 .Dv PCIM_CMD_BUSMASTEREN
411 .Fn pci_disable_busmaster
412 function clears this bit.
416 function enables memory or I/O port address decoding for the device
424 register appropriately.
427 function clears the appropriate bit.
430 argument specifies which resource is affected; this can be either
435 Device drivers should generally not use these routines directly.
436 The PCI bus will enable decoding automatically when a
440 resource is activated via
441 .Xr bus_alloc_resource 9
443 .Xr bus_activate_resource 9 .
446 .Fn pci_get_max_read_req
447 function returns the current maximum read request size in bytes for a
451 device is not a PCI-express device,
452 .Fn pci_get_max_read_req
456 .Fn pci_set_max_read_req
457 sets the PCI-express maximum read request size for
463 .Fn pci_set_max_read_req
464 returns the actual size set in bytes.
467 device is not a PCI-express device,
468 .Fn pci_set_max_read_req
472 .Fn pci_get_powerstate
473 function returns the current power state of the device
475 If the device does not support power management capabilities, then the default
477 .Dv PCI_POWERSTATE_D0
479 The following power states are defined by PCI:
480 .Bl -hang -width ".Dv PCI_POWERSTATE_UNKNOWN"
481 .It Dv PCI_POWERSTATE_D0
482 State in which device is on and running.
483 It is receiving full power from the system and delivering
484 full functionality to the user.
485 .It Dv PCI_POWERSTATE_D1
486 Class-specific low-power state in which device context may or
488 Busses in this state cannot do anything to the bus, to
489 force devices to lose context.
490 .It Dv PCI_POWERSTATE_D2
491 Class-specific low-power state in which device context may or
493 Attains greater power savings than
494 .Dv PCI_POWERSTATE_D1 .
495 Busses in this state can cause devices to lose some context.
498 be prepared for the bus to be in this state or higher.
499 .It Dv PCI_POWERSTATE_D3
500 State in which the device is off and not running.
501 Device context is lost, and power from the device can
503 .It Dv PCI_POWERSTATE_UNKNOWN
504 State of the device is unknown.
508 .Fn pci_set_powerstate
509 function is used to transition the device
511 to the PCI power state
513 If the device does not support power management capabilities or
514 it does not support the specific power state
516 then the function will fail with
521 function is used to advertise that the given device
522 .Pq and associated device driver
523 supports PCI Single-Root I/O Virtualization
525 A driver that supports SR-IOV must implement the
531 This function should be called during the
534 If this function returns an error, it is recommended that the device driver
535 still successfully attaches, but runs with SR-IOV disabled.
540 parameters are used to define what device-specific configuration parameters the
541 device driver accepts when SR-IOV is enabled for the Physical Function
543 and for individual Virtual Functions
548 for details on how to construct the schema.
553 is invalid or specifies parameter names that conflict with parameter names that
556 will return an error and SR-IOV will not be available on the PF device.
557 If a driver does not accept configuration parameters for either the PF device
558 or the VF devices, the driver must pass an empty schema for that device.
559 The SR-IOV infrastructure takes ownership of the
563 and is responsible for freeing them.
564 The driver must never free the schemas itself.
568 function is used to advise the SR-IOV infrastructure that the driver for the
569 given device is attempting to detach and that all SR-IOV resources for the
570 device must be released.
571 This function must be called during the
575 was successfully called on the device and
577 has not subsequently been called on the device and returned no error.
578 If this function returns an error, the
580 method must fail and return an error, as detaching the PF driver while VF
581 devices are active would cause system instability.
582 This function is safe to call and will always succeed if
584 previously failed with an error on the given device, or if
586 was never called on the device.
591 .Fn pci_restore_state
592 functions can be used by a device driver to save and restore standard PCI
596 function must be invoked while the device has valid state before
597 .Fn pci_restore_state
599 If the device is not in the fully-powered state
600 .Pq Dv PCI_POWERSTATE_D0
602 .Fn pci_restore_state
604 then the device will be transitioned to
605 .Dv PCI_POWERSTATE_D0
606 before any config registers are restored.
607 .Ss Message Signaled Interrupts
608 Message Signaled Interrupts
611 Enhanced Message Signaled Interrupts
613 are PCI capabilities that provide an alternate method for PCI
614 devices to signal interrupts.
615 The legacy INTx interrupt is available to PCI devices as a
617 resource with a resource ID of zero.
618 MSI and MSI-X interrupts are available to PCI devices as one or more
620 resources with resource IDs greater than zero.
621 A driver must ask the PCI bus to allocate MSI or MSI-X interrupts
626 before it can use MSI or MSI-X
629 A driver is not allowed to use the legacy INTx
631 resource if MSI or MSI-X interrupts have been allocated,
632 and attempts to allocate MSI or MSI-X interrupts will fail if the
633 driver is currently using the legacy INTx
636 A driver is only allowed to use either MSI or MSI-X,
641 function returns the maximum number of MSI messages supported by the
644 If the device does not support MSI,
651 function attempts to allocate
653 MSI messages for the device
657 function may allocate fewer messages than requested for various
658 reasons including requests for more messages than the device
661 or if the system has a shortage of available MSI messages.
664 is set to the number of messages allocated and
669 resources for the allocated messages will be available at consecutive
670 resource IDs beginning with one.
673 is not able to allocate any messages,
675 Note that MSI only supports message counts that are powers of two;
676 requests to allocate a non-power of two count of messages will fail.
680 function is used to release any allocated MSI or MSI-X messages back
684 resources are allocated by the driver or have a configured interrupt
686 this function will fail with
690 function returns zero on success and an error on failure.
694 function returns the maximum number of MSI-X messages supported by the
697 If the device does not support MSI-X,
704 function returns the offset in configuration space of the Base Address Register
706 containing the MSI-X Pending Bit Array (PBA) for device
708 The returned value can be used as the resource ID with
709 .Xr bus_alloc_resource 9
711 .Xr bus_release_resource 9
713 If the device does not support MSI-X,
719 .Fn pci_msix_table_bar
720 function returns the offset in configuration space of the BAR
721 containing the MSI-X vector table for device
723 The returned value can be used as the resource ID with
724 .Xr bus_alloc_resource 9
726 .Xr bus_release_resource 9
728 If the device does not support MSI-X,
730 .Fn pci_msix_table_bar
735 function attempts to allocate
737 MSI-X messages for the device
741 function may allocate fewer messages than requested for various
742 reasons including requests for more messages than the device
745 or if the system has a shortage of available MSI-X messages.
748 is set to the number of messages allocated and
752 the resource ID for each
754 resource identifies the index in the MSI-X table of the
755 corresponding message.
756 A resource ID of one maps to the first index of the MSI-X table;
757 a resource ID two identifies the second index in the table, etc.
762 messages allocated to the first
767 is not able to allocate any messages,
770 MSI-X does not require message counts that are powers of two.
772 The BARs containing the MSI-X vector table and PBA must be
774 .Xr bus_alloc_resource 9
777 and must not be released until after calling
778 .Fn pci_release_msi .
779 Note that the vector table and PBA may be stored in the same BAR or in
784 function examines the
787 to determine the pending status of the MSI-X message at table index
789 If the indicated message is pending,
790 this function returns a non-zero value;
795 to this function will result in undefined behavior.
797 As mentioned in the description of
799 MSI-X messages are initially assigned to the first N table entries.
800 A driver may use a different distribution of available messages to
801 table entries via the
804 Note that this function must be called after a successful call to
806 but before any of the
808 resources are allocated.
811 function returns zero on success,
812 or an error on failure.
819 The array maps directly to the MSI-X table in that the first entry in
820 the array specifies the message used for the first entry in the MSI-X
822 the second entry in the array corresponds to the second entry in the
825 The vector value in each array index can either be zero to indicate
826 that no message should be assigned to the corresponding MSI-X table entry,
827 or it can be a number from one to N
829 where N is the count returned from the previous call to
832 to indicate which of the allocated messages should be assigned to the
833 corresponding MSI-X table entry.
838 each MSI-X table entry with a non-zero vector will have an associated
840 resource whose resource ID corresponds to the table index as described
843 MSI-X table entries that with a vector of zero will not have an
848 if any of the original messages allocated by
850 are not used in the new distribution of messages in the MSI-X table,
851 they will be released automatically.
852 Note that if a driver wishes to use fewer messages than were allocated by
854 the driver must use a single, contiguous range of messages beginning
855 with one in the new distribution.
858 function will fail if this condition is not met.
859 .Sh IMPLEMENTATION NOTES
862 type varies according to the size of the PCI bus address
863 space on the target architecture.
867 .Xr bus_alloc_resource 9 ,
869 .Xr bus_release_resource 9 ,
870 .Xr bus_setup_intr 9 ,
871 .Xr bus_teardown_intr 9 ,
877 .%B FreeBSD Developers' Handbook
879 .%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/
884 .%B PCI System Architecture
887 .%O ISBN 0-201-30974-2
891 This manual page was written by
892 .An Bruce M Simpson Aq Mt bms@FreeBSD.org
894 .An John Baldwin Aq Mt jhb@FreeBSD.org .
896 The kernel PCI code has a number of references to
898 These do not refer to the geographic location of PCI devices,
899 but to the device number assigned by the combination of the PCI IDSEL
900 mechanism and the platform firmware.
901 This should be taken note of when working with the kernel PCI code.
903 The PCI bus driver should allocate the MSI-X vector table and PBA internally
904 as necessary rather than requiring the caller to do so.