| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ================= |
| PCI NTB Function |
| ================= |
| |
| :Author: Kishon Vijay Abraham I <kishon@ti.com> |
| |
| PCI Non-Transparent Bridges (NTB) allow two host systems to communicate |
| with each other by exposing each host as a device to the other host. |
| NTBs typically support the ability to generate interrupts on the remote |
| machine, expose memory ranges as BARs, and perform DMA. They also support |
| scratchpads, which are areas of memory within the NTB that are accessible |
| from both machines. |
| |
| PCI NTB Function allows two different systems (or hosts) to communicate |
| with each other by configuring the endpoint instances in such a way that |
| transactions from one system are routed to the other system. |
| |
| In the below diagram, PCI NTB function configures the SoC with multiple |
| PCI Endpoint (EP) instances in such a way that transactions from one EP |
| controller are routed to the other EP controller. Once PCI NTB function |
| configures the SoC with multiple EP instances, HOST1 and HOST2 can |
| communicate with each other using SoC as a bridge. |
| |
| .. code-block:: text |
| |
| +-------------+ +-------------+ |
| | | | | |
| | HOST1 | | HOST2 | |
| | | | | |
| +------^------+ +------^------+ |
| | | |
| | | |
| +---------|-------------------------------------------------|---------+ |
| | +------v------+ +------v------+ | |
| | | | | | | |
| | | EP | | EP | | |
| | | CONTROLLER1 | | CONTROLLER2 | | |
| | | <-----------------------------------> | | |
| | | | | | | |
| | | | | | | |
| | | | SoC With Multiple EP Instances | | | |
| | | | (Configured using NTB Function) | | | |
| | +-------------+ +-------------+ | |
| +---------------------------------------------------------------------+ |
| |
| Constructs used for Implementing NTB |
| ==================================== |
| |
| 1) Config Region |
| 2) Self Scratchpad Registers |
| 3) Peer Scratchpad Registers |
| 4) Doorbell (DB) Registers |
| 5) Memory Window (MW) |
| |
| |
| Config Region: |
| -------------- |
| |
| Config Region is a construct that is specific to NTB implemented using NTB |
| Endpoint Function Driver. The host and endpoint side NTB function driver will |
| exchange information with each other using this region. Config Region has |
| Control/Status Registers for configuring the Endpoint Controller. Host can |
| write into this region for configuring the outbound Address Translation Unit |
| (ATU) and to indicate the link status. Endpoint can indicate the status of |
| commands issued by host in this region. Endpoint can also indicate the |
| scratchpad offset and number of memory windows to the host using this region. |
| |
| The format of Config Region is given below. All the fields here are 32 bits. |
| |
| .. code-block:: text |
| |
| +------------------------+ |
| | COMMAND | |
| +------------------------+ |
| | ARGUMENT | |
| +------------------------+ |
| | STATUS | |
| +------------------------+ |
| | TOPOLOGY | |
| +------------------------+ |
| | ADDRESS (LOWER 32) | |
| +------------------------+ |
| | ADDRESS (UPPER 32) | |
| +------------------------+ |
| | SIZE | |
| +------------------------+ |
| | NO OF MEMORY WINDOW | |
| +------------------------+ |
| | MEMORY WINDOW1 OFFSET | |
| +------------------------+ |
| | SPAD OFFSET | |
| +------------------------+ |
| | SPAD COUNT | |
| +------------------------+ |
| | DB ENTRY SIZE | |
| +------------------------+ |
| | DB DATA | |
| +------------------------+ |
| | : | |
| +------------------------+ |
| | : | |
| +------------------------+ |
| | DB DATA | |
| +------------------------+ |
| |
| |
| COMMAND: |
| |
| NTB function supports three commands: |
| |
| CMD_CONFIGURE_DOORBELL (0x1): Command to configure doorbell. Before |
| invoking this command, the host should allocate and initialize |
| MSI/MSI-X vectors (i.e., initialize the MSI/MSI-X Capability in the |
| Endpoint). The endpoint on receiving this command will configure |
| the outbound ATU such that transactions to Doorbell BAR will be routed |
| to the MSI/MSI-X address programmed by the host. The ARGUMENT |
| register should be populated with number of DBs to configure (in the |
| lower 16 bits) and if MSI or MSI-X should be configured (BIT 16). |
| |
| CMD_CONFIGURE_MW (0x2): Command to configure memory window (MW). The |
| host invokes this command after allocating a buffer that can be |
| accessed by remote host. The allocated address should be programmed |
| in the ADDRESS register (64 bit), the size should be programmed in |
| the SIZE register and the memory window index should be programmed |
| in the ARGUMENT register. The endpoint on receiving this command |
| will configure the outbound ATU such that transactions to MW BAR |
| are routed to the address provided by the host. |
| |
| CMD_LINK_UP (0x3): Command to indicate an NTB application is |
| bound to the EP device on the host side. Once the endpoint |
| receives this command from both the hosts, the endpoint will |
| raise a LINK_UP event to both the hosts to indicate the host |
| NTB applications can start communicating with each other. |
| |
| ARGUMENT: |
| |
| The value of this register is based on the commands issued in |
| command register. See COMMAND section for more information. |
| |
| TOPOLOGY: |
| |
| Set to NTB_TOPO_B2B_USD for Primary interface |
| Set to NTB_TOPO_B2B_DSD for Secondary interface |
| |
| ADDRESS/SIZE: |
| |
| Address and Size to be used while configuring the memory window. |
| See "CMD_CONFIGURE_MW" for more info. |
| |
| MEMORY WINDOW1 OFFSET: |
| |
| Memory Window 1 and Doorbell registers are packed together in the |
| same BAR. The initial portion of the region will have doorbell |
| registers and the latter portion of the region is for memory window 1. |
| This register will specify the offset of the memory window 1. |
| |
| NO OF MEMORY WINDOW: |
| |
| Specifies the number of memory windows supported by the NTB device. |
| |
| SPAD OFFSET: |
| |
| Self scratchpad region and config region are packed together in the |
| same BAR. The initial portion of the region will have config region |
| and the latter portion of the region is for self scratchpad. This |
| register will specify the offset of the self scratchpad registers. |
| |
| SPAD COUNT: |
| |
| Specifies the number of scratchpad registers supported by the NTB |
| device. |
| |
| DB ENTRY SIZE: |
| |
| Used to determine the offset within the DB BAR that should be written |
| in order to raise doorbell. EPF NTB can use either MSI or MSI-X to |
| ring doorbell (MSI-X support will be added later). MSI uses same |
| address for all the interrupts and MSI-X can provide different |
| addresses for different interrupts. The MSI/MSI-X address is provided |
| by the host and the address it gives is based on the MSI/MSI-X |
| implementation supported by the host. For instance, ARM platform |
| using GIC ITS will have the same MSI-X address for all the interrupts. |
| In order to support all the combinations and use the same mechanism |
| for both MSI and MSI-X, EPF NTB allocates a separate region in the |
| Outbound Address Space for each of the interrupts. This region will |
| be mapped to the MSI/MSI-X address provided by the host. If a host |
| provides the same address for all the interrupts, all the regions |
| will be translated to the same address. If a host provides different |
| addresses, the regions will be translated to different addresses. This |
| will ensure there is no difference while raising the doorbell. |
| |
| DB DATA: |
| |
| EPF NTB supports 32 interrupts, so there are 32 DB DATA registers. |
| This holds the MSI/MSI-X data that has to be written to MSI address |
| for raising doorbell interrupt. This will be populated by EPF NTB |
| while invoking CMD_CONFIGURE_DOORBELL. |
| |
| Scratchpad Registers: |
| --------------------- |
| |
| Each host has its own register space allocated in the memory of NTB endpoint |
| controller. They are both readable and writable from both sides of the bridge. |
| They are used by applications built over NTB and can be used to pass control |
| and status information between both sides of a device. |
| |
| Scratchpad registers has 2 parts |
| 1) Self Scratchpad: Host's own register space |
| 2) Peer Scratchpad: Remote host's register space. |
| |
| Doorbell Registers: |
| ------------------- |
| |
| Doorbell Registers are used by the hosts to interrupt each other. |
| |
| Memory Window: |
| -------------- |
| |
| Actual transfer of data between the two hosts will happen using the |
| memory window. |
| |
| Modeling Constructs: |
| ==================== |
| |
| There are 5 or more distinct regions (config, self scratchpad, peer |
| scratchpad, doorbell, one or more memory windows) to be modeled to achieve |
| NTB functionality. At least one memory window is required while more than |
| one is permitted. All these regions should be mapped to BARs for hosts to |
| access these regions. |
| |
| If one 32-bit BAR is allocated for each of these regions, the scheme would |
| look like this: |
| |
| ====== =============== |
| BAR NO CONSTRUCTS USED |
| ====== =============== |
| BAR0 Config Region |
| BAR1 Self Scratchpad |
| BAR2 Peer Scratchpad |
| BAR3 Doorbell |
| BAR4 Memory Window 1 |
| BAR5 Memory Window 2 |
| ====== =============== |
| |
| However if we allocate a separate BAR for each of the regions, there would not |
| be enough BARs for all the regions in a platform that supports only 64-bit |
| BARs. |
| |
| In order to be supported by most of the platforms, the regions should be |
| packed and mapped to BARs in a way that provides NTB functionality and |
| also makes sure the host doesn't access any region that it is not supposed |
| to. |
| |
| The following scheme is used in EPF NTB Function: |
| |
| ====== =============================== |
| BAR NO CONSTRUCTS USED |
| ====== =============================== |
| BAR0 Config Region + Self Scratchpad |
| BAR1 Peer Scratchpad |
| BAR2 Doorbell + Memory Window 1 |
| BAR3 Memory Window 2 |
| BAR4 Memory Window 3 |
| BAR5 Memory Window 4 |
| ====== =============================== |
| |
| With this scheme, for the basic NTB functionality 3 BARs should be sufficient. |
| |
| Modeling Config/Scratchpad Region: |
| ---------------------------------- |
| |
| .. code-block:: text |
| |
| +-----------------+------->+------------------+ +-----------------+ |
| | BAR0 | | CONFIG REGION | | BAR0 | |
| +-----------------+----+ +------------------+<-------+-----------------+ |
| | BAR1 | | |SCRATCHPAD REGION | | BAR1 | |
| +-----------------+ +-->+------------------+<-------+-----------------+ |
| | BAR2 | Local Memory | BAR2 | |
| +-----------------+ +-----------------+ |
| | BAR3 | | BAR3 | |
| +-----------------+ +-----------------+ |
| | BAR4 | | BAR4 | |
| +-----------------+ +-----------------+ |
| | BAR5 | | BAR5 | |
| +-----------------+ +-----------------+ |
| EP CONTROLLER 1 EP CONTROLLER 2 |
| |
| Above diagram shows Config region + Scratchpad region for HOST1 (connected to |
| EP controller 1) allocated in local memory. The HOST1 can access the config |
| region and scratchpad region (self scratchpad) using BAR0 of EP controller 1. |
| The peer host (HOST2 connected to EP controller 2) can also access this |
| scratchpad region (peer scratchpad) using BAR1 of EP controller 2. This |
| diagram shows the case where Config region and Scratchpad regions are allocated |
| for HOST1, however the same is applicable for HOST2. |
| |
| Modeling Doorbell/Memory Window 1: |
| ---------------------------------- |
| |
| .. code-block:: text |
| |
| +-----------------+ +----->+----------------+-----------+-----------------+ |
| | BAR0 | | | Doorbell 1 +-----------> MSI-X ADDRESS 1 | |
| +-----------------+ | +----------------+ +-----------------+ |
| | BAR1 | | | Doorbell 2 +---------+ | | |
| +-----------------+----+ +----------------+ | | | |
| | BAR2 | | Doorbell 3 +-------+ | +-----------------+ |
| +-----------------+----+ +----------------+ | +-> MSI-X ADDRESS 2 | |
| | BAR3 | | | Doorbell 4 +-----+ | +-----------------+ |
| +-----------------+ | |----------------+ | | | | |
| | BAR4 | | | | | | +-----------------+ |
| +-----------------+ | | MW1 +---+ | +-->+ MSI-X ADDRESS 3|| |
| | BAR5 | | | | | | +-----------------+ |
| +-----------------+ +----->-----------------+ | | | | |
| EP CONTROLLER 1 | | | | +-----------------+ |
| | | | +---->+ MSI-X ADDRESS 4 | |
| +----------------+ | +-----------------+ |
| EP CONTROLLER 2 | | | |
| (OB SPACE) | | | |
| +-------> MW1 | |
| | | |
| | | |
| +-----------------+ |
| | | |
| | | |
| | | |
| | | |
| | | |
| +-----------------+ |
| PCI Address Space |
| (Managed by HOST2) |
| |
| Above diagram shows how the doorbell and memory window 1 is mapped so that |
| HOST1 can raise doorbell interrupt on HOST2 and also how HOST1 can access |
| buffers exposed by HOST2 using memory window1 (MW1). Here doorbell and |
| memory window 1 regions are allocated in EP controller 2 outbound (OB) address |
| space. Allocating and configuring BARs for doorbell and memory window1 |
| is done during the initialization phase of NTB endpoint function driver. |
| Mapping from EP controller 2 OB space to PCI address space is done when HOST2 |
| sends CMD_CONFIGURE_MW/CMD_CONFIGURE_DOORBELL. |
| |
| Modeling Optional Memory Windows: |
| --------------------------------- |
| |
| This is modeled the same was as MW1 but each of the additional memory windows |
| is mapped to separate BARs. |