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