]>
Commit | Line | Data |
---|---|---|
e3866726 MCC |
1 | =========== |
2 | NTB Drivers | |
3 | =========== | |
a1bd3bae AH |
4 | |
5 | NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects | |
6 | the separate memory systems of two computers to the same PCI-Express fabric. | |
7 | Existing NTB hardware supports a common feature set, including scratchpad | |
8 | registers, doorbell registers, and memory translation windows. Scratchpad | |
9 | registers are read-and-writable registers that are accessible from either side | |
10 | of the device, so that peers can exchange a small amount of information at a | |
11 | fixed address. Doorbell registers provide a way for peers to send interrupt | |
12 | events. Memory windows allow translated read and write access to the peer | |
13 | memory. | |
14 | ||
e3866726 MCC |
15 | NTB Core Driver (ntb) |
16 | ===================== | |
a1bd3bae AH |
17 | |
18 | The NTB core driver defines an api wrapping the common feature set, and allows | |
19 | clients interested in NTB features to discover NTB the devices supported by | |
20 | hardware drivers. The term "client" is used here to mean an upper layer | |
21 | component making use of the NTB api. The term "driver," or "hardware driver," | |
22 | is used here to mean a driver for a specific vendor and model of NTB hardware. | |
23 | ||
e3866726 MCC |
24 | NTB Client Drivers |
25 | ================== | |
a1bd3bae AH |
26 | |
27 | NTB client drivers should register with the NTB core driver. After | |
28 | registering, the client probe and remove functions will be called appropriately | |
29 | as ntb hardware, or hardware drivers, are inserted and removed. The | |
30 | registration uses the Linux Device framework, so it should feel familiar to | |
31 | anyone who has written a pci driver. | |
32 | ||
e3866726 MCC |
33 | NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev) |
34 | ------------------------------------------------------------------ | |
e26a5843 AH |
35 | |
36 | The primary client for NTB is the Transport client, used in tandem with NTB | |
37 | Netdev. These drivers function together to create a logical link to the peer, | |
38 | across the ntb, to exchange packets of network data. The Transport client | |
39 | establishes a logical link to the peer, and creates queue pairs to exchange | |
40 | messages and data. The NTB Netdev then creates an ethernet device using a | |
41 | Transport queue pair. Network data is copied between socket buffers and the | |
42 | Transport queue pair buffer. The Transport client may be used for other things | |
43 | besides Netdev, however no other applications have yet been written. | |
44 | ||
e3866726 MCC |
45 | NTB Ping Pong Test Client (ntb\_pingpong) |
46 | ----------------------------------------- | |
963de473 AH |
47 | |
48 | The Ping Pong test client serves as a demonstration to exercise the doorbell | |
49 | and scratchpad registers of NTB hardware, and as an example simple NTB client. | |
50 | Ping Pong enables the link when started, waits for the NTB link to come up, and | |
51 | then proceeds to read and write the doorbell scratchpad registers of the NTB. | |
52 | The peers interrupt each other using a bit mask of doorbell bits, which is | |
53 | shifted by one in each round, to test the behavior of multiple doorbell bits | |
54 | and interrupt vectors. The Ping Pong driver also reads the first local | |
55 | scratchpad, and writes the value plus one to the first peer scratchpad, each | |
56 | round before writing the peer doorbell register. | |
57 | ||
58 | Module Parameters: | |
59 | ||
60 | * unsafe - Some hardware has known issues with scratchpad and doorbell | |
61 | registers. By default, Ping Pong will not attempt to exercise such | |
62 | hardware. You may override this behavior at your own risk by setting | |
63 | unsafe=1. | |
64 | * delay\_ms - Specify the delay between receiving a doorbell | |
65 | interrupt event and setting the peer doorbell register for the next | |
66 | round. | |
67 | * init\_db - Specify the doorbell bits to start new series of rounds. A new | |
68 | series begins once all the doorbell bits have been shifted out of | |
69 | range. | |
70 | * dyndbg - It is suggested to specify dyndbg=+p when loading this module, and | |
71 | then to observe debugging output on the console. | |
72 | ||
e3866726 MCC |
73 | NTB Tool Test Client (ntb\_tool) |
74 | -------------------------------- | |
578b881b AH |
75 | |
76 | The Tool test client serves for debugging, primarily, ntb hardware and drivers. | |
77 | The Tool provides access through debugfs for reading, setting, and clearing the | |
78 | NTB doorbell, and reading and writing scratchpads. | |
79 | ||
80 | The Tool does not currently have any module parameters. | |
81 | ||
82 | Debugfs Files: | |
83 | ||
e3866726 MCC |
84 | * *debugfs*/ntb\_tool/*hw*/ |
85 | A directory in debugfs will be created for each | |
578b881b AH |
86 | NTB device probed by the tool. This directory is shortened to *hw* |
87 | below. | |
e3866726 MCC |
88 | * *hw*/db |
89 | This file is used to read, set, and clear the local doorbell. Not | |
578b881b AH |
90 | all operations may be supported by all hardware. To read the doorbell, |
91 | read the file. To set the doorbell, write `s` followed by the bits to | |
92 | set (eg: `echo 's 0x0101' > db`). To clear the doorbell, write `c` | |
93 | followed by the bits to clear. | |
e3866726 MCC |
94 | * *hw*/mask |
95 | This file is used to read, set, and clear the local doorbell mask. | |
578b881b | 96 | See *db* for details. |
e3866726 MCC |
97 | * *hw*/peer\_db |
98 | This file is used to read, set, and clear the peer doorbell. | |
578b881b | 99 | See *db* for details. |
e3866726 MCC |
100 | * *hw*/peer\_mask |
101 | This file is used to read, set, and clear the peer doorbell | |
578b881b | 102 | mask. See *db* for details. |
e3866726 MCC |
103 | * *hw*/spad |
104 | This file is used to read and write local scratchpads. To read | |
578b881b AH |
105 | the values of all scratchpads, read the file. To write values, write a |
106 | series of pairs of scratchpad number and value | |
107 | (eg: `echo '4 0x123 7 0xabc' > spad` | |
108 | # to set scratchpads `4` and `7` to `0x123` and `0xabc`, respectively). | |
e3866726 MCC |
109 | * *hw*/peer\_spad |
110 | This file is used to read and write peer scratchpads. See | |
578b881b AH |
111 | *spad* for details. |
112 | ||
e3866726 MCC |
113 | NTB Hardware Drivers |
114 | ==================== | |
a1bd3bae AH |
115 | |
116 | NTB hardware drivers should register devices with the NTB core driver. After | |
117 | registering, clients probe and remove functions will be called. | |
e26a5843 | 118 | |
e3866726 MCC |
119 | NTB Intel Hardware Driver (ntb\_hw\_intel) |
120 | ------------------------------------------ | |
e26a5843 AH |
121 | |
122 | The Intel hardware driver supports NTB on Xeon and Atom CPUs. | |
123 | ||
124 | Module Parameters: | |
125 | ||
e3866726 MCC |
126 | * b2b\_mw\_idx |
127 | If the peer ntb is to be accessed via a memory window, then use | |
e26a5843 AH |
128 | this memory window to access the peer ntb. A value of zero or positive |
129 | starts from the first mw idx, and a negative value starts from the last | |
130 | mw idx. Both sides MUST set the same value here! The default value is | |
131 | `-1`. | |
e3866726 MCC |
132 | * b2b\_mw\_share |
133 | If the peer ntb is to be accessed via a memory window, and if | |
e26a5843 AH |
134 | the memory window is large enough, still allow the client to use the |
135 | second half of the memory window for address translation to the peer. | |
e3866726 MCC |
136 | * xeon\_b2b\_usd\_bar2\_addr64 |
137 | If using B2B topology on Xeon hardware, use | |
2f887b9a DJ |
138 | this 64 bit address on the bus between the NTB devices for the window |
139 | at BAR2, on the upstream side of the link. | |
140 | * xeon\_b2b\_usd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*. | |
141 | * xeon\_b2b\_usd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*. | |
142 | * xeon\_b2b\_usd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*. | |
143 | * xeon\_b2b\_dsd\_bar2\_addr64 - See *xeon\_b2b\_bar2\_addr64*. | |
144 | * xeon\_b2b\_dsd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*. | |
145 | * xeon\_b2b\_dsd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*. | |
146 | * xeon\_b2b\_dsd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*. |