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_get_max_read_req ,
46 .Nm pci_get_powerstate ,
47 .Nm pci_get_vpd_ident ,
48 .Nm pci_get_vpd_readonly ,
53 .Nm pci_pending_msix ,
57 .Nm pci_restore_state ,
59 .Nm pci_set_max_read_req ,
60 .Nm pci_set_powerstate ,
68 .Fn pci_alloc_msi "device_t dev" "int *count"
70 .Fn pci_alloc_msix "device_t dev" "int *count"
72 .Fn pci_disable_busmaster "device_t dev"
74 .Fn pci_disable_io "device_t dev" "int space"
76 .Fn pci_enable_busmaster "device_t dev"
78 .Fn pci_enable_io "device_t dev" "int space"
80 .Fn pci_find_bsf "uint8_t bus" "uint8_t slot" "uint8_t func"
82 .Fn pci_find_cap "device_t dev" "int capability" "int *capreg"
84 .Fn pci_find_dbsf "uint32_t domain" "uint8_t bus" "uint8_t slot" "uint8_t func"
86 .Fn pci_find_device "uint16_t vendor" "uint16_t device"
88 .Fn pci_find_extcap "device_t dev" "int capability" "int *capreg"
90 .Fn pci_find_htcap "device_t dev" "int capability" "int *capreg"
92 .Fn pci_get_max_read_req "device_t dev"
94 .Fn pci_get_powerstate "device_t dev"
96 .Fn pci_get_vpd_ident "device_t dev" "const char **identptr"
98 .Fn pci_get_vpd_readonly "device_t dev" "const char *kw" "const char **vptr"
100 .Fn pci_msi_count "device_t dev"
102 .Fn pci_msix_count "device_t dev"
104 .Fn pci_pending_msix "device_t dev" "u_int index"
106 .Fn pci_read_config "device_t dev" "int reg" "int width"
108 .Fn pci_release_msi "device_t dev"
110 .Fn pci_remap_msix "device_t dev" "int count" "const u_int *vectors"
112 .Fn pci_restore_state "device_t dev"
114 .Fn pci_save_state "device_t dev"
116 .Fn pci_set_max_read_req "device_t dev" "int size"
118 .Fn pci_set_powerstate "device_t dev" "int state"
120 .Fn pci_write_config "device_t dev" "int reg" "uint32_t val" "int width"
121 .In dev/pci/pci_iov.h
123 .Fn pci_iov_attach "device_t dev" "nvlist_t *pf_schema" "nvlist_t *vf_schema"
125 .Fn pci_iov_detach "device_t dev"
129 set of functions are used for managing PCI devices.
130 The functions are split into several groups:
131 raw configuration access,
134 device configuration,
136 message signaled interrupts.
137 .Ss Raw Configuration Access
140 function is used to read data from the PCI configuration
147 specifying the size of the access.
151 function is used to write the value
153 to the PCI configuration
160 specifying the size of the access.
163 Device drivers should only use these functions for functionality that
164 is not available via another
170 function looks up the
172 of a PCI device, given its
179 number actually refers to the number of the device on the bus,
180 which does not necessarily indicate its geographic location
181 in terms of a physical slot.
182 Note that in case the system has multiple PCI domains,
185 function only searches the first one.
186 Actually, it is equivalent to:
187 .Bd -literal -offset indent
188 pci_find_dbsf(0, bus, slot, func);
193 function looks up the
195 of a PCI device, given its
203 number actually refers to the number of the device on the bus,
204 which does not necessarily indicate its geographic location
205 in terms of a physical slot.
209 function looks up the
211 of a PCI device, given its
216 Note that there can be multiple matches for this search; this function
217 only returns the first matching device.
218 .Ss Device Information
221 function is used to locate the first instance of a PCI capability
222 register set for the device
224 The capability to locate is specified by ID via
226 Constant macros of the form
228 for standard capability IDs are defined in
229 .In dev/pci/pcireg.h .
230 If the capability is found, then
232 is set to the offset in configuration space of the capability register set,
236 If the capability is not found or the device does not support capabilities,
242 function is used to locate the first instance of a PCI-express
243 extended capability register set for the device
245 The extended capability to locate is specified by ID via
247 Constant macros of the form
249 for standard extended capability IDs are defined in
250 .In dev/pci/pcireg.h .
251 If the extended capability is found, then
253 is set to the offset in configuration space of the extended capability
257 If the extended capability is not found or the device is not a
264 function is used to locate the first instance of a HyperTransport capability
265 register set for the device
267 The capability to locate is specified by type via
269 Constant macros of the form
271 for standard HyperTransport capability types are defined in
272 .In dev/pci/pcireg.h .
273 If the capability is found, then
275 is set to the offset in configuration space of the capability register set,
279 If the capability is not found or the device is not a HyperTransport device,
284 .Fn pci_get_vpd_ident
285 function is used to fetch a device's Vital Product Data
290 supports VPD and provides an identifier string,
293 is set to point at a read-only, null-terminated copy of the identifier
296 .Fn pci_get_vpd_ident
298 If the device does not support VPD or does not provide an identifier
301 .Fn pci_get_vpd_ident
305 .Fn pci_get_vpd_readonly
306 function is used to fetch the value of a single VPD read-only keyword
309 The keyword to fetch is identified by the two character string
311 If the device supports VPD and provides a read-only value for the
315 is set to point at a read-only, null-terminated copy of the value,
317 .Fn pci_get_vpd_readonly
319 If the device does not support VPD or does not provide the requested
322 .Fn pci_get_vpd_readonly
324 .Ss Device Configuration
326 .Fn pci_enable_busmaster
327 function enables PCI bus mastering for the device
330 .Dv PCIM_CMD_BUSMASTEREN
335 .Fn pci_disable_busmaster
336 function clears this bit.
340 function enables memory or I/O port address decoding for the device
348 register appropriately.
351 function clears the appropriate bit.
354 argument specifies which resource is affected; this can be either
359 Device drivers should generally not use these routines directly.
360 The PCI bus will enable decoding automatically when a
364 resource is activated via
365 .Xr bus_alloc_resource 9
367 .Xr bus_activate_resource 9 .
370 .Fn pci_get_max_read_req
371 function returns the current maximum read request size in bytes for a
375 device is not a PCI-express device,
376 .Fn pci_get_max_read_req
380 .Fn pci_set_max_read_req
381 sets the PCI-express maximum read request size for
387 .Fn pci_set_max_read_req
388 returns the actual size set in bytes.
391 device is not a PCI-express device,
392 .Fn pci_set_max_read_req
396 .Fn pci_get_powerstate
397 function returns the current power state of the device
399 If the device does not support power management capabilities, then the default
401 .Dv PCI_POWERSTATE_D0
403 The following power states are defined by PCI:
404 .Bl -hang -width ".Dv PCI_POWERSTATE_UNKNOWN"
405 .It Dv PCI_POWERSTATE_D0
406 State in which device is on and running.
407 It is receiving full power from the system and delivering
408 full functionality to the user.
409 .It Dv PCI_POWERSTATE_D1
410 Class-specific low-power state in which device context may or
412 Busses in this state cannot do anything to the bus, to
413 force devices to lose context.
414 .It Dv PCI_POWERSTATE_D2
415 Class-specific low-power state in which device context may or
417 Attains greater power savings than
418 .Dv PCI_POWERSTATE_D1 .
419 Busses in this state can cause devices to lose some context.
422 be prepared for the bus to be in this state or higher.
423 .It Dv PCI_POWERSTATE_D3
424 State in which the device is off and not running.
425 Device context is lost, and power from the device can
427 .It Dv PCI_POWERSTATE_UNKNOWN
428 State of the device is unknown.
432 .Fn pci_set_powerstate
433 function is used to transition the device
435 to the PCI power state
437 If the device does not support power management capabilities or
438 it does not support the specific power state
440 then the function will fail with
445 function is used to advertise that the given device
446 .Pq and associated device driver
447 supports PCI Single-Root I/O Virtualization
449 A driver that supports SR-IOV must implement the
455 This function should be called during the
458 If this function returns an error, it is recommended that the device driver
459 still successfully attaches, but runs with SR-IOV disabled.
464 parameters are used to define what device-specific configuration parameters the
465 device driver accepts when SR-IOV is enabled for the Physical Function
467 and for individual Virtual Functions
472 for details on how to construct the schema.
477 is invalid or specifies parameter names that conflict with parameter names that
480 will return an error and SR-IOV will not be available on the PF device.
481 If a driver does not accept configuration parameters for either the PF device
482 or the VF devices, the driver must pass an empty schema for that device.
483 The SR-IOV infrastructure takes ownership of the
487 and is responsible for freeing them.
488 The driver must never free the schemas itself.
492 function is used to advise the SR-IOV infrastructure that the driver for the
493 given device is attempting to detach and that all SR-IOV resources for the
494 device must be released.
495 This function must be called during the
499 was successfully called on the device and
501 has not subsequently been called on the device and returned no error.
502 If this function returns an error, the
504 method must fail and return an error, as detaching the PF driver while VF
505 devices are active would cause system instability.
506 This function is safe to call and will always succeed if
508 previously failed with an error on the given device, or if
510 was never called on the device.
515 .Fn pci_restore_state
516 functions can be used by a device driver to save and restore standard PCI
520 function must be invoked while the device has valid state before
521 .Fn pci_restore_state
523 If the device is not in the fully-powered state
524 .Pq Dv PCI_POWERSTATE_D0
526 .Fn pci_restore_state
528 then the device will be transitioned to
529 .Dv PCI_POWERSTATE_D0
530 before any config registers are restored.
531 .Ss Message Signaled Interrupts
532 Message Signaled Interrupts
535 Enhanced Message Signaled Interrupts
537 are PCI capabilities that provide an alternate method for PCI
538 devices to signal interrupts.
539 The legacy INTx interrupt is available to PCI devices as a
541 resource with a resource ID of zero.
542 MSI and MSI-X interrupts are available to PCI devices as one or more
544 resources with resource IDs greater than zero.
545 A driver must ask the PCI bus to allocate MSI or MSI-X interrupts
550 before it can use MSI or MSI-X
553 A driver is not allowed to use the legacy INTx
555 resource if MSI or MSI-X interrupts have been allocated,
556 and attempts to allocate MSI or MSI-X interrupts will fail if the
557 driver is currently using the legacy INTx
560 A driver is only allowed to use either MSI or MSI-X,
565 function returns the maximum number of MSI messages supported by the
568 If the device does not support MSI,
575 function attempts to allocate
577 MSI messages for the device
581 function may allocate fewer messages than requested for various
582 reasons including requests for more messages than the device
585 or if the system has a shortage of available MSI messages.
588 is set to the number of messages allocated and
593 resources for the allocated messages will be available at consecutive
594 resource IDs beginning with one.
597 is not able to allocate any messages,
599 Note that MSI only supports message counts that are powers of two;
600 requests to allocate a non-power of two count of messages will fail.
604 function is used to release any allocated MSI or MSI-X messages back
608 resources are allocated by the driver or have a configured interrupt
610 this function will fail with
614 function returns zero on success and an error on failure.
618 function returns the maximum number of MSI-X messages supported by the
621 If the device does not support MSI-X,
628 function attempts to allocate
630 MSI-X messages for the device
634 function may allocate fewer messages than requested for various
635 reasons including requests for more messages than the device
638 or if the system has a shortage of available MSI-X messages.
641 is set to the number of messages allocated and
645 the resource ID for each
647 resource identifies the index in the MSI-X table of the
648 corresponding message.
649 A resource ID of one maps to the first index of the MSI-X table;
650 a resource ID two identifies the second index in the table, etc.
655 messages allocated to the first
660 is not able to allocate any messages,
663 MSI-X does not require message counts that are powers of two.
667 function examines the
669 device's Pending Bit Array
671 to determine the pending status of the MSI-X message at table index
673 If the indicated message is pending,
674 this function returns a non-zero value;
679 to this function will result in undefined behavior.
681 As mentioned in the description of
683 MSI-X messages are initially assigned to the first N table entries.
684 A driver may use a different distribution of available messages to
685 table entries via the
688 Note that this function must be called after a successful call to
690 but before any of the
692 resources are allocated.
695 function returns zero on success,
696 or an error on failure.
703 The array maps directly to the MSI-X table in that the first entry in
704 the array specifies the message used for the first entry in the MSI-X
706 the second entry in the array corresponds to the second entry in the
709 The vector value in each array index can either be zero to indicate
710 that no message should be assigned to the corresponding MSI-X table entry,
711 or it can be a number from one to N
713 where N is the count returned from the previous call to
716 to indicate which of the allocated messages should be assigned to the
717 corresponding MSI-X table entry.
722 each MSI-X table entry with a non-zero vector will have an associated
724 resource whose resource ID corresponds to the table index as described
727 MSI-X table entries that with a vector of zero will not have an
732 if any of the original messages allocated by
734 are not used in the new distribution of messages in the MSI-X table,
735 they will be released automatically.
736 Note that if a driver wishes to use fewer messages than were allocated by
738 the driver must use a single, contiguous range of messages beginning
739 with one in the new distribution.
742 function will fail if this condition is not met.
743 .Sh IMPLEMENTATION NOTES
746 type varies according to the size of the PCI bus address
747 space on the target architecture.
751 .Xr bus_alloc_resource 9 ,
753 .Xr bus_release_resource 9 ,
754 .Xr bus_setup_intr 9 ,
755 .Xr bus_teardown_intr 9 ,
761 .%B FreeBSD Developers' Handbook
763 .%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/
768 .%B PCI System Architecture
771 .%O ISBN 0-201-30974-2
775 This manual page was written by
776 .An Bruce M Simpson Aq Mt bms@FreeBSD.org
778 .An John Baldwin Aq Mt jhb@FreeBSD.org .
780 The kernel PCI code has a number of references to
782 These do not refer to the geographic location of PCI devices,
783 but to the device number assigned by the combination of the PCI IDSEL
784 mechanism and the platform firmware.
785 This should be taken note of when working with the kernel PCI code.