.. _nvlink: OPAL/Skiboot Nvlink Interface Documentation =========================================== Overview -------- NV-Link is a high speed interconnect that is used in conjunction with a PCI-E connection to create an interface between chips that provides very high data bandwidth. The PCI-E connection is used as the control path to initiate and report status of large data transfers. The data transfers themselves are sent over the NV-Link. On IBM Power systems the NV-Link hardware is similar to our standard PCI hardware so to maximise code reuse the NV-Link is exposed as an emulated PCI device through system firmware (OPAL/skiboot). Thus each NV-Link capable device will appear as two devices on a system, the real PCI-E device and at least one emulated PCI device used for the NV-Link. Presently the NV-Link is only capable of data transfers initiated by the target, thus the emulated PCI device will only handle registers for link initialisation, DMA transfers and error reporting (EEH). Emulated PCI Devices -------------------- Each link will be exported as an emulated PCI device with a minimum of two emulated PCI devices per GPU. Emulated PCI devices are grouped per GPU. The emulated PCI device will be exported as a standard PCI device by the Linux kernel. It has a standard PCI configuration space to expose necessary device parameters. The only functionality available is related to the setup of DMA windows. Configuration Space Parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ============ =================== ===== ============ =================== ===== Vendor ID 0x1014 (IBM) Device ID 0x04ea Revision ID 0x00 Class 0x068000 / 0x068001 (Bridge Device Other, ProgIf = 0x0 / 0x1) BAR0/1 TL/DL Registers BAR2/3 GEN-ID Registers (Only for rev-id = 0x1) ============ =================== ===== TL/DL Registers ^^^^^^^^^^^^^^^ Each link has 128KB of TL/DL registers. These will always be mapped to 64-bit BAR#0 of the emulated PCI device configuration space. :: BAR#0 + 128K +-----------+ | NTL (64K) | BAR#0 + 64K +-----------+ | DL (64K) | BAR#0 +-----------+ Generation Registers (GEN-ID) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ On POWER9 each link has 64K of generation ID registers for the relaxed ordering mode syncronisation. Refer to the programming guide for details of the register layout in this BAR. Relaxed ordering mode will be disabled by default as it requires device driver support. Device drivers will need to request relaxed ordering mode through some yet to be designed mechanism. Vendor Specific Capabilities ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: +-----------------+----------------+----------------+----------------+ | Version (0x02) | Cap Length | Next Cap Ptr | Cap ID (0x09) | +-----------------+----------------+----------------+----------------+ | Procedure Status Register | +--------------------------------------------------------------------+ | Procedure Control Register | +---------------------------------------------------+----------------+ | Reserved | PCI Dev Flag | Link Number | +---------------------------------------------------+----------------+ Version This refers to the version of the NPU config space. Used by device drivers to determine which fields of the config space they can expect to be available. Procedure Control Register Used to start hardware procedures. Writes will start the corresponding procedure and set bit 31 in the procedure status register. This register must not be written while bit 31 is set in the status register. Performing a write while another procudure is already in progress will abort that procedure. Reads will return the in progress procedure or the last completed procedure number depending on the procedure status field. Procedure Numbers: 0. Abort in-progress procedure 1. NOP 2. Unsupported procedure 3. Unsupported procedure 4. Naples PHY - RESET 5. Naples PHY - TX_ZCAL 6. Naples PHY - RX_DCCAL 7. Naples PHY - TX_RXCAL_ENABLE 8. Naples PHY - TX_RXCAL_DISABLE 9. Naples PHY - RX_TRAINING 10. Naples NPU - RESET 11. Naples PHY - PHY preterminate 12. Naples PHY - PHY terminated 13. Witherspoon TL credit validation Procedure 5 (TX_ZCAL) should only be run once. System firmware will ensure this so device drivers may call this procedure mutiple times. Procedure Status Register The procedure status register is used to determine when execution of the procedure number in the control register is complete and if it completed successfully. This register must be polled frequently to allow system firmware to execute the procedures. Fields: Bit 31 - Procedure in progress Bit 30 - Procedure complete Bit 3-0 - Procedure completion code Procedure completion codes: 0 - Procedure completed successfully. 1 - Transient failure. Procedure should be rerun. 2 - Permanent failure. Procedure will never complete successfully. 3 - Procedure aborted. 4 - Unsupported procedure. PCI Device Flag Bit 0 - set if the GPU PCIe device associated with this nvlink was found. bit 1 - set if the DL has been taken out of reset. Link Number Physical link number this emulated PCI device is associated with. One of 0, 1, 4 or 5 (links 2 & 3 do not exist on Naples). Reserved These fields must be ignored and no value should be assumed. Interrupts ^^^^^^^^^^ Each link has a single DL/TL interrupt assigned to it. These will be exposed as an LSI via the emulated PCI device. There are 4 links consuming 4 LSI interrupts. The 4 remaining interrupts supported by the corresponding PHB will be routed to OS platform for the purpose of error reporting. Device Tree Bindings -------------------- See :ref:`device-tree/nvlink`