raw/ntb: setup queues
[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_topo {
31         NTB_TOPO_NONE = 0,
32         NTB_TOPO_B2B_USD,
33         NTB_TOPO_B2B_DSD,
34 };
35
36 enum ntb_link {
37         NTB_LINK_DOWN = 0,
38         NTB_LINK_UP,
39 };
40
41 enum ntb_speed {
42         NTB_SPEED_NONE = 0,
43         NTB_SPEED_GEN1 = 1,
44         NTB_SPEED_GEN2 = 2,
45         NTB_SPEED_GEN3 = 3,
46         NTB_SPEED_GEN4 = 4,
47 };
48
49 enum ntb_width {
50         NTB_WIDTH_NONE = 0,
51         NTB_WIDTH_1 = 1,
52         NTB_WIDTH_2 = 2,
53         NTB_WIDTH_4 = 4,
54         NTB_WIDTH_8 = 8,
55         NTB_WIDTH_12 = 12,
56         NTB_WIDTH_16 = 16,
57         NTB_WIDTH_32 = 32,
58 };
59
60 /* Define spad registers usage. 0 is reserved. */
61 enum ntb_spad_idx {
62         SPAD_NUM_MWS = 1,
63         SPAD_NUM_QPS,
64         SPAD_Q_SZ,
65         SPAD_USED_MWS,
66         SPAD_MW0_SZ_H,
67         SPAD_MW0_SZ_L,
68         SPAD_MW1_SZ_H,
69         SPAD_MW1_SZ_L,
70         SPAD_MW0_BA_H,
71         SPAD_MW0_BA_L,
72         SPAD_MW1_BA_H,
73         SPAD_MW1_BA_L,
74 };
75
76 /**
77  * NTB device operations
78  * @ntb_dev_init: Init ntb dev.
79  * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
80  * @mw_set_trans: Set translation of internal memory that remote can access.
81  * @get_link_status: get link status, link speed and link width.
82  * @set_link: Set local side up/down.
83  * @spad_read: Read local/peer spad register val.
84  * @spad_write: Write val to local/peer spad register.
85  * @db_read: Read doorbells status.
86  * @db_clear: Clear local doorbells.
87  * @db_set_mask: Set bits in db mask, preventing db interrpts generated
88  * for those db bits.
89  * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
90  * @vector_bind: Bind vector source [intr] to msix vector [msix].
91  */
92 struct ntb_dev_ops {
93         int (*ntb_dev_init)(const struct rte_rawdev *dev);
94         void *(*get_peer_mw_addr)(const struct rte_rawdev *dev, int mw_idx);
95         int (*mw_set_trans)(const struct rte_rawdev *dev, int mw_idx,
96                             uint64_t addr, uint64_t size);
97         int (*get_link_status)(const struct rte_rawdev *dev);
98         int (*set_link)(const struct rte_rawdev *dev, bool up);
99         uint32_t (*spad_read)(const struct rte_rawdev *dev, int spad,
100                               bool peer);
101         int (*spad_write)(const struct rte_rawdev *dev, int spad,
102                           bool peer, uint32_t spad_v);
103         uint64_t (*db_read)(const struct rte_rawdev *dev);
104         int (*db_clear)(const struct rte_rawdev *dev, uint64_t db_bits);
105         int (*db_set_mask)(const struct rte_rawdev *dev, uint64_t db_mask);
106         int (*peer_db_set)(const struct rte_rawdev *dev, uint8_t db_bit);
107         int (*vector_bind)(const struct rte_rawdev *dev, uint8_t intr,
108                            uint8_t msix);
109 };
110
111 struct ntb_desc {
112         uint64_t addr; /* buffer addr */
113         uint16_t len;  /* buffer length */
114         uint16_t rsv1;
115         uint32_t rsv2;
116 };
117
118 #define NTB_FLAG_EOP    1 /* end of packet */
119 struct ntb_used {
120         uint16_t len;     /* buffer length */
121         uint16_t flags;   /* flags */
122 };
123
124 struct ntb_rx_entry {
125         struct rte_mbuf *mbuf;
126 };
127
128 struct ntb_rx_queue {
129         struct ntb_desc *rx_desc_ring;
130         volatile struct ntb_used *rx_used_ring;
131         uint16_t *avail_cnt;
132         volatile uint16_t *used_cnt;
133         uint16_t last_avail;
134         uint16_t last_used;
135         uint16_t nb_rx_desc;
136
137         uint16_t rx_free_thresh;
138
139         struct rte_mempool *mpool; /* mempool for mbuf allocation */
140         struct ntb_rx_entry *sw_ring;
141
142         uint16_t queue_id;         /* DPDK queue index. */
143         uint16_t port_id;          /* Device port identifier. */
144
145         struct ntb_hw *hw;
146 };
147
148 struct ntb_tx_entry {
149         struct rte_mbuf *mbuf;
150         uint16_t next_id;
151         uint16_t last_id;
152 };
153
154 struct ntb_tx_queue {
155         volatile struct ntb_desc *tx_desc_ring;
156         struct ntb_used *tx_used_ring;
157         volatile uint16_t *avail_cnt;
158         uint16_t *used_cnt;
159         uint16_t last_avail;          /* Next need to be free. */
160         uint16_t last_used;           /* Next need to be sent. */
161         uint16_t nb_tx_desc;
162
163         /* Total number of TX descriptors ready to be allocated. */
164         uint16_t nb_tx_free;
165         uint16_t tx_free_thresh;
166
167         struct ntb_tx_entry *sw_ring;
168
169         uint16_t queue_id;            /* DPDK queue index. */
170         uint16_t port_id;             /* Device port identifier. */
171
172         struct ntb_hw *hw;
173 };
174
175 struct ntb_header {
176         uint16_t avail_cnt __rte_cache_aligned;
177         uint16_t used_cnt __rte_cache_aligned;
178         struct ntb_desc desc_ring[] __rte_cache_aligned;
179 };
180
181 /* ntb private data. */
182 struct ntb_hw {
183         uint8_t mw_cnt;
184         uint8_t db_cnt;
185         uint8_t spad_cnt;
186
187         uint64_t db_valid_mask;
188         uint64_t db_mask;
189
190         enum ntb_topo topo;
191
192         enum ntb_link link_status;
193         enum ntb_speed link_speed;
194         enum ntb_width link_width;
195
196         const struct ntb_dev_ops *ntb_ops;
197
198         struct rte_pci_device *pci_dev;
199         char *hw_addr;
200
201         uint8_t peer_dev_up;
202         uint64_t *mw_size;
203         /* remote mem base addr */
204         uint64_t *peer_mw_base;
205
206         uint16_t queue_pairs;
207         uint16_t queue_size;
208         uint32_t hdr_size_per_queue;
209
210         struct ntb_rx_queue **rx_queues;
211         struct ntb_tx_queue **tx_queues;
212
213         /* memzone to populate RX ring. */
214         const struct rte_memzone **mz;
215         uint8_t used_mw_num;
216
217         uint8_t peer_used_mws;
218
219         /* Reserve several spad for app to use. */
220         int spad_user_list[NTB_SPAD_USER_MAX_NUM];
221 };
222
223 #endif /* _NTB_H_ */