summaryrefslogtreecommitdiff
path: root/static/freebsd/man4/pci.4 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man4/pci.4 3.html')
-rw-r--r--static/freebsd/man4/pci.4 3.html580
1 files changed, 0 insertions, 580 deletions
diff --git a/static/freebsd/man4/pci.4 3.html b/static/freebsd/man4/pci.4 3.html
deleted file mode 100644
index a892e232..00000000
--- a/static/freebsd/man4/pci.4 3.html
+++ /dev/null
@@ -1,580 +0,0 @@
-<table class="head">
- <tr>
- <td class="head-ltitle">PCI(4)</td>
- <td class="head-vol">Device Drivers Manual</td>
- <td class="head-rtitle">PCI(4)</td>
- </tr>
-</table>
-<div class="manual-text">
-<section class="Sh">
-<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
-<p class="Pp"><code class="Nm">pci</code> &#x2014; <span class="Nd">generic
- PCI/PCIe bus driver</span></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
-<p class="Pp">To compile the PCI bus driver into the kernel, place the following
- line in your kernel configuration file:</p>
-<div class="Bd Pp Bd-indent"><code class="Cd">device pci</code></div>
-<p class="Pp">To compile in support for Single Root I/O Virtualization
- (SR-IOV):</p>
-<div class="Bd Pp Bd-indent"><code class="Cd">options PCI_IOV</code></div>
-<p class="Pp">To compile in support for native PCI-express HotPlug:</p>
-<div class="Bd Pp Bd-indent"><code class="Cd">options PCI_HP</code></div>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
-<p class="Pp">The <code class="Nm">pci</code> driver provides support for PCI
- and PCIe devices in the kernel and limited access to PCI devices for
- userland.</p>
-<p class="Pp">The <code class="Nm">pci</code> driver provides a
- <span class="Pa">/dev/pci</span> character device that can be used by
- userland programs to read and write PCI configuration registers. Programs
- can also use this device to get a list of all PCI devices, or all PCI
- devices that match various patterns.</p>
-<p class="Pp">Since the <code class="Nm">pci</code> driver provides a write
- interface for PCI configuration registers, system administrators should
- exercise caution when granting access to the <code class="Nm">pci</code>
- device. If used improperly, this driver can allow userland applications to
- crash a machine or cause data loss. In particular, driver only allows
- operations on the opened <span class="Pa">/dev/pci</span> to modify system
- state if the file descriptor was opened for writing. For instance, the
- <code class="Dv">PCIOCREAD</code> and <code class="Dv">PCIOCBARMMAP</code>
- operations require a writeable descriptor, because reading a config register
- or a BAR read access could have function-specific side-effects.</p>
-<p class="Pp">The <code class="Nm">pci</code> driver implements the PCI bus in
- the kernel. It enumerates any devices on the PCI bus and gives PCI client
- drivers the chance to attach to them. It assigns resources to children, when
- the BIOS does not. It takes care of routing interrupts when necessary. It
- reprobes the unattached PCI children when PCI client drivers are dynamically
- loaded at runtime. The <code class="Nm">pci</code> driver also includes
- support for PCI-PCI bridges, various platform-specific Host-PCI bridges, and
- basic support for PCI VGA adapters.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="IOCTLS"><a class="permalink" href="#IOCTLS">IOCTLS</a></h1>
-<p class="Pp">The following <a class="Xr">ioctl(2)</a> calls are supported by
- the <code class="Nm">pci</code> driver. They are defined in the header file
- <code class="In">&lt;<a class="In">sys/pciio.h</a>&gt;</code>.</p>
-<dl class="Bl-tag">
- <dt>PCIOCGETCONF</dt>
- <dd>This <a class="Xr">ioctl(2)</a> takes a <var class="Va">pci_conf_io</var>
- structure. It allows the user to retrieve information on all PCI devices
- in the system, or on PCI devices matching patterns supplied by the user.
- The call may set <var class="Va">errno</var> to any value specified in
- either <a class="Xr">copyin(9)</a> or <a class="Xr">copyout(9)</a>. The
- <var class="Va">pci_conf_io</var> structure consists of a number of
- fields:
- <dl class="Bl-tag">
- <dt>pat_buf_len</dt>
- <dd>The length, in bytes, of the buffer filled with user-supplied
- patterns.</dd>
- <dt>num_patterns</dt>
- <dd>The number of user-supplied patterns.</dd>
- <dt>patterns</dt>
- <dd>Pointer to a buffer filled with user-supplied patterns.
- <var class="Va">patterns</var> is a pointer to
- <var class="Va">num_patterns</var>
- <var class="Va">pci_match_conf</var> structures. The
- <var class="Va">pci_match_conf</var> structure consists of the
- following elements:
- <dl class="Bl-tag">
- <dt>pc_sel</dt>
- <dd>PCI domain, bus, slot and function.</dd>
- <dt>pd_name</dt>
- <dd>PCI device driver name.</dd>
- <dt>pd_unit</dt>
- <dd>PCI device driver unit number.</dd>
- <dt>pc_vendor</dt>
- <dd>PCI vendor ID.</dd>
- <dt>pc_device</dt>
- <dd>PCI device ID.</dd>
- <dt>pc_class</dt>
- <dd>PCI device class.</dd>
- <dt>flags</dt>
- <dd>The flags describe which of the fields the kernel should match
- against. A device must match all specified fields in order to be
- returned. The match flags are enumerated in the
- <var class="Va">pci_getconf_flags</var> structure. Hopefully the
- flag values are obvious enough that they do not need to described
- in detail.</dd>
- </dl>
- </dd>
- <dt>match_buf_len</dt>
- <dd>Length of the <var class="Va">matches</var> buffer allocated by the
- user to hold the results of the <code class="Dv">PCIOCGETCONF</code>
- query.</dd>
- <dt>num_matches</dt>
- <dd>Number of matches returned by the kernel.</dd>
- <dt>matches</dt>
- <dd>Buffer containing matching devices returned by the kernel. The items
- in this buffer are of type <var class="Va">pci_conf</var>, which
- consists of the following items:
- <dl class="Bl-tag">
- <dt>pc_sel</dt>
- <dd>PCI domain, bus, slot and function.</dd>
- <dt>pc_hdr</dt>
- <dd>PCI header type.</dd>
- <dt>pc_subvendor</dt>
- <dd>PCI subvendor ID.</dd>
- <dt>pc_subdevice</dt>
- <dd>PCI subdevice ID.</dd>
- <dt>pc_vendor</dt>
- <dd>PCI vendor ID.</dd>
- <dt>pc_device</dt>
- <dd>PCI device ID.</dd>
- <dt>pc_class</dt>
- <dd>PCI device class.</dd>
- <dt>pc_subclass</dt>
- <dd>PCI device subclass.</dd>
- <dt>pc_progif</dt>
- <dd>PCI device programming interface.</dd>
- <dt>pc_revid</dt>
- <dd>PCI revision ID.</dd>
- <dt>pd_name</dt>
- <dd>Driver name.</dd>
- <dt>pd_unit</dt>
- <dd>Driver unit number.</dd>
- <dt>pd_numa_domain</dt>
- <dd>Device NUMA domain.</dd>
- <dt>pc_reported_len</dt>
- <dd>Length of the valid portion of the encompassing
- <var class="Vt">pci_conf</var> structure. This should always be
- equivalent to the offset of the <var class="Va">pc_spare</var>
- member.</dd>
- <dt>pc_secbus</dt>
- <dd>Secondary PCI bus number. (Only valid for bridge devices)</dd>
- <dt>pc_subbus</dt>
- <dd>Subordinate PCI bus number. (Only valid for bridge devices)</dd>
- <dt>pc_spare</dt>
- <dd>Reserved for future use.</dd>
- </dl>
- </dd>
- <dt>offset</dt>
- <dd>The offset is passed in by the user to tell the kernel where it should
- start traversing the device list. The value passed out by the kernel
- points to the record immediately after the last one returned. The user
- may pass the value returned by the kernel in subsequent calls to the
- <code class="Dv">PCIOCGETCONF</code> ioctl. If the user does not
- intend to use the offset, it must be set to zero.</dd>
- <dt>generation</dt>
- <dd>PCI configuration generation. This value only needs to be set if the
- offset is set. The kernel will compare the current generation number
- of its internal device list to the generation passed in by the user to
- determine whether its device list has changed since the user last
- called the <code class="Dv">PCIOCGETCONF</code> ioctl. If the device
- list has changed, a status of
- <var class="Va">PCI_GETCONF_LIST_CHANGED</var> will be passed
- back.</dd>
- <dt>status</dt>
- <dd>The status tells the user the disposition of his request for a device
- list. The possible status values are:
- <dl class="Bl-ohang">
- <dt>PCI_GETCONF_LAST_DEVICE</dt>
- <dd>This means that there are no more devices in the PCI device list
- matching the specified criteria after the ones returned in the
- <var class="Va">matches</var> buffer.</dd>
- <dt>PCI_GETCONF_LIST_CHANGED</dt>
- <dd>This status tells the user that the PCI device list has changed
- since his last call to the <code class="Dv">PCIOCGETCONF</code>
- ioctl and he must reset the <var class="Va">offset</var> and
- <var class="Va">generation</var> to zero to start over at the
- beginning of the list.</dd>
- <dt>PCI_GETCONF_MORE_DEVS</dt>
- <dd>This tells the user that his buffer was not large enough to hold
- all of the remaining devices in the device list that match his
- criteria.</dd>
- <dt id="sizeof">PCI_GETCONF_ERROR</dt>
- <dd>This indicates a general error while servicing the user's request.
- If the <var class="Va">pat_buf_len</var> is not equal to
- <var class="Va">num_patterns</var> times
- <a class="permalink" href="#sizeof"><code class="Fn">sizeof</code></a>(<var class="Fa">struct
- pci_match_conf</var>), <var class="Va">errno</var> will be set to
- <code class="Er">EINVAL</code>.</dd>
- </dl>
- </dd>
- </dl>
- </dd>
- <dt>PCIOCREAD</dt>
- <dd>This <a class="Xr">ioctl(2)</a> reads the PCI configuration registers
- specified by the passed-in <var class="Va">pci_io</var> structure. The
- <var class="Va">pci_io</var> structure consists of the following fields:
- <dl class="Bl-tag">
- <dt>pi_sel</dt>
- <dd>A <var class="Va">pcisel</var> structure which specifies the domain,
- bus, slot and function the user would like to query. If the specific
- bus is not found, errno will be set to ENODEV and -1 returned from the
- ioctl.</dd>
- <dt>pi_reg</dt>
- <dd>The PCI configuration registers the user would like to access.</dd>
- <dt>pi_width</dt>
- <dd>The width, in bytes, of the data the user would like to read. This
- value may be either 1, 2, or 4. 3-byte reads and reads larger than 4
- bytes are not supported. If an invalid width is passed, errno will be
- set to EINVAL.</dd>
- <dt>pi_data</dt>
- <dd>The data returned by the kernel.</dd>
- </dl>
- </dd>
- <dt>PCIOCWRITE</dt>
- <dd>This <a class="Xr">ioctl(2)</a> allows users to write to the PCI
- configuration registers specified in the passed-in
- <var class="Va">pci_io</var> structure. The <var class="Va">pci_io</var>
- structure is described above. The limitations on data width described for
- reading registers, above, also apply to writing PCI configuration
- registers.</dd>
- <dt>PCIOCATTACHED</dt>
- <dd>This <a class="Xr">ioctl(2)</a> allows users to query if a driver is
- attached to the PCI device specified in the passed-in
- <var class="Va">pci_io</var> structure. The <var class="Va">pci_io</var>
- structure is described above, however, the <var class="Va">pi_reg</var>
- and <var class="Va">pi_width</var> fields are not used. The status of the
- device is stored in the <var class="Va">pi_data</var> field. A value of 0
- indicates no driver is attached, while a value larger than 0 indicates
- that a driver is attached.</dd>
- <dt>PCIOCBARMMAP</dt>
- <dd>This <a class="Xr">ioctl(2)</a> command allows userspace processes to
- <a class="Xr">mmap(2)</a> the memory-mapped PCI BAR into its address
- space. The input parameters and results are passed in the
- <var class="Va">pci_bar_mmap</var> structure, which has the following
- fields:
- <dl class="Bl-tag">
- <dt><var class="Vt">void *pbm_map_base</var></dt>
- <dd>Reports the established mapping base to the caller. If
- <var class="Va">PCIIO_BAR_MMAP_FIXED</var> flag was specified, then
- this field must be filled before the call with the desired address for
- the mapping.</dd>
- <dt><var class="Vt">size_t pbm_map_length</var></dt>
- <dd>Reports the mapped length of the BAR, in bytes. Its
- <var class="Vt">size_t</var> value is always multiple of machine
- pages.</dd>
- <dt><var class="Vt">uint64_t pbm_bar_length</var></dt>
- <dd>Reports length of the bar as exposed by the device.</dd>
- <dt><var class="Vt">int pbm_bar_off</var></dt>
- <dd>Reports offset from the mapped base to the start of the first register
- in the bar.</dd>
- <dt><var class="Vt">struct pcisel pbm_sel</var></dt>
- <dd>Should be filled before the call. Describes the device to operate
- on.</dd>
- <dt><var class="Vt">int pbm_reg</var></dt>
- <dd>The BAR index to mmap.</dd>
- <dt><var class="Vt">int pbm_flags</var></dt>
- <dd>Flags which augments the operation. See below.</dd>
- <dt><var class="Vt">int pbm_memattr</var></dt>
- <dd>The caching attribute for the mapping. Typical values are
- <code class="Dv">VM_MEMATTR_UNCACHEABLE</code> for control registers
- BARs, and <code class="Dv">VM_MEMATTR_WRITE_COMBINING</code> for frame
- buffers. Regular memory-like BAR should be mapped with
- <code class="Dv">VM_MEMATTR_DEFAULT</code> attribute.</dd>
- </dl>
- <p class="Pp">Currently defined flags are:</p>
- <dl class="Bl-tag">
- <dt>PCIIO_BAR_MMAP_FIXED</dt>
- <dd>The resulted mappings should be established at the address specified
- by the <var class="Va">pbm_map_base</var> member, otherwise fail.</dd>
- <dt>PCIIO_BAR_MMAP_EXCL</dt>
- <dd>Must be used together with
- <code class="Dv">PCIIO_BAR_MMAP_FIXED</code> If the specified base
- contains already established mappings, the operation fails instead of
- implicitly unmapping them.</dd>
- <dt>PCIIO_BAR_MMAP_RW</dt>
- <dd>The requested mapping allows both reading and writing. Without the
- flag, read-only mapping is established. Note that it is common for the
- device registers to have side-effects even on reads.</dd>
- <dt>PCIIO_BAR_MMAP_ACTIVATE</dt>
- <dd>(Unimplemented) If the BAR is not activated, activate it in the course
- of mapping. Currently attempt to mmap an inactive BAR results in
- error.</dd>
- </dl>
- </dd>
- <dt>PCIOCBARIO</dt>
- <dd>This <a class="Xr">ioctl(2)</a> command allows users to read from and
- write to BARs. The I/O request parameters are passed in a
- <var class="Va">struct pci_bar_ioreq</var> structure, which has the
- following fields:
- <dl class="Bl-tag">
- <dt><var class="Vt">struct pcisel pbi_sel</var></dt>
- <dd>Describes the device to operate on.</dd>
- <dt><var class="Vt">int pbi_op</var></dt>
- <dd>The operation to perform. Currently supported values are
- <code class="Dv">PCIBARIO_READ</code> and
- <code class="Dv">PCIBARIO_WRITE</code>.</dd>
- <dt><var class="Vt">uint32_t pbi_bar</var></dt>
- <dd>The index of the BAR on which to operate.</dd>
- <dt><var class="Vt">uint32_t pbi_offset</var></dt>
- <dd>The offset into the BAR at which to operate.</dd>
- <dt><var class="Vt">uint32_t pbi_width</var></dt>
- <dd>The size, in bytes, of the I/O operation. 1-byte, 2-byte, 4-byte and
- 8-byte perations are supported.</dd>
- <dt><var class="Vt">uint32_t pbi_value</var></dt>
- <dd>For reads, the value is returned in this field. For writes, the caller
- specifies the value to be written in this field.
- <p class="Pp">Note that this operation maps and unmaps the corresponding
- resource and so is relatively expensive for memory BARs. The
- <var class="Va">PCIOCBARMMAP</var> <a class="Xr">ioctl(2)</a> can be
- used to create a persistent userspace mapping for such BARs
- instead.</p>
- </dd>
- </dl>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="LOADER_TUNABLES"><a class="permalink" href="#LOADER_TUNABLES">LOADER
- TUNABLES</a></h1>
-<p class="Pp">Tunables can be set at the <a class="Xr">loader(8)</a> prompt
- before booting the kernel, or stored in <a class="Xr">loader.conf(5)</a>.
- The current value of these tunables can be examined at runtime via
- <a class="Xr">sysctl(8)</a> nodes of the same name. Unless otherwise
- specified, each of these tunables is a boolean that can be enabled by
- setting the tunable to a non-zero value.</p>
-<dl class="Bl-tag">
- <dt id="hw.pci.clear_bars"><var class="Va">hw.pci.clear_bars</var> (Defaults
- to 0)</dt>
- <dd>Ignore any firmware-assigned memory and I/O port resources. This forces
- the PCI bus driver to allocate resource ranges for memory and I/O port
- resources from scratch.</dd>
- <dt id="hw.pci.clear_buses"><var class="Va">hw.pci.clear_buses</var> (Defaults
- to 0)</dt>
- <dd>Ignore any firmware-assigned bus number registers in PCI-PCI bridges. This
- forces the PCI bus driver and PCI-PCI bridge driver to allocate bus
- numbers for secondary buses behind PCI-PCI bridges.</dd>
- <dt id="hw.pci.clear_pcib"><var class="Va">hw.pci.clear_pcib</var> (Defaults
- to 0)</dt>
- <dd>Ignore any firmware-assigned memory and I/O port resource windows in
- PCI-PCI bridges. This forces the PCI-PCI bridge driver to allocate memory
- and I/O port resources for resource windows from scratch.
- <p class="Pp">By default the PCI-PCI bridge driver will allocate windows
- that contain the firmware-assigned resources devices behind the bridge.
- In addition, the PCI-PCI bridge driver will suballocate from existing
- window regions when possible to satisfy a resource request. As a result,
- both <var class="Va">hw.pci.clear_bars</var> and
- <var class="Va">hw.pci.clear_pcib</var> must be enabled to fully ignore
- firmware-supplied resource assignments.</p>
- </dd>
- <dt id="hw.pci.default_vgapci_unit"><var class="Va">hw.pci.default_vgapci_unit</var>
- (Defaults to -1)</dt>
- <dd>By default, the first PCI VGA adapter encountered by the system is assumed
- to be the boot display device. This tunable can be set to choose a
- specific VGA adapter by specifying the unit number of the associated
- <var class="Va">vgapci</var><var class="Ar">X</var> device.</dd>
- <dt id="hw.pci.do_power_nodriver"><var class="Va">hw.pci.do_power_nodriver</var>
- (Defaults to 0)</dt>
- <dd>Place devices into a low power state (D3) when a suitable device driver is
- not found. Can be set to one of the following values:
- <dl class="Bl-tag">
- <dt>3</dt>
- <dd>Powers down all PCI devices without a device driver.</dd>
- <dt>2</dt>
- <dd>Powers down most devices without a device driver. PCI devices with the
- display, memory, and base peripheral device classes are not powered
- down.</dd>
- <dt>1</dt>
- <dd>Similar to a setting of 2 except that storage controllers are also not
- powered down.</dd>
- <dt>0</dt>
- <dd>All devices are left fully powered.</dd>
- </dl>
- <p class="Pp">A PCI device must support power management to be powered down.
- Placing a device into a low power state may not reduce power
- consumption.</p>
- </dd>
- <dt id="hw.pci.do_power_resume"><var class="Va">hw.pci.do_power_resume</var>
- (Defaults to 1)</dt>
- <dd>Place PCI devices into the fully powered state when resuming either the
- system or an individual device. Setting this to zero is discouraged as the
- system will not attempt to power up non-powered PCI devices after a
- suspend.</dd>
- <dt id="hw.pci.do_power_suspend"><var class="Va">hw.pci.do_power_suspend</var>
- (Defaults to 1)</dt>
- <dd>Place PCI devices into a low power state when suspending either the system
- or individual devices. Normally the D3 state is used as the low power
- state, but firmware may override the desired power state during a system
- suspend.</dd>
- <dt id="hw.pci.enable_ari"><var class="Va">hw.pci.enable_ari</var> (Defaults
- to 1)</dt>
- <dd>Enable support for PCI-express Alternative RID Interpretation. This is
- often used in conjunction with SR-IOV.</dd>
- <dt id="hw.pci.enable_io_modes"><var class="Va">hw.pci.enable_io_modes</var>
- (Defaults to 1)</dt>
- <dd>Enable memory or I/O port decoding in a PCI device's command register if
- it has firmware-assigned memory or I/O port resources. The firmware (BIOS)
- in some systems does not enable memory or I/O port decoding for some
- devices even when it has assigned resources to the device. This enables
- decoding for such resources during bus probe.</dd>
- <dt id="hw.pci.enable_msi"><var class="Va">hw.pci.enable_msi</var> (Defaults
- to 1)</dt>
- <dd>Enable support for Message Signalled Interrupts (MSI). MSI interrupts can
- be disabled by setting this tunable to 0.</dd>
- <dt id="hw.pci.enable_msix"><var class="Va">hw.pci.enable_msix</var> (Defaults
- to 1)</dt>
- <dd>Enable support for extended Message Signalled Interrupts (MSI-X). MSI-X
- interrupts can be disabled by setting this tunable to 0.</dd>
- <dt id="hw.pci.enable_pcie_ei"><var class="Va">hw.pci.enable_pcie_ei</var>
- (Defaults to 0)</dt>
- <dd>Enable support for PCI-express Electromechanical Interlock.</dd>
- <dt id="hw.pci.enable_pcie_hp"><var class="Va">hw.pci.enable_pcie_hp</var>
- (Defaults to 1)</dt>
- <dd>Enable support for native PCI-express HotPlug.</dd>
- <dt id="hw.pci.honor_msi_blacklist"><var class="Va">hw.pci.honor_msi_blacklist</var>
- (Defaults to 1)</dt>
- <dd>MSI and MSI-X interrupts are disabled for certain chipsets known to have
- broken MSI and MSI-X implementations when this tunable is set. It can be
- set to zero to permit use of MSI and MSI-X interrupts if the chipset match
- is a false positive.</dd>
- <dt id="hw.pci.iov_max_config"><var class="Va">hw.pci.iov_max_config</var>
- (Defaults to 1MB)</dt>
- <dd>The maximum amount of memory permitted for the configuration parameters
- used when creating Virtual Functions via SR-IOV. This tunable can also be
- changed at runtime via <a class="Xr">sysctl(8)</a>.</dd>
- <dt id="hw.pci.realloc_bars"><var class="Va">hw.pci.realloc_bars</var>
- (Defaults to 0)</dt>
- <dd>Attempt to allocate a new resource range during the initial device scan
- for any memory or I/O port resources with firmware-assigned ranges that
- conflict with another active resource.</dd>
- <dt id="hw.pci.usb_early_takeover"><var class="Va">hw.pci.usb_early_takeover</var>
- (Defaults to 1 on amd64 and i386)</dt>
- <dd>Disable legacy device emulation of USB devices during the initial device
- scan. Set this tunable to zero to use USB devices via legacy emulation
- when using a custom kernel without USB controller drivers.</dd>
- <dt id="hw.pci_D_._B_._S_.INT_P_.irq"><var class="Va">hw.pci&lt;D&gt;.&lt;B&gt;.&lt;S&gt;.INT&lt;P&gt;.irq</var></dt>
- <dd>These tunables can be used to override the interrupt routing for legacy
- PCI INTx interrupts. Unlike other tunables in this list, these do not have
- corresponding sysctl nodes. The tunable name includes the address of the
- PCI device as well as the pin of the desired INTx IRQ to override:
- <dl class="Bl-tag">
- <dt>&lt;D&gt;</dt>
- <dd>The domain (or segment) of the PCI device in decimal.</dd>
- <dt>&lt;B&gt;</dt>
- <dd>The bus address of the PCI device in decimal.</dd>
- <dt>&lt;S&gt;</dt>
- <dd>The slot of the PCI device in decimal.</dd>
- <dt>&lt;P&gt;</dt>
- <dd>The interrupt pin of the PCI slot to override. One of
- &#x2018;<code class="Li">A</code>&#x2019;,
- &#x2018;<code class="Li">B</code>&#x2019;,
- &#x2018;<code class="Li">C</code>&#x2019;, or
- &#x2018;<code class="Li">D</code>&#x2019;.</dd>
- </dl>
- <p class="Pp">The value of the tunable is the raw IRQ value to use for the
- INTx interrupt pin identified by the tunable name. Mapping of IRQ values
- to platform interrupt sources is machine dependent.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DEVICE_WIRING"><a class="permalink" href="#DEVICE_WIRING">DEVICE
- WIRING</a></h1>
-<p class="Pp">You can wire the device unit at a given location with
- <a class="Xr">device.hints(5)</a>.</p>
-<section class="Ss">
-<h2 class="Ss" id="BSF_Based_Wiring"><a class="permalink" href="#BSF_Based_Wiring">BSF
- Based Wiring</a></h2>
-<p class="Pp">Devices may be wired to a Bus / Slot / Function (BSF) address.
- This is the form reported by <a class="Xr">pciconf(8)</a> Entries of the
- form
- <var class="Va">hints.&lt;name&gt;.&lt;unit&gt;.at=&quot;pci&lt;B&gt;:&lt;S&gt;:&lt;F&gt;&quot;</var>
- or
- <var class="Va">hints.&lt;name&gt;.&lt;unit&gt;.at=&quot;pci&lt;D&gt;:&lt;B&gt;:&lt;S&gt;:&lt;F&gt;&quot;</var>
- will force the driver <var class="Va">name</var> to probe and attach at unit
- <var class="Va">unit</var> for any PCI device found to match the
- specification, where:</p>
-<dl class="Bl-tag">
- <dt>&lt;D&gt;</dt>
- <dd>The domain (or segment) of the PCI device in decimal. Defaults to 0 if
- unspecified.</dd>
- <dt>&lt;B&gt;</dt>
- <dd>The bus address of the PCI device in decimal.</dd>
- <dt>&lt;S&gt;</dt>
- <dd>The slot of the PCI device in decimal.</dd>
- <dt>&lt;F&gt;</dt>
- <dd>The function of the PCI device in decimal.</dd>
-</dl>
-<p class="Pp">The code to do the matching requires an exact string match. Do not
- specify the angle brackets (&lt; &gt;) in the hints file. Wiring multiple
- devices to the same <var class="Va">name</var> and
- <var class="Va">unit</var> produces undefined results.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Examples"><a class="permalink" href="#Examples">Examples</a></h2>
-<p class="Pp">Given the following lines in
- <span class="Pa">/boot/device.hints</span>:</p>
-<div class="Bd Pp Li">
-<pre>hint.nvme.3.at=&quot;pci6:0:0&quot;
-hint.igb.8.at=&quot;pci14:0:0&quot;</pre>
-</div>
-<p class="Pp">If there is a device that supports <a class="Xr">igb(4)</a> at PCI
- bus 14 slot 0 function 0, then it will be assigned igb8 for probe and
- attach. Likewise, if there is an <a class="Xr">nvme(4)</a> device at PCI bus
- 6 slot 0 function 0, then it will be assigned nvme3 for probe and attach. If
- another type of card is in either of these locations, the name and unit of
- that card will be the default names and will be unaffected by these hints.
- If other igb or nvme cards are located elsewhere, they will be assigned
- their unit numbers sequentially, skipping the unit numbers that have 'at'
- hints.</p>
-</section>
-<section class="Ss">
-<h2 class="Ss" id="Location_Based_Wiring"><a class="permalink" href="#Location_Based_Wiring">Location
- Based Wiring</a></h2>
-<p class="Pp">While simple to locate where to place a device for BSF wiring, the
- bus number of that is not invariant. Any number of changes to the devices
- within the system can cause this value to vary from boot to boot. The UEFI
- Standard defines a device path that's based only on the invariant parts of
- the address: The root complex (domain), the slot number and the function.
- These paths are hard to construct by hand, please see
- <a class="Xr">devctl(8)</a> &#x2018;<code class="Cm">getpath</code>&#x2019;
- command with a &#x2018;<var class="Ar">UEFI</var>&#x2019; locator. The above
- example could also be expressed as</p>
-<div class="Bd Pp Li">
-<pre>hint.nvme.3.at=&quot;PciRoot(0x2)/Pci(0x1,0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)&quot;
-hint.nvme.8.at=&quot;PciRoot(0x1)/Pci(0x2,0x2)/Pci(0x0,0x0)/Pci(0x0,0x0)&quot;</pre>
-</div>
-<p class="Pp">The advantage of this notation is that you can specify the exact
- location a device will be at. For deployments of multiple systems with the
- same configuration, this can be helpful in managing the devices. However,
- even slight variation in motherboards can cause the path to change
- substantially. It is also less natural to think of the UEFI Device Paths
- since little else will report it.</p>
-</section>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="FILES"><a class="permalink" href="#FILES">FILES</a></h1>
-<dl class="Bl-tag Bl-compact">
- <dt><span class="Pa">/dev/pci</span></dt>
- <dd>Character device for the <code class="Nm">pci</code> driver.</dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
- ALSO</a></h1>
-<p class="Pp"><a class="Xr">device.hints(5)</a> <a class="Xr">pciconf(8)</a></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
-<p class="Pp">The <code class="Nm">pci</code> driver (not the kernel's PCI
- support code) first appeared in <span class="Ux">FreeBSD 2.2</span>, and was
- written by Stefan Esser and Garrett Wollman. Support for device listing and
- matching was re-implemented by Kenneth Merry, and first appeared in
- <span class="Ux">FreeBSD 3.0</span>.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1>
-<p class="Pp"><span class="An">Kenneth Merry</span>
- &lt;<a class="Mt" href="mailto:ken@FreeBSD.org">ken@FreeBSD.org</a>&gt;</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="BUGS"><a class="permalink" href="#BUGS">BUGS</a></h1>
-<p class="Pp">It is not possible for users to specify an accurate offset into
- the device list without calling the <code class="Dv">PCIOCGETCONF</code> at
- least once, since they have no way of knowing the current generation number
- otherwise. This probably is not a serious problem, though, since users can
- easily narrow their search by specifying a pattern or patterns for the
- kernel to match against.</p>
-</section>
-</div>
-<table class="foot">
- <tr>
- <td class="foot-date">March 10, 2026</td>
- <td class="foot-os">FreeBSD 15.0</td>
- </tr>
-</table>