PCI Slots

The PCI slots are instantiated to represent their associated properties and operations. The slot properties are exported to OS through the device tree node of the corresponding parent PCI device. The slot operations are used to accomodate requests from OS regarding the indicated PCI slot:

  • PCI slot reset

  • PCI slot property retrival

The PCI slots are expected to be created by individual platforms based on the given templates, which are classified to PHB slot or normal one currently. The PHB slot is instantiated based on PHB types like P7IOC and PHB3. However, the normal PCI slots are created based on general RC (Root Complex), PCIE switch ports, PCIE-to-PCIx bridge. Individual platform may create PCI slot, which doesn’t have existing template.

The PCI slots are created at different stages according to their types. PHB slots are expected to be created once the PHB is register (struct platform::pci_setup_phb()) because the PHB slot reset operations are required at early stage of PCI enumeration. The normal slots are populated after their parent PCI devices are instantiated at struct platform::pci_get_slot_info().

The operation set supplied by the template might be overrided and reimplemented, or partially. It’s usually done according to the VPD figured out by individual platforms.

PCI Slot Operations

The following operations are supported to one particular PCI slot. More details could be found from the definition of struct pci_slot_ops:

Operation

Definition

get_presence_state

Check if any adapter connected to slot

get_link_state

Retrieve PCIE link status: up, down, link width

get_power_state

Retrieve the power status: on, off

get_attention_state

Retrieve attention status: on, off, blinking

get_latch_state

Retrieve latch status

set_power_state

Configure the power status: on, off

set_attention_state

Configure attention status: on, off, blinking

prepare_link_change

Prepare PCIE link status change

poll_link

Poll PCIE link until it’s up or down permanently

creset

Complete reset, only available to PHB slot

freset

Fundamental reset

hreset

Hot reset

poll

Interface for OPAL API to drive internal state machine

add_properties

Additional PCI slot properties seen by platform

PCI Slot Properties

The following PCI slot properties have been exported through PCI device tree node for a root port, a PCIE switch port, or a PCIE to PCIx bridge. If the individual platforms (e.g. Firenze and Apollo) have VPD for the PCI slot, they should extract the PCI slot properties from VPD and export them accordingly.

Property

Definition

ibm,reset-by-firmware

Boolean indicating whether the slot reset should be done in firmware

ibm,slot-pluggable

Boolean indicating whether the slot is pluggable

ibm,slot-surprise-pluggable

Boolean indicating whether the slot supports surprise hotplug

ibm,slot-broken-pdc

Boolean indicating whether PDC (Presence Detection Change) is broken

ibm,slot-power-ctl

Boolean indicating whether the slot has power control

ibm,slot-wired-lanes

The number of hardware lanes that are wired

ibm,slot-pwr-led-ctl

Presence of slot power led, and controlling entity

ibm,slot-attn-led-ctl

Presence of slot ATTN led, and controlling entity

PCI Hotplug

The implementation of PCI slot hotplug heavily relies on its power state. Initially, the slot is powered off if there are no adapters behind it. Otherwise, the slot should be powered on.

In hot add scenario, the adapter is physically inserted to PCI slot. Then the PCI slot is powered on by OPAL API opal_pci_set_power_state(). The power is supplied to the PCI slot, the adapter behind the PCI slot is probed and the device sub-tree (for hot added devices) is populated. A OPAL message is sent to OS on completion. The OS needs retrieve the device sub-tree through OPAL API opal_get_device_tree(), unflatten it and populate the device sub-tree. After that, the adapter behind the PCI slot should be probed and added to the system.

On the other hand, the OS removes the adapter behind the PCI slot before calling opal_pci_set_power_state(). Skiboot cuts off the power supply to the PCI slot, removes the adapter behind the PCI slot and the corresponding device sub-tree. A OPAL message (OPAL_MSG_ASYNC_COMP) is sent to OS. The OS removes the device sub-tree for the adapter behind the PCI slot.

The OPAL message used in PCI hotplug is comprised of 4 dwords in sequence: asychronous token from OS, PCI slot device node’s phandle, OPAL_PCI_SLOT_POWER_{ON, OFF}, OPAL_SUCCESS or errcode.

The states OPAL_PCI_SLOT_OFFLINE and OPAL_PCI_SLOT_ONLINE are used for removing or adding devices behind the slot. The device nodes in the device tree are removed or added accordingly, without actually changing the slot’s power state. The API call will return OPAL_SUCCESS immediately and no further asynchronous message will be sent.

PCI Slot on Apollo and Firenze

On IBM’s Apollo and Firenze platform, the PCI VPD is fetched from dedicated LID, which is organized in so-called 1004, 1005, or 1006 format. 1006 mapping format isn’t supported currently. The PCI slot properties are figured out from the VPD. On the other hand, there might have external power management entity hooked to I2C buses for one PCI slot. The fundamental reset operation of the PCI slot should be implemented based on the external power management entity for that case.

On Firenze platform, PERST pin is accessible through bit#10 of PCI config register (offset: 0x80) for those PCI slots behind some PLX switch downstream ports. For those PCI slots, PERST pin is utilized to implement fundamental reset if external power management entity doesn’t exist.

For Apollo and Firenze platform, following PCI slot properties are exported through PCI device tree node except those generic properties (as above):

Property

Definition

ibm,slot-location-code

System location code string for the slot connector

ibm,slot-label

Slot label, part of “ibm,slot-location-code”