1cc166b51SGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause 2f1d30e27SJun Yang * Copyright 2021-2024 NXP 3cc166b51SGagandeep Singh */ 4cc166b51SGagandeep Singh 5cc166b51SGagandeep Singh #ifndef _DPAA_QDMA_H_ 6cc166b51SGagandeep Singh #define _DPAA_QDMA_H_ 7cc166b51SGagandeep Singh 8cc166b51SGagandeep Singh #include <rte_io.h> 9cc166b51SGagandeep Singh 107da29a64SGagandeep Singh #ifndef BIT 117da29a64SGagandeep Singh #define BIT(nr) (1UL << (nr)) 127da29a64SGagandeep Singh #endif 137da29a64SGagandeep Singh 14cc166b51SGagandeep Singh #define RETRIES 5 15cc166b51SGagandeep Singh 16453d8273SGagandeep Singh #ifndef GENMASK 17453d8273SGagandeep Singh #define BITS_PER_LONG (__SIZEOF_LONG__ * 8) 18453d8273SGagandeep Singh #define GENMASK(h, l) \ 19453d8273SGagandeep Singh (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) 20453d8273SGagandeep Singh #endif 21453d8273SGagandeep Singh 22f1d30e27SJun Yang #define QDMA_CTRL_REGION_OFFSET 0 23f1d30e27SJun Yang #define QDMA_CTRL_REGION_SIZE 0x10000 24f1d30e27SJun Yang #define QDMA_STATUS_REGION_OFFSET \ 25f1d30e27SJun Yang (QDMA_CTRL_REGION_OFFSET + QDMA_CTRL_REGION_SIZE) 26f1d30e27SJun Yang #define QDMA_STATUS_REGION_SIZE 0x10000 27a77261f6SJun Yang 28f1d30e27SJun Yang #define DPAA_QDMA_FLAGS_INDEX RTE_BIT64(63) 29a77261f6SJun Yang #define DPAA_QDMA_COPY_IDX_OFFSET 8 30a77261f6SJun Yang #define DPAA_QDMA_SG_IDX_ADDR_ALIGN \ 31a77261f6SJun Yang RTE_BIT64(DPAA_QDMA_COPY_IDX_OFFSET) 32a77261f6SJun Yang #define DPAA_QDMA_SG_IDX_ADDR_MASK \ 33a77261f6SJun Yang (DPAA_QDMA_SG_IDX_ADDR_ALIGN - 1) 34f1d30e27SJun Yang 35cc166b51SGagandeep Singh #define FSL_QDMA_DMR 0x0 36cc166b51SGagandeep Singh #define FSL_QDMA_DSR 0x4 377da29a64SGagandeep Singh #define FSL_QDMA_DEDR 0xe04 387da29a64SGagandeep Singh #define FSL_QDMA_DECFDW0R 0xe10 397da29a64SGagandeep Singh #define FSL_QDMA_DECFDW1R 0xe14 407da29a64SGagandeep Singh #define FSL_QDMA_DECFDW2R 0xe18 417da29a64SGagandeep Singh #define FSL_QDMA_DECFDW3R 0xe1c 427da29a64SGagandeep Singh #define FSL_QDMA_DECFQIDR 0xe30 437da29a64SGagandeep Singh #define FSL_QDMA_DECBR 0xe34 44cc166b51SGagandeep Singh 45cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR(x) (0xc0 + 0x100 * (x)) 467da29a64SGagandeep Singh #define FSL_QDMA_BCQSR(x) (0xc4 + 0x100 * (x)) 47cc166b51SGagandeep Singh #define FSL_QDMA_BCQEDPA_SADDR(x) (0xc8 + 0x100 * (x)) 48cc166b51SGagandeep Singh #define FSL_QDMA_BCQDPA_SADDR(x) (0xcc + 0x100 * (x)) 49cc166b51SGagandeep Singh #define FSL_QDMA_BCQEEPA_SADDR(x) (0xd0 + 0x100 * (x)) 50cc166b51SGagandeep Singh #define FSL_QDMA_BCQEPA_SADDR(x) (0xd4 + 0x100 * (x)) 51cc166b51SGagandeep Singh #define FSL_QDMA_BCQIER(x) (0xe0 + 0x100 * (x)) 52cc166b51SGagandeep Singh #define FSL_QDMA_BCQIDR(x) (0xe4 + 0x100 * (x)) 53cc166b51SGagandeep Singh 54cc166b51SGagandeep Singh #define FSL_QDMA_SQEDPAR 0x808 55cc166b51SGagandeep Singh #define FSL_QDMA_SQDPAR 0x80c 56cc166b51SGagandeep Singh #define FSL_QDMA_SQEEPAR 0x810 57cc166b51SGagandeep Singh #define FSL_QDMA_SQEPAR 0x814 58cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR 0x800 597da29a64SGagandeep Singh #define FSL_QDMA_BSQSR 0x804 60cc166b51SGagandeep Singh #define FSL_QDMA_BSQICR 0x828 61cc166b51SGagandeep Singh #define FSL_QDMA_CQIER 0xa10 62cc166b51SGagandeep Singh #define FSL_QDMA_SQCCMR 0xa20 63cc166b51SGagandeep Singh 64cc166b51SGagandeep Singh #define FSL_QDMA_SQCCMR_ENTER_WM 0x200000 65cc166b51SGagandeep Singh 66cc166b51SGagandeep Singh #define FSL_QDMA_QUEUE_MAX 8 67cc166b51SGagandeep Singh 68cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_EN 0x80000000 69f1d30e27SJun Yang #define FSL_QDMA_BCQMR_EI 0x40000000 70f1d30e27SJun Yang 71cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_CD_THLD(x) ((x) << 20) 72cc166b51SGagandeep Singh #define FSL_QDMA_BCQMR_CQ_SIZE(x) ((x) << 16) 73cc166b51SGagandeep Singh 747da29a64SGagandeep Singh #define FSL_QDMA_BCQSR_QF_XOFF_BE 0x1000100 757da29a64SGagandeep Singh 76cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR_EN 0x80000000 77cc166b51SGagandeep Singh #define FSL_QDMA_BSQMR_CQ_SIZE(x) ((x) << 16) 78f1d30e27SJun Yang #define FSL_QDMA_BSQMR_DI 0xc0 79cc166b51SGagandeep Singh 807da29a64SGagandeep Singh #define FSL_QDMA_BSQSR_QE_BE 0x200 817da29a64SGagandeep Singh 82cc166b51SGagandeep Singh #define FSL_QDMA_DMR_DQD 0x40000000 83cc166b51SGagandeep Singh #define FSL_QDMA_DSR_DB 0x80000000 84cc166b51SGagandeep Singh 85cc166b51SGagandeep Singh #define FSL_QDMA_CIRCULAR_DESC_SIZE_MIN 64 86cc166b51SGagandeep Singh #define FSL_QDMA_CIRCULAR_DESC_SIZE_MAX 16384 87cc166b51SGagandeep Singh #define FSL_QDMA_QUEUE_NUM_MAX 8 88cc166b51SGagandeep Singh 89f1d30e27SJun Yang #define FSL_QDMA_COMP_SG_FORMAT 0x1 90f1d30e27SJun Yang 91453d8273SGagandeep Singh #define FSL_QDMA_CMD_RWTTYPE 0x4 92453d8273SGagandeep Singh #define FSL_QDMA_CMD_LWC 0x2 93453d8273SGagandeep Singh 94bdcb782aSJun Yang #define FSL_QDMA_CMD_SS_ERR050757_LEN 128 95453d8273SGagandeep Singh 96cc166b51SGagandeep Singh /* qdma engine attribute */ 97bdcb782aSJun Yang #define QDMA_QUEUE_SIZE FSL_QDMA_CIRCULAR_DESC_SIZE_MIN 98bdcb782aSJun Yang #define QDMA_STATUS_SIZE QDMA_QUEUE_SIZE 99cc166b51SGagandeep Singh #define QDMA_CCSR_BASE 0x8380000 100cc166b51SGagandeep Singh #define QDMA_BLOCK_OFFSET 0x10000 101cc166b51SGagandeep Singh #define QDMA_BLOCKS 4 102cc166b51SGagandeep Singh #define QDMA_QUEUES 8 103f1d30e27SJun Yang #define QDMA_QUEUE_CR_WM 32 104cc166b51SGagandeep Singh 105cc166b51SGagandeep Singh #define QDMA_BIG_ENDIAN 1 106cc166b51SGagandeep Singh #ifdef QDMA_BIG_ENDIAN 107cc166b51SGagandeep Singh #define QDMA_IN(addr) be32_to_cpu(rte_read32(addr)) 108cc166b51SGagandeep Singh #define QDMA_OUT(addr, val) rte_write32(be32_to_cpu(val), addr) 1097da29a64SGagandeep Singh #define QDMA_IN_BE(addr) rte_read32(addr) 1107da29a64SGagandeep Singh #define QDMA_OUT_BE(addr, val) rte_write32(val, addr) 111cc166b51SGagandeep Singh #else 112cc166b51SGagandeep Singh #define QDMA_IN(addr) rte_read32(addr) 113cc166b51SGagandeep Singh #define QDMA_OUT(addr, val) rte_write32(val, addr) 1147da29a64SGagandeep Singh #define QDMA_IN_BE(addr) be32_to_cpu(rte_write32(addr)) 1157da29a64SGagandeep Singh #define QDMA_OUT_BE(addr, val) rte_write32(be32_to_cpu(val), addr) 116cc166b51SGagandeep Singh #endif 117cc166b51SGagandeep Singh 118cc166b51SGagandeep Singh #define FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma_engine, x) \ 119cc166b51SGagandeep Singh (((fsl_qdma_engine)->block_offset) * (x)) 120cc166b51SGagandeep Singh 121cc166b51SGagandeep Singh /* qDMA Command Descriptor Formats */ 122*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_comp_cmd_desc { 123f1d30e27SJun Yang uint8_t status; 124f1d30e27SJun Yang uint32_t rsv0:22; 125f1d30e27SJun Yang uint32_t ser:1; 126f1d30e27SJun Yang uint32_t rsv1:21; 127f1d30e27SJun Yang uint32_t offset:9; 128f1d30e27SJun Yang uint32_t format:3; 129f1d30e27SJun Yang uint32_t addr_lo; 130f1d30e27SJun Yang uint8_t addr_hi; 131f1d30e27SJun Yang uint16_t rsv3; 132f1d30e27SJun Yang uint8_t queue:3; 133f1d30e27SJun Yang uint8_t rsv4:3; 134f1d30e27SJun Yang uint8_t dd:2; 135*e7750639SAndre Muezerie } __rte_packed_end; 136cc166b51SGagandeep Singh 137*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_comp_sg_desc { 138f1d30e27SJun Yang uint32_t offset:13; 139f1d30e27SJun Yang uint32_t rsv0:19; 140f1d30e27SJun Yang uint32_t length:30; 141f1d30e27SJun Yang uint32_t final:1; 142f1d30e27SJun Yang uint32_t extion:1; 143f1d30e27SJun Yang uint32_t addr_lo; 144f1d30e27SJun Yang uint8_t addr_hi; 145f1d30e27SJun Yang uint32_t rsv1:24; 146*e7750639SAndre Muezerie } __rte_packed_end; 147f1d30e27SJun Yang 148*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_sdf { 149f1d30e27SJun Yang uint32_t rsv0; 150f1d30e27SJun Yang uint32_t ssd:12; 151f1d30e27SJun Yang uint32_t sss:12; 152f1d30e27SJun Yang uint32_t rsv1:8; 153f1d30e27SJun Yang uint32_t rsv2; 154453d8273SGagandeep Singh 155f1d30e27SJun Yang uint32_t rsv3:17; 156f1d30e27SJun Yang uint32_t prefetch:1; 157f1d30e27SJun Yang uint32_t rsv4:1; 158f1d30e27SJun Yang uint32_t ssen:1; 159f1d30e27SJun Yang uint32_t rthrotl:4; 160f1d30e27SJun Yang uint32_t sqos:3; 161f1d30e27SJun Yang uint32_t ns:1; 162f1d30e27SJun Yang uint32_t srttype:4; 163*e7750639SAndre Muezerie } __rte_packed_end; 164f1d30e27SJun Yang 165*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_ddf { 166f1d30e27SJun Yang uint32_t rsv0; 167f1d30e27SJun Yang uint32_t dsd:12; 168f1d30e27SJun Yang uint32_t dss:12; 169f1d30e27SJun Yang uint32_t rsv1:8; 170f1d30e27SJun Yang uint32_t rsv2; 171f1d30e27SJun Yang 172f1d30e27SJun Yang uint16_t rsv3; 173f1d30e27SJun Yang uint32_t lwc:2; 174f1d30e27SJun Yang uint32_t rsv4:1; 175f1d30e27SJun Yang uint32_t dsen:1; 176f1d30e27SJun Yang uint32_t wthrotl:4; 177f1d30e27SJun Yang uint32_t dqos:3; 178f1d30e27SJun Yang uint32_t ns:1; 179f1d30e27SJun Yang uint32_t dwttype:4; 180*e7750639SAndre Muezerie } __rte_packed_end; 181f1d30e27SJun Yang 182f1d30e27SJun Yang struct fsl_qdma_df { 183f1d30e27SJun Yang struct fsl_qdma_sdf sdf; 184f1d30e27SJun Yang struct fsl_qdma_ddf ddf; 185453d8273SGagandeep Singh }; 186453d8273SGagandeep Singh 187f1d30e27SJun Yang #define FSL_QDMA_SG_MAX_ENTRY 64 188f1d30e27SJun Yang #define FSL_QDMA_MAX_DESC_NUM (FSL_QDMA_SG_MAX_ENTRY * QDMA_QUEUE_SIZE) 189*e7750639SAndre Muezerie struct __rte_packed_begin fsl_qdma_cmpd_ft { 190f1d30e27SJun Yang struct fsl_qdma_comp_sg_desc desc_buf; 191f1d30e27SJun Yang struct fsl_qdma_comp_sg_desc desc_sbuf; 192f1d30e27SJun Yang struct fsl_qdma_comp_sg_desc desc_dbuf; 193f1d30e27SJun Yang uint64_t cache_align[2]; 194f1d30e27SJun Yang struct fsl_qdma_comp_sg_desc desc_ssge[FSL_QDMA_SG_MAX_ENTRY]; 195f1d30e27SJun Yang struct fsl_qdma_comp_sg_desc desc_dsge[FSL_QDMA_SG_MAX_ENTRY]; 196f1d30e27SJun Yang struct fsl_qdma_df df; 197f1d30e27SJun Yang uint64_t phy_ssge; 198f1d30e27SJun Yang uint64_t phy_dsge; 199f1d30e27SJun Yang uint64_t phy_df; 200*e7750639SAndre Muezerie } __rte_packed_end; 201f1d30e27SJun Yang 202a63c6426SJun Yang #define FSL_QDMA_ERR_REG_STATUS_OFFSET 0xe00 203a63c6426SJun Yang 204a63c6426SJun Yang struct fsl_qdma_dedr_reg { 205a63c6426SJun Yang uint32_t me:1; 206a63c6426SJun Yang uint32_t rsv0:1; 207a63c6426SJun Yang uint32_t rte:1; 208a63c6426SJun Yang uint32_t wte:1; 209a63c6426SJun Yang uint32_t cde:1; 210a63c6426SJun Yang uint32_t sde:1; 211a63c6426SJun Yang uint32_t dde:1; 212a63c6426SJun Yang uint32_t ere:1; 213a63c6426SJun Yang uint32_t rsv1:24; 214a63c6426SJun Yang }; 215a63c6426SJun Yang 216a63c6426SJun Yang struct fsl_qdma_deccqidr_reg { 217a63c6426SJun Yang uint32_t rsv:27; 218a63c6426SJun Yang uint32_t block:2; 219a63c6426SJun Yang uint32_t queue:3; 220a63c6426SJun Yang }; 221a63c6426SJun Yang 222a63c6426SJun Yang #define FSL_QDMA_DECCD_ERR_NUM \ 223a63c6426SJun Yang (sizeof(struct fsl_qdma_comp_cmd_desc) / sizeof(uint32_t)) 224a63c6426SJun Yang 225a63c6426SJun Yang struct fsl_qdma_err_reg { 226a63c6426SJun Yang uint32_t deier; 227a63c6426SJun Yang union { 228a63c6426SJun Yang rte_be32_t dedr_be; 229a63c6426SJun Yang struct fsl_qdma_dedr_reg dedr; 230a63c6426SJun Yang }; 231a63c6426SJun Yang uint32_t rsv0[2]; 232a63c6426SJun Yang union { 233a63c6426SJun Yang rte_le32_t deccd_le[FSL_QDMA_DECCD_ERR_NUM]; 234a63c6426SJun Yang struct fsl_qdma_comp_cmd_desc err_cmd; 235a63c6426SJun Yang }; 236a63c6426SJun Yang uint32_t rsv1[4]; 237a63c6426SJun Yang union { 238a63c6426SJun Yang rte_be32_t deccqidr_be; 239a63c6426SJun Yang struct fsl_qdma_deccqidr_reg deccqidr; 240a63c6426SJun Yang }; 241a63c6426SJun Yang rte_be32_t decbr; 242a63c6426SJun Yang }; 243a63c6426SJun Yang 244a77261f6SJun Yang #define DPAA_QDMA_IDXADDR_FROM_SG_FLAG(flag) \ 245a77261f6SJun Yang ((void *)(uintptr_t)((flag) - ((flag) & DPAA_QDMA_SG_IDX_ADDR_MASK))) 246a77261f6SJun Yang 247f1d30e27SJun Yang #define DPAA_QDMA_IDX_FROM_FLAG(flag) \ 248f1d30e27SJun Yang ((flag) >> DPAA_QDMA_COPY_IDX_OFFSET) 249f1d30e27SJun Yang 250f1d30e27SJun Yang struct fsl_qdma_desc { 251f1d30e27SJun Yang rte_iova_t src; 252f1d30e27SJun Yang rte_iova_t dst; 253f1d30e27SJun Yang uint64_t flag; 254f1d30e27SJun Yang uint64_t len; 255cc166b51SGagandeep Singh }; 256cc166b51SGagandeep Singh 257cc166b51SGagandeep Singh struct fsl_qdma_queue { 258f1d30e27SJun Yang int used; 259f1d30e27SJun Yang struct fsl_qdma_cmpd_ft **ft; 260f1d30e27SJun Yang uint16_t ci; 261f1d30e27SJun Yang struct rte_ring *complete_burst; 262f1d30e27SJun Yang struct rte_ring *complete_desc; 263f1d30e27SJun Yang struct rte_ring *complete_pool; 264f1d30e27SJun Yang uint16_t n_cq; 265f1d30e27SJun Yang uint8_t block_id; 266f1d30e27SJun Yang uint8_t queue_id; 267f1d30e27SJun Yang uint8_t channel_id; 268f1d30e27SJun Yang void *block_vir; 269f1d30e27SJun Yang uint32_t le_cqmr; 270f1d30e27SJun Yang struct fsl_qdma_comp_cmd_desc *cq; 271f1d30e27SJun Yang uint16_t desc_in_hw[QDMA_QUEUE_SIZE]; 27233441726SGagandeep Singh struct rte_dma_stats stats; 273f1d30e27SJun Yang struct fsl_qdma_desc *pending_desc; 274f1d30e27SJun Yang uint16_t pending_max; 275f1d30e27SJun Yang uint16_t pending_start; 276f1d30e27SJun Yang uint16_t pending_num; 277f1d30e27SJun Yang uint16_t complete_start; 278f1d30e27SJun Yang dma_addr_t bus_addr; 279f1d30e27SJun Yang void *engine; 280cc166b51SGagandeep Singh }; 281cc166b51SGagandeep Singh 282f1d30e27SJun Yang struct fsl_qdma_status_queue { 283f1d30e27SJun Yang uint16_t n_cq; 284f1d30e27SJun Yang uint16_t complete; 285f1d30e27SJun Yang uint8_t block_id; 286f1d30e27SJun Yang void *block_vir; 287f1d30e27SJun Yang struct fsl_qdma_comp_cmd_desc *cq; 288f1d30e27SJun Yang struct rte_dma_stats stats; 289cc166b51SGagandeep Singh dma_addr_t bus_addr; 290f1d30e27SJun Yang void *engine; 291cc166b51SGagandeep Singh }; 292cc166b51SGagandeep Singh 293cc166b51SGagandeep Singh struct fsl_qdma_engine { 294f1d30e27SJun Yang void *reg_base; 295cc166b51SGagandeep Singh void *ctrl_base; 296cc166b51SGagandeep Singh void *status_base; 297cc166b51SGagandeep Singh void *block_base; 298f1d30e27SJun Yang uint32_t n_queues; 299f1d30e27SJun Yang uint8_t block_queues[QDMA_BLOCKS]; 300f1d30e27SJun Yang struct fsl_qdma_queue cmd_queues[QDMA_BLOCKS][QDMA_QUEUES]; 301f1d30e27SJun Yang struct fsl_qdma_status_queue stat_queues[QDMA_BLOCKS]; 302f1d30e27SJun Yang struct fsl_qdma_queue *chan[QDMA_BLOCKS * QDMA_QUEUES]; 303f1d30e27SJun Yang uint32_t num_blocks; 304cc166b51SGagandeep Singh int block_offset; 3057a7bb89eSJun Yang int is_silent; 306cc166b51SGagandeep Singh }; 307cc166b51SGagandeep Singh 308cc166b51SGagandeep Singh #endif /* _DPAA_QDMA_H_ */ 309