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
3353c6ee7dSSiva 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
128*04e031ffSSiva Reddy Kallam struct bng_re_stats {
129*04e031ffSSiva Reddy Kallam dma_addr_t dma_map;
130*04e031ffSSiva Reddy Kallam void *dma;
131*04e031ffSSiva Reddy Kallam u32 size;
132*04e031ffSSiva Reddy Kallam u32 fw_id;
133*04e031ffSSiva Reddy Kallam };
134*04e031ffSSiva Reddy Kallam
13553310b69SSiva Reddy Kallam struct bng_re_res {
13653310b69SSiva Reddy Kallam struct pci_dev *pdev;
13753310b69SSiva Reddy Kallam struct bng_re_chip_ctx *cctx;
13853c6ee7dSSiva Reddy Kallam struct bng_re_dev_attr *dattr;
13953310b69SSiva Reddy Kallam };
14053310b69SSiva Reddy Kallam
bng_re_get_qe(struct bng_re_hwq * hwq,u32 indx,u64 * pg)1414f830cd8SSiva Reddy Kallam static inline void *bng_re_get_qe(struct bng_re_hwq *hwq,
1424f830cd8SSiva Reddy Kallam u32 indx, u64 *pg)
1434f830cd8SSiva Reddy Kallam {
1444f830cd8SSiva Reddy Kallam u32 pg_num, pg_idx;
1454f830cd8SSiva Reddy Kallam
1464f830cd8SSiva Reddy Kallam pg_num = (indx / hwq->qe_ppg);
1474f830cd8SSiva Reddy Kallam pg_idx = (indx % hwq->qe_ppg);
1484f830cd8SSiva Reddy Kallam if (pg)
1494f830cd8SSiva Reddy Kallam *pg = (u64)&hwq->pbl_ptr[pg_num];
1504f830cd8SSiva Reddy Kallam return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx);
1514f830cd8SSiva Reddy Kallam }
1524f830cd8SSiva Reddy Kallam
1534f830cd8SSiva Reddy Kallam #define BNG_RE_INIT_DBHDR(xid, type, indx, toggle) \
1544f830cd8SSiva Reddy Kallam (((u64)(((xid) & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | \
1554f830cd8SSiva Reddy Kallam (type) | BNG_RE_DBR_VALID) << 32) | (indx) | \
1564f830cd8SSiva Reddy Kallam (((u32)(toggle)) << (BNG_RE_DBR_TOGGLE_SHIFT)))
1574f830cd8SSiva Reddy Kallam
bng_re_ring_db(struct bng_re_db_info * info,u32 type)1584f830cd8SSiva Reddy Kallam static inline void bng_re_ring_db(struct bng_re_db_info *info,
1594f830cd8SSiva Reddy Kallam u32 type)
1604f830cd8SSiva Reddy Kallam {
1614f830cd8SSiva Reddy Kallam u64 key = 0;
1624f830cd8SSiva Reddy Kallam u32 indx;
1634f830cd8SSiva Reddy Kallam u8 toggle = 0;
1644f830cd8SSiva Reddy Kallam
1654f830cd8SSiva Reddy Kallam if (type == DBC_DBC_TYPE_CQ_ARMALL ||
1664f830cd8SSiva Reddy Kallam type == DBC_DBC_TYPE_CQ_ARMSE)
1674f830cd8SSiva Reddy Kallam toggle = info->toggle;
1684f830cd8SSiva Reddy Kallam
1694f830cd8SSiva Reddy Kallam indx = (info->hwq->cons & DBC_DBC_INDEX_MASK) |
1704f830cd8SSiva Reddy Kallam ((info->flags & BNG_RE_FLAG_EPOCH_CONS_MASK) <<
1714f830cd8SSiva Reddy Kallam BNG_RE_DB_EPOCH_CONS_SHIFT);
1724f830cd8SSiva Reddy Kallam
1734f830cd8SSiva Reddy Kallam key = BNG_RE_INIT_DBHDR(info->xid, type, indx, toggle);
1744f830cd8SSiva Reddy Kallam writeq(key, info->db);
1754f830cd8SSiva Reddy Kallam }
1764f830cd8SSiva Reddy Kallam
bng_re_ring_nq_db(struct bng_re_db_info * info,struct bng_re_chip_ctx * cctx,bool arm)1774f830cd8SSiva Reddy Kallam static inline void bng_re_ring_nq_db(struct bng_re_db_info *info,
1784f830cd8SSiva Reddy Kallam struct bng_re_chip_ctx *cctx,
1794f830cd8SSiva Reddy Kallam bool arm)
1804f830cd8SSiva Reddy Kallam {
1814f830cd8SSiva Reddy Kallam u32 type;
1824f830cd8SSiva Reddy Kallam
1834f830cd8SSiva Reddy Kallam type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ;
1844f830cd8SSiva Reddy Kallam bng_re_ring_db(info, type);
1854f830cd8SSiva Reddy Kallam }
1864f830cd8SSiva Reddy Kallam
bng_re_hwq_incr_cons(u32 max_elements,u32 * cons,u32 cnt,u32 * dbinfo_flags)1874f830cd8SSiva Reddy Kallam static inline void bng_re_hwq_incr_cons(u32 max_elements, u32 *cons, u32 cnt,
1884f830cd8SSiva Reddy Kallam u32 *dbinfo_flags)
1894f830cd8SSiva Reddy Kallam {
1904f830cd8SSiva Reddy Kallam /* move cons and update toggle/epoch if wrap around */
1914f830cd8SSiva Reddy Kallam *cons += cnt;
1924f830cd8SSiva Reddy Kallam if (*cons >= max_elements) {
1934f830cd8SSiva Reddy Kallam *cons %= max_elements;
1944f830cd8SSiva Reddy Kallam *dbinfo_flags ^= 1UL << BNG_RE_FLAG_EPOCH_CONS_SHIFT;
1954f830cd8SSiva Reddy Kallam }
1964f830cd8SSiva Reddy Kallam }
1974f830cd8SSiva Reddy Kallam
_is_max_srq_ext_supported(u16 dev_cap_ext_flags_2)19853c6ee7dSSiva Reddy Kallam static inline bool _is_max_srq_ext_supported(u16 dev_cap_ext_flags_2)
19953c6ee7dSSiva Reddy Kallam {
20053c6ee7dSSiva Reddy Kallam return !!(dev_cap_ext_flags_2 & CREQ_QUERY_FUNC_RESP_SB_MAX_SRQ_EXTENDED);
20153c6ee7dSSiva Reddy Kallam }
20253c6ee7dSSiva Reddy Kallam
20353310b69SSiva Reddy Kallam void bng_re_free_hwq(struct bng_re_res *res,
20453310b69SSiva Reddy Kallam struct bng_re_hwq *hwq);
20553310b69SSiva Reddy Kallam
20653310b69SSiva Reddy Kallam int bng_re_alloc_init_hwq(struct bng_re_hwq *hwq,
20753310b69SSiva Reddy Kallam struct bng_re_hwq_attr *hwq_attr);
208*04e031ffSSiva Reddy Kallam
209*04e031ffSSiva Reddy Kallam void bng_re_free_stats_ctx_mem(struct pci_dev *pdev,
210*04e031ffSSiva Reddy Kallam struct bng_re_stats *stats);
211*04e031ffSSiva Reddy Kallam
212*04e031ffSSiva Reddy Kallam int bng_re_alloc_stats_ctx_mem(struct pci_dev *pdev,
213*04e031ffSSiva Reddy Kallam struct bng_re_chip_ctx *cctx,
214*04e031ffSSiva Reddy Kallam struct bng_re_stats *stats);
21574506577SSiva Reddy Kallam #endif
216