1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019 Intel Corporation.
10 extern int ntb_logtype;
12 #define NTB_LOG(level, fmt, args...) \
13 rte_log(RTE_LOG_ ## level, ntb_logtype, "%s(): " fmt "\n", \
17 #define NTB_INTEL_VENDOR_ID 0x8086
20 #define NTB_INTEL_DEV_ID_B2B_SKX 0x201C
22 /* Reserved to app to use. */
23 #define NTB_SPAD_USER "spad_user_"
24 #define NTB_SPAD_USER_LEN (sizeof(NTB_SPAD_USER) - 1)
25 #define NTB_SPAD_USER_MAX_NUM 4
26 #define NTB_ATTR_NAME_LEN 30
28 #define NTB_DFLT_TX_FREE_THRESH 256
69 /* Define spad registers usage. 0 is reserved. */
86 * NTB device operations
87 * @ntb_dev_init: Init ntb dev.
88 * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
89 * @mw_set_trans: Set translation of internal memory that remote can access.
90 * @get_link_status: get link status, link speed and link width.
91 * @set_link: Set local side up/down.
92 * @spad_read: Read local/peer spad register val.
93 * @spad_write: Write val to local/peer spad register.
94 * @db_read: Read doorbells status.
95 * @db_clear: Clear local doorbells.
96 * @db_set_mask: Set bits in db mask, preventing db interrpts generated
98 * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
99 * @vector_bind: Bind vector source [intr] to msix vector [msix].
102 int (*ntb_dev_init)(const struct rte_rawdev *dev);
103 void *(*get_peer_mw_addr)(const struct rte_rawdev *dev, int mw_idx);
104 int (*mw_set_trans)(const struct rte_rawdev *dev, int mw_idx,
105 uint64_t addr, uint64_t size);
106 int (*get_link_status)(const struct rte_rawdev *dev);
107 int (*set_link)(const struct rte_rawdev *dev, bool up);
108 uint32_t (*spad_read)(const struct rte_rawdev *dev, int spad,
110 int (*spad_write)(const struct rte_rawdev *dev, int spad,
111 bool peer, uint32_t spad_v);
112 uint64_t (*db_read)(const struct rte_rawdev *dev);
113 int (*db_clear)(const struct rte_rawdev *dev, uint64_t db_bits);
114 int (*db_set_mask)(const struct rte_rawdev *dev, uint64_t db_mask);
115 int (*peer_db_set)(const struct rte_rawdev *dev, uint8_t db_bit);
116 int (*vector_bind)(const struct rte_rawdev *dev, uint8_t intr,
121 uint64_t addr; /* buffer addr */
122 uint16_t len; /* buffer length */
127 #define NTB_FLAG_EOP 1 /* end of packet */
129 uint16_t len; /* buffer length */
130 uint16_t flags; /* flags */
133 struct ntb_rx_entry {
134 struct rte_mbuf *mbuf;
137 struct ntb_rx_queue {
138 struct ntb_desc *rx_desc_ring;
139 volatile struct ntb_used *rx_used_ring;
141 volatile uint16_t *used_cnt;
146 uint16_t rx_free_thresh;
148 struct rte_mempool *mpool; /* mempool for mbuf allocation */
149 struct ntb_rx_entry *sw_ring;
151 uint16_t queue_id; /* DPDK queue index. */
152 uint16_t port_id; /* Device port identifier. */
157 struct ntb_tx_entry {
158 struct rte_mbuf *mbuf;
163 struct ntb_tx_queue {
164 volatile struct ntb_desc *tx_desc_ring;
165 struct ntb_used *tx_used_ring;
166 volatile uint16_t *avail_cnt;
168 uint16_t last_avail; /* Next need to be free. */
169 uint16_t last_used; /* Next need to be sent. */
172 /* Total number of TX descriptors ready to be allocated. */
174 uint16_t tx_free_thresh;
176 struct ntb_tx_entry *sw_ring;
178 uint16_t queue_id; /* DPDK queue index. */
179 uint16_t port_id; /* Device port identifier. */
185 uint16_t avail_cnt __rte_cache_aligned;
186 uint16_t used_cnt __rte_cache_aligned;
187 struct ntb_desc desc_ring[] __rte_cache_aligned;
190 /* ntb private data. */
196 uint64_t db_valid_mask;
201 enum ntb_link link_status;
202 enum ntb_speed link_speed;
203 enum ntb_width link_width;
205 const struct ntb_dev_ops *ntb_ops;
207 struct rte_pci_device *pci_dev;
212 /* remote mem base addr */
213 uint64_t *peer_mw_base;
215 uint16_t queue_pairs;
217 uint32_t hdr_size_per_queue;
219 struct ntb_rx_queue **rx_queues;
220 struct ntb_tx_queue **tx_queues;
222 /* memzone to populate RX ring. */
223 const struct rte_memzone **mz;
226 uint8_t peer_used_mws;
228 uint64_t *ntb_xstats;
229 uint64_t *ntb_xstats_off;
231 /* Reserve several spad for app to use. */
232 int spad_user_list[NTB_SPAD_USER_MAX_NUM];