349 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| .. 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.
 |