174506577SSiva Reddy Kallam /* SPDX-License-Identifier: GPL-2.0 */ 274506577SSiva Reddy Kallam // Copyright (c) 2025 Broadcom. 374506577SSiva Reddy Kallam 474506577SSiva Reddy Kallam #ifndef __BNG_RES_H__ 574506577SSiva Reddy Kallam #define __BNG_RES_H__ 674506577SSiva Reddy Kallam 7*4f830cd8SSiva Reddy Kallam #include "roce_hsi.h" 8*4f830cd8SSiva Reddy Kallam 974506577SSiva Reddy Kallam #define BNG_ROCE_FW_MAX_TIMEOUT 60 1074506577SSiva Reddy Kallam 1153310b69SSiva Reddy Kallam #define PTR_CNT_PER_PG (PAGE_SIZE / sizeof(void *)) 1253310b69SSiva Reddy Kallam #define PTR_MAX_IDX_PER_PG (PTR_CNT_PER_PG - 1) 1353310b69SSiva Reddy Kallam #define PTR_PG(x) (((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG) 1453310b69SSiva Reddy Kallam #define PTR_IDX(x) ((x) & PTR_MAX_IDX_PER_PG) 1553310b69SSiva Reddy Kallam 16*4f830cd8SSiva Reddy Kallam #define HWQ_CMP(idx, hwq) ((idx) & ((hwq)->max_elements - 1)) 17*4f830cd8SSiva Reddy Kallam #define HWQ_FREE_SLOTS(hwq) (hwq->max_elements - \ 18*4f830cd8SSiva Reddy Kallam ((HWQ_CMP(hwq->prod, hwq)\ 19*4f830cd8SSiva Reddy Kallam - HWQ_CMP(hwq->cons, hwq))\ 20*4f830cd8SSiva Reddy Kallam & (hwq->max_elements - 1))) 21*4f830cd8SSiva Reddy Kallam 2253310b69SSiva Reddy Kallam #define MAX_PBL_LVL_0_PGS 1 2353310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS 512 2453310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS_SHIFT 9 2553310b69SSiva Reddy Kallam #define MAX_PBL_LVL_1_PGS_FOR_LVL_2 256 2653310b69SSiva Reddy Kallam #define MAX_PBL_LVL_2_PGS (256 * 512) 2753310b69SSiva Reddy Kallam #define MAX_PDL_LVL_SHIFT 9 2853310b69SSiva Reddy Kallam 29*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_VALID (0x1UL << 26) 30*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_EPOCH_SHIFT 24 31*4f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_TOGGLE_SHIFT 25 32*4f830cd8SSiva Reddy Kallam 33*4f830cd8SSiva Reddy Kallam 34*4f830cd8SSiva Reddy Kallam struct bng_re_reg_desc { 35*4f830cd8SSiva Reddy Kallam u8 bar_id; 36*4f830cd8SSiva Reddy Kallam resource_size_t bar_base; 37*4f830cd8SSiva Reddy Kallam unsigned long offset; 38*4f830cd8SSiva Reddy Kallam void __iomem *bar_reg; 39*4f830cd8SSiva Reddy Kallam size_t len; 40*4f830cd8SSiva Reddy Kallam }; 41*4f830cd8SSiva Reddy Kallam 42*4f830cd8SSiva Reddy Kallam struct bng_re_db_info { 43*4f830cd8SSiva Reddy Kallam void __iomem *db; 44*4f830cd8SSiva Reddy Kallam void __iomem *priv_db; 45*4f830cd8SSiva Reddy Kallam struct bng_re_hwq *hwq; 46*4f830cd8SSiva Reddy Kallam u32 xid; 47*4f830cd8SSiva Reddy Kallam u32 max_slot; 48*4f830cd8SSiva Reddy Kallam u32 flags; 49*4f830cd8SSiva Reddy Kallam u8 toggle; 50*4f830cd8SSiva Reddy Kallam }; 51*4f830cd8SSiva Reddy Kallam 52*4f830cd8SSiva Reddy Kallam enum bng_re_db_info_flags_mask { 53*4f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_CONS_SHIFT = 0x0UL, 54*4f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_PROD_SHIFT = 0x1UL, 55*4f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_CONS_MASK = 0x1UL, 56*4f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_PROD_MASK = 0x2UL, 57*4f830cd8SSiva Reddy Kallam }; 58*4f830cd8SSiva Reddy Kallam 59*4f830cd8SSiva Reddy Kallam enum bng_re_db_epoch_flag_shift { 60*4f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_CONS_SHIFT = BNG_RE_DBR_EPOCH_SHIFT, 61*4f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_PROD_SHIFT = (BNG_RE_DBR_EPOCH_SHIFT - 1), 62*4f830cd8SSiva Reddy Kallam }; 63*4f830cd8SSiva Reddy Kallam 6474506577SSiva Reddy Kallam struct bng_re_chip_ctx { 6574506577SSiva Reddy Kallam u16 chip_num; 6674506577SSiva Reddy Kallam u16 hw_stats_size; 6774506577SSiva Reddy Kallam u64 hwrm_intf_ver; 6874506577SSiva Reddy Kallam u16 hwrm_cmd_max_timeout; 6974506577SSiva Reddy Kallam }; 7074506577SSiva Reddy Kallam 7153310b69SSiva Reddy Kallam struct bng_re_pbl { 7253310b69SSiva Reddy Kallam u32 pg_count; 7353310b69SSiva Reddy Kallam u32 pg_size; 7453310b69SSiva Reddy Kallam void **pg_arr; 7553310b69SSiva Reddy Kallam dma_addr_t *pg_map_arr; 7653310b69SSiva Reddy Kallam }; 7753310b69SSiva Reddy Kallam 7853310b69SSiva Reddy Kallam enum bng_re_pbl_lvl { 7953310b69SSiva Reddy Kallam BNG_PBL_LVL_0, 8053310b69SSiva Reddy Kallam BNG_PBL_LVL_1, 8153310b69SSiva Reddy Kallam BNG_PBL_LVL_2, 8253310b69SSiva Reddy Kallam BNG_PBL_LVL_MAX 8353310b69SSiva Reddy Kallam }; 8453310b69SSiva Reddy Kallam 8553310b69SSiva Reddy Kallam enum bng_re_hwq_type { 8653310b69SSiva Reddy Kallam BNG_HWQ_TYPE_CTX, 8753310b69SSiva Reddy Kallam BNG_HWQ_TYPE_QUEUE 8853310b69SSiva Reddy Kallam }; 8953310b69SSiva Reddy Kallam 9053310b69SSiva Reddy Kallam struct bng_re_sg_info { 9153310b69SSiva Reddy Kallam u32 npages; 9253310b69SSiva Reddy Kallam u32 pgshft; 9353310b69SSiva Reddy Kallam u32 pgsize; 9453310b69SSiva Reddy Kallam bool nopte; 9553310b69SSiva Reddy Kallam }; 9653310b69SSiva Reddy Kallam 9753310b69SSiva Reddy Kallam struct bng_re_hwq_attr { 9853310b69SSiva Reddy Kallam struct bng_re_res *res; 9953310b69SSiva Reddy Kallam struct bng_re_sg_info *sginfo; 10053310b69SSiva Reddy Kallam enum bng_re_hwq_type type; 10153310b69SSiva Reddy Kallam u32 depth; 10253310b69SSiva Reddy Kallam u32 stride; 10353310b69SSiva Reddy Kallam u32 aux_stride; 10453310b69SSiva Reddy Kallam u32 aux_depth; 10553310b69SSiva Reddy Kallam }; 10653310b69SSiva Reddy Kallam 10753310b69SSiva Reddy Kallam struct bng_re_hwq { 10853310b69SSiva Reddy Kallam struct pci_dev *pdev; 10953310b69SSiva Reddy Kallam /* lock to protect hwq */ 11053310b69SSiva Reddy Kallam spinlock_t lock; 11153310b69SSiva Reddy Kallam struct bng_re_pbl pbl[BNG_PBL_LVL_MAX + 1]; 11253310b69SSiva Reddy Kallam /* Valid values: 0, 1, 2 */ 11353310b69SSiva Reddy Kallam enum bng_re_pbl_lvl level; 11453310b69SSiva Reddy Kallam /* PBL entries */ 11553310b69SSiva Reddy Kallam void **pbl_ptr; 11653310b69SSiva Reddy Kallam /* PBL dma_addr */ 11753310b69SSiva Reddy Kallam dma_addr_t *pbl_dma_ptr; 11853310b69SSiva Reddy Kallam u32 max_elements; 11953310b69SSiva Reddy Kallam u32 depth; 12053310b69SSiva Reddy Kallam u16 element_size; 12153310b69SSiva Reddy Kallam u32 prod; 12253310b69SSiva Reddy Kallam u32 cons; 123*4f830cd8SSiva Reddy Kallam /* queue entry per page */ 124*4f830cd8SSiva Reddy Kallam u16 qe_ppg; 12553310b69SSiva Reddy Kallam }; 12653310b69SSiva Reddy Kallam 12753310b69SSiva Reddy Kallam struct bng_re_res { 12853310b69SSiva Reddy Kallam struct pci_dev *pdev; 12953310b69SSiva Reddy Kallam struct bng_re_chip_ctx *cctx; 13053310b69SSiva Reddy Kallam }; 13153310b69SSiva Reddy Kallam 132*4f830cd8SSiva Reddy Kallam static inline void *bng_re_get_qe(struct bng_re_hwq *hwq, 133*4f830cd8SSiva Reddy Kallam u32 indx, u64 *pg) 134*4f830cd8SSiva Reddy Kallam { 135*4f830cd8SSiva Reddy Kallam u32 pg_num, pg_idx; 136*4f830cd8SSiva Reddy Kallam 137*4f830cd8SSiva Reddy Kallam pg_num = (indx / hwq->qe_ppg); 138*4f830cd8SSiva Reddy Kallam pg_idx = (indx % hwq->qe_ppg); 139*4f830cd8SSiva Reddy Kallam if (pg) 140*4f830cd8SSiva Reddy Kallam *pg = (u64)&hwq->pbl_ptr[pg_num]; 141*4f830cd8SSiva Reddy Kallam return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx); 142*4f830cd8SSiva Reddy Kallam } 143*4f830cd8SSiva Reddy Kallam 144*4f830cd8SSiva Reddy Kallam #define BNG_RE_INIT_DBHDR(xid, type, indx, toggle) \ 145*4f830cd8SSiva Reddy Kallam (((u64)(((xid) & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | \ 146*4f830cd8SSiva Reddy Kallam (type) | BNG_RE_DBR_VALID) << 32) | (indx) | \ 147*4f830cd8SSiva Reddy Kallam (((u32)(toggle)) << (BNG_RE_DBR_TOGGLE_SHIFT))) 148*4f830cd8SSiva Reddy Kallam 149*4f830cd8SSiva Reddy Kallam static inline void bng_re_ring_db(struct bng_re_db_info *info, 150*4f830cd8SSiva Reddy Kallam u32 type) 151*4f830cd8SSiva Reddy Kallam { 152*4f830cd8SSiva Reddy Kallam u64 key = 0; 153*4f830cd8SSiva Reddy Kallam u32 indx; 154*4f830cd8SSiva Reddy Kallam u8 toggle = 0; 155*4f830cd8SSiva Reddy Kallam 156*4f830cd8SSiva Reddy Kallam if (type == DBC_DBC_TYPE_CQ_ARMALL || 157*4f830cd8SSiva Reddy Kallam type == DBC_DBC_TYPE_CQ_ARMSE) 158*4f830cd8SSiva Reddy Kallam toggle = info->toggle; 159*4f830cd8SSiva Reddy Kallam 160*4f830cd8SSiva Reddy Kallam indx = (info->hwq->cons & DBC_DBC_INDEX_MASK) | 161*4f830cd8SSiva Reddy Kallam ((info->flags & BNG_RE_FLAG_EPOCH_CONS_MASK) << 162*4f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_CONS_SHIFT); 163*4f830cd8SSiva Reddy Kallam 164*4f830cd8SSiva Reddy Kallam key = BNG_RE_INIT_DBHDR(info->xid, type, indx, toggle); 165*4f830cd8SSiva Reddy Kallam writeq(key, info->db); 166*4f830cd8SSiva Reddy Kallam } 167*4f830cd8SSiva Reddy Kallam 168*4f830cd8SSiva Reddy Kallam static inline void bng_re_ring_nq_db(struct bng_re_db_info *info, 169*4f830cd8SSiva Reddy Kallam struct bng_re_chip_ctx *cctx, 170*4f830cd8SSiva Reddy Kallam bool arm) 171*4f830cd8SSiva Reddy Kallam { 172*4f830cd8SSiva Reddy Kallam u32 type; 173*4f830cd8SSiva Reddy Kallam 174*4f830cd8SSiva Reddy Kallam type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ; 175*4f830cd8SSiva Reddy Kallam bng_re_ring_db(info, type); 176*4f830cd8SSiva Reddy Kallam } 177*4f830cd8SSiva Reddy Kallam 178*4f830cd8SSiva Reddy Kallam static inline void bng_re_hwq_incr_cons(u32 max_elements, u32 *cons, u32 cnt, 179*4f830cd8SSiva Reddy Kallam u32 *dbinfo_flags) 180*4f830cd8SSiva Reddy Kallam { 181*4f830cd8SSiva Reddy Kallam /* move cons and update toggle/epoch if wrap around */ 182*4f830cd8SSiva Reddy Kallam *cons += cnt; 183*4f830cd8SSiva Reddy Kallam if (*cons >= max_elements) { 184*4f830cd8SSiva Reddy Kallam *cons %= max_elements; 185*4f830cd8SSiva Reddy Kallam *dbinfo_flags ^= 1UL << BNG_RE_FLAG_EPOCH_CONS_SHIFT; 186*4f830cd8SSiva Reddy Kallam } 187*4f830cd8SSiva Reddy Kallam } 188*4f830cd8SSiva Reddy Kallam 18953310b69SSiva Reddy Kallam void bng_re_free_hwq(struct bng_re_res *res, 19053310b69SSiva Reddy Kallam struct bng_re_hwq *hwq); 19153310b69SSiva Reddy Kallam 19253310b69SSiva Reddy Kallam int bng_re_alloc_init_hwq(struct bng_re_hwq *hwq, 19353310b69SSiva Reddy Kallam struct bng_re_hwq_attr *hwq_attr); 19474506577SSiva Reddy Kallam #endif 195