raw/ifpga: add HE-HSSI AFU driver
[dpdk.git] / drivers / raw / ifpga / afu_pmd_n3000.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2022 Intel Corporation
3  */
4
5 #ifndef AFU_PMD_N3000_H
6 #define AFU_PMD_N3000_H
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12 #include "afu_pmd_core.h"
13 #include "rte_pmd_afu.h"
14
15 #define N3000_AFU_UUID_L  0xc000c9660d824272
16 #define N3000_AFU_UUID_H  0x9aeffe5f84570612
17 #define N3000_NLB0_UUID_L 0xf89e433683f9040b
18 #define N3000_NLB0_UUID_H 0xd8424dc4a4a3c413
19 #define N3000_DMA_UUID_L  0xa9149a35bace01ea
20 #define N3000_DMA_UUID_H  0xef82def7f6ec40fc
21
22 #define NUM_N3000_DMA  4
23 #define MAX_MSIX_VEC   7
24
25 /* N3000 DFL definition */
26 #define DFH_UUID_L_OFFSET  8
27 #define DFH_UUID_H_OFFSET  16
28 #define DFH_TYPE(hdr)  (((hdr) >> 60) & 0xf)
29 #define DFH_TYPE_AFU  1
30 #define DFH_TYPE_BBB  2
31 #define DFH_TYPE_PRIVATE  3
32 #define DFH_EOL(hdr)  (((hdr) >> 40) & 0x1)
33 #define DFH_NEXT_OFFSET(hdr)  (((hdr) >> 16) & 0xffffff)
34 #define DFH_FEATURE_ID(hdr)  ((hdr) & 0xfff)
35 #define PORT_ATTR_REG(n)  (((n) << 3) + 0x38)
36 #define PORT_IMPLEMENTED(attr)  (((attr) >> 60) & 0x1)
37 #define PORT_BAR(attr)  (((attr) >> 32) & 0x7)
38 #define PORT_OFFSET(attr)  ((attr) & 0xffffff)
39 #define PORT_FEATURE_UINT_ID  0x12
40 #define PORT_UINT_CAP_REG  0x8
41 #define PORT_VEC_START(cap)  (((cap) >> 12) & 0xfff)
42 #define PORT_VEC_COUNT(cap)  ((cap) >> 12 & 0xfff)
43 #define PORT_CTRL_REG  0x38
44 #define PORT_SOFT_RESET  (0x1 << 0)
45
46 /* NLB registers definition */
47 #define CSR_SCRATCHPAD0    0x100
48 #define CSR_SCRATCHPAD1    0x108
49 #define CSR_AFU_DSM_BASEL  0x110
50 #define CSR_AFU_DSM_BASEH  0x114
51 #define CSR_SRC_ADDR       0x120
52 #define CSR_DST_ADDR       0x128
53 #define CSR_NUM_LINES      0x130
54 #define CSR_CTL            0x138
55 #define CSR_CFG            0x140
56 #define CSR_INACT_THRESH   0x148
57 #define CSR_INTERRUPT0     0x150
58 #define CSR_SWTEST_MSG     0x158
59 #define CSR_STATUS0        0x160
60 #define CSR_STATUS1        0x168
61 #define CSR_ERROR          0x170
62 #define CSR_STRIDE         0x178
63 #define CSR_HE_INFO0       0x180
64
65 #define DSM_SIZE           0x200000
66 #define DSM_STATUS         0x40
67 #define DSM_POLL_INTERVAL  5  /* ms */
68 #define DSM_TIMEOUT        1000  /* ms */
69
70 #define NLB_BUF_SIZE  0x400000
71 #define TEST_MEM_ALIGN  1024
72
73 struct nlb_csr_ctl {
74         union {
75                 uint32_t csr;
76                 struct {
77                         uint32_t reset:1;
78                         uint32_t start:1;
79                         uint32_t force_completion:1;
80                         uint32_t reserved:29;
81                 };
82         };
83 };
84
85 struct nlb_csr_cfg {
86         union {
87                 uint32_t csr;
88                 struct {
89                         uint32_t wrthru_en:1;
90                         uint32_t cont:1;
91                         uint32_t mode:3;
92                         uint32_t multicl_len:2;
93                         uint32_t rsvd1:1;
94                         uint32_t delay_en:1;
95                         uint32_t rdsel:2;
96                         uint32_t rsvd2:1;
97                         uint32_t chsel:3;
98                         uint32_t rsvd3:1;
99                         uint32_t wrpush_i:1;
100                         uint32_t wr_chsel:3;
101                         uint32_t rsvd4:3;
102                         uint32_t test_cfg:5;
103                         uint32_t interrupt_on_error:1;
104                         uint32_t interrupt_testmode:1;
105                         uint32_t wrfence_chsel:2;
106                 };
107         };
108 };
109
110 struct nlb_status0 {
111         union {
112                 uint64_t csr;
113                 struct {
114                         uint32_t num_writes;
115                         uint32_t num_reads;
116                 };
117         };
118 };
119
120 struct nlb_status1 {
121         union {
122                 uint64_t csr;
123                 struct {
124                         uint32_t num_pend_writes;
125                         uint32_t num_pend_reads;
126                 };
127         };
128 };
129
130 struct nlb_dsm_status {
131         uint32_t test_complete;
132         uint32_t test_error;
133         uint64_t num_clocks;
134         uint32_t num_reads;
135         uint32_t num_writes;
136         uint32_t start_overhead;
137         uint32_t end_overhead;
138 };
139
140 /* DMA registers definition */
141 #define DMA_CSR       0x40
142 #define DMA_DESC      0x60
143 #define DMA_ASE_CTRL  0x200
144 #define DMA_ASE_DATA  0x1000
145
146 #define DMA_ASE_WINDOW       4096
147 #define DMA_ASE_WINDOW_MASK  ((uint64_t)(DMA_ASE_WINDOW - 1))
148 #define INVALID_ASE_PAGE     0xffffffffffffffffULL
149
150 #define DMA_WF_MAGIC             0x5772745F53796E63ULL
151 #define DMA_WF_MAGIC_ROM         0x1000000000000
152 #define DMA_HOST_ADDR(addr)      ((addr) | 0x2000000000000)
153 #define DMA_WF_HOST_ADDR(addr)   ((addr) | 0x3000000000000)
154
155 #define NUM_DMA_BUF   8
156 #define HALF_DMA_BUF  (NUM_DMA_BUF / 2)
157
158 #define DMA_MASK_32_BIT 0xFFFFFFFF
159
160 #define DMA_CSR_BUSY           0x1
161 #define DMA_DESC_BUFFER_EMPTY  0x2
162 #define DMA_DESC_BUFFER_FULL   0x4
163
164 #define DWORD_BYTES 4
165 #define IS_ALIGNED_DWORD(addr) (((addr) % DWORD_BYTES) == 0)
166
167 #define QWORD_BYTES 8
168 #define IS_ALIGNED_QWORD(addr) (((addr) % QWORD_BYTES) == 0)
169
170 #define DMA_ALIGN_BYTES 64
171 #define IS_DMA_ALIGNED(addr) (((addr) % DMA_ALIGN_BYTES) == 0)
172
173 #define CCIP_ALIGN_BYTES (DMA_ALIGN_BYTES << 2)
174
175 #define DMA_TIMEOUT_MSEC  5000
176
177 #define MAGIC_BUF_SIZE  64
178 #define ERR_CHECK_LIMIT  64
179
180 #ifndef MIN
181 #define MIN(a, b) ((a) < (b) ? (a) : (b))
182 #endif
183
184 #ifndef ARRAY_SIZE
185 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
186 #endif
187
188 typedef enum {
189         HOST_TO_FPGA = 0,
190         FPGA_TO_HOST,
191         FPGA_TO_FPGA,
192         FPGA_MAX_TRANSFER_TYPE,
193 } fpga_dma_type;
194
195 typedef union {
196         uint32_t csr;
197         struct {
198                 uint32_t tx_channel:8;
199                 uint32_t generate_sop:1;
200                 uint32_t generate_eop:1;
201                 uint32_t park_reads:1;
202                 uint32_t park_writes:1;
203                 uint32_t end_on_eop:1;
204                 uint32_t reserved_1:1;
205                 uint32_t transfer_irq_en:1;
206                 uint32_t early_term_irq_en:1;
207                 uint32_t trans_error_irq_en:8;
208                 uint32_t early_done_en:1;
209                 uint32_t reserved_2:6;
210                 uint32_t go:1;
211         };
212 } msgdma_desc_ctrl;
213
214 typedef struct __rte_packed {
215         uint32_t rd_address;
216         uint32_t wr_address;
217         uint32_t len;
218         uint16_t seq_num;
219         uint8_t rd_burst_count;
220         uint8_t wr_burst_count;
221         uint16_t rd_stride;
222         uint16_t wr_stride;
223         uint32_t rd_address_ext;
224         uint32_t wr_address_ext;
225         msgdma_desc_ctrl control;
226 } msgdma_ext_desc;
227
228 typedef union {
229         uint32_t csr;
230         struct {
231                 uint32_t busy:1;
232                 uint32_t desc_buf_empty:1;
233                 uint32_t desc_buf_full:1;
234                 uint32_t rsp_buf_empty:1;
235                 uint32_t rsp_buf_full:1;
236                 uint32_t stopped:1;
237                 uint32_t resetting:1;
238                 uint32_t stopped_on_error:1;
239                 uint32_t stopped_on_early_term:1;
240                 uint32_t irq:1;
241                 uint32_t reserved:22;
242         };
243 } msgdma_status;
244
245 typedef union {
246         uint32_t csr;
247         struct {
248                 uint32_t stop_dispatcher:1;
249                 uint32_t reset_dispatcher:1;
250                 uint32_t stop_on_error:1;
251                 uint32_t stopped_on_early_term:1;
252                 uint32_t global_intr_en_mask:1;
253                 uint32_t stop_descriptors:1;
254                 uint32_t reserved:22;
255         };
256 } msgdma_ctrl;
257
258 typedef union {
259         uint32_t csr;
260         struct {
261                 uint32_t rd_fill_level:16;
262                 uint32_t wr_fill_level:16;
263         };
264 } msgdma_fill_level;
265
266 typedef union {
267         uint32_t csr;
268         struct {
269                 uint32_t rsp_fill_level:16;
270                 uint32_t reserved:16;
271         };
272 } msgdma_rsp_level;
273
274 typedef union {
275         uint32_t csr;
276         struct {
277                 uint32_t rd_seq_num:16;
278                 uint32_t wr_seq_num:16;
279         };
280 } msgdma_seq_num;
281
282 typedef struct __rte_packed {
283         msgdma_status status;
284         msgdma_ctrl ctrl;
285         msgdma_fill_level fill_level;
286         msgdma_rsp_level rsp;
287         msgdma_seq_num seq_num;
288 } msgdma_csr;
289
290 #define CSR_STATUS(csr)   (&(((msgdma_csr *)(csr))->status))
291 #define CSR_CONTROL(csr)  (&(((msgdma_csr *)(csr))->ctrl))
292
293 struct nlb_afu_ctx {
294         uint8_t *addr;
295         uint8_t *dsm_ptr;
296         uint64_t dsm_iova;
297         uint8_t *src_ptr;
298         uint64_t src_iova;
299         uint8_t *dest_ptr;
300         uint64_t dest_iova;
301         struct nlb_dsm_status *status_ptr;
302 };
303
304 struct dma_afu_ctx {
305         int index;
306         uint8_t *addr;
307         uint8_t *csr_addr;
308         uint8_t *desc_addr;
309         uint8_t *ase_ctrl_addr;
310         uint8_t *ase_data_addr;
311         uint64_t mem_size;
312         uint64_t cur_ase_page;
313         int event_fd;
314         int verbose;
315         int pattern;
316         void *data_buf;
317         void *ref_buf;
318         msgdma_ext_desc *desc_buf;
319         uint64_t *magic_buf;
320         uint64_t magic_iova;
321         uint32_t dma_buf_size;
322         uint64_t *dma_buf[NUM_DMA_BUF];
323         uint64_t dma_iova[NUM_DMA_BUF];
324 };
325
326 struct n3000_afu_priv {
327         struct rte_pmd_afu_nlb_cfg nlb_cfg;
328         struct rte_pmd_afu_dma_cfg dma_cfg;
329         struct nlb_afu_ctx nlb_ctx;
330         struct dma_afu_ctx dma_ctx[NUM_N3000_DMA];
331         int num_dma;
332         int cfg_type;
333 };
334
335 #ifdef __cplusplus
336 }
337 #endif
338
339 #endif /* AFU_PMD_N3000_H */