Documentation/driver-api/ntb.rst GitHub 원문 ↗

Linux 6.18.37 · Driver API

NTB Drivers

NTB memory window, client, test tool와 Intel driver의 전문 번역입니다.

Source pathDocumentation/driver-api/ntb.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

ntb.rst:1-263

NTB는 doorbell과 translated memory window로 peer system을 연결하며 core, transport/netdev, test client와 hardware driver 계층을 제공합니다.

문서 구성
원문 줄내용
1-34NTB core와 client
35-122Memory window
123-162Transport와 Ping Pong
163-229Tool과 MSI test
230-263Intel hardware driver

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ===========
2 NTB Drivers
3 ===========
4
5 NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
6 the separate memory systems of two or more computers to the same PCI-Express
7 fabric. Existing NTB hardware supports a common feature set: doorbell
8 registers and memory translation windows, as well as non common features like
9 scratchpad and message registers. Scratchpad registers are read-and-writable
10 registers that are accessible from either side of the device, so that peers can
11 exchange a small amount of information at a fixed address. Message registers can
12 be utilized for the same purpose. Additionally they are provided with
13 special status bits to make sure the information isn't rewritten by another
14 peer. Doorbell registers provide a way for peers to send interrupt events.
15 Memory windows allow translated read and write access to the peer memory.
16
17 NTB Core Driver (ntb)
18 =====================
19
20 The NTB core driver defines an api wrapping the common feature set, and allows
21 clients interested in NTB features to discover NTB the devices supported by
22 hardware drivers. The term "client" is used here to mean an upper layer
23 component making use of the NTB api. The term "driver," or "hardware driver,"
24 is used here to mean a driver for a specific vendor and model of NTB hardware.
25
26 NTB Client Drivers
27 ==================
28
29 NTB client drivers should register with the NTB core driver. After
30 registering, the client probe and remove functions will be called appropriately
31 as ntb hardware, or hardware drivers, are inserted and removed. The
32 registration uses the Linux Device framework, so it should feel familiar to
33 anyone who has written a pci driver.
34
35 NTB Typical client driver implementation
36 ----------------------------------------
37
38 Primary purpose of NTB is to share some piece of memory between at least two
39 systems. So the NTB device features like Scratchpad/Message registers are
40 mainly used to perform the proper memory window initialization. Typically
41 there are two types of memory window interfaces supported by the NTB API:
42 inbound translation configured on the local ntb port and outbound translation
43 configured by the peer, on the peer ntb port. The first type is
44 depicted on the next figure::
45
46 Inbound translation:
47
48 Memory: Local NTB Port: Peer NTB Port: Peer MMIO:
49 ____________
50 | dma-mapped |-ntb_mw_set_trans(addr) |
51 | memory | _v____________ | ______________
52 | (addr) |<======| MW xlat addr |<====| MW base addr |<== memory-mapped IO
53 |------------| |--------------| | |--------------|
54
55 So typical scenario of the first type memory window initialization looks:
56 1) allocate a memory region, 2) put translated address to NTB config,
57 3) somehow notify a peer device of performed initialization, 4) peer device
58 maps corresponding outbound memory window so to have access to the shared
59 memory region.
60
61 The second type of interface, that implies the shared windows being
62 initialized by a peer device, is depicted on the figure::
63
64 Outbound translation:
65
66 Memory: Local NTB Port: Peer NTB Port: Peer MMIO:
67 ____________ ______________
68 | dma-mapped | | | MW base addr |<== memory-mapped IO
69 | memory | | |--------------|
70 | (addr) |<===================| MW xlat addr |<-ntb_peer_mw_set_trans(addr)
71 |------------| | |--------------|
72
73 Typical scenario of the second type interface initialization would be:
74 1) allocate a memory region, 2) somehow deliver a translated address to a peer
75 device, 3) peer puts the translated address to NTB config, 4) peer device maps
76 outbound memory window so to have access to the shared memory region.
77
78 As one can see the described scenarios can be combined in one portable
79 algorithm.
80
81 Local device:
82 1) Allocate memory for a shared window
83 2) Initialize memory window by translated address of the allocated region
84 (it may fail if local memory window initialization is unsupported)
85 3) Send the translated address and memory window index to a peer device
86
87 Peer device:
88 1) Initialize memory window with retrieved address of the allocated
89 by another device memory region (it may fail if peer memory window
90 initialization is unsupported)
91 2) Map outbound memory window
92
93 In accordance with this scenario, the NTB Memory Window API can be used as
94 follows:
95
96 Local device:
97 1) ntb_mw_count(pidx) - retrieve number of memory ranges, which can
98 be allocated for memory windows between local device and peer device
99 of port with specified index.
100 2) ntb_get_align(pidx, midx) - retrieve parameters restricting the
101 shared memory region alignment and size. Then memory can be properly
102 allocated.
103 3) Allocate physically contiguous memory region in compliance with
104 restrictions retrieved in 2).
105 4) ntb_mw_set_trans(pidx, midx) - try to set translation address of
106 the memory window with specified index for the defined peer device
107 (it may fail if local translated address setting is not supported)
108 5) Send translated base address (usually together with memory window
109 number) to the peer device using, for instance, scratchpad or message
110 registers.
111
112 Peer device:
113 1) ntb_peer_mw_set_trans(pidx, midx) - try to set received from other
114 device (related to pidx) translated address for specified memory
115 window. It may fail if retrieved address, for instance, exceeds
116 maximum possible address or isn't properly aligned.
117 2) ntb_peer_mw_get_addr(widx) - retrieve MMIO address to map the memory
118 window so to have an access to the shared memory.
119
120 Also it is worth to note, that method ntb_mw_count(pidx) should return the
121 same value as ntb_peer_mw_count() on the peer with port index - pidx.
122
123 NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev)
124 ------------------------------------------------------------------
125
126 The primary client for NTB is the Transport client, used in tandem with NTB
127 Netdev. These drivers function together to create a logical link to the peer,
128 across the ntb, to exchange packets of network data. The Transport client
129 establishes a logical link to the peer, and creates queue pairs to exchange
130 messages and data. The NTB Netdev then creates an ethernet device using a
131 Transport queue pair. Network data is copied between socket buffers and the
132 Transport queue pair buffer. The Transport client may be used for other things
133 besides Netdev, however no other applications have yet been written.
134
135 NTB Ping Pong Test Client (ntb\_pingpong)
136 -----------------------------------------
137
138 The Ping Pong test client serves as a demonstration to exercise the doorbell
139 and scratchpad registers of NTB hardware, and as an example simple NTB client.
140 Ping Pong enables the link when started, waits for the NTB link to come up, and
141 then proceeds to read and write the doorbell scratchpad registers of the NTB.
142 The peers interrupt each other using a bit mask of doorbell bits, which is
143 shifted by one in each round, to test the behavior of multiple doorbell bits
144 and interrupt vectors. The Ping Pong driver also reads the first local
145 scratchpad, and writes the value plus one to the first peer scratchpad, each
146 round before writing the peer doorbell register.
147
148 Module Parameters:
149
150 * unsafe - Some hardware has known issues with scratchpad and doorbell
151 registers. By default, Ping Pong will not attempt to exercise such
152 hardware. You may override this behavior at your own risk by setting
153 unsafe=1.
154 * delay\_ms - Specify the delay between receiving a doorbell
155 interrupt event and setting the peer doorbell register for the next
156 round.
157 * init\_db - Specify the doorbell bits to start new series of rounds. A new
158 series begins once all the doorbell bits have been shifted out of
159 range.
160 * dyndbg - It is suggested to specify dyndbg=+p when loading this module, and
161 then to observe debugging output on the console.
162
163 NTB Tool Test Client (ntb\_tool)
164 --------------------------------
165
166 The Tool test client serves for debugging, primarily, ntb hardware and drivers.
167 The Tool provides access through debugfs for reading, setting, and clearing the
168 NTB doorbell, and reading and writing scratchpads.
169
170 The Tool does not currently have any module parameters.
171
172 Debugfs Files:
173
174 * *debugfs*/ntb\_tool/*hw*/
175 A directory in debugfs will be created for each
176 NTB device probed by the tool. This directory is shortened to *hw*
177 below.
178 * *hw*/db
179 This file is used to read, set, and clear the local doorbell. Not
180 all operations may be supported by all hardware. To read the doorbell,
181 read the file. To set the doorbell, write `s` followed by the bits to
182 set (eg: `echo 's 0x0101' > db`). To clear the doorbell, write `c`
183 followed by the bits to clear.
184 * *hw*/mask
185 This file is used to read, set, and clear the local doorbell mask.
186 See *db* for details.
187 * *hw*/peer\_db
188 This file is used to read, set, and clear the peer doorbell.
189 See *db* for details.
190 * *hw*/peer\_mask
191 This file is used to read, set, and clear the peer doorbell
192 mask. See *db* for details.
193 * *hw*/spad
194 This file is used to read and write local scratchpads. To read
195 the values of all scratchpads, read the file. To write values, write a
196 series of pairs of scratchpad number and value
197 (eg: `echo '4 0x123 7 0xabc' > spad`
198 # to set scratchpads `4` and `7` to `0x123` and `0xabc`, respectively).
199 * *hw*/peer\_spad
200 This file is used to read and write peer scratchpads. See
201 *spad* for details.
202
203 NTB MSI Test Client (ntb\_msi\_test)
204 ------------------------------------
205
206 The MSI test client serves to test and debug the MSI library which
207 allows for passing MSI interrupts across NTB memory windows. The
208 test client is interacted with through the debugfs filesystem:
209
210 * *debugfs*/ntb\_msi\_test/*hw*/
211 A directory in debugfs will be created for each
212 NTB device probed by the msi test. This directory is shortened to *hw*
213 below.
214 * *hw*/port
215 This file describes the local port number
216 * *hw*/irq*_occurrences
217 One occurrences file exists for each interrupt and, when read,
218 returns the number of times the interrupt has been triggered.
219 * *hw*/peer*/port
220 This file describes the port number for each peer
221 * *hw*/peer*/count
222 This file describes the number of interrupts that can be
223 triggered on each peer
224 * *hw*/peer*/trigger
225 Writing an interrupt number (any number less than the value
226 specified in count) will trigger the interrupt on the
227 specified peer. That peer's interrupt's occurrence file
228 should be incremented.
229
230 NTB Hardware Drivers
231 ====================
232
233 NTB hardware drivers should register devices with the NTB core driver. After
234 registering, clients probe and remove functions will be called.
235
236 NTB Intel Hardware Driver (ntb\_hw\_intel)
237 ------------------------------------------
238
239 The Intel hardware driver supports NTB on Xeon and Atom CPUs.
240
241 Module Parameters:
242
243 * b2b\_mw\_idx
244 If the peer ntb is to be accessed via a memory window, then use
245 this memory window to access the peer ntb. A value of zero or positive
246 starts from the first mw idx, and a negative value starts from the last
247 mw idx. Both sides MUST set the same value here! The default value is
248 `-1`.
249 * b2b\_mw\_share
250 If the peer ntb is to be accessed via a memory window, and if
251 the memory window is large enough, still allow the client to use the
252 second half of the memory window for address translation to the peer.
253 * xeon\_b2b\_usd\_bar2\_addr64
254 If using B2B topology on Xeon hardware, use
255 this 64 bit address on the bus between the NTB devices for the window
256 at BAR2, on the upstream side of the link.
257 * xeon\_b2b\_usd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
258 * xeon\_b2b\_usd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
259 * xeon\_b2b\_usd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
260 * xeon\_b2b\_dsd\_bar2\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
261 * xeon\_b2b\_dsd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
262 * xeon\_b2b\_dsd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
263 * xeon\_b2b\_dsd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
264

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Non-Transparent Bridge 기능

1-16

NTB, Non-Transparent Bridge는 두 대 이상 computer의 분리된 memory system을 같은 PCI Express fabric에 연결하는 bridge chip입니다.

공통 기능은 doorbell register와 memory translation window이며 hardware에 따라 scratchpad와 message register도 제공합니다.

Scratchpad는 양쪽에서 읽고 쓸 수 있는 fixed-address register로 소량 정보를 교환합니다. Message register도 같은 용도지만 다른 peer의 overwrite를 막는 status bit가 있습니다.

Doorbell은 peer interrupt event를 보내고 memory window는 peer memory에 대한 translated read/write access를 제공합니다.

NTB 기능
기능용도
DoorbellPeer interrupt
Memory windowPeer memory translated I/O
Scratchpad소량 fixed-address 정보
Message registerOverwrite 보호가 있는 정보 전달

===========
NTB Drivers
===========

NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
the separate memory systems of two or more computers to the same PCI-Express
fabric. Existing NTB hardware supports a common feature set: doorbell
registers and memory translation windows, as well as non common features like
scratchpad and message registers. 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. Message registers can
be utilized for the same purpose. Additionally they are provided with
special status bits to make sure the information isn't rewritten by another
peer. 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와 client driver

17-34

NTB core driver는 공통 feature set을 감싼 API를 정의하고 client가 hardware driver가 지원하는 NTB device를 발견하게 합니다.

Client는 NTB API를 사용하는 upper-layer component이고 hardware driver는 특정 vendor와 model의 NTB를 구동합니다.

Client driver는 NTB core에 등록합니다. Hardware나 driver가 삽입·제거되면 probe/remove가 호출됩니다. Linux Device framework를 사용하므로 PCI driver와 유사합니다.

NTB driver 계층
NTB hardwareHardware driverNTB core APIClient probe/remove

Hardware-specific driver를 core API가 추상화하고 upper-layer client가 bind합니다.

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.

Inbound·outbound memory window

35-122

NTB의 주 목적은 둘 이상의 system이 memory를 공유하는 것입니다. Scratchpad/message register는 주로 memory window 초기화 정보를 교환하는 데 사용합니다.

Inbound translation은 local NTB port에 설정합니다. Local device가 DMA-mapped memory를 할당하고 `ntb_mw_set_trans(addr)`로 translation을 설정한 뒤 peer에 알리면 peer가 outbound window를 map해 공유 memory에 접근합니다.

Outbound translation은 peer가 초기화합니다. Local이 memory와 translated address를 peer에 전달하고 peer가 `ntb_peer_mw_set_trans(addr)`로 자신의 NTB config를 설정한 뒤 outbound window를 map합니다.

Portable algorithm은 local이 shared memory를 할당하고 가능한 경우 local window를 초기화한 뒤 translated address와 window index를 peer에 보냅니다. Peer는 가능한 경우 받은 주소로 window를 초기화하고 outbound window를 map합니다.

API 순서는 `ntb_mw_count(pidx)`로 range 수 확인, `ntb_get_align(pidx,midx)`로 alignment·size 제한 확인, physically contiguous memory 할당, `ntb_mw_set_trans()` 설정, scratchpad/message로 base와 window 번호 전달입니다.

Peer는 `ntb_peer_mw_set_trans()`로 받은 주소를 설정합니다. Maximum address 초과나 alignment 오류면 실패할 수 있습니다. `ntb_peer_mw_get_addr(widx)`로 MMIO address를 얻어 map합니다.

Local `ntb_mw_count(pidx)` 값은 반대편 peer에서 대응 port index에 대한 `ntb_peer_mw_count()`와 같아야 합니다.

Portable NTB memory window setup
Local allocate contiguous DMA memory`ntb_get_align()` 제한
Local `ntb_mw_set_trans()`Address + window index 전달
Peer `ntb_peer_mw_set_trans()``ntb_peer_mw_get_addr()`Outbound MMIO map
Peer MMIOTranslated accessLocal DMA memory

Local memory address를 peer에 전달하고 양쪽 translation capability에 맞춰 window를 map합니다.

NTB Typical client driver implementation
----------------------------------------

Primary purpose of NTB is to share some piece of memory between at least two
systems. So the NTB device features like Scratchpad/Message registers are
mainly used to perform the proper memory window initialization. Typically
there are two types of memory window interfaces supported by the NTB API:
inbound translation configured on the local ntb port and outbound translation
configured by the peer, on the peer ntb port. The first type is
depicted on the next figure::

 Inbound translation:

 Memory:              Local NTB Port:      Peer NTB Port:      Peer MMIO:
  ____________
 | dma-mapped |-ntb_mw_set_trans(addr)  |
 | memory     |        _v____________   |   ______________
 | (addr)     |<======| MW xlat addr |<====| MW base addr |<== memory-mapped IO
 |------------|       |--------------|  |  |--------------|

So typical scenario of the first type memory window initialization looks:
1) allocate a memory region, 2) put translated address to NTB config,
3) somehow notify a peer device of performed initialization, 4) peer device
maps corresponding outbound memory window so to have access to the shared
memory region.

The second type of interface, that implies the shared windows being
initialized by a peer device, is depicted on the figure::

 Outbound translation:

 Memory:        Local NTB Port:    Peer NTB Port:      Peer MMIO:
  ____________                      ______________
 | dma-mapped |                |   | MW base addr |<== memory-mapped IO
 | memory     |                |   |--------------|
 | (addr)     |<===================| MW xlat addr |<-ntb_peer_mw_set_trans(addr)
 |------------|                |   |--------------|

Typical scenario of the second type interface initialization would be:
1) allocate a memory region, 2) somehow deliver a translated address to a peer
device, 3) peer puts the translated address to NTB config, 4) peer device maps
outbound memory window so to have access to the shared memory region.

As one can see the described scenarios can be combined in one portable
algorithm.

 Local device:
  1) Allocate memory for a shared window
  2) Initialize memory window by translated address of the allocated region
     (it may fail if local memory window initialization is unsupported)
  3) Send the translated address and memory window index to a peer device

 Peer device:
  1) Initialize memory window with retrieved address of the allocated
     by another device memory region (it may fail if peer memory window
     initialization is unsupported)
  2) Map outbound memory window

In accordance with this scenario, the NTB Memory Window API can be used as
follows:

 Local device:
  1) ntb_mw_count(pidx) - retrieve number of memory ranges, which can
     be allocated for memory windows between local device and peer device
     of port with specified index.
  2) ntb_get_align(pidx, midx) - retrieve parameters restricting the
     shared memory region alignment and size. Then memory can be properly
     allocated.
  3) Allocate physically contiguous memory region in compliance with
     restrictions retrieved in 2).
  4) ntb_mw_set_trans(pidx, midx) - try to set translation address of
     the memory window with specified index for the defined peer device
     (it may fail if local translated address setting is not supported)
  5) Send translated base address (usually together with memory window
     number) to the peer device using, for instance, scratchpad or message
     registers.

 Peer device:
  1) ntb_peer_mw_set_trans(pidx, midx) - try to set received from other
     device (related to pidx) translated address for specified memory
     window. It may fail if retrieved address, for instance, exceeds
     maximum possible address or isn't properly aligned.
  2) ntb_peer_mw_get_addr(widx) - retrieve MMIO address to map the memory
     window so to have an access to the shared memory.

Also it is worth to note, that method ntb_mw_count(pidx) should return the
same value as ntb_peer_mw_count() on the peer with port index - pidx.

Transport와 Netdev client

123-134

주요 client는 `ntb_transport`와 `ntb_netdev`입니다. 둘이 함께 NTB를 가로지르는 peer logical link를 만들어 network packet을 교환합니다.

Transport client는 peer link와 message/data용 queue pair를 만들고 Netdev는 queue pair를 사용한 Ethernet device를 생성합니다. Network data는 socket buffer와 transport queue-pair buffer 사이에서 복사됩니다.

Transport는 Netdev 외 용도로도 쓸 수 있지만 문서 시점에는 다른 application이 없습니다.

NTB network stack
Socket buffer`ntb_netdev` Ethernet`ntb_transport` queue pairNTB peer link

Transport queue pair를 Netdev가 Ethernet interface로 노출합니다.

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.

Ping Pong test client

135-162

`ntb_pingpong`은 doorbell과 scratchpad를 시험하고 간단한 NTB client 예제를 제공합니다.

시작 시 link를 enable하고 up을 기다린 뒤 doorbell·scratchpad를 읽고 씁니다. Peer는 각 round마다 한 bit씩 shift되는 doorbell mask로 interrupt해 여러 bit와 vector 동작을 시험합니다.

각 round에서 local scratchpad 0을 읽고 값에 1을 더해 peer scratchpad 0에 쓴 뒤 peer doorbell을 설정합니다.

`unsafe=1`은 알려진 scratchpad/doorbell issue가 있는 hardware 시험을 위험을 감수하고 허용합니다. `delay_ms`는 interrupt 수신과 다음 peer doorbell 사이 delay, `init_db`는 새 round series의 시작 bit입니다. Load 시 `dyndbg=+p`가 권장됩니다.

`ntb_pingpong` parameter
Parameter의미
`unsafe`문제 있는 hardware 강제 시험
`delay_ms`다음 doorbell까지 delay
`init_db`Round series 시작 bit
`dyndbg=+p`Console debug 권장

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 debugfs client

163-202

`ntb_tool`은 주로 NTB hardware와 driver debugging에 사용하며 module parameter는 없습니다.

Probe된 device마다 `debugfs/ntb_tool/hw` directory를 만들고 doorbell과 mask, peer doorbell/mask, local·peer scratchpad를 읽고 변경합니다.

`db`는 read로 local doorbell을 읽고 `s <bits>` write로 set, `c <bits>`로 clear합니다. `mask`, `peer_db`, `peer_mask`도 같은 형식입니다.

`spad`는 모든 local scratchpad를 읽거나 `<number> <value>` pair series를 써 여러 register를 설정합니다. `peer_spad`는 peer scratchpad에 같은 동작을 합니다.

`ntb_tool` debugfs
파일동작
`db`Local doorbell read/set/clear
`mask`Local doorbell mask
`peer_db`Peer doorbell
`peer_mask`Peer doorbell mask
`spad`Local scratchpad read/write
`peer_spad`Peer scratchpad read/write

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 MSI test client

203-229

`ntb_msi_test`는 NTB memory window를 통해 MSI interrupt를 전달하는 MSI library를 시험·debug하며 debugfs로 제어합니다.

Probe된 device마다 `debugfs/ntb_msi_test/hw`를 만듭니다. `port`는 local port number이고 interrupt별 `irq*_occurrences`는 trigger 횟수를 반환합니다.

Peer별 `peer*/port`는 port 번호, `peer*/count`는 trigger 가능한 interrupt 수입니다. `peer*/trigger`에 count보다 작은 interrupt number를 쓰면 해당 peer interrupt를 trigger하고 peer의 occurrence가 증가해야 합니다.

MSI test
`peer*/trigger = irq`NTB MSI libraryPeer interrupt`irq*_occurrences + 1`

Local debugfs write가 NTB window를 거쳐 peer interrupt와 counter 증가를 유발합니다.

NTB MSI Test Client (ntb\_msi\_test)
------------------------------------

The MSI test client serves to test and debug the MSI library which
allows for passing MSI interrupts across NTB memory windows. The
test client is interacted with through the debugfs filesystem:

* *debugfs*/ntb\_msi\_test/*hw*/
        A directory in debugfs will be created for each
        NTB device probed by the msi test.  This directory is shortened to *hw*
        below.
* *hw*/port
        This file describes the local port number
* *hw*/irq*_occurrences
        One occurrences file exists for each interrupt and, when read,
        returns the number of times the interrupt has been triggered.
* *hw*/peer*/port
        This file describes the port number for each peer
* *hw*/peer*/count
        This file describes the number of interrupts that can be
        triggered on each peer
* *hw*/peer*/trigger
        Writing an interrupt number (any number less than the value
        specified in count) will trigger the interrupt on the
        specified peer. That peer's interrupt's occurrence file
        should be incremented.

Hardware driver 등록

230-240

NTB hardware driver는 device를 NTB core에 등록해야 하며 등록 후 client probe/remove가 호출됩니다.

Intel hardware driver `ntb_hw_intel`은 Xeon과 Atom CPU의 NTB를 지원합니다.

Intel NTB bind
Xeon/Atom NTB`ntb_hw_intel`NTB coreClient probe

Intel hardware driver가 core에 device를 등록하면 client가 probe됩니다.

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.

Intel B2B memory-window parameter

241-263

`b2b_mw_idx`는 peer NTB를 memory window로 접근할 때 사용할 index입니다. 0 이상은 첫 index부터, 음수는 마지막 index부터 세며 양쪽이 반드시 같은 값을 써야 합니다. 기본은 `-1`입니다.

`b2b_mw_share`는 window가 충분히 클 때 그 절반을 client의 peer address translation에도 허용합니다.

Xeon B2B topology의 `xeon_b2b_usd_bar2_addr64`는 upstream side BAR2 window가 두 NTB 사이 bus에서 사용할 64-bit address입니다.

나머지 USD/DSD BAR4·BAR5 64/32-bit parameter도 BAR2 parameter와 같은 방식으로 각 window address를 지정합니다.

Intel NTB module parameter
Parameter의미
`b2b_mw_idx`Peer NTB 접근 window, 양쪽 동일
`b2b_mw_share`Window 후반부 client translation 공유
`xeon_b2b_usd_bar2_addr64`Upstream BAR2 64-bit bus address
`xeon_b2b_*_bar*`USD/DSD BAR2/4/5 address

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