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_iov_attach "device_t dev" "nvlist_t *pf_schema" "nvlist_t *vf_schema"
102 .Fn pci_iov_detach "device_t dev"
104 .Fn pci_msi_count "device_t dev"
106 .Fn pci_msix_count "device_t dev"
108 .Fn pci_pending_msix "device_t dev" "u_int index"
110 .Fn pci_read_config "device_t dev" "int reg" "int width"
112 .Fn pci_release_msi "device_t dev"
114 .Fn pci_remap_msix "device_t dev" "int count" "const u_int *vectors"
116 .Fn pci_restore_state "device_t dev"
118 .Fn pci_save_state "device_t dev"
120 .Fn pci_set_max_read_req "device_t dev" "int size"
122 .Fn pci_set_powerstate "device_t dev" "int state"
124 .Fn pci_write_config "device_t dev" "int reg" "uint32_t val" "int width"
128 set of functions are used for managing PCI devices.
129 The functions are split into several groups:
130 raw configuration access,
133 device configuration,
135 message signaled interrupts.
136 .Ss Raw Configuration Access
139 function is used to read data from the PCI configuration
146 specifying the size of the access.
150 function is used to write the value
152 to the PCI configuration
159 specifying the size of the access.
162 Device drivers should only use these functions for functionality that
163 is not available via another
169 function looks up the
171 of a PCI device, given its
178 number actually refers to the number of the device on the bus,
179 which does not necessarily indicate its geographic location
180 in terms of a physical slot.
181 Note that in case the system has multiple PCI domains,
184 function only searches the first one.
185 Actually, it is equivalent to:
186 .Bd -literal -offset indent
187 pci_find_dbsf(0, bus, slot, func);
192 function looks up the
194 of a PCI device, given its
202 number actually refers to the number of the device on the bus,
203 which does not necessarily indicate its geographic location
204 in terms of a physical slot.
208 function looks up the
210 of a PCI device, given its
215 Note that there can be multiple matches for this search; this function
216 only returns the first matching device.
217 .Ss Device Information
220 function is used to locate the first instance of a PCI capability
221 register set for the device
223 The capability to locate is specified by ID via
225 Constant macros of the form
227 for standard capability IDs are defined in
228 .In dev/pci/pcireg.h .
229 If the capability is found, then
231 is set to the offset in configuration space of the capability register set,
235 If the capability is not found or the device does not support capabilities,
241 function is used to locate the first instance of a PCI-express
242 extended capability register set for the device
244 The extended capability to locate is specified by ID via
246 Constant macros of the form
248 for standard extended capability IDs are defined in
249 .In dev/pci/pcireg.h .
250 If the extended capability is found, then
252 is set to the offset in configuration space of the extended capability
256 If the extended capability is not found or the device is not a
263 function is used to locate the first instance of a HyperTransport capability
264 register set for the device
266 The capability to locate is specified by type via
268 Constant macros of the form
270 for standard HyperTransport capability types are defined in
271 .In dev/pci/pcireg.h .
272 If the capability is found, then
274 is set to the offset in configuration space of the capability register set,
278 If the capability is not found or the device is not a HyperTransport device,
283 .Fn pci_get_vpd_ident
284 function is used to fetch a device's Vital Product Data
289 supports VPD and provides an identifier string,
292 is set to point at a read-only, null-terminated copy of the identifier
295 .Fn pci_get_vpd_ident
297 If the device does not support VPD or does not provide an identifier
300 .Fn pci_get_vpd_ident
304 .Fn pci_get_vpd_readonly
305 function is used to fetch the value of a single VPD read-only keyword
308 The keyword to fetch is identified by the two character string
310 If the device supports VPD and provides a read-only value for the
314 is set to point at a read-only, null-terminated copy of the value,
316 .Fn pci_get_vpd_readonly
318 If the device does not support VPD or does not provide the requested
321 .Fn pci_get_vpd_readonly
323 .Ss Device Configuration
325 .Fn pci_enable_busmaster
326 function enables PCI bus mastering for the device
329 .Dv PCIM_CMD_BUSMASTEREN
334 .Fn pci_disable_busmaster
335 function clears this bit.
339 function enables memory or I/O port address decoding for the device
347 register appropriately.
350 function clears the appropriate bit.
353 argument specifies which resource is affected; this can be either
358 Device drivers should generally not use these routines directly.
359 The PCI bus will enable decoding automatically when a
363 resource is activated via
364 .Xr bus_alloc_resource 9
366 .Xr bus_activate_resource 9 .
369 .Fn pci_get_max_read_req
370 function returns the current maximum read request size in bytes for a
374 device is not a PCI-express device,
375 .Fn pci_get_max_read_req
379 .Fn pci_set_max_read_req
380 sets the PCI-express maximum read request size for
386 .Fn pci_set_max_read_req
387 returns the actual size set in bytes.
390 device is not a PCI-express device,
391 .Fn pci_set_max_read_req
395 .Fn pci_get_powerstate
396 function returns the current power state of the device
398 If the device does not support power management capabilities, then the default
400 .Dv PCI_POWERSTATE_D0
402 The following power states are defined by PCI:
403 .Bl -hang -width ".Dv PCI_POWERSTATE_UNKNOWN"
404 .It Dv PCI_POWERSTATE_D0
405 State in which device is on and running.
406 It is receiving full power from the system and delivering
407 full functionality to the user.
408 .It Dv PCI_POWERSTATE_D1
409 Class-specific low-power state in which device context may or
411 Busses in this state cannot do anything to the bus, to
412 force devices to lose context.
413 .It Dv PCI_POWERSTATE_D2
414 Class-specific low-power state in which device context may or
416 Attains greater power savings than
417 .Dv PCI_POWERSTATE_D1 .
418 Busses in this state can cause devices to lose some context.
421 be prepared for the bus to be in this state or higher.
422 .It Dv PCI_POWERSTATE_D3
423 State in which the device is off and not running.
424 Device context is lost, and power from the device can
426 .It Dv PCI_POWERSTATE_UNKNOWN
427 State of the device is unknown.
431 .Fn pci_set_powerstate
432 function is used to transition the device
434 to the PCI power state
436 If the device does not support power management capabilities or
437 it does not support the specific power state
439 then the function will fail with
444 function is used to advertise that the given device
445 .Pq and associated device driver
446 supports PCI Single-Root I/O Virtualization
448 A driver that supports SR-IOV must implement the
454 This function should be called during the
457 If this function returns an error, it is recommended that the device driver
458 still successfully attaches, but runs with SR-IOV disabled.
463 parameters are used to define what device-specific configuration parameters the
464 device driver accepts when SR-IOV is enabled for the Physical Function
466 and for individual Virtual Functions
471 for details on how to construct the schema.
476 is invalid or specifies parameter names that conflict with parameter names that
479 will return an error and SR-IOV will not be available on the PF device.
480 If a driver does not accept configuration parameters for either the PF device
481 or the VF devices, the driver must pass an empty schema for that device.
482 The SR-IOV infrastructure takes ownership of the
486 and is responsible for freeing them.
487 The driver must never free the schemas itself.
491 function is used to advise the SR-IOV infrastructure that the driver for the
492 given device is attempting to detach and that all SR-IOV resources for the
493 device must be released.
494 This function must be called during the
498 was successfully called on the device and
500 has not subsequently been called on the device and returned no error.
501 If this function returns an error, the
503 method must fail and return an error, as detaching the PF driver while VF
504 devices are active would cause system instability.
505 This function is safe to call and will always succeed if
507 previously failed with an error on the given device, or if
509 was never called on the device.
514 .Fn pci_restore_state
515 functions can be used by a device driver to save and restore standard PCI
519 function must be invoked while the device has valid state before
520 .Fn pci_restore_state
522 If the device is not in the fully-powered state
523 .Pq Dv PCI_POWERSTATE_D0
525 .Fn pci_restore_state
527 then the device will be transitioned to
528 .Dv PCI_POWERSTATE_D0
529 before any config registers are restored.
530 .Ss Message Signaled Interrupts
531 Message Signaled Interrupts
534 Enhanced Message Signaled Interrupts
536 are PCI capabilities that provide an alternate method for PCI
537 devices to signal interrupts.
538 The legacy INTx interrupt is available to PCI devices as a
540 resource with a resource ID of zero.
541 MSI and MSI-X interrupts are available to PCI devices as one or more
543 resources with resource IDs greater than zero.
544 A driver must ask the PCI bus to allocate MSI or MSI-X interrupts
549 before it can use MSI or MSI-X
552 A driver is not allowed to use the legacy INTx
554 resource if MSI or MSI-X interrupts have been allocated,
555 and attempts to allocate MSI or MSI-X interrupts will fail if the
556 driver is currently using the legacy INTx
559 A driver is only allowed to use either MSI or MSI-X,
564 function returns the maximum number of MSI messages supported by the
567 If the device does not support MSI,
574 function attempts to allocate
576 MSI messages for the device
580 function may allocate fewer messages than requested for various
581 reasons including requests for more messages than the device
584 or if the system has a shortage of available MSI messages.
587 is set to the number of messages allocated and
592 resources for the allocated messages will be available at consecutive
593 resource IDs beginning with one.
596 is not able to allocate any messages,
598 Note that MSI only supports message counts that are powers of two;
599 requests to allocate a non-power of two count of messages will fail.
603 function is used to release any allocated MSI or MSI-X messages back
607 resources are allocated by the driver or have a configured interrupt
609 this function will fail with
613 function returns zero on success and an error on failure.
617 function returns the maximum number of MSI-X messages supported by the
620 If the device does not support MSI-X,
627 function attempts to allocate
629 MSI-X messages for the device
633 function may allocate fewer messages than requested for various
634 reasons including requests for more messages than the device
637 or if the system has a shortage of available MSI-X messages.
640 is set to the number of messages allocated and
644 the resource ID for each
646 resource identifies the index in the MSI-X table of the
647 corresponding message.
648 A resource ID of one maps to the first index of the MSI-X table;
649 a resource ID two identifies the second index in the table, etc.
654 messages allocated to the first
659 is not able to allocate any messages,
662 MSI-X does not require message counts that are powers of two.
666 function examines the
668 device's Pending Bit Array
670 to determine the pending status of the MSI-X message at table index
672 If the indicated message is pending,
673 this function returns a non-zero value;
678 to this function will result in undefined behavior.
680 As mentioned in the description of
682 MSI-X messages are initially assigned to the first N table entries.
683 A driver may use a different distribution of available messages to
684 table entries via the
687 Note that this function must be called after a successful call to
689 but before any of the
691 resources are allocated.
694 function returns zero on success,
695 or an error on failure.
702 The array maps directly to the MSI-X table in that the first entry in
703 the array specifies the message used for the first entry in the MSI-X
705 the second entry in the array corresponds to the second entry in the
708 The vector value in each array index can either be zero to indicate
709 that no message should be assigned to the corresponding MSI-X table entry,
710 or it can be a number from one to N
712 where N is the count returned from the previous call to
715 to indicate which of the allocated messages should be assigned to the
716 corresponding MSI-X table entry.
721 each MSI-X table entry with a non-zero vector will have an associated
723 resource whose resource ID corresponds to the table index as described
726 MSI-X table entries that with a vector of zero will not have an
731 if any of the original messages allocated by
733 are not used in the new distribution of messages in the MSI-X table,
734 they will be released automatically.
735 Note that if a driver wishes to use fewer messages than were allocated by
737 the driver must use a single, contiguous range of messages beginning
738 with one in the new distribution.
741 function will fail if this condition is not met.
742 .Sh IMPLEMENTATION NOTES
745 type varies according to the size of the PCI bus address
746 space on the target architecture.
750 .Xr bus_alloc_resource 9 ,
752 .Xr bus_release_resource 9 ,
753 .Xr bus_setup_intr 9 ,
754 .Xr bus_teardown_intr 9 ,
760 .%B FreeBSD Developers' Handbook
762 .%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/
767 .%B PCI System Architecture
770 .%O ISBN 0-201-30974-2
774 This manual page was written by
775 .An Bruce M Simpson Aq Mt bms@FreeBSD.org
777 .An John Baldwin Aq Mt jhb@FreeBSD.org .
779 The kernel PCI code has a number of references to
781 These do not refer to the geographic location of PCI devices,
782 but to the device number assigned by the combination of the PCI IDSEL
783 mechanism and the platform firmware.
784 This should be taken note of when working with the kernel PCI code.