xref: /dpdk/drivers/raw/ifpga/afu_pmd_n3000.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
17d63899aSWei Huang /* SPDX-License-Identifier: BSD-3-Clause
27d63899aSWei Huang  * Copyright(c) 2022 Intel Corporation
37d63899aSWei Huang  */
47d63899aSWei Huang 
57d63899aSWei Huang #ifndef AFU_PMD_N3000_H
67d63899aSWei Huang #define AFU_PMD_N3000_H
77d63899aSWei Huang 
8719834a6SMattias Rönnblom #include "afu_pmd_core.h"
9719834a6SMattias Rönnblom #include "rte_pmd_afu.h"
10719834a6SMattias Rönnblom 
117d63899aSWei Huang #ifdef __cplusplus
127d63899aSWei Huang extern "C" {
137d63899aSWei Huang #endif
147d63899aSWei Huang 
157d63899aSWei Huang #define N3000_AFU_UUID_L  0xc000c9660d824272
167d63899aSWei Huang #define N3000_AFU_UUID_H  0x9aeffe5f84570612
177d63899aSWei Huang #define N3000_NLB0_UUID_L 0xf89e433683f9040b
187d63899aSWei Huang #define N3000_NLB0_UUID_H 0xd8424dc4a4a3c413
197d63899aSWei Huang #define N3000_DMA_UUID_L  0xa9149a35bace01ea
207d63899aSWei Huang #define N3000_DMA_UUID_H  0xef82def7f6ec40fc
217d63899aSWei Huang 
227d63899aSWei Huang #define NUM_N3000_DMA  4
237d63899aSWei Huang #define MAX_MSIX_VEC   7
247d63899aSWei Huang 
257d63899aSWei Huang /* N3000 DFL definition */
267d63899aSWei Huang #define DFH_UUID_L_OFFSET  8
277d63899aSWei Huang #define DFH_UUID_H_OFFSET  16
287d63899aSWei Huang #define DFH_TYPE(hdr)  (((hdr) >> 60) & 0xf)
297d63899aSWei Huang #define DFH_TYPE_AFU  1
307d63899aSWei Huang #define DFH_TYPE_BBB  2
317d63899aSWei Huang #define DFH_TYPE_PRIVATE  3
327d63899aSWei Huang #define DFH_EOL(hdr)  (((hdr) >> 40) & 0x1)
337d63899aSWei Huang #define DFH_NEXT_OFFSET(hdr)  (((hdr) >> 16) & 0xffffff)
347d63899aSWei Huang #define DFH_FEATURE_ID(hdr)  ((hdr) & 0xfff)
357d63899aSWei Huang #define PORT_ATTR_REG(n)  (((n) << 3) + 0x38)
367d63899aSWei Huang #define PORT_IMPLEMENTED(attr)  (((attr) >> 60) & 0x1)
377d63899aSWei Huang #define PORT_BAR(attr)  (((attr) >> 32) & 0x7)
387d63899aSWei Huang #define PORT_OFFSET(attr)  ((attr) & 0xffffff)
397d63899aSWei Huang #define PORT_FEATURE_UINT_ID  0x12
407d63899aSWei Huang #define PORT_UINT_CAP_REG  0x8
417d63899aSWei Huang #define PORT_VEC_START(cap)  (((cap) >> 12) & 0xfff)
427d63899aSWei Huang #define PORT_VEC_COUNT(cap)  ((cap) >> 12 & 0xfff)
437d63899aSWei Huang #define PORT_CTRL_REG  0x38
447d63899aSWei Huang #define PORT_SOFT_RESET  (0x1 << 0)
457d63899aSWei Huang 
467d63899aSWei Huang /* NLB registers definition */
477d63899aSWei Huang #define CSR_SCRATCHPAD0    0x100
487d63899aSWei Huang #define CSR_SCRATCHPAD1    0x108
497d63899aSWei Huang #define CSR_AFU_DSM_BASEL  0x110
507d63899aSWei Huang #define CSR_AFU_DSM_BASEH  0x114
517d63899aSWei Huang #define CSR_SRC_ADDR       0x120
527d63899aSWei Huang #define CSR_DST_ADDR       0x128
537d63899aSWei Huang #define CSR_NUM_LINES      0x130
547d63899aSWei Huang #define CSR_CTL            0x138
557d63899aSWei Huang #define CSR_CFG            0x140
567d63899aSWei Huang #define CSR_INACT_THRESH   0x148
577d63899aSWei Huang #define CSR_INTERRUPT0     0x150
587d63899aSWei Huang #define CSR_SWTEST_MSG     0x158
597d63899aSWei Huang #define CSR_STATUS0        0x160
607d63899aSWei Huang #define CSR_STATUS1        0x168
617d63899aSWei Huang #define CSR_ERROR          0x170
627d63899aSWei Huang #define CSR_STRIDE         0x178
637d63899aSWei Huang #define CSR_HE_INFO0       0x180
647d63899aSWei Huang 
657d63899aSWei Huang #define DSM_SIZE           0x200000
667d63899aSWei Huang #define DSM_STATUS         0x40
677d63899aSWei Huang #define DSM_POLL_INTERVAL  5  /* ms */
687d63899aSWei Huang #define DSM_TIMEOUT        1000  /* ms */
697d63899aSWei Huang 
707d63899aSWei Huang #define NLB_BUF_SIZE  0x400000
717d63899aSWei Huang #define TEST_MEM_ALIGN  1024
727d63899aSWei Huang 
737d63899aSWei Huang struct nlb_csr_ctl {
747d63899aSWei Huang 	union {
757d63899aSWei Huang 		uint32_t csr;
767d63899aSWei Huang 		struct {
777d63899aSWei Huang 			uint32_t reset:1;
787d63899aSWei Huang 			uint32_t start:1;
797d63899aSWei Huang 			uint32_t force_completion:1;
807d63899aSWei Huang 			uint32_t reserved:29;
817d63899aSWei Huang 		};
827d63899aSWei Huang 	};
837d63899aSWei Huang };
847d63899aSWei Huang 
857d63899aSWei Huang struct nlb_csr_cfg {
867d63899aSWei Huang 	union {
877d63899aSWei Huang 		uint32_t csr;
887d63899aSWei Huang 		struct {
897d63899aSWei Huang 			uint32_t wrthru_en:1;
907d63899aSWei Huang 			uint32_t cont:1;
917d63899aSWei Huang 			uint32_t mode:3;
927d63899aSWei Huang 			uint32_t multicl_len:2;
937d63899aSWei Huang 			uint32_t rsvd1:1;
947d63899aSWei Huang 			uint32_t delay_en:1;
957d63899aSWei Huang 			uint32_t rdsel:2;
967d63899aSWei Huang 			uint32_t rsvd2:1;
977d63899aSWei Huang 			uint32_t chsel:3;
987d63899aSWei Huang 			uint32_t rsvd3:1;
997d63899aSWei Huang 			uint32_t wrpush_i:1;
1007d63899aSWei Huang 			uint32_t wr_chsel:3;
1017d63899aSWei Huang 			uint32_t rsvd4:3;
1027d63899aSWei Huang 			uint32_t test_cfg:5;
1037d63899aSWei Huang 			uint32_t interrupt_on_error:1;
1047d63899aSWei Huang 			uint32_t interrupt_testmode:1;
1057d63899aSWei Huang 			uint32_t wrfence_chsel:2;
1067d63899aSWei Huang 		};
1077d63899aSWei Huang 	};
1087d63899aSWei Huang };
1097d63899aSWei Huang 
1107d63899aSWei Huang struct nlb_status0 {
1117d63899aSWei Huang 	union {
1127d63899aSWei Huang 		uint64_t csr;
1137d63899aSWei Huang 		struct {
1147d63899aSWei Huang 			uint32_t num_writes;
1157d63899aSWei Huang 			uint32_t num_reads;
1167d63899aSWei Huang 		};
1177d63899aSWei Huang 	};
1187d63899aSWei Huang };
1197d63899aSWei Huang 
1207d63899aSWei Huang struct nlb_status1 {
1217d63899aSWei Huang 	union {
1227d63899aSWei Huang 		uint64_t csr;
1237d63899aSWei Huang 		struct {
1247d63899aSWei Huang 			uint32_t num_pend_writes;
1257d63899aSWei Huang 			uint32_t num_pend_reads;
1267d63899aSWei Huang 		};
1277d63899aSWei Huang 	};
1287d63899aSWei Huang };
1297d63899aSWei Huang 
1307d63899aSWei Huang struct nlb_dsm_status {
1317d63899aSWei Huang 	uint32_t test_complete;
1327d63899aSWei Huang 	uint32_t test_error;
1337d63899aSWei Huang 	uint64_t num_clocks;
1347d63899aSWei Huang 	uint32_t num_reads;
1357d63899aSWei Huang 	uint32_t num_writes;
1367d63899aSWei Huang 	uint32_t start_overhead;
1377d63899aSWei Huang 	uint32_t end_overhead;
1387d63899aSWei Huang };
1397d63899aSWei Huang 
1407d63899aSWei Huang /* DMA registers definition */
1417d63899aSWei Huang #define DMA_CSR       0x40
1427d63899aSWei Huang #define DMA_DESC      0x60
1437d63899aSWei Huang #define DMA_ASE_CTRL  0x200
1447d63899aSWei Huang #define DMA_ASE_DATA  0x1000
1457d63899aSWei Huang 
1467d63899aSWei Huang #define DMA_ASE_WINDOW       4096
1477d63899aSWei Huang #define DMA_ASE_WINDOW_MASK  ((uint64_t)(DMA_ASE_WINDOW - 1))
1487d63899aSWei Huang #define INVALID_ASE_PAGE     0xffffffffffffffffULL
1497d63899aSWei Huang 
1507d63899aSWei Huang #define DMA_WF_MAGIC             0x5772745F53796E63ULL
1517d63899aSWei Huang #define DMA_WF_MAGIC_ROM         0x1000000000000
1527d63899aSWei Huang #define DMA_HOST_ADDR(addr)      ((addr) | 0x2000000000000)
1537d63899aSWei Huang #define DMA_WF_HOST_ADDR(addr)   ((addr) | 0x3000000000000)
1547d63899aSWei Huang 
1557d63899aSWei Huang #define NUM_DMA_BUF   8
1567d63899aSWei Huang #define HALF_DMA_BUF  (NUM_DMA_BUF / 2)
1577d63899aSWei Huang 
1587d63899aSWei Huang #define DMA_MASK_32_BIT 0xFFFFFFFF
1597d63899aSWei Huang 
1607d63899aSWei Huang #define DMA_CSR_BUSY           0x1
1617d63899aSWei Huang #define DMA_DESC_BUFFER_EMPTY  0x2
1627d63899aSWei Huang #define DMA_DESC_BUFFER_FULL   0x4
1637d63899aSWei Huang 
1647d63899aSWei Huang #define DWORD_BYTES 4
1657d63899aSWei Huang #define IS_ALIGNED_DWORD(addr) (((addr) % DWORD_BYTES) == 0)
1667d63899aSWei Huang 
1677d63899aSWei Huang #define QWORD_BYTES 8
1687d63899aSWei Huang #define IS_ALIGNED_QWORD(addr) (((addr) % QWORD_BYTES) == 0)
1697d63899aSWei Huang 
1707d63899aSWei Huang #define DMA_ALIGN_BYTES 64
1717d63899aSWei Huang #define IS_DMA_ALIGNED(addr) (((addr) % DMA_ALIGN_BYTES) == 0)
1727d63899aSWei Huang 
1737d63899aSWei Huang #define CCIP_ALIGN_BYTES (DMA_ALIGN_BYTES << 2)
1747d63899aSWei Huang 
1757d63899aSWei Huang #define DMA_TIMEOUT_MSEC  5000
1767d63899aSWei Huang 
1777d63899aSWei Huang #define MAGIC_BUF_SIZE  64
1787d63899aSWei Huang #define ERR_CHECK_LIMIT  64
1797d63899aSWei Huang 
1807d63899aSWei Huang #ifndef MIN
1817d63899aSWei Huang #define MIN(a, b) ((a) < (b) ? (a) : (b))
1827d63899aSWei Huang #endif
1837d63899aSWei Huang 
1847d63899aSWei Huang #ifndef ARRAY_SIZE
1857d63899aSWei Huang #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
1867d63899aSWei Huang #endif
1877d63899aSWei Huang 
1887d63899aSWei Huang typedef enum {
1897d63899aSWei Huang 	HOST_TO_FPGA = 0,
1907d63899aSWei Huang 	FPGA_TO_HOST,
1917d63899aSWei Huang 	FPGA_TO_FPGA,
1927d63899aSWei Huang 	FPGA_MAX_TRANSFER_TYPE,
1937d63899aSWei Huang } fpga_dma_type;
1947d63899aSWei Huang 
1957d63899aSWei Huang typedef union {
1967d63899aSWei Huang 	uint32_t csr;
1977d63899aSWei Huang 	struct {
1987d63899aSWei Huang 		uint32_t tx_channel:8;
1997d63899aSWei Huang 		uint32_t generate_sop:1;
2007d63899aSWei Huang 		uint32_t generate_eop:1;
2017d63899aSWei Huang 		uint32_t park_reads:1;
2027d63899aSWei Huang 		uint32_t park_writes:1;
2037d63899aSWei Huang 		uint32_t end_on_eop:1;
2047d63899aSWei Huang 		uint32_t reserved_1:1;
2057d63899aSWei Huang 		uint32_t transfer_irq_en:1;
2067d63899aSWei Huang 		uint32_t early_term_irq_en:1;
2077d63899aSWei Huang 		uint32_t trans_error_irq_en:8;
2087d63899aSWei Huang 		uint32_t early_done_en:1;
2097d63899aSWei Huang 		uint32_t reserved_2:6;
2107d63899aSWei Huang 		uint32_t go:1;
2117d63899aSWei Huang 	};
2127d63899aSWei Huang } msgdma_desc_ctrl;
2137d63899aSWei Huang 
214*e7750639SAndre Muezerie typedef struct __rte_packed_begin {
2157d63899aSWei Huang 	uint32_t rd_address;
2167d63899aSWei Huang 	uint32_t wr_address;
2177d63899aSWei Huang 	uint32_t len;
2187d63899aSWei Huang 	uint16_t seq_num;
2197d63899aSWei Huang 	uint8_t rd_burst_count;
2207d63899aSWei Huang 	uint8_t wr_burst_count;
2217d63899aSWei Huang 	uint16_t rd_stride;
2227d63899aSWei Huang 	uint16_t wr_stride;
2237d63899aSWei Huang 	uint32_t rd_address_ext;
2247d63899aSWei Huang 	uint32_t wr_address_ext;
2257d63899aSWei Huang 	msgdma_desc_ctrl control;
226*e7750639SAndre Muezerie } __rte_packed_end msgdma_ext_desc;
2277d63899aSWei Huang 
2287d63899aSWei Huang typedef union {
2297d63899aSWei Huang 	uint32_t csr;
2307d63899aSWei Huang 	struct {
2317d63899aSWei Huang 		uint32_t busy:1;
2327d63899aSWei Huang 		uint32_t desc_buf_empty:1;
2337d63899aSWei Huang 		uint32_t desc_buf_full:1;
2347d63899aSWei Huang 		uint32_t rsp_buf_empty:1;
2357d63899aSWei Huang 		uint32_t rsp_buf_full:1;
2367d63899aSWei Huang 		uint32_t stopped:1;
2377d63899aSWei Huang 		uint32_t resetting:1;
2387d63899aSWei Huang 		uint32_t stopped_on_error:1;
2397d63899aSWei Huang 		uint32_t stopped_on_early_term:1;
2407d63899aSWei Huang 		uint32_t irq:1;
2417d63899aSWei Huang 		uint32_t reserved:22;
2427d63899aSWei Huang 	};
2437d63899aSWei Huang } msgdma_status;
2447d63899aSWei Huang 
2457d63899aSWei Huang typedef union {
2467d63899aSWei Huang 	uint32_t csr;
2477d63899aSWei Huang 	struct {
2487d63899aSWei Huang 		uint32_t stop_dispatcher:1;
2497d63899aSWei Huang 		uint32_t reset_dispatcher:1;
2507d63899aSWei Huang 		uint32_t stop_on_error:1;
2517d63899aSWei Huang 		uint32_t stopped_on_early_term:1;
2527d63899aSWei Huang 		uint32_t global_intr_en_mask:1;
2537d63899aSWei Huang 		uint32_t stop_descriptors:1;
2547d63899aSWei Huang 		uint32_t reserved:22;
2557d63899aSWei Huang 	};
2567d63899aSWei Huang } msgdma_ctrl;
2577d63899aSWei Huang 
2587d63899aSWei Huang typedef union {
2597d63899aSWei Huang 	uint32_t csr;
2607d63899aSWei Huang 	struct {
2617d63899aSWei Huang 		uint32_t rd_fill_level:16;
2627d63899aSWei Huang 		uint32_t wr_fill_level:16;
2637d63899aSWei Huang 	};
2647d63899aSWei Huang } msgdma_fill_level;
2657d63899aSWei Huang 
2667d63899aSWei Huang typedef union {
2677d63899aSWei Huang 	uint32_t csr;
2687d63899aSWei Huang 	struct {
2697d63899aSWei Huang 		uint32_t rsp_fill_level:16;
2707d63899aSWei Huang 		uint32_t reserved:16;
2717d63899aSWei Huang 	};
2727d63899aSWei Huang } msgdma_rsp_level;
2737d63899aSWei Huang 
2747d63899aSWei Huang typedef union {
2757d63899aSWei Huang 	uint32_t csr;
2767d63899aSWei Huang 	struct {
2777d63899aSWei Huang 		uint32_t rd_seq_num:16;
2787d63899aSWei Huang 		uint32_t wr_seq_num:16;
2797d63899aSWei Huang 	};
2807d63899aSWei Huang } msgdma_seq_num;
2817d63899aSWei Huang 
282*e7750639SAndre Muezerie typedef struct __rte_packed_begin {
2837d63899aSWei Huang 	msgdma_status status;
2847d63899aSWei Huang 	msgdma_ctrl ctrl;
2857d63899aSWei Huang 	msgdma_fill_level fill_level;
2867d63899aSWei Huang 	msgdma_rsp_level rsp;
2877d63899aSWei Huang 	msgdma_seq_num seq_num;
288*e7750639SAndre Muezerie } __rte_packed_end msgdma_csr;
2897d63899aSWei Huang 
2907d63899aSWei Huang #define CSR_STATUS(csr)   (&(((msgdma_csr *)(csr))->status))
2917d63899aSWei Huang #define CSR_CONTROL(csr)  (&(((msgdma_csr *)(csr))->ctrl))
2927d63899aSWei Huang 
2937d63899aSWei Huang struct nlb_afu_ctx {
2947d63899aSWei Huang 	uint8_t *addr;
2957d63899aSWei Huang 	uint8_t *dsm_ptr;
2967d63899aSWei Huang 	uint64_t dsm_iova;
2977d63899aSWei Huang 	uint8_t *src_ptr;
2987d63899aSWei Huang 	uint64_t src_iova;
2997d63899aSWei Huang 	uint8_t *dest_ptr;
3007d63899aSWei Huang 	uint64_t dest_iova;
3017d63899aSWei Huang 	struct nlb_dsm_status *status_ptr;
3027d63899aSWei Huang };
3037d63899aSWei Huang 
3047d63899aSWei Huang struct dma_afu_ctx {
3057d63899aSWei Huang 	int index;
3067d63899aSWei Huang 	uint8_t *addr;
3077d63899aSWei Huang 	uint8_t *csr_addr;
3087d63899aSWei Huang 	uint8_t *desc_addr;
3097d63899aSWei Huang 	uint8_t *ase_ctrl_addr;
3107d63899aSWei Huang 	uint8_t *ase_data_addr;
3117d63899aSWei Huang 	uint64_t mem_size;
3127d63899aSWei Huang 	uint64_t cur_ase_page;
3137d63899aSWei Huang 	int event_fd;
3147d63899aSWei Huang 	int verbose;
3157d63899aSWei Huang 	int pattern;
3167d63899aSWei Huang 	void *data_buf;
3177d63899aSWei Huang 	void *ref_buf;
3187d63899aSWei Huang 	msgdma_ext_desc *desc_buf;
3197d63899aSWei Huang 	uint64_t *magic_buf;
3207d63899aSWei Huang 	uint64_t magic_iova;
3217d63899aSWei Huang 	uint32_t dma_buf_size;
3227d63899aSWei Huang 	uint64_t *dma_buf[NUM_DMA_BUF];
3237d63899aSWei Huang 	uint64_t dma_iova[NUM_DMA_BUF];
3247d63899aSWei Huang };
3257d63899aSWei Huang 
3267d63899aSWei Huang struct n3000_afu_priv {
3277d63899aSWei Huang 	struct rte_pmd_afu_nlb_cfg nlb_cfg;
3287d63899aSWei Huang 	struct rte_pmd_afu_dma_cfg dma_cfg;
3297d63899aSWei Huang 	struct nlb_afu_ctx nlb_ctx;
3307d63899aSWei Huang 	struct dma_afu_ctx dma_ctx[NUM_N3000_DMA];
3317d63899aSWei Huang 	int num_dma;
3327d63899aSWei Huang 	int cfg_type;
3337d63899aSWei Huang };
3347d63899aSWei Huang 
3357d63899aSWei Huang #ifdef __cplusplus
3367d63899aSWei Huang }
3377d63899aSWei Huang #endif
3387d63899aSWei Huang 
3397d63899aSWei Huang #endif /* AFU_PMD_N3000_H */
340