3cc160680f73d3c0a7cf4739e6661bc4aaff5bd9
[dpdk.git] / drivers / raw / ntb / ntb.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation.
3  */
4
5 #ifndef _NTB_H_
6 #define _NTB_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 /* 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
27
28 #define NTB_DFLT_TX_FREE_THRESH     256
29
30 enum ntb_xstats_idx {
31         NTB_TX_PKTS_ID = 0,
32         NTB_TX_BYTES_ID,
33         NTB_TX_ERRS_ID,
34         NTB_RX_PKTS_ID,
35         NTB_RX_BYTES_ID,
36         NTB_RX_MISS_ID,
37 };
38
39 enum ntb_topo {
40         NTB_TOPO_NONE = 0,
41         NTB_TOPO_B2B_USD,
42         NTB_TOPO_B2B_DSD,
43 };
44
45 enum ntb_link {
46         NTB_LINK_DOWN = 0,
47         NTB_LINK_UP,
48 };
49
50 enum ntb_speed {
51         NTB_SPEED_NONE = 0,
52         NTB_SPEED_GEN1 = 1,
53         NTB_SPEED_GEN2 = 2,
54         NTB_SPEED_GEN3 = 3,
55         NTB_SPEED_GEN4 = 4,
56 };
57
58 enum ntb_width {
59         NTB_WIDTH_NONE = 0,
60         NTB_WIDTH_1 = 1,
61         NTB_WIDTH_2 = 2,
62         NTB_WIDTH_4 = 4,
63         NTB_WIDTH_8 = 8,
64         NTB_WIDTH_12 = 12,
65         NTB_WIDTH_16 = 16,
66         NTB_WIDTH_32 = 32,
67 };
68
69 /* Define spad registers usage. 0 is reserved. */
70 enum ntb_spad_idx {
71         SPAD_NUM_MWS = 1,
72         SPAD_NUM_QPS,
73         SPAD_Q_SZ,
74         SPAD_USED_MWS,
75         SPAD_MW0_SZ_H,
76         SPAD_MW0_SZ_L,
77         SPAD_MW1_SZ_H,
78         SPAD_MW1_SZ_L,
79         SPAD_MW0_BA_H,
80         SPAD_MW0_BA_L,
81         SPAD_MW1_BA_H,
82         SPAD_MW1_BA_L,
83 };
84
85 /**
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
97  * for those db bits.
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].
100  */
101 struct ntb_dev_ops {
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,
109                               bool peer);
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,
117                            uint8_t msix);
118 };
119
120 struct ntb_desc {
121         uint64_t addr; /* buffer addr */
122         uint16_t len;  /* buffer length */
123         uint16_t rsv1;
124         uint32_t rsv2;
125 };
126
127 #define NTB_FLAG_EOP    1 /* end of packet */
128 struct ntb_used {
129         uint16_t len;     /* buffer length */
130         uint16_t flags;   /* flags */
131 };
132
133 struct ntb_rx_entry {
134         struct rte_mbuf *mbuf;
135 };
136
137 struct ntb_rx_queue {
138         struct ntb_desc *rx_desc_ring;
139         volatile struct ntb_used *rx_used_ring;
140         uint16_t *avail_cnt;
141         volatile uint16_t *used_cnt;
142         uint16_t last_avail;
143         uint16_t last_used;
144         uint16_t nb_rx_desc;
145
146         uint16_t rx_free_thresh;
147
148         struct rte_mempool *mpool; /* mempool for mbuf allocation */
149         struct ntb_rx_entry *sw_ring;
150
151         uint16_t queue_id;         /* DPDK queue index. */
152         uint16_t port_id;          /* Device port identifier. */
153
154         struct ntb_hw *hw;
155 };
156
157 struct ntb_tx_entry {
158         struct rte_mbuf *mbuf;
159         uint16_t next_id;
160         uint16_t last_id;
161 };
162
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;
167         uint16_t *used_cnt;
168         uint16_t last_avail;          /* Next need to be free. */
169         uint16_t last_used;           /* Next need to be sent. */
170         uint16_t nb_tx_desc;
171
172         /* Total number of TX descriptors ready to be allocated. */
173         uint16_t nb_tx_free;
174         uint16_t tx_free_thresh;
175
176         struct ntb_tx_entry *sw_ring;
177
178         uint16_t queue_id;            /* DPDK queue index. */
179         uint16_t port_id;             /* Device port identifier. */
180
181         struct ntb_hw *hw;
182 };
183
184 struct ntb_header {
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;
188 };
189
190 /* ntb private data. */
191 struct ntb_hw {
192         uint8_t mw_cnt;
193         uint8_t db_cnt;
194         uint8_t spad_cnt;
195
196         uint64_t db_valid_mask;
197         uint64_t db_mask;
198
199         enum ntb_topo topo;
200
201         enum ntb_link link_status;
202         enum ntb_speed link_speed;
203         enum ntb_width link_width;
204
205         const struct ntb_dev_ops *ntb_ops;
206
207         struct rte_pci_device *pci_dev;
208         char *hw_addr;
209
210         uint8_t peer_dev_up;
211         uint64_t *mw_size;
212         /* remote mem base addr */
213         uint64_t *peer_mw_base;
214
215         uint16_t queue_pairs;
216         uint16_t queue_size;
217         uint32_t hdr_size_per_queue;
218
219         struct ntb_rx_queue **rx_queues;
220         struct ntb_tx_queue **tx_queues;
221
222         /* memzone to populate RX ring. */
223         const struct rte_memzone **mz;
224         uint8_t used_mw_num;
225
226         uint8_t peer_used_mws;
227
228         uint64_t *ntb_xstats;
229         uint64_t *ntb_xstats_off;
230
231         /* Reserve several spad for app to use. */
232         int spad_user_list[NTB_SPAD_USER_MAX_NUM];
233 };
234
235 #endif /* _NTB_H_ */