xref: /dpdk/drivers/raw/ntb/ntb.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
127731002SXiaoyun Li /* SPDX-License-Identifier: BSD-3-Clause
227731002SXiaoyun Li  * Copyright(c) 2019 Intel Corporation.
327731002SXiaoyun Li  */
427731002SXiaoyun Li 
5c39d1e08SXiaoyun Li #ifndef _NTB_H_
6c39d1e08SXiaoyun Li #define _NTB_H_
727731002SXiaoyun Li 
827731002SXiaoyun Li #include <stdbool.h>
927731002SXiaoyun Li 
1027731002SXiaoyun Li extern int ntb_logtype;
11*2b843cacSDavid Marchand #define RTE_LOGTYPE_NTB ntb_logtype
1227731002SXiaoyun Li 
13*2b843cacSDavid Marchand #define NTB_LOG(level, ...) \
14*2b843cacSDavid Marchand 	RTE_LOG_LINE_PREFIX(level, NTB, "%s(): ", __func__, __VA_ARGS__)
1527731002SXiaoyun Li 
1627731002SXiaoyun Li /* Vendor ID */
1727731002SXiaoyun Li #define NTB_INTEL_VENDOR_ID         0x8086
1827731002SXiaoyun Li 
1927731002SXiaoyun Li /* Device IDs */
2027731002SXiaoyun Li #define NTB_INTEL_DEV_ID_B2B_SKX    0x201C
21f5057be3SXiaoyun Li #define NTB_INTEL_DEV_ID_B2B_ICX    0x347E
22834d99f3SJunfeng Guo #define NTB_INTEL_DEV_ID_B2B_SPR    0x347E
2327731002SXiaoyun Li 
2427731002SXiaoyun Li /* Reserved to app to use. */
2527731002SXiaoyun Li #define NTB_SPAD_USER               "spad_user_"
2627731002SXiaoyun Li #define NTB_SPAD_USER_LEN           (sizeof(NTB_SPAD_USER) - 1)
27c39d1e08SXiaoyun Li #define NTB_SPAD_USER_MAX_NUM       4
2827731002SXiaoyun Li #define NTB_ATTR_NAME_LEN           30
2927731002SXiaoyun Li 
30c39d1e08SXiaoyun Li #define NTB_DFLT_TX_FREE_THRESH     256
3127731002SXiaoyun Li 
3286083fccSXiaoyun Li enum ntb_xstats_idx {
3386083fccSXiaoyun Li 	NTB_TX_PKTS_ID = 0,
3486083fccSXiaoyun Li 	NTB_TX_BYTES_ID,
3586083fccSXiaoyun Li 	NTB_TX_ERRS_ID,
3686083fccSXiaoyun Li 	NTB_RX_PKTS_ID,
3786083fccSXiaoyun Li 	NTB_RX_BYTES_ID,
3886083fccSXiaoyun Li 	NTB_RX_MISS_ID,
3986083fccSXiaoyun Li };
4086083fccSXiaoyun Li 
4127731002SXiaoyun Li enum ntb_topo {
4227731002SXiaoyun Li 	NTB_TOPO_NONE = 0,
4327731002SXiaoyun Li 	NTB_TOPO_B2B_USD,
4427731002SXiaoyun Li 	NTB_TOPO_B2B_DSD,
4527731002SXiaoyun Li };
4627731002SXiaoyun Li 
4727731002SXiaoyun Li enum ntb_link {
4827731002SXiaoyun Li 	NTB_LINK_DOWN = 0,
4927731002SXiaoyun Li 	NTB_LINK_UP,
5027731002SXiaoyun Li };
5127731002SXiaoyun Li 
5227731002SXiaoyun Li enum ntb_speed {
5327731002SXiaoyun Li 	NTB_SPEED_NONE = 0,
5427731002SXiaoyun Li 	NTB_SPEED_GEN1 = 1,
5527731002SXiaoyun Li 	NTB_SPEED_GEN2 = 2,
5627731002SXiaoyun Li 	NTB_SPEED_GEN3 = 3,
5727731002SXiaoyun Li 	NTB_SPEED_GEN4 = 4,
5827731002SXiaoyun Li };
5927731002SXiaoyun Li 
6027731002SXiaoyun Li enum ntb_width {
6127731002SXiaoyun Li 	NTB_WIDTH_NONE = 0,
6227731002SXiaoyun Li 	NTB_WIDTH_1 = 1,
6327731002SXiaoyun Li 	NTB_WIDTH_2 = 2,
6427731002SXiaoyun Li 	NTB_WIDTH_4 = 4,
6527731002SXiaoyun Li 	NTB_WIDTH_8 = 8,
6627731002SXiaoyun Li 	NTB_WIDTH_12 = 12,
6727731002SXiaoyun Li 	NTB_WIDTH_16 = 16,
6827731002SXiaoyun Li 	NTB_WIDTH_32 = 32,
6927731002SXiaoyun Li };
7027731002SXiaoyun Li 
7127731002SXiaoyun Li /* Define spad registers usage. 0 is reserved. */
7227731002SXiaoyun Li enum ntb_spad_idx {
7327731002SXiaoyun Li 	SPAD_NUM_MWS = 1,
7427731002SXiaoyun Li 	SPAD_NUM_QPS,
7527731002SXiaoyun Li 	SPAD_Q_SZ,
76c39d1e08SXiaoyun Li 	SPAD_USED_MWS,
7727731002SXiaoyun Li 	SPAD_MW0_SZ_H,
7827731002SXiaoyun Li 	SPAD_MW0_SZ_L,
7927731002SXiaoyun Li 	SPAD_MW1_SZ_H,
8027731002SXiaoyun Li 	SPAD_MW1_SZ_L,
81c39d1e08SXiaoyun Li 	SPAD_MW0_BA_H,
82c39d1e08SXiaoyun Li 	SPAD_MW0_BA_L,
83c39d1e08SXiaoyun Li 	SPAD_MW1_BA_H,
84c39d1e08SXiaoyun Li 	SPAD_MW1_BA_L,
8527731002SXiaoyun Li };
8627731002SXiaoyun Li 
8727731002SXiaoyun Li /**
8827731002SXiaoyun Li  * NTB device operations
8927731002SXiaoyun Li  * @ntb_dev_init: Init ntb dev.
9027731002SXiaoyun Li  * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
9127731002SXiaoyun Li  * @mw_set_trans: Set translation of internal memory that remote can access.
9211b5c7daSXiaoyun Li  * @ioremap: Translate the remote host address to bar address.
9327731002SXiaoyun Li  * @get_link_status: get link status, link speed and link width.
9427731002SXiaoyun Li  * @set_link: Set local side up/down.
9527731002SXiaoyun Li  * @spad_read: Read local/peer spad register val.
9627731002SXiaoyun Li  * @spad_write: Write val to local/peer spad register.
9727731002SXiaoyun Li  * @db_read: Read doorbells status.
9827731002SXiaoyun Li  * @db_clear: Clear local doorbells.
997be78d02SJosh Soref  * @db_set_mask: Set bits in db mask, preventing db interrupts generated
10027731002SXiaoyun Li  * for those db bits.
10127731002SXiaoyun Li  * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
10227731002SXiaoyun Li  * @vector_bind: Bind vector source [intr] to msix vector [msix].
10327731002SXiaoyun Li  */
10427731002SXiaoyun Li struct ntb_dev_ops {
105c39d1e08SXiaoyun Li 	int (*ntb_dev_init)(const struct rte_rawdev *dev);
106c39d1e08SXiaoyun Li 	void *(*get_peer_mw_addr)(const struct rte_rawdev *dev, int mw_idx);
107c39d1e08SXiaoyun Li 	int (*mw_set_trans)(const struct rte_rawdev *dev, int mw_idx,
10827731002SXiaoyun Li 			    uint64_t addr, uint64_t size);
10911b5c7daSXiaoyun Li 	void *(*ioremap)(const struct rte_rawdev *dev, uint64_t addr);
110c39d1e08SXiaoyun Li 	int (*get_link_status)(const struct rte_rawdev *dev);
111c39d1e08SXiaoyun Li 	int (*set_link)(const struct rte_rawdev *dev, bool up);
112c39d1e08SXiaoyun Li 	uint32_t (*spad_read)(const struct rte_rawdev *dev, int spad,
113c39d1e08SXiaoyun Li 			      bool peer);
114c39d1e08SXiaoyun Li 	int (*spad_write)(const struct rte_rawdev *dev, int spad,
11527731002SXiaoyun Li 			  bool peer, uint32_t spad_v);
116c39d1e08SXiaoyun Li 	uint64_t (*db_read)(const struct rte_rawdev *dev);
117c39d1e08SXiaoyun Li 	int (*db_clear)(const struct rte_rawdev *dev, uint64_t db_bits);
118c39d1e08SXiaoyun Li 	int (*db_set_mask)(const struct rte_rawdev *dev, uint64_t db_mask);
119c39d1e08SXiaoyun Li 	int (*peer_db_set)(const struct rte_rawdev *dev, uint8_t db_bit);
120c39d1e08SXiaoyun Li 	int (*vector_bind)(const struct rte_rawdev *dev, uint8_t intr,
121c39d1e08SXiaoyun Li 			   uint8_t msix);
122c39d1e08SXiaoyun Li };
123c39d1e08SXiaoyun Li 
124c39d1e08SXiaoyun Li struct ntb_desc {
125c39d1e08SXiaoyun Li 	uint64_t addr; /* buffer addr */
126c39d1e08SXiaoyun Li 	uint16_t len;  /* buffer length */
127c39d1e08SXiaoyun Li 	uint16_t rsv1;
128c39d1e08SXiaoyun Li 	uint32_t rsv2;
129c39d1e08SXiaoyun Li };
130c39d1e08SXiaoyun Li 
131c39d1e08SXiaoyun Li #define NTB_FLAG_EOP    1 /* end of packet */
132c39d1e08SXiaoyun Li struct ntb_used {
133c39d1e08SXiaoyun Li 	uint16_t len;     /* buffer length */
134c39d1e08SXiaoyun Li 	uint16_t flags;   /* flags */
135c39d1e08SXiaoyun Li };
136c39d1e08SXiaoyun Li 
137c39d1e08SXiaoyun Li struct ntb_rx_entry {
138c39d1e08SXiaoyun Li 	struct rte_mbuf *mbuf;
139c39d1e08SXiaoyun Li };
140c39d1e08SXiaoyun Li 
141c39d1e08SXiaoyun Li struct ntb_rx_queue {
142c39d1e08SXiaoyun Li 	struct ntb_desc *rx_desc_ring;
143c39d1e08SXiaoyun Li 	volatile struct ntb_used *rx_used_ring;
144c39d1e08SXiaoyun Li 	uint16_t *avail_cnt;
145c39d1e08SXiaoyun Li 	volatile uint16_t *used_cnt;
146c39d1e08SXiaoyun Li 	uint16_t last_avail;
147c39d1e08SXiaoyun Li 	uint16_t last_used;
148c39d1e08SXiaoyun Li 	uint16_t nb_rx_desc;
149c39d1e08SXiaoyun Li 
150c39d1e08SXiaoyun Li 	uint16_t rx_free_thresh;
151c39d1e08SXiaoyun Li 
152c39d1e08SXiaoyun Li 	struct rte_mempool *mpool; /* mempool for mbuf allocation */
153c39d1e08SXiaoyun Li 	struct ntb_rx_entry *sw_ring;
154c39d1e08SXiaoyun Li 
155c39d1e08SXiaoyun Li 	uint16_t queue_id;         /* DPDK queue index. */
156c39d1e08SXiaoyun Li 	uint16_t port_id;          /* Device port identifier. */
157c39d1e08SXiaoyun Li 
158c39d1e08SXiaoyun Li 	struct ntb_hw *hw;
159c39d1e08SXiaoyun Li };
160c39d1e08SXiaoyun Li 
161c39d1e08SXiaoyun Li struct ntb_tx_entry {
162c39d1e08SXiaoyun Li 	struct rte_mbuf *mbuf;
163c39d1e08SXiaoyun Li 	uint16_t next_id;
164c39d1e08SXiaoyun Li 	uint16_t last_id;
165c39d1e08SXiaoyun Li };
166c39d1e08SXiaoyun Li 
167c39d1e08SXiaoyun Li struct ntb_tx_queue {
168c39d1e08SXiaoyun Li 	volatile struct ntb_desc *tx_desc_ring;
169c39d1e08SXiaoyun Li 	struct ntb_used *tx_used_ring;
170c39d1e08SXiaoyun Li 	volatile uint16_t *avail_cnt;
171c39d1e08SXiaoyun Li 	uint16_t *used_cnt;
172c39d1e08SXiaoyun Li 	uint16_t last_avail;          /* Next need to be free. */
173c39d1e08SXiaoyun Li 	uint16_t last_used;           /* Next need to be sent. */
174c39d1e08SXiaoyun Li 	uint16_t nb_tx_desc;
175c39d1e08SXiaoyun Li 
176c39d1e08SXiaoyun Li 	/* Total number of TX descriptors ready to be allocated. */
177c39d1e08SXiaoyun Li 	uint16_t nb_tx_free;
178c39d1e08SXiaoyun Li 	uint16_t tx_free_thresh;
179c39d1e08SXiaoyun Li 
180c39d1e08SXiaoyun Li 	struct ntb_tx_entry *sw_ring;
181c39d1e08SXiaoyun Li 
182c39d1e08SXiaoyun Li 	uint16_t queue_id;            /* DPDK queue index. */
183c39d1e08SXiaoyun Li 	uint16_t port_id;             /* Device port identifier. */
184c39d1e08SXiaoyun Li 
185c39d1e08SXiaoyun Li 	struct ntb_hw *hw;
186c39d1e08SXiaoyun Li };
187c39d1e08SXiaoyun Li 
188c39d1e08SXiaoyun Li struct ntb_header {
18927595cd8STyler Retzlaff 	alignas(RTE_CACHE_LINE_SIZE) uint16_t avail_cnt;
19027595cd8STyler Retzlaff 	alignas(RTE_CACHE_LINE_SIZE) uint16_t used_cnt;
19127595cd8STyler Retzlaff 	alignas(RTE_CACHE_LINE_SIZE) struct ntb_desc desc_ring[];
19227731002SXiaoyun Li };
19327731002SXiaoyun Li 
19427731002SXiaoyun Li /* ntb private data. */
19527731002SXiaoyun Li struct ntb_hw {
19627731002SXiaoyun Li 	uint8_t mw_cnt;
19727731002SXiaoyun Li 	uint8_t db_cnt;
19827731002SXiaoyun Li 	uint8_t spad_cnt;
19927731002SXiaoyun Li 
20027731002SXiaoyun Li 	uint64_t db_valid_mask;
20127731002SXiaoyun Li 	uint64_t db_mask;
20227731002SXiaoyun Li 
20327731002SXiaoyun Li 	enum ntb_topo topo;
20427731002SXiaoyun Li 
20527731002SXiaoyun Li 	enum ntb_link link_status;
20627731002SXiaoyun Li 	enum ntb_speed link_speed;
20727731002SXiaoyun Li 	enum ntb_width link_width;
20827731002SXiaoyun Li 
20927731002SXiaoyun Li 	const struct ntb_dev_ops *ntb_ops;
21027731002SXiaoyun Li 
21127731002SXiaoyun Li 	struct rte_pci_device *pci_dev;
21227731002SXiaoyun Li 	char *hw_addr;
21327731002SXiaoyun Li 
21427731002SXiaoyun Li 	uint8_t peer_dev_up;
215c39d1e08SXiaoyun Li 	uint64_t *mw_size;
216c39d1e08SXiaoyun Li 	/* remote mem base addr */
217c39d1e08SXiaoyun Li 	uint64_t *peer_mw_base;
21827731002SXiaoyun Li 
21927731002SXiaoyun Li 	uint16_t queue_pairs;
22027731002SXiaoyun Li 	uint16_t queue_size;
221c39d1e08SXiaoyun Li 	uint32_t hdr_size_per_queue;
22227731002SXiaoyun Li 
223c39d1e08SXiaoyun Li 	struct ntb_rx_queue **rx_queues;
224c39d1e08SXiaoyun Li 	struct ntb_tx_queue **tx_queues;
225c39d1e08SXiaoyun Li 
226c39d1e08SXiaoyun Li 	/* memzone to populate RX ring. */
22727731002SXiaoyun Li 	const struct rte_memzone **mz;
228c39d1e08SXiaoyun Li 	uint8_t used_mw_num;
229c39d1e08SXiaoyun Li 
230c39d1e08SXiaoyun Li 	uint8_t peer_used_mws;
23127731002SXiaoyun Li 
23286083fccSXiaoyun Li 	uint64_t *ntb_xstats;
23386083fccSXiaoyun Li 	uint64_t *ntb_xstats_off;
23486083fccSXiaoyun Li 
23527731002SXiaoyun Li 	/* Reserve several spad for app to use. */
23627731002SXiaoyun Li 	int spad_user_list[NTB_SPAD_USER_MAX_NUM];
23727731002SXiaoyun Li };
23827731002SXiaoyun Li 
239c39d1e08SXiaoyun Li #endif /* _NTB_H_ */
240