123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # 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*.
|