root/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2025 Broadcom */

#ifndef _BNGE_RMEM_H_
#define _BNGE_RMEM_H_

struct bnge_ctx_mem_type;
struct bnge_dev;
struct bnge_net;

#define PTU_PTE_VALID             0x1UL
#define PTU_PTE_LAST              0x2UL
#define PTU_PTE_NEXT_TO_LAST      0x4UL

struct bnge_ring_mem_info {
        /* Number of pages to next level */
        int                     nr_pages;
        int                     page_size;
        u16                     flags;
#define BNGE_RMEM_VALID_PTE_FLAG        1
#define BNGE_RMEM_RING_PTE_FLAG         2
#define BNGE_RMEM_USE_FULL_PAGE_FLAG    4

        u16                     depth;

        void                    **pg_arr;
        dma_addr_t              *dma_arr;

        __le64                  *pg_tbl;
        dma_addr_t              dma_pg_tbl;

        int                     vmem_size;
        void                    **vmem;

        struct bnge_ctx_mem_type        *ctx_mem;
};

/* The hardware supports certain page sizes.
 * Use the supported page sizes to allocate the rings.
 */
#if (PAGE_SHIFT < 12)
#define BNGE_PAGE_SHIFT 12
#elif (PAGE_SHIFT <= 13)
#define BNGE_PAGE_SHIFT PAGE_SHIFT
#elif (PAGE_SHIFT < 16)
#define BNGE_PAGE_SHIFT 13
#else
#define BNGE_PAGE_SHIFT 16
#endif
#define BNGE_PAGE_SIZE  (1 << BNGE_PAGE_SHIFT)
/* The RXBD length is 16-bit so we can only support page sizes < 64K */
#if (PAGE_SHIFT > 15)
#define BNGE_RX_PAGE_SHIFT 15
#else
#define BNGE_RX_PAGE_SHIFT PAGE_SHIFT
#endif
#define MAX_CTX_PAGES   (BNGE_PAGE_SIZE / 8)
#define MAX_CTX_TOTAL_PAGES     (MAX_CTX_PAGES * MAX_CTX_PAGES)

struct bnge_ctx_pg_info {
        u32             entries;
        u32             nr_pages;
        void            *ctx_pg_arr[MAX_CTX_PAGES];
        dma_addr_t      ctx_dma_arr[MAX_CTX_PAGES];
        struct bnge_ring_mem_info ring_mem;
        struct bnge_ctx_pg_info **ctx_pg_tbl;
};

#define BNGE_MAX_TQM_SP_RINGS           1
#define BNGE_MAX_TQM_FP_RINGS           8
#define BNGE_MAX_TQM_RINGS              \
        (BNGE_MAX_TQM_SP_RINGS + BNGE_MAX_TQM_FP_RINGS)
#define BNGE_BACKING_STORE_CFG_LEGACY_LEN       256
#define BNGE_SET_CTX_PAGE_ATTR(attr)                                    \
do {                                                                    \
        if (BNGE_PAGE_SIZE == 0x2000)                                   \
                attr = FUNC_BACKING_STORE_CFG_REQ_SRQ_PG_SIZE_PG_8K;    \
        else if (BNGE_PAGE_SIZE == 0x10000)                             \
                attr = FUNC_BACKING_STORE_CFG_REQ_QPC_PG_SIZE_PG_64K;   \
        else                                                            \
                attr = FUNC_BACKING_STORE_CFG_REQ_QPC_PG_SIZE_PG_4K;    \
} while (0)

#define BNGE_CTX_MRAV_AV_SPLIT_ENTRY    0

#define BNGE_CTX_QP     \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_QP
#define BNGE_CTX_SRQ    \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ
#define BNGE_CTX_CQ     \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ
#define BNGE_CTX_VNIC   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_VNIC
#define BNGE_CTX_STAT   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_STAT
#define BNGE_CTX_STQM   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SP_TQM_RING
#define BNGE_CTX_FTQM   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_FP_TQM_RING
#define BNGE_CTX_MRAV   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MRAV
#define BNGE_CTX_TIM    \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TIM
#define BNGE_CTX_TCK    \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_TX_CK
#define BNGE_CTX_RCK    \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RX_CK
#define BNGE_CTX_MTQM   \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_MP_TQM_RING
#define BNGE_CTX_SQDBS  \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SQ_DB_SHADOW
#define BNGE_CTX_RQDBS  \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RQ_DB_SHADOW
#define BNGE_CTX_SRQDBS \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRQ_DB_SHADOW
#define BNGE_CTX_CQDBS  \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CQ_DB_SHADOW
#define BNGE_CTX_SRT_TRACE      \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRT_TRACE
#define BNGE_CTX_SRT2_TRACE     \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_SRT2_TRACE
#define BNGE_CTX_CRT_TRACE      \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CRT_TRACE
#define BNGE_CTX_CRT2_TRACE     \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_CRT2_TRACE
#define BNGE_CTX_RIGP0_TRACE    \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_RIGP0_TRACE
#define BNGE_CTX_L2_HWRM_TRACE  \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_L2_HWRM_TRACE
#define BNGE_CTX_ROCE_HWRM_TRACE        \
        FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_ROCE_HWRM_TRACE

#define BNGE_CTX_MAX            (BNGE_CTX_TIM + 1)
#define BNGE_CTX_L2_MAX         (BNGE_CTX_FTQM + 1)
#define BNGE_CTX_INV            ((u16)-1)

#define BNGE_CTX_V2_MAX \
        (FUNC_BACKING_STORE_QCAPS_V2_REQ_TYPE_ROCE_HWRM_TRACE + 1)

#define BNGE_BS_CFG_ALL_DONE    \
        FUNC_BACKING_STORE_CFG_V2_REQ_FLAGS_BS_CFG_ALL_DONE

struct bnge_ctx_mem_type {
        u16     type;
        u16     entry_size;
        u32     flags;
#define BNGE_CTX_MEM_TYPE_VALID \
        FUNC_BACKING_STORE_QCAPS_V2_RESP_FLAGS_TYPE_VALID
        u32     instance_bmap;
        u8      init_value;
        u8      entry_multiple;
        u16     init_offset;
#define BNGE_CTX_INIT_INVALID_OFFSET    0xffff
        u32     max_entries;
        u32     min_entries;
        u8      last:1;
        u8      split_entry_cnt;
#define BNGE_MAX_SPLIT_ENTRY    4
        union {
                struct {
                        u32     qp_l2_entries;
                        u32     qp_qp1_entries;
                        u32     qp_fast_qpmd_entries;
                };
                u32     srq_l2_entries;
                u32     cq_l2_entries;
                u32     vnic_entries;
                struct {
                        u32     mrav_av_entries;
                        u32     mrav_num_entries_units;
                };
                u32     split[BNGE_MAX_SPLIT_ENTRY];
        };
        struct bnge_ctx_pg_info *pg_info;
};

struct bnge_ctx_mem_info {
        u8      tqm_fp_rings_count;
        u32     flags;
#define BNGE_CTX_FLAG_INITED    0x01
        struct bnge_ctx_mem_type        ctx_arr[BNGE_CTX_V2_MAX];
};

struct bnge_ring_struct {
        struct bnge_ring_mem_info       ring_mem;

        u16                     fw_ring_id;
        union {
                u16             grp_idx;
                u16             map_idx; /* Used by NQs */
        };
        u32                     handle;
        u8                      queue_id;
};

int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem);
void bnge_free_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem);
int bnge_alloc_ctx_mem(struct bnge_dev *bd);
void bnge_free_ctx_mem(struct bnge_dev *bd);
void bnge_init_ring_struct(struct bnge_net *bn);

#endif /* _BNGE_RMEM_H_ */