18caf8427SNipun Gupta /* SPDX-License-Identifier: BSD-3-Clause 2388e888dSJun Yang * Copyright 2018-2024 NXP 38caf8427SNipun Gupta */ 48caf8427SNipun Gupta 58caf8427SNipun Gupta #ifndef _DPAA2_QDMA_H_ 68caf8427SNipun Gupta #define _DPAA2_QDMA_H_ 78caf8427SNipun Gupta 807d679bcSJun Yang #include "portal/dpaa2_hw_pvt.h" 907d679bcSJun Yang #include "portal/dpaa2_hw_dpio.h" 1007d679bcSJun Yang 118caf8427SNipun Gupta #define DPAA2_QDMA_MAX_VHANS 64 128caf8427SNipun Gupta 1307d679bcSJun Yang #define DPAA2_DPDMAI_MAX_QUEUES 16 148caf8427SNipun Gupta 158caf8427SNipun Gupta /** Notification by FQD_CTX[fqid] */ 168caf8427SNipun Gupta #define QDMA_SER_CTX (1 << 8) 178caf8427SNipun Gupta #define DPAA2_RBP_MEM_RW 0x0 188caf8427SNipun Gupta /** 198caf8427SNipun Gupta * Source descriptor command read transaction type for RBP=0: 208caf8427SNipun Gupta * coherent copy of cacheable memory 218caf8427SNipun Gupta */ 228caf8427SNipun Gupta #define DPAA2_COHERENT_NO_ALLOCATE_CACHE 0xb 238caf8427SNipun Gupta #define DPAA2_LX2_COHERENT_NO_ALLOCATE_CACHE 0x7 248caf8427SNipun Gupta /** 258caf8427SNipun Gupta * Destination descriptor command write transaction type for RBP=0: 268caf8427SNipun Gupta * coherent copy of cacheable memory 278caf8427SNipun Gupta */ 288caf8427SNipun Gupta #define DPAA2_COHERENT_ALLOCATE_CACHE 0x6 298caf8427SNipun Gupta #define DPAA2_LX2_COHERENT_ALLOCATE_CACHE 0xb 308caf8427SNipun Gupta 318caf8427SNipun Gupta /** Maximum possible H/W Queues on each core */ 328caf8427SNipun Gupta #define MAX_HW_QUEUE_PER_CORE 64 338caf8427SNipun Gupta 34388e888dSJun Yang #define DPAA2_QDMA_FD_FLUSH_FORMAT 0x0 35388e888dSJun Yang #define DPAA2_QDMA_FD_LONG_FORMAT 0x1 36388e888dSJun Yang #define DPAA2_QDMA_FD_SHORT_FORMAT 0x3 37388e888dSJun Yang 38388e888dSJun Yang #define DPAA2_QDMA_BMT_ENABLE 0x1 39388e888dSJun Yang #define DPAA2_QDMA_BMT_DISABLE 0x0 408caf8427SNipun Gupta 418caf8427SNipun Gupta /** Source/Destination Descriptor */ 42*e7750639SAndre Muezerie struct __rte_packed_begin qdma_sdd { 438caf8427SNipun Gupta uint32_t rsv; 448caf8427SNipun Gupta /** Stride configuration */ 458caf8427SNipun Gupta uint32_t stride; 468caf8427SNipun Gupta /** Route-by-port command */ 478caf8427SNipun Gupta union { 488caf8427SNipun Gupta uint32_t rbpcmd; 498caf8427SNipun Gupta struct rbpcmd_st { 508caf8427SNipun Gupta uint32_t vfid:6; 518caf8427SNipun Gupta uint32_t rsv4:2; 528caf8427SNipun Gupta uint32_t pfid:1; 538caf8427SNipun Gupta uint32_t rsv3:7; 548caf8427SNipun Gupta uint32_t attr:3; 558caf8427SNipun Gupta uint32_t rsv2:1; 568caf8427SNipun Gupta uint32_t at:2; 578caf8427SNipun Gupta uint32_t vfa:1; 588caf8427SNipun Gupta uint32_t ca:1; 598caf8427SNipun Gupta uint32_t tc:3; 608caf8427SNipun Gupta uint32_t rsv1:5; 618caf8427SNipun Gupta } rbpcmd_simple; 628caf8427SNipun Gupta }; 638caf8427SNipun Gupta union { 648caf8427SNipun Gupta uint32_t cmd; 658caf8427SNipun Gupta struct rcmd_simple { 668caf8427SNipun Gupta uint32_t portid:4; 678caf8427SNipun Gupta uint32_t rsv1:14; 688caf8427SNipun Gupta uint32_t rbp:1; 698caf8427SNipun Gupta uint32_t ssen:1; 708caf8427SNipun Gupta uint32_t rthrotl:4; 718caf8427SNipun Gupta uint32_t sqos:3; 728caf8427SNipun Gupta uint32_t ns:1; 738caf8427SNipun Gupta uint32_t rdtype:4; 748caf8427SNipun Gupta } read_cmd; 758caf8427SNipun Gupta struct wcmd_simple { 768caf8427SNipun Gupta uint32_t portid:4; 778caf8427SNipun Gupta uint32_t rsv3:10; 788caf8427SNipun Gupta uint32_t rsv2:2; 798caf8427SNipun Gupta uint32_t lwc:2; 808caf8427SNipun Gupta uint32_t rbp:1; 818caf8427SNipun Gupta uint32_t dsen:1; 828caf8427SNipun Gupta uint32_t rsv1:4; 838caf8427SNipun Gupta uint32_t dqos:3; 848caf8427SNipun Gupta uint32_t ns:1; 858caf8427SNipun Gupta uint32_t wrttype:4; 868caf8427SNipun Gupta } write_cmd; 878caf8427SNipun Gupta }; 88*e7750639SAndre Muezerie } __rte_packed_end; 898caf8427SNipun Gupta 908caf8427SNipun Gupta #define QDMA_SG_FMT_SDB 0x0 /* single data buffer */ 918caf8427SNipun Gupta #define QDMA_SG_FMT_FDS 0x1 /* frame data section */ 928caf8427SNipun Gupta #define QDMA_SG_FMT_SGTE 0x2 /* SGT extension */ 938caf8427SNipun Gupta #define QDMA_SG_SL_SHORT 0x1 /* short length */ 948caf8427SNipun Gupta #define QDMA_SG_SL_LONG 0x0 /* long length */ 958caf8427SNipun Gupta #define QDMA_SG_F 0x1 /* last sg entry */ 96388e888dSJun Yang #define QDMA_SG_BMT_ENABLE DPAA2_QDMA_BMT_ENABLE 97388e888dSJun Yang #define QDMA_SG_BMT_DISABLE DPAA2_QDMA_BMT_DISABLE 988caf8427SNipun Gupta 99*e7750639SAndre Muezerie struct __rte_packed_begin qdma_sg_entry { 1008caf8427SNipun Gupta uint32_t addr_lo; /* address 0:31 */ 1018caf8427SNipun Gupta uint32_t addr_hi:17; /* address 32:48 */ 1028caf8427SNipun Gupta uint32_t rsv:15; 1038caf8427SNipun Gupta union { 1048caf8427SNipun Gupta uint32_t data_len_sl0; /* SL=0, the long format */ 1058caf8427SNipun Gupta struct { 1068caf8427SNipun Gupta uint32_t len:17; /* SL=1, the short format */ 1078caf8427SNipun Gupta uint32_t reserve:3; 1088caf8427SNipun Gupta uint32_t sf:1; 1098caf8427SNipun Gupta uint32_t sr:1; 1108caf8427SNipun Gupta uint32_t size:10; /* buff size */ 1118caf8427SNipun Gupta } data_len_sl1; 1128caf8427SNipun Gupta } data_len; /* AVAIL_LENGTH */ 1138caf8427SNipun Gupta union { 1148caf8427SNipun Gupta uint32_t ctrl_fields; 1158caf8427SNipun Gupta struct { 1168caf8427SNipun Gupta uint32_t bpid:14; 1178caf8427SNipun Gupta uint32_t ivp:1; 1188caf8427SNipun Gupta uint32_t bmt:1; 1198caf8427SNipun Gupta uint32_t offset:12; 1208caf8427SNipun Gupta uint32_t fmt:2; 1218caf8427SNipun Gupta uint32_t sl:1; 1228caf8427SNipun Gupta uint32_t f:1; 1238caf8427SNipun Gupta } ctrl; 1248caf8427SNipun Gupta }; 125*e7750639SAndre Muezerie } __rte_packed_end; 1268caf8427SNipun Gupta 1273d990faaSJun Yang struct dpaa2_qdma_rbp { 1283d990faaSJun Yang uint32_t use_ultrashort:1; 1293d990faaSJun Yang uint32_t enable:1; 1303d990faaSJun Yang /** 1313d990faaSJun Yang * dportid: 1323d990faaSJun Yang * 0000 PCI-Express 1 1333d990faaSJun Yang * 0001 PCI-Express 2 1343d990faaSJun Yang * 0010 PCI-Express 3 1353d990faaSJun Yang * 0011 PCI-Express 4 1363d990faaSJun Yang * 0100 PCI-Express 5 1373d990faaSJun Yang * 0101 PCI-Express 6 1383d990faaSJun Yang */ 1393d990faaSJun Yang uint32_t dportid:4; 1403d990faaSJun Yang uint32_t dpfid:2; 1413d990faaSJun Yang uint32_t dvfid:6; 1423d990faaSJun Yang uint32_t dvfa:1; 1433d990faaSJun Yang /*using route by port for destination */ 1443d990faaSJun Yang uint32_t drbp:1; 1453d990faaSJun Yang /** 1463d990faaSJun Yang * sportid: 1473d990faaSJun Yang * 0000 PCI-Express 1 1483d990faaSJun Yang * 0001 PCI-Express 2 1493d990faaSJun Yang * 0010 PCI-Express 3 1503d990faaSJun Yang * 0011 PCI-Express 4 1513d990faaSJun Yang * 0100 PCI-Express 5 1523d990faaSJun Yang * 0101 PCI-Express 6 1533d990faaSJun Yang */ 1543d990faaSJun Yang uint32_t sportid:4; 1553d990faaSJun Yang uint32_t spfid:2; 1563d990faaSJun Yang uint32_t svfid:6; 1573d990faaSJun Yang uint32_t svfa:1; 1583d990faaSJun Yang /* using route by port for source */ 1593d990faaSJun Yang uint32_t srbp:1; 1603d990faaSJun Yang uint32_t rsv:2; 1613d990faaSJun Yang }; 1623d990faaSJun Yang 163388e888dSJun Yang enum dpaa2_qdma_fd_type { 164388e888dSJun Yang DPAA2_QDMA_FD_SHORT = 1, 165388e888dSJun Yang DPAA2_QDMA_FD_LONG = 2, 166388e888dSJun Yang DPAA2_QDMA_FD_SG = 3 167388e888dSJun Yang }; 168388e888dSJun Yang 169388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_TYPE_OFFSET 13 170b52af62fSJun Yang #define DPAA2_QDMA_FD_ATT_MAX_IDX \ 171b52af62fSJun Yang ((1 << DPAA2_QDMA_FD_ATT_TYPE_OFFSET) - 1) 172388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_TYPE(att) \ 173388e888dSJun Yang (att >> DPAA2_QDMA_FD_ATT_TYPE_OFFSET) 174388e888dSJun Yang #define DPAA2_QDMA_FD_ATT_CNTX(att) \ 175b52af62fSJun Yang (att & DPAA2_QDMA_FD_ATT_MAX_IDX) 176b52af62fSJun Yang 177b52af62fSJun Yang #define DPAA2_QDMA_MAX_DESC ((DPAA2_QDMA_FD_ATT_MAX_IDX + 1) / 2) 178b52af62fSJun Yang #define DPAA2_QDMA_MIN_DESC 1 179388e888dSJun Yang 180388e888dSJun Yang static inline void 181388e888dSJun Yang dpaa2_qdma_fd_set_addr(struct qbman_fd *fd, 182388e888dSJun Yang uint64_t addr) 183388e888dSJun Yang { 184388e888dSJun Yang fd->simple_ddr.saddr_lo = lower_32_bits(addr); 185388e888dSJun Yang fd->simple_ddr.saddr_hi = upper_32_bits(addr); 186388e888dSJun Yang } 187388e888dSJun Yang 188388e888dSJun Yang static inline void 189388e888dSJun Yang dpaa2_qdma_fd_save_att(struct qbman_fd *fd, 190388e888dSJun Yang uint16_t job_idx, enum dpaa2_qdma_fd_type type) 191388e888dSJun Yang { 192b52af62fSJun Yang RTE_ASSERT(job_idx <= DPAA2_QDMA_FD_ATT_MAX_IDX); 193388e888dSJun Yang fd->simple_ddr.rsv1_att = job_idx | 194388e888dSJun Yang (type << DPAA2_QDMA_FD_ATT_TYPE_OFFSET); 195388e888dSJun Yang } 196388e888dSJun Yang 197388e888dSJun Yang static inline uint16_t 198388e888dSJun Yang dpaa2_qdma_fd_get_att(const struct qbman_fd *fd) 199388e888dSJun Yang { 200388e888dSJun Yang return fd->simple_ddr.rsv1_att; 201388e888dSJun Yang } 202388e888dSJun Yang 20307d679bcSJun Yang enum { 20407d679bcSJun Yang DPAA2_QDMA_SDD_FLE, 20507d679bcSJun Yang DPAA2_QDMA_SRC_FLE, 20607d679bcSJun Yang DPAA2_QDMA_DST_FLE, 20707d679bcSJun Yang DPAA2_QDMA_MAX_FLE 20807d679bcSJun Yang }; 20907d679bcSJun Yang 21007d679bcSJun Yang enum { 21107d679bcSJun Yang DPAA2_QDMA_SRC_SDD, 21207d679bcSJun Yang DPAA2_QDMA_DST_SDD, 21307d679bcSJun Yang DPAA2_QDMA_MAX_SDD 21407d679bcSJun Yang }; 21507d679bcSJun Yang 216*e7750639SAndre Muezerie struct __rte_packed_begin qdma_cntx_fle_sdd { 21707d679bcSJun Yang struct qbman_fle fle[DPAA2_QDMA_MAX_FLE]; 21807d679bcSJun Yang struct qdma_sdd sdd[DPAA2_QDMA_MAX_SDD]; 219*e7750639SAndre Muezerie } __rte_packed_end; 22007d679bcSJun Yang 221*e7750639SAndre Muezerie struct __rte_packed_begin qdma_cntx_sg { 22207d679bcSJun Yang struct qdma_cntx_fle_sdd fle_sdd; 2237cfcce8eSJun Yang struct qdma_sg_entry sg_src_entry[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX]; 2247cfcce8eSJun Yang struct qdma_sg_entry sg_dst_entry[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX]; 2257cfcce8eSJun Yang uint16_t cntx_idx[RTE_DPAAX_QDMA_JOB_SUBMIT_MAX]; 22607d679bcSJun Yang uint16_t job_nb; 22707d679bcSJun Yang uint16_t rsv[3]; 228*e7750639SAndre Muezerie } __rte_packed_end; 22907d679bcSJun Yang 23007d679bcSJun Yang #define DPAA2_QDMA_IDXADDR_FROM_SG_FLAG(flag) \ 2317cfcce8eSJun Yang ((void *)(uintptr_t)((flag) - ((flag) & RTE_DPAAX_QDMA_SG_IDX_ADDR_MASK))) 23207d679bcSJun Yang 23307d679bcSJun Yang #define DPAA2_QDMA_IDX_FROM_FLAG(flag) \ 2347cfcce8eSJun Yang ((flag) >> RTE_DPAAX_QDMA_COPY_IDX_OFFSET) 23507d679bcSJun Yang 2368caf8427SNipun Gupta /** Represents a DPDMAI device */ 2378caf8427SNipun Gupta struct dpaa2_dpdmai_dev { 2388caf8427SNipun Gupta /** Pointer to Next device instance */ 2398caf8427SNipun Gupta TAILQ_ENTRY(dpaa2_qdma_device) next; 2408caf8427SNipun Gupta /** HW ID for DPDMAI object */ 2418caf8427SNipun Gupta uint32_t dpdmai_id; 2428caf8427SNipun Gupta /** Tocken of this device */ 2438caf8427SNipun Gupta uint16_t token; 2448caf8427SNipun Gupta /** Number of queue in this DPDMAI device */ 2458caf8427SNipun Gupta uint8_t num_queues; 2468caf8427SNipun Gupta /** RX queues */ 2478caf8427SNipun Gupta struct dpaa2_queue rx_queue[DPAA2_DPDMAI_MAX_QUEUES]; 2488caf8427SNipun Gupta /** TX queues */ 2498caf8427SNipun Gupta struct dpaa2_queue tx_queue[DPAA2_DPDMAI_MAX_QUEUES]; 2508caf8427SNipun Gupta struct qdma_device *qdma_dev; 2518caf8427SNipun Gupta }; 2528caf8427SNipun Gupta 25307d679bcSJun Yang #define QDMA_CNTX_IDX_RING_EXTRA_SPACE 64 25407d679bcSJun Yang #define QDMA_CNTX_IDX_RING_MAX_FREE \ 25507d679bcSJun Yang (DPAA2_QDMA_MAX_DESC - QDMA_CNTX_IDX_RING_EXTRA_SPACE) 25607d679bcSJun Yang struct qdma_cntx_idx_ring { 25707d679bcSJun Yang uint16_t cntx_idx_ring[DPAA2_QDMA_MAX_DESC]; 25807d679bcSJun Yang uint16_t start; 25907d679bcSJun Yang uint16_t tail; 26007d679bcSJun Yang uint16_t free_space; 26107d679bcSJun Yang uint16_t nb_in_ring; 26207d679bcSJun Yang }; 2638caf8427SNipun Gupta 26407d679bcSJun Yang #define DPAA2_QDMA_DESC_DEBUG_FLAG (1 << 0) 2658caf8427SNipun Gupta 2668caf8427SNipun Gupta /** Represents a QDMA virtual queue */ 2678caf8427SNipun Gupta struct qdma_virt_queue { 2688caf8427SNipun Gupta /** Associated hw queue */ 2698caf8427SNipun Gupta struct dpaa2_dpdmai_dev *dpdmai_dev; 2708caf8427SNipun Gupta /** FLE pool for the queue */ 2718caf8427SNipun Gupta struct rte_mempool *fle_pool; 272388e888dSJun Yang uint64_t fle_iova2va_offset; 27307d679bcSJun Yang void **fle_elem; 2748caf8427SNipun Gupta /** Route by port */ 2753d990faaSJun Yang struct dpaa2_qdma_rbp rbp; 2768caf8427SNipun Gupta /** States if this vq is in use or not */ 27707d679bcSJun Yang uint8_t fle_pre_populate; 2788caf8427SNipun Gupta /** Number of descriptor for the virtual DMA channel */ 2798caf8427SNipun Gupta uint16_t nb_desc; 2808caf8427SNipun Gupta /* Total number of enqueues on this VQ */ 2818caf8427SNipun Gupta uint64_t num_enqueues; 2828caf8427SNipun Gupta /* Total number of dequeues from this VQ */ 2838caf8427SNipun Gupta uint64_t num_dequeues; 284388e888dSJun Yang uint64_t copy_num; 2858caf8427SNipun Gupta 2868caf8427SNipun Gupta uint16_t vq_id; 2878caf8427SNipun Gupta uint32_t flags; 28807d679bcSJun Yang struct qbman_fd fd[DPAA2_QDMA_MAX_DESC]; 28907d679bcSJun Yang uint16_t fd_idx; 29007d679bcSJun Yang struct qdma_cntx_idx_ring *ring_cntx_idx; 2918caf8427SNipun Gupta 29207d679bcSJun Yang /**Used for silent enabled*/ 29307d679bcSJun Yang struct qdma_cntx_sg *cntx_sg[DPAA2_QDMA_MAX_DESC]; 294388e888dSJun Yang struct qdma_cntx_fle_sdd *cntx_fle_sdd[DPAA2_QDMA_MAX_DESC]; 29507d679bcSJun Yang uint16_t silent_idx; 29607d679bcSJun Yang 2978caf8427SNipun Gupta int num_valid_jobs; 298388e888dSJun Yang int using_short_fd; 2998caf8427SNipun Gupta 3008caf8427SNipun Gupta struct rte_dma_stats stats; 3018caf8427SNipun Gupta }; 3028caf8427SNipun Gupta 3038caf8427SNipun Gupta /** Represents a QDMA device. */ 3048caf8427SNipun Gupta struct qdma_device { 3058caf8427SNipun Gupta /** VQ's of this device */ 3068caf8427SNipun Gupta struct qdma_virt_queue *vqs; 3078caf8427SNipun Gupta /** Total number of VQ's */ 3088caf8427SNipun Gupta uint16_t num_vqs; 30907d679bcSJun Yang uint8_t is_silent; 3108caf8427SNipun Gupta }; 3118caf8427SNipun Gupta 3128caf8427SNipun Gupta #endif /* _DPAA2_QDMA_H_ */ 313