# NTB Drivers

NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
the separate memory systems of two computers to the same PCI-Express fabric.
Existing NTB hardware supports a common feature set, including scratchpad
registers, doorbell registers, and memory translation windows.  Scratchpad
registers are read-and-writable registers that are accessible from either side
of the device, so that peers can exchange a small amount of information at a
fixed address.  Doorbell registers provide a way for peers to send interrupt
events.  Memory windows allow translated read and write access to the peer
memory.

## NTB Core Driver (ntb)

The NTB core driver defines an api wrapping the common feature set, and allows
clients interested in NTB features to discover NTB the devices supported by
hardware drivers.  The term "client" is used here to mean an upper layer
component making use of the NTB api.  The term "driver," or "hardware driver,"
is used here to mean a driver for a specific vendor and model of NTB hardware.

## NTB Client Drivers

NTB client drivers should register with the NTB core driver.  After
registering, the client probe and remove functions will be called appropriately
as ntb hardware, or hardware drivers, are inserted and removed.  The
registration uses the Linux Device framework, so it should feel familiar to
anyone who has written a pci driver.

### NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev)

The primary client for NTB is the Transport client, used in tandem with NTB
Netdev.  These drivers function together to create a logical link to the peer,
across the ntb, to exchange packets of network data.  The Transport client
establishes a logical link to the peer, and creates queue pairs to exchange
messages and data.  The NTB Netdev then creates an ethernet device using a
Transport queue pair.  Network data is copied between socket buffers and the
Transport queue pair buffer.  The Transport client may be used for other things
besides Netdev, however no other applications have yet been written.

### NTB Ping Pong Test Client (ntb\_pingpong)

The Ping Pong test client serves as a demonstration to exercise the doorbell
and scratchpad registers of NTB hardware, and as an example simple NTB client.
Ping Pong enables the link when started, waits for the NTB link to come up, and
then proceeds to read and write the doorbell scratchpad registers of the NTB.
The peers interrupt each other using a bit mask of doorbell bits, which is
shifted by one in each round, to test the behavior of multiple doorbell bits
and interrupt vectors.  The Ping Pong driver also reads the first local
scratchpad, and writes the value plus one to the first peer scratchpad, each
round before writing the peer doorbell register.

Module Parameters:

* unsafe - Some hardware has known issues with scratchpad and doorbell
	registers.  By default, Ping Pong will not attempt to exercise such
	hardware.  You may override this behavior at your own risk by setting
	unsafe=1.
* delay\_ms - Specify the delay between receiving a doorbell
	interrupt event and setting the peer doorbell register for the next
	round.
* init\_db - Specify the doorbell bits to start new series of rounds.  A new
	series begins once all the doorbell bits have been shifted out of
	range.
* dyndbg - It is suggested to specify dyndbg=+p when loading this module, and
	then to observe debugging output on the console.

### NTB Tool Test Client (ntb\_tool)

The Tool test client serves for debugging, primarily, ntb hardware and drivers.
The Tool provides access through debugfs for reading, setting, and clearing the
NTB doorbell, and reading and writing scratchpads.

The Tool does not currently have any module parameters.

Debugfs Files:

* *debugfs*/ntb\_tool/*hw*/ - A directory in debugfs will be created for each
	NTB device probed by the tool.  This directory is shortened to *hw*
	below.
* *hw*/db - This file is used to read, set, and clear the local doorbell.  Not
	all operations may be supported by all hardware.  To read the doorbell,
	read the file.  To set the doorbell, write `s` followed by the bits to
	set (eg: `echo 's 0x0101' > db`).  To clear the doorbell, write `c`
	followed by the bits to clear.
* *hw*/mask - This file is used to read, set, and clear the local doorbell mask.
	See *db* for details.
* *hw*/peer\_db - This file is used to read, set, and clear the peer doorbell.
	See *db* for details.
* *hw*/peer\_mask - This file is used to read, set, and clear the peer doorbell
	mask.  See *db* for details.
* *hw*/spad - This file is used to read and write local scratchpads.  To read
	the values of all scratchpads, read the file.  To write values, write a
	series of pairs of scratchpad number and value
	(eg: `echo '4 0x123 7 0xabc' > spad`
	# to set scratchpads `4` and `7` to `0x123` and `0xabc`, respectively).
* *hw*/peer\_spad - This file is used to read and write peer scratchpads.  See
	*spad* for details.

## NTB Hardware Drivers

NTB hardware drivers should register devices with the NTB core driver.  After
registering, clients probe and remove functions will be called.

### NTB Intel Hardware Driver (ntb\_hw\_intel)

The Intel hardware driver supports NTB on Xeon and Atom CPUs.

Module Parameters:

* b2b\_mw\_idx - If the peer ntb is to be accessed via a memory window, then use
	this memory window to access the peer ntb.  A value of zero or positive
	starts from the first mw idx, and a negative value starts from the last
	mw idx.  Both sides MUST set the same value here!  The default value is
	`-1`.
* b2b\_mw\_share - If the peer ntb is to be accessed via a memory window, and if
	the memory window is large enough, still allow the client to use the
	second half of the memory window for address translation to the peer.
* xeon\_b2b\_usd\_bar2\_addr64 - If using B2B topology on Xeon hardware, use
	this 64 bit address on the bus between the NTB devices for the window
	at BAR2, on the upstream side of the link.
* xeon\_b2b\_usd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_usd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_usd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_dsd\_bar2\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_dsd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_dsd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
* xeon\_b2b\_dsd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
