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 74f830cd8SSiva Reddy Kallam #include "roce_hsi.h" 84f830cd8SSiva 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 164f830cd8SSiva Reddy Kallam #define HWQ_CMP(idx, hwq) ((idx) & ((hwq)->max_elements - 1)) 174f830cd8SSiva Reddy Kallam #define HWQ_FREE_SLOTS(hwq) (hwq->max_elements - \ 184f830cd8SSiva Reddy Kallam ((HWQ_CMP(hwq->prod, hwq)\ 194f830cd8SSiva Reddy Kallam - HWQ_CMP(hwq->cons, hwq))\ 204f830cd8SSiva Reddy Kallam & (hwq->max_elements - 1))) 214f830cd8SSiva 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 294f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_VALID (0x1UL << 26) 304f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_EPOCH_SHIFT 24 314f830cd8SSiva Reddy Kallam #define BNG_RE_DBR_TOGGLE_SHIFT 25 324f830cd8SSiva Reddy Kallam 33*53c6ee7dSSiva Reddy Kallam #define BNG_MAX_TQM_ALLOC_REQ 48 344f830cd8SSiva Reddy Kallam 354f830cd8SSiva Reddy Kallam struct bng_re_reg_desc { 364f830cd8SSiva Reddy Kallam u8 bar_id; 374f830cd8SSiva Reddy Kallam resource_size_t bar_base; 384f830cd8SSiva Reddy Kallam unsigned long offset; 394f830cd8SSiva Reddy Kallam void __iomem *bar_reg; 404f830cd8SSiva Reddy Kallam size_t len; 414f830cd8SSiva Reddy Kallam }; 424f830cd8SSiva Reddy Kallam 434f830cd8SSiva Reddy Kallam struct bng_re_db_info { 444f830cd8SSiva Reddy Kallam void __iomem *db; 454f830cd8SSiva Reddy Kallam void __iomem *priv_db; 464f830cd8SSiva Reddy Kallam struct bng_re_hwq *hwq; 474f830cd8SSiva Reddy Kallam u32 xid; 484f830cd8SSiva Reddy Kallam u32 max_slot; 494f830cd8SSiva Reddy Kallam u32 flags; 504f830cd8SSiva Reddy Kallam u8 toggle; 514f830cd8SSiva Reddy Kallam }; 524f830cd8SSiva Reddy Kallam 534f830cd8SSiva Reddy Kallam enum bng_re_db_info_flags_mask { 544f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_CONS_SHIFT = 0x0UL, 554f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_PROD_SHIFT = 0x1UL, 564f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_CONS_MASK = 0x1UL, 574f830cd8SSiva Reddy Kallam BNG_RE_FLAG_EPOCH_PROD_MASK = 0x2UL, 584f830cd8SSiva Reddy Kallam }; 594f830cd8SSiva Reddy Kallam 604f830cd8SSiva Reddy Kallam enum bng_re_db_epoch_flag_shift { 614f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_CONS_SHIFT = BNG_RE_DBR_EPOCH_SHIFT, 624f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_PROD_SHIFT = (BNG_RE_DBR_EPOCH_SHIFT - 1), 634f830cd8SSiva Reddy Kallam }; 644f830cd8SSiva Reddy Kallam 6574506577SSiva Reddy Kallam struct bng_re_chip_ctx { 6674506577SSiva Reddy Kallam u16 chip_num; 6774506577SSiva Reddy Kallam u16 hw_stats_size; 6874506577SSiva Reddy Kallam u64 hwrm_intf_ver; 6974506577SSiva Reddy Kallam u16 hwrm_cmd_max_timeout; 7074506577SSiva Reddy Kallam }; 7174506577SSiva Reddy Kallam 7253310b69SSiva Reddy Kallam struct bng_re_pbl { 7353310b69SSiva Reddy Kallam u32 pg_count; 7453310b69SSiva Reddy Kallam u32 pg_size; 7553310b69SSiva Reddy Kallam void **pg_arr; 7653310b69SSiva Reddy Kallam dma_addr_t *pg_map_arr; 7753310b69SSiva Reddy Kallam }; 7853310b69SSiva Reddy Kallam 7953310b69SSiva Reddy Kallam enum bng_re_pbl_lvl { 8053310b69SSiva Reddy Kallam BNG_PBL_LVL_0, 8153310b69SSiva Reddy Kallam BNG_PBL_LVL_1, 8253310b69SSiva Reddy Kallam BNG_PBL_LVL_2, 8353310b69SSiva Reddy Kallam BNG_PBL_LVL_MAX 8453310b69SSiva Reddy Kallam }; 8553310b69SSiva Reddy Kallam 8653310b69SSiva Reddy Kallam enum bng_re_hwq_type { 8753310b69SSiva Reddy Kallam BNG_HWQ_TYPE_CTX, 8853310b69SSiva Reddy Kallam BNG_HWQ_TYPE_QUEUE 8953310b69SSiva Reddy Kallam }; 9053310b69SSiva Reddy Kallam 9153310b69SSiva Reddy Kallam struct bng_re_sg_info { 9253310b69SSiva Reddy Kallam u32 npages; 9353310b69SSiva Reddy Kallam u32 pgshft; 9453310b69SSiva Reddy Kallam u32 pgsize; 9553310b69SSiva Reddy Kallam bool nopte; 9653310b69SSiva Reddy Kallam }; 9753310b69SSiva Reddy Kallam 9853310b69SSiva Reddy Kallam struct bng_re_hwq_attr { 9953310b69SSiva Reddy Kallam struct bng_re_res *res; 10053310b69SSiva Reddy Kallam struct bng_re_sg_info *sginfo; 10153310b69SSiva Reddy Kallam enum bng_re_hwq_type type; 10253310b69SSiva Reddy Kallam u32 depth; 10353310b69SSiva Reddy Kallam u32 stride; 10453310b69SSiva Reddy Kallam u32 aux_stride; 10553310b69SSiva Reddy Kallam u32 aux_depth; 10653310b69SSiva Reddy Kallam }; 10753310b69SSiva Reddy Kallam 10853310b69SSiva Reddy Kallam struct bng_re_hwq { 10953310b69SSiva Reddy Kallam struct pci_dev *pdev; 11053310b69SSiva Reddy Kallam /* lock to protect hwq */ 11153310b69SSiva Reddy Kallam spinlock_t lock; 11253310b69SSiva Reddy Kallam struct bng_re_pbl pbl[BNG_PBL_LVL_MAX + 1]; 11353310b69SSiva Reddy Kallam /* Valid values: 0, 1, 2 */ 11453310b69SSiva Reddy Kallam enum bng_re_pbl_lvl level; 11553310b69SSiva Reddy Kallam /* PBL entries */ 11653310b69SSiva Reddy Kallam void **pbl_ptr; 11753310b69SSiva Reddy Kallam /* PBL dma_addr */ 11853310b69SSiva Reddy Kallam dma_addr_t *pbl_dma_ptr; 11953310b69SSiva Reddy Kallam u32 max_elements; 12053310b69SSiva Reddy Kallam u32 depth; 12153310b69SSiva Reddy Kallam u16 element_size; 12253310b69SSiva Reddy Kallam u32 prod; 12353310b69SSiva Reddy Kallam u32 cons; 1244f830cd8SSiva Reddy Kallam /* queue entry per page */ 1254f830cd8SSiva Reddy Kallam u16 qe_ppg; 12653310b69SSiva Reddy Kallam }; 12753310b69SSiva Reddy Kallam 12853310b69SSiva Reddy Kallam struct bng_re_res { 12953310b69SSiva Reddy Kallam struct pci_dev *pdev; 13053310b69SSiva Reddy Kallam struct bng_re_chip_ctx *cctx; 131*53c6ee7dSSiva Reddy Kallam struct bng_re_dev_attr *dattr; 13253310b69SSiva Reddy Kallam }; 13353310b69SSiva Reddy Kallam 1344f830cd8SSiva Reddy Kallam static inline void *bng_re_get_qe(struct bng_re_hwq *hwq, 1354f830cd8SSiva Reddy Kallam u32 indx, u64 *pg) 1364f830cd8SSiva Reddy Kallam { 1374f830cd8SSiva Reddy Kallam u32 pg_num, pg_idx; 1384f830cd8SSiva Reddy Kallam 1394f830cd8SSiva Reddy Kallam pg_num = (indx / hwq->qe_ppg); 1404f830cd8SSiva Reddy Kallam pg_idx = (indx % hwq->qe_ppg); 1414f830cd8SSiva Reddy Kallam if (pg) 1424f830cd8SSiva Reddy Kallam *pg = (u64)&hwq->pbl_ptr[pg_num]; 1434f830cd8SSiva Reddy Kallam return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx); 1444f830cd8SSiva Reddy Kallam } 1454f830cd8SSiva Reddy Kallam 1464f830cd8SSiva Reddy Kallam #define BNG_RE_INIT_DBHDR(xid, type, indx, toggle) \ 1474f830cd8SSiva Reddy Kallam (((u64)(((xid) & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | \ 1484f830cd8SSiva Reddy Kallam (type) | BNG_RE_DBR_VALID) << 32) | (indx) | \ 1494f830cd8SSiva Reddy Kallam (((u32)(toggle)) << (BNG_RE_DBR_TOGGLE_SHIFT))) 1504f830cd8SSiva Reddy Kallam 1514f830cd8SSiva Reddy Kallam static inline void bng_re_ring_db(struct bng_re_db_info *info, 1524f830cd8SSiva Reddy Kallam u32 type) 1534f830cd8SSiva Reddy Kallam { 1544f830cd8SSiva Reddy Kallam u64 key = 0; 1554f830cd8SSiva Reddy Kallam u32 indx; 1564f830cd8SSiva Reddy Kallam u8 toggle = 0; 1574f830cd8SSiva Reddy Kallam 1584f830cd8SSiva Reddy Kallam if (type == DBC_DBC_TYPE_CQ_ARMALL || 1594f830cd8SSiva Reddy Kallam type == DBC_DBC_TYPE_CQ_ARMSE) 1604f830cd8SSiva Reddy Kallam toggle = info->toggle; 1614f830cd8SSiva Reddy Kallam 1624f830cd8SSiva Reddy Kallam indx = (info->hwq->cons & DBC_DBC_INDEX_MASK) | 1634f830cd8SSiva Reddy Kallam ((info->flags & BNG_RE_FLAG_EPOCH_CONS_MASK) << 1644f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_CONS_SHIFT); 1654f830cd8SSiva Reddy Kallam 1664f830cd8SSiva Reddy Kallam key = BNG_RE_INIT_DBHDR(info->xid, type, indx, toggle); 1674f830cd8SSiva Reddy Kallam writeq(key, info->db); 1684f830cd8SSiva Reddy Kallam } 1694f830cd8SSiva Reddy Kallam 1704f830cd8SSiva Reddy Kallam static inline void bng_re_ring_nq_db(struct bng_re_db_info *info, 1714f830cd8SSiva Reddy Kallam struct bng_re_chip_ctx *cctx, 1724f830cd8SSiva Reddy Kallam bool arm) 1734f830cd8SSiva Reddy Kallam { 1744f830cd8SSiva Reddy Kallam u32 type; 1754f830cd8SSiva Reddy Kallam 1764f830cd8SSiva Reddy Kallam type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ; 1774f830cd8SSiva Reddy Kallam bng_re_ring_db(info, type); 1784f830cd8SSiva Reddy Kallam } 1794f830cd8SSiva Reddy Kallam 1804f830cd8SSiva Reddy Kallam static inline void bng_re_hwq_incr_cons(u32 max_elements, u32 *cons, u32 cnt, 1814f830cd8SSiva Reddy Kallam u32 *dbinfo_flags) 1824f830cd8SSiva Reddy Kallam { 1834f830cd8SSiva Reddy Kallam /* move cons and update toggle/epoch if wrap around */ 1844f830cd8SSiva Reddy Kallam *cons += cnt; 1854f830cd8SSiva Reddy Kallam if (*cons >= max_elements) { 1864f830cd8SSiva Reddy Kallam *cons %= max_elements; 1874f830cd8SSiva Reddy Kallam *dbinfo_flags ^= 1UL << BNG_RE_FLAG_EPOCH_CONS_SHIFT; 1884f830cd8SSiva Reddy Kallam } 1894f830cd8SSiva Reddy Kallam } 1904f830cd8SSiva Reddy Kallam 191*53c6ee7dSSiva Reddy Kallam static inline bool _is_max_srq_ext_supported(u16 dev_cap_ext_flags_2) 192*53c6ee7dSSiva Reddy Kallam { 193*53c6ee7dSSiva Reddy Kallam return !!(dev_cap_ext_flags_2 & CREQ_QUERY_FUNC_RESP_SB_MAX_SRQ_EXTENDED); 194*53c6ee7dSSiva Reddy Kallam } 195*53c6ee7dSSiva Reddy Kallam 19653310b69SSiva Reddy Kallam void bng_re_free_hwq(struct bng_re_res *res, 19753310b69SSiva Reddy Kallam struct bng_re_hwq *hwq); 19853310b69SSiva Reddy Kallam 19953310b69SSiva Reddy Kallam int bng_re_alloc_init_hwq(struct bng_re_hwq *hwq, 20053310b69SSiva Reddy Kallam struct bng_re_hwq_attr *hwq_attr); 20174506577SSiva Reddy Kallam #endif 202