PCI(5) File Formats and Configurations PCI(5)

NAME


pci, pcie - configuration files for PCI and PCI Express device
drivers

DESCRIPTION


The Peripheral Component Interconnect (PCI) bus is a little endian
bus. PCI Express (PCIe) and PCI-X are successors to PCI. All three
types of devices share the same configuration parameters. What is
specified here for PCI devices applies to PCI-X 1.0 devices as well.
All three types of devices are self-identifying, which means that
these devices provide configuration parameters to the system that
allow the system to identify the device and its driver. The
configuration parameters are represented in the form of name-value
pairs that can be retrieved using the DDI property interfaces. See
ddi_prop_lookup(9F) for details.


The bus properties of PCI devices or logical bus properties of PCIe
devices are derived from PCI configuration space, or supplied by the
Fcode PROM, if it exists. Therefore, driver configuration files are
not necessary for these devices.


On some occasions, drivers for PCI and PCIe devices can use driver
configuration files to provide driver private properties through the
global property mechanism. See driver.conf(5) for further details.
Driver configuration files can also be used to augment or override
properties for a specific instance of a driver.


All bus drivers of PCI and PCIe devices recognize the following
properties:

reg
An arbitrary length array where each element of the
array consists of a 5-tuple of 32-bit values. Each
array element describes a logically contiguous mappable
resource on the PCI bus or PCIe device tree.

The first three values in the 5-tuple describe the PCI
address of the mappable resource. The first tuple
contains the following information:


Bits 0 - 7 8-bit register number
Bits 8 - 10 3-bit function number
Bits 11 - 15 5-bit device number
Bits 16 - 23 8-bit bus number
Bits 24 - 25 2-bit address space type identifier
Bits 31 - 28 Register number extended bits 8:11
for extended config space. Zero for
conventional configuration space.

The address space type identifier can be interpreted as
follows:


0x0 configuration space
0x1 I/O space
0x2 32-bit memory space address
0x3 64-bit memory space address

The bus number is a unique identifying number assigned
to each PCI bus or PCIe logical bus within its domain.

The device number is a unique identifying number
assigned to each device on a PCI bus or PCIe logical
bus. Note that a device number is unique only within
the set of device numbers for a particular bus or
logical bus.

Each PCI or PCIe device can have one to eight logically
independent functions, each with its own independent
set of configuration registers. Each function on a
device is assigned a function number. For a device with
only one function, the function number must be 0.

The register number fields select a particular register
within the set of configuration registers corresponding
to the selected function. When the address space type
identifier indicates configuration space, non-zero
register number extended bits select registers in
extended configuration space.

The second and third values in the reg property 5-tuple
specify the 64-bit address of the mappable resource
within the PCI or PCIe address domain. The second
32-bit tuple corresponds to the high order four bytes
of the 64-bit address. The third 32-bit tuple
corresponds to the low order bytes.

The fourth and fifth 32-bit values in the 5-tuple reg
property specify the size of the mappable resource. The
size is a 64-bit value, where the fourth tuple
corresponds to the high order bytes of the 64-bit size
and the fifth corresponds to the low order.

The driver can refer to the elements of this array by
index, and construct kernel mappings to these addresses
using ddi_regs_map_setup(9F). The index into the array
is passed as the rnumber argument of
ddi_regs_map_setup(9F).

At a high-level interrupt context, you can use the
ddi_get* and ddi_put* family of functions to access I/O
and memory space. However, access to configuration
space is not allowed when running at a high-interrupt
level.


interrupts
This property consists of a single-integer element
array. Valid interrupt property values are 1, 2, 3, and
4. This value is derived directly from the contents of
the device's configuration-interrupt-pin register.

A driver should use an index value of 0 when
registering its interrupt handler with the DDI
interrupt interfaces.


All PCI and PCIe devices support the reg property. The device number
and function number as derived from the reg property are used to
construct the address part of the device name under /devices.


Only devices that generate interrupts support an interrupts property.


Occasionally it might be necessary to override or augment the
configuration information supplied by a PCI or PCIe device. This
change can be achieved by writing a driver configuration file that
describes a prototype device node specification containing the
additional properties required.


For the system to merge the prototype node specification into an
actual device node, certain conditions must be met.

o First, the name property must be identical. The value of
the name property needs to match the binding name of the
device. The binding name is the name chosen by the system
to bind a driver to a device and is either an alias
associated with the driver or the hardware node name of
the device.

o Second, the parent property must identify the PCI bus or
PCIe logical bus.

o Third, the unit-address property must identify the card.
The format of the unit-address property is:


DD[,F]


where DD is the device number and F is the function number. If the
function number is 0, only DD is specified.

EXAMPLES


Example 1: Sample Configuration File




An example configuration file called ACME,scsi-hba.conf for a PCI
driver called ACME,scsi-hba follows:


#
# Copyright (c) 1995, ACME SCSI Host Bus Adaptor
# ident "@(#)ACME,scsi-hba.conf 1.1 96/02/04"
name="ACME,scsi-hba" parent="/pci@1,0/pci@1f,4000"
unit-address="3" scsi-initiator-id=6;
hba-advanced-mode="on";
hba-dma-speed=10;


In this example, a property scsi-initiator-id specifies the SCSI bus
initiator id that the adapter should use, for just one particular
instance of adapter installed in the machine. The name property
identifies the driver and the parent property to identify the
particular bus the card is plugged into. This example uses the
parent's full path name to identify the bus. The unit-address
property identifies the card itself, with device number of 3 and
function number of 0.


Two global driver properties are also created: hba-advanced-mode
(which has the string value on) and hba-dma-speed (which has the
value 10 M bit/s). These properties apply to all device nodes of the
ACME,scsi-hba.


Configuration files for PCIe devices are similar. Shown below is an
example configuration file called ACME,pcie-widget.conf for a PCIe
driver called ACME,pcie-widget.


#
# Copyright (c) 2005, ACME PCIe Widget Adapter
# ident "@(#)ACME,pcie-widget.conf 1.1 05/11/14"
name="ACME,pcie-widget" parent="/pci@780" unit-address="2,1"
debug-mode=12;


In this example, we provide a property debug-mode for a particular
PCIe device. As before, the logical bus is identified by the pathname
of the parent of the device. The device has a device number of 2, and
a function number of 1.


ATTRIBUTES


See attributes(7) for descriptions of the following attributes:


+---------------+-----------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+-----------------+
|Architecture | SPARC, x86 |
+---------------+-----------------+

SEE ALSO


driver.conf(5), attributes(7), ddi_intr_add_handler(9F),
ddi_prop_lookup(9F), ddi_regs_map_setup(9F)


Writing Device Drivers


IEEE 1275 PCI Bus Binding

NOTES


PCIe devices support an extended configuration space unavailable to
PCI devices. While PCIe devices can be operated using a PCI device
driver, operating them using a PCIe device driver can make use of the
extended properties and features made available only in the extended
configuration space.

May 13, 2017 PCI(5)

tribblix@gmail.com :: GitHub :: Privacy