xref: /dpdk/drivers/raw/ntb/ntb.h (revision 7f12dfdc)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation.
3  */
4 
5 #ifndef _NTB_RAWDEV_H_
6 #define _NTB_RAWDEV_H_
7 
8 #include <stdbool.h>
9 
10 extern int ntb_logtype;
11 
12 #define NTB_LOG(level, fmt, args...) \
13 	rte_log(RTE_LOG_ ## level, ntb_logtype,	"%s(): " fmt "\n", \
14 		__func__, ##args)
15 
16 /* Vendor ID */
17 #define NTB_INTEL_VENDOR_ID         0x8086
18 
19 /* Device IDs */
20 #define NTB_INTEL_DEV_ID_B2B_SKX    0x201C
21 
22 #define NTB_TOPO_NAME               "topo"
23 #define NTB_LINK_STATUS_NAME        "link_status"
24 #define NTB_SPEED_NAME              "speed"
25 #define NTB_WIDTH_NAME              "width"
26 #define NTB_MW_CNT_NAME             "mw_count"
27 #define NTB_DB_CNT_NAME             "db_count"
28 #define NTB_SPAD_CNT_NAME           "spad_count"
29 /* Reserved to app to use. */
30 #define NTB_SPAD_USER               "spad_user_"
31 #define NTB_SPAD_USER_LEN           (sizeof(NTB_SPAD_USER) - 1)
32 #define NTB_SPAD_USER_MAX_NUM       10
33 #define NTB_ATTR_NAME_LEN           30
34 #define NTB_ATTR_VAL_LEN            30
35 #define NTB_ATTR_MAX                20
36 
37 /* NTB Attributes */
38 struct ntb_attr {
39 	/**< Name of the attribute */
40 	char name[NTB_ATTR_NAME_LEN];
41 	/**< Value or reference of value of attribute */
42 	char value[NTB_ATTR_NAME_LEN];
43 };
44 
45 enum ntb_attr_idx {
46 	NTB_TOPO_ID = 0,
47 	NTB_LINK_STATUS_ID,
48 	NTB_SPEED_ID,
49 	NTB_WIDTH_ID,
50 	NTB_MW_CNT_ID,
51 	NTB_DB_CNT_ID,
52 	NTB_SPAD_CNT_ID,
53 };
54 
55 enum ntb_topo {
56 	NTB_TOPO_NONE = 0,
57 	NTB_TOPO_B2B_USD,
58 	NTB_TOPO_B2B_DSD,
59 };
60 
61 enum ntb_link {
62 	NTB_LINK_DOWN = 0,
63 	NTB_LINK_UP,
64 };
65 
66 enum ntb_speed {
67 	NTB_SPEED_NONE = 0,
68 	NTB_SPEED_GEN1 = 1,
69 	NTB_SPEED_GEN2 = 2,
70 	NTB_SPEED_GEN3 = 3,
71 	NTB_SPEED_GEN4 = 4,
72 };
73 
74 enum ntb_width {
75 	NTB_WIDTH_NONE = 0,
76 	NTB_WIDTH_1 = 1,
77 	NTB_WIDTH_2 = 2,
78 	NTB_WIDTH_4 = 4,
79 	NTB_WIDTH_8 = 8,
80 	NTB_WIDTH_12 = 12,
81 	NTB_WIDTH_16 = 16,
82 	NTB_WIDTH_32 = 32,
83 };
84 
85 /* Define spad registers usage. 0 is reserved. */
86 enum ntb_spad_idx {
87 	SPAD_NUM_MWS = 1,
88 	SPAD_NUM_QPS,
89 	SPAD_Q_SZ,
90 	SPAD_MW0_SZ_H,
91 	SPAD_MW0_SZ_L,
92 	SPAD_MW1_SZ_H,
93 	SPAD_MW1_SZ_L,
94 };
95 
96 /**
97  * NTB device operations
98  * @ntb_dev_init: Init ntb dev.
99  * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
100  * @mw_set_trans: Set translation of internal memory that remote can access.
101  * @get_link_status: get link status, link speed and link width.
102  * @set_link: Set local side up/down.
103  * @spad_read: Read local/peer spad register val.
104  * @spad_write: Write val to local/peer spad register.
105  * @db_read: Read doorbells status.
106  * @db_clear: Clear local doorbells.
107  * @db_set_mask: Set bits in db mask, preventing db interrpts generated
108  * for those db bits.
109  * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
110  * @vector_bind: Bind vector source [intr] to msix vector [msix].
111  */
112 struct ntb_dev_ops {
113 	int (*ntb_dev_init)(struct rte_rawdev *dev);
114 	void *(*get_peer_mw_addr)(struct rte_rawdev *dev, int mw_idx);
115 	int (*mw_set_trans)(struct rte_rawdev *dev, int mw_idx,
116 			    uint64_t addr, uint64_t size);
117 	int (*get_link_status)(struct rte_rawdev *dev);
118 	int (*set_link)(struct rte_rawdev *dev, bool up);
119 	uint32_t (*spad_read)(struct rte_rawdev *dev, int spad, bool peer);
120 	int (*spad_write)(struct rte_rawdev *dev, int spad,
121 			  bool peer, uint32_t spad_v);
122 	uint64_t (*db_read)(struct rte_rawdev *dev);
123 	int (*db_clear)(struct rte_rawdev *dev, uint64_t db_bits);
124 	int (*db_set_mask)(struct rte_rawdev *dev, uint64_t db_mask);
125 	int (*peer_db_set)(struct rte_rawdev *dev, uint8_t db_bit);
126 	int (*vector_bind)(struct rte_rawdev *dev, uint8_t intr, uint8_t msix);
127 };
128 
129 /* ntb private data. */
130 struct ntb_hw {
131 	uint8_t mw_cnt;
132 	uint8_t peer_mw_cnt;
133 	uint8_t db_cnt;
134 	uint8_t spad_cnt;
135 
136 	uint64_t db_valid_mask;
137 	uint64_t db_mask;
138 
139 	enum ntb_topo topo;
140 
141 	enum ntb_link link_status;
142 	enum ntb_speed link_speed;
143 	enum ntb_width link_width;
144 
145 	const struct ntb_dev_ops *ntb_ops;
146 
147 	struct rte_pci_device *pci_dev;
148 	char *hw_addr;
149 
150 	uint64_t *mw_size;
151 	uint64_t *peer_mw_size;
152 	uint8_t peer_dev_up;
153 
154 	uint16_t queue_pairs;
155 	uint16_t queue_size;
156 
157 	/**< mem zone to populate RX ring. */
158 	const struct rte_memzone **mz;
159 
160 	/* Reserve several spad for app to use. */
161 	int spad_user_list[NTB_SPAD_USER_MAX_NUM];
162 };
163 
164 #endif /* _NTB_RAWDEV_H_ */
165