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
21 #define NTB_INTEL_DEV_ID_B2B_ICX 0x347E
23 /* Reserved to app to use. */
24 #define NTB_SPAD_USER "spad_user_"
25 #define NTB_SPAD_USER_LEN (sizeof(NTB_SPAD_USER) - 1)
26 #define NTB_SPAD_USER_MAX_NUM 4
27 #define NTB_ATTR_NAME_LEN 30
29 #define NTB_DFLT_TX_FREE_THRESH 256
70 /* Define spad registers usage. 0 is reserved. */
87 * NTB device operations
88 * @ntb_dev_init: Init ntb dev.
89 * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
90 * @mw_set_trans: Set translation of internal memory that remote can access.
91 * @ioremap: Translate the remote host address to bar address.
92 * @get_link_status: get link status, link speed and link width.
93 * @set_link: Set local side up/down.
94 * @spad_read: Read local/peer spad register val.
95 * @spad_write: Write val to local/peer spad register.
96 * @db_read: Read doorbells status.
97 * @db_clear: Clear local doorbells.
98 * @db_set_mask: Set bits in db mask, preventing db interrupts generated
100 * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
101 * @vector_bind: Bind vector source [intr] to msix vector [msix].
104 int (*ntb_dev_init)(const struct rte_rawdev *dev);
105 void *(*get_peer_mw_addr)(const struct rte_rawdev *dev, int mw_idx);
106 int (*mw_set_trans)(const struct rte_rawdev *dev, int mw_idx,
107 uint64_t addr, uint64_t size);
108 void *(*ioremap)(const struct rte_rawdev *dev, uint64_t addr);
109 int (*get_link_status)(const struct rte_rawdev *dev);
110 int (*set_link)(const struct rte_rawdev *dev, bool up);
111 uint32_t (*spad_read)(const struct rte_rawdev *dev, int spad,
113 int (*spad_write)(const struct rte_rawdev *dev, int spad,
114 bool peer, uint32_t spad_v);
115 uint64_t (*db_read)(const struct rte_rawdev *dev);
116 int (*db_clear)(const struct rte_rawdev *dev, uint64_t db_bits);
117 int (*db_set_mask)(const struct rte_rawdev *dev, uint64_t db_mask);
118 int (*peer_db_set)(const struct rte_rawdev *dev, uint8_t db_bit);
119 int (*vector_bind)(const struct rte_rawdev *dev, uint8_t intr,
124 uint64_t addr; /* buffer addr */
125 uint16_t len; /* buffer length */
130 #define NTB_FLAG_EOP 1 /* end of packet */
132 uint16_t len; /* buffer length */
133 uint16_t flags; /* flags */
136 struct ntb_rx_entry {
137 struct rte_mbuf *mbuf;
140 struct ntb_rx_queue {
141 struct ntb_desc *rx_desc_ring;
142 volatile struct ntb_used *rx_used_ring;
144 volatile uint16_t *used_cnt;
149 uint16_t rx_free_thresh;
151 struct rte_mempool *mpool; /* mempool for mbuf allocation */
152 struct ntb_rx_entry *sw_ring;
154 uint16_t queue_id; /* DPDK queue index. */
155 uint16_t port_id; /* Device port identifier. */
160 struct ntb_tx_entry {
161 struct rte_mbuf *mbuf;
166 struct ntb_tx_queue {
167 volatile struct ntb_desc *tx_desc_ring;
168 struct ntb_used *tx_used_ring;
169 volatile uint16_t *avail_cnt;
171 uint16_t last_avail; /* Next need to be free. */
172 uint16_t last_used; /* Next need to be sent. */
175 /* Total number of TX descriptors ready to be allocated. */
177 uint16_t tx_free_thresh;
179 struct ntb_tx_entry *sw_ring;
181 uint16_t queue_id; /* DPDK queue index. */
182 uint16_t port_id; /* Device port identifier. */
188 uint16_t avail_cnt __rte_cache_aligned;
189 uint16_t used_cnt __rte_cache_aligned;
190 struct ntb_desc desc_ring[] __rte_cache_aligned;
193 /* ntb private data. */
199 uint64_t db_valid_mask;
204 enum ntb_link link_status;
205 enum ntb_speed link_speed;
206 enum ntb_width link_width;
208 const struct ntb_dev_ops *ntb_ops;
210 struct rte_pci_device *pci_dev;
215 /* remote mem base addr */
216 uint64_t *peer_mw_base;
218 uint16_t queue_pairs;
220 uint32_t hdr_size_per_queue;
222 struct ntb_rx_queue **rx_queues;
223 struct ntb_tx_queue **tx_queues;
225 /* memzone to populate RX ring. */
226 const struct rte_memzone **mz;
229 uint8_t peer_used_mws;
231 uint64_t *ntb_xstats;
232 uint64_t *ntb_xstats_off;
234 /* Reserve several spad for app to use. */
235 int spad_user_list[NTB_SPAD_USER_MAX_NUM];