162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Broadcom NetXtreme-E RoCE driver. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term 562306a36Sopenharmony_ci * Broadcom refers to Broadcom Limited and/or its subsidiaries. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This software is available to you under a choice of one of two 862306a36Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 962306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 1062306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the 1162306a36Sopenharmony_ci * BSD license below: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 1462306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 1562306a36Sopenharmony_ci * are met: 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1862306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 1962306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 2062306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in 2162306a36Sopenharmony_ci * the documentation and/or other materials provided with the 2262306a36Sopenharmony_ci * distribution. 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' 2562306a36Sopenharmony_ci * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 2662306a36Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2762306a36Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 2862306a36Sopenharmony_ci * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2962306a36Sopenharmony_ci * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3062306a36Sopenharmony_ci * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 3162306a36Sopenharmony_ci * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 3262306a36Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 3362306a36Sopenharmony_ci * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 3462306a36Sopenharmony_ci * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3562306a36Sopenharmony_ci * 3662306a36Sopenharmony_ci * Description: QPLib resource manager (header) 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#ifndef __BNXT_QPLIB_RES_H__ 4062306a36Sopenharmony_ci#define __BNXT_QPLIB_RES_H__ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciextern const struct bnxt_qplib_gid bnxt_qplib_gid_zero; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define CHIP_NUM_57508 0x1750 4562306a36Sopenharmony_ci#define CHIP_NUM_57504 0x1751 4662306a36Sopenharmony_ci#define CHIP_NUM_57502 0x1752 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistruct bnxt_qplib_drv_modes { 4962306a36Sopenharmony_ci u8 wqe_mode; 5062306a36Sopenharmony_ci bool db_push; 5162306a36Sopenharmony_ci bool dbr_pacing; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct bnxt_qplib_chip_ctx { 5562306a36Sopenharmony_ci u16 chip_num; 5662306a36Sopenharmony_ci u8 chip_rev; 5762306a36Sopenharmony_ci u8 chip_metal; 5862306a36Sopenharmony_ci u16 hw_stats_size; 5962306a36Sopenharmony_ci u16 hwrm_cmd_max_timeout; 6062306a36Sopenharmony_ci struct bnxt_qplib_drv_modes modes; 6162306a36Sopenharmony_ci u64 hwrm_intf_ver; 6262306a36Sopenharmony_ci u32 dbr_stat_db_fifo; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct bnxt_qplib_db_pacing_data { 6662306a36Sopenharmony_ci u32 do_pacing; 6762306a36Sopenharmony_ci u32 pacing_th; 6862306a36Sopenharmony_ci u32 alarm_th; 6962306a36Sopenharmony_ci u32 fifo_max_depth; 7062306a36Sopenharmony_ci u32 fifo_room_mask; 7162306a36Sopenharmony_ci u32 fifo_room_shift; 7262306a36Sopenharmony_ci u32 grc_reg_offset; 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define BNXT_QPLIB_DBR_PF_DB_OFFSET 0x10000 7662306a36Sopenharmony_ci#define BNXT_QPLIB_DBR_VF_DB_OFFSET 0x4000 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define PTR_CNT_PER_PG (PAGE_SIZE / sizeof(void *)) 7962306a36Sopenharmony_ci#define PTR_MAX_IDX_PER_PG (PTR_CNT_PER_PG - 1) 8062306a36Sopenharmony_ci#define PTR_PG(x) (((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG) 8162306a36Sopenharmony_ci#define PTR_IDX(x) ((x) & PTR_MAX_IDX_PER_PG) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define HWQ_CMP(idx, hwq) ((idx) & ((hwq)->max_elements - 1)) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define HWQ_FREE_SLOTS(hwq) (hwq->max_elements - \ 8662306a36Sopenharmony_ci ((HWQ_CMP(hwq->prod, hwq)\ 8762306a36Sopenharmony_ci - HWQ_CMP(hwq->cons, hwq))\ 8862306a36Sopenharmony_ci & (hwq->max_elements - 1))) 8962306a36Sopenharmony_cienum bnxt_qplib_hwq_type { 9062306a36Sopenharmony_ci HWQ_TYPE_CTX, 9162306a36Sopenharmony_ci HWQ_TYPE_QUEUE, 9262306a36Sopenharmony_ci HWQ_TYPE_L2_CMPL, 9362306a36Sopenharmony_ci HWQ_TYPE_MR 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define MAX_PBL_LVL_0_PGS 1 9762306a36Sopenharmony_ci#define MAX_PBL_LVL_1_PGS 512 9862306a36Sopenharmony_ci#define MAX_PBL_LVL_1_PGS_SHIFT 9 9962306a36Sopenharmony_ci#define MAX_PBL_LVL_1_PGS_FOR_LVL_2 256 10062306a36Sopenharmony_ci#define MAX_PBL_LVL_2_PGS (256 * 512) 10162306a36Sopenharmony_ci#define MAX_PDL_LVL_SHIFT 9 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cienum bnxt_qplib_pbl_lvl { 10462306a36Sopenharmony_ci PBL_LVL_0, 10562306a36Sopenharmony_ci PBL_LVL_1, 10662306a36Sopenharmony_ci PBL_LVL_2, 10762306a36Sopenharmony_ci PBL_LVL_MAX 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define ROCE_PG_SIZE_4K (4 * 1024) 11162306a36Sopenharmony_ci#define ROCE_PG_SIZE_8K (8 * 1024) 11262306a36Sopenharmony_ci#define ROCE_PG_SIZE_64K (64 * 1024) 11362306a36Sopenharmony_ci#define ROCE_PG_SIZE_2M (2 * 1024 * 1024) 11462306a36Sopenharmony_ci#define ROCE_PG_SIZE_8M (8 * 1024 * 1024) 11562306a36Sopenharmony_ci#define ROCE_PG_SIZE_1G (1024 * 1024 * 1024) 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cienum bnxt_qplib_hwrm_pg_size { 11862306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_4K = 0, 11962306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_8K = 1, 12062306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_64K = 2, 12162306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_2M = 3, 12262306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_8M = 4, 12362306a36Sopenharmony_ci BNXT_QPLIB_HWRM_PG_SIZE_1G = 5, 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistruct bnxt_qplib_reg_desc { 12762306a36Sopenharmony_ci u8 bar_id; 12862306a36Sopenharmony_ci resource_size_t bar_base; 12962306a36Sopenharmony_ci unsigned long offset; 13062306a36Sopenharmony_ci void __iomem *bar_reg; 13162306a36Sopenharmony_ci size_t len; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistruct bnxt_qplib_pbl { 13562306a36Sopenharmony_ci u32 pg_count; 13662306a36Sopenharmony_ci u32 pg_size; 13762306a36Sopenharmony_ci void **pg_arr; 13862306a36Sopenharmony_ci dma_addr_t *pg_map_arr; 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistruct bnxt_qplib_sg_info { 14262306a36Sopenharmony_ci struct ib_umem *umem; 14362306a36Sopenharmony_ci u32 npages; 14462306a36Sopenharmony_ci u32 pgshft; 14562306a36Sopenharmony_ci u32 pgsize; 14662306a36Sopenharmony_ci bool nopte; 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistruct bnxt_qplib_hwq_attr { 15062306a36Sopenharmony_ci struct bnxt_qplib_res *res; 15162306a36Sopenharmony_ci struct bnxt_qplib_sg_info *sginfo; 15262306a36Sopenharmony_ci enum bnxt_qplib_hwq_type type; 15362306a36Sopenharmony_ci u32 depth; 15462306a36Sopenharmony_ci u32 stride; 15562306a36Sopenharmony_ci u32 aux_stride; 15662306a36Sopenharmony_ci u32 aux_depth; 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct bnxt_qplib_hwq { 16062306a36Sopenharmony_ci struct pci_dev *pdev; 16162306a36Sopenharmony_ci /* lock to protect qplib_hwq */ 16262306a36Sopenharmony_ci spinlock_t lock; 16362306a36Sopenharmony_ci struct bnxt_qplib_pbl pbl[PBL_LVL_MAX + 1]; 16462306a36Sopenharmony_ci enum bnxt_qplib_pbl_lvl level; /* 0, 1, or 2 */ 16562306a36Sopenharmony_ci /* ptr for easy access to the PBL entries */ 16662306a36Sopenharmony_ci void **pbl_ptr; 16762306a36Sopenharmony_ci /* ptr for easy access to the dma_addr */ 16862306a36Sopenharmony_ci dma_addr_t *pbl_dma_ptr; 16962306a36Sopenharmony_ci u32 max_elements; 17062306a36Sopenharmony_ci u32 depth; 17162306a36Sopenharmony_ci u16 element_size; /* Size of each entry */ 17262306a36Sopenharmony_ci u16 qe_ppg; /* queue entry per page */ 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci u32 prod; /* raw */ 17562306a36Sopenharmony_ci u32 cons; /* raw */ 17662306a36Sopenharmony_ci u8 cp_bit; 17762306a36Sopenharmony_ci u8 is_user; 17862306a36Sopenharmony_ci u64 *pad_pg; 17962306a36Sopenharmony_ci u32 pad_stride; 18062306a36Sopenharmony_ci u32 pad_pgofft; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistruct bnxt_qplib_db_info { 18462306a36Sopenharmony_ci void __iomem *db; 18562306a36Sopenharmony_ci void __iomem *priv_db; 18662306a36Sopenharmony_ci struct bnxt_qplib_hwq *hwq; 18762306a36Sopenharmony_ci u32 xid; 18862306a36Sopenharmony_ci u32 max_slot; 18962306a36Sopenharmony_ci}; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci/* Tables */ 19262306a36Sopenharmony_cistruct bnxt_qplib_pd_tbl { 19362306a36Sopenharmony_ci unsigned long *tbl; 19462306a36Sopenharmony_ci u32 max; 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistruct bnxt_qplib_sgid_tbl { 19862306a36Sopenharmony_ci struct bnxt_qplib_gid_info *tbl; 19962306a36Sopenharmony_ci u16 *hw_id; 20062306a36Sopenharmony_ci u16 max; 20162306a36Sopenharmony_ci u16 active; 20262306a36Sopenharmony_ci void *ctx; 20362306a36Sopenharmony_ci u8 *vlan; 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cienum { 20762306a36Sopenharmony_ci BNXT_QPLIB_DPI_TYPE_KERNEL = 0, 20862306a36Sopenharmony_ci BNXT_QPLIB_DPI_TYPE_UC = 1, 20962306a36Sopenharmony_ci BNXT_QPLIB_DPI_TYPE_WC = 2 21062306a36Sopenharmony_ci}; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistruct bnxt_qplib_dpi { 21362306a36Sopenharmony_ci u32 dpi; 21462306a36Sopenharmony_ci u32 bit; 21562306a36Sopenharmony_ci void __iomem *dbr; 21662306a36Sopenharmony_ci u64 umdbr; 21762306a36Sopenharmony_ci u8 type; 21862306a36Sopenharmony_ci}; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistruct bnxt_qplib_dpi_tbl { 22162306a36Sopenharmony_ci void **app_tbl; 22262306a36Sopenharmony_ci unsigned long *tbl; 22362306a36Sopenharmony_ci u16 max; 22462306a36Sopenharmony_ci struct bnxt_qplib_reg_desc ucreg; /* Hold entire DB bar. */ 22562306a36Sopenharmony_ci struct bnxt_qplib_reg_desc wcreg; 22662306a36Sopenharmony_ci void __iomem *priv_db; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistruct bnxt_qplib_stats { 23062306a36Sopenharmony_ci dma_addr_t dma_map; 23162306a36Sopenharmony_ci void *dma; 23262306a36Sopenharmony_ci u32 size; 23362306a36Sopenharmony_ci u32 fw_id; 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistruct bnxt_qplib_vf_res { 23762306a36Sopenharmony_ci u32 max_qp_per_vf; 23862306a36Sopenharmony_ci u32 max_mrw_per_vf; 23962306a36Sopenharmony_ci u32 max_srq_per_vf; 24062306a36Sopenharmony_ci u32 max_cq_per_vf; 24162306a36Sopenharmony_ci u32 max_gid_per_vf; 24262306a36Sopenharmony_ci}; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci#define BNXT_QPLIB_MAX_QP_CTX_ENTRY_SIZE 448 24562306a36Sopenharmony_ci#define BNXT_QPLIB_MAX_SRQ_CTX_ENTRY_SIZE 64 24662306a36Sopenharmony_ci#define BNXT_QPLIB_MAX_CQ_CTX_ENTRY_SIZE 64 24762306a36Sopenharmony_ci#define BNXT_QPLIB_MAX_MRW_CTX_ENTRY_SIZE 128 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci#define MAX_TQM_ALLOC_REQ 48 25062306a36Sopenharmony_ci#define MAX_TQM_ALLOC_BLK_SIZE 8 25162306a36Sopenharmony_cistruct bnxt_qplib_tqm_ctx { 25262306a36Sopenharmony_ci struct bnxt_qplib_hwq pde; 25362306a36Sopenharmony_ci u8 pde_level; /* Original level */ 25462306a36Sopenharmony_ci struct bnxt_qplib_hwq qtbl[MAX_TQM_ALLOC_REQ]; 25562306a36Sopenharmony_ci u8 qcount[MAX_TQM_ALLOC_REQ]; 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistruct bnxt_qplib_ctx { 25962306a36Sopenharmony_ci u32 qpc_count; 26062306a36Sopenharmony_ci struct bnxt_qplib_hwq qpc_tbl; 26162306a36Sopenharmony_ci u32 mrw_count; 26262306a36Sopenharmony_ci struct bnxt_qplib_hwq mrw_tbl; 26362306a36Sopenharmony_ci u32 srqc_count; 26462306a36Sopenharmony_ci struct bnxt_qplib_hwq srqc_tbl; 26562306a36Sopenharmony_ci u32 cq_count; 26662306a36Sopenharmony_ci struct bnxt_qplib_hwq cq_tbl; 26762306a36Sopenharmony_ci struct bnxt_qplib_hwq tim_tbl; 26862306a36Sopenharmony_ci struct bnxt_qplib_tqm_ctx tqm_ctx; 26962306a36Sopenharmony_ci struct bnxt_qplib_stats stats; 27062306a36Sopenharmony_ci struct bnxt_qplib_vf_res vf_res; 27162306a36Sopenharmony_ci}; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistruct bnxt_qplib_res { 27462306a36Sopenharmony_ci struct pci_dev *pdev; 27562306a36Sopenharmony_ci struct bnxt_qplib_chip_ctx *cctx; 27662306a36Sopenharmony_ci struct bnxt_qplib_dev_attr *dattr; 27762306a36Sopenharmony_ci struct net_device *netdev; 27862306a36Sopenharmony_ci struct bnxt_qplib_rcfw *rcfw; 27962306a36Sopenharmony_ci struct bnxt_qplib_pd_tbl pd_tbl; 28062306a36Sopenharmony_ci /* To protect the pd table bit map */ 28162306a36Sopenharmony_ci struct mutex pd_tbl_lock; 28262306a36Sopenharmony_ci struct bnxt_qplib_sgid_tbl sgid_tbl; 28362306a36Sopenharmony_ci struct bnxt_qplib_dpi_tbl dpi_tbl; 28462306a36Sopenharmony_ci /* To protect the dpi table bit map */ 28562306a36Sopenharmony_ci struct mutex dpi_tbl_lock; 28662306a36Sopenharmony_ci bool prio; 28762306a36Sopenharmony_ci bool is_vf; 28862306a36Sopenharmony_ci struct bnxt_qplib_db_pacing_data *pacing_data; 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic inline bool bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx *cctx) 29262306a36Sopenharmony_ci{ 29362306a36Sopenharmony_ci return (cctx->chip_num == CHIP_NUM_57508 || 29462306a36Sopenharmony_ci cctx->chip_num == CHIP_NUM_57504 || 29562306a36Sopenharmony_ci cctx->chip_num == CHIP_NUM_57502); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic inline u8 bnxt_qplib_get_hwq_type(struct bnxt_qplib_res *res) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci return bnxt_qplib_is_chip_gen_p5(res->cctx) ? 30162306a36Sopenharmony_ci HWQ_TYPE_QUEUE : HWQ_TYPE_L2_CMPL; 30262306a36Sopenharmony_ci} 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic inline u8 bnxt_qplib_get_ring_type(struct bnxt_qplib_chip_ctx *cctx) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci return bnxt_qplib_is_chip_gen_p5(cctx) ? 30762306a36Sopenharmony_ci RING_ALLOC_REQ_RING_TYPE_NQ : 30862306a36Sopenharmony_ci RING_ALLOC_REQ_RING_TYPE_ROCE_CMPL; 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistatic inline u8 bnxt_qplib_base_pg_size(struct bnxt_qplib_hwq *hwq) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci u8 pg_size = BNXT_QPLIB_HWRM_PG_SIZE_4K; 31462306a36Sopenharmony_ci struct bnxt_qplib_pbl *pbl; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci pbl = &hwq->pbl[PBL_LVL_0]; 31762306a36Sopenharmony_ci switch (pbl->pg_size) { 31862306a36Sopenharmony_ci case ROCE_PG_SIZE_4K: 31962306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_4K; 32062306a36Sopenharmony_ci break; 32162306a36Sopenharmony_ci case ROCE_PG_SIZE_8K: 32262306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_8K; 32362306a36Sopenharmony_ci break; 32462306a36Sopenharmony_ci case ROCE_PG_SIZE_64K: 32562306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_64K; 32662306a36Sopenharmony_ci break; 32762306a36Sopenharmony_ci case ROCE_PG_SIZE_2M: 32862306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_2M; 32962306a36Sopenharmony_ci break; 33062306a36Sopenharmony_ci case ROCE_PG_SIZE_8M: 33162306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_8M; 33262306a36Sopenharmony_ci break; 33362306a36Sopenharmony_ci case ROCE_PG_SIZE_1G: 33462306a36Sopenharmony_ci pg_size = BNXT_QPLIB_HWRM_PG_SIZE_1G; 33562306a36Sopenharmony_ci break; 33662306a36Sopenharmony_ci default: 33762306a36Sopenharmony_ci break; 33862306a36Sopenharmony_ci } 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci return pg_size; 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic inline void *bnxt_qplib_get_qe(struct bnxt_qplib_hwq *hwq, 34462306a36Sopenharmony_ci u32 indx, u64 *pg) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci u32 pg_num, pg_idx; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci pg_num = (indx / hwq->qe_ppg); 34962306a36Sopenharmony_ci pg_idx = (indx % hwq->qe_ppg); 35062306a36Sopenharmony_ci if (pg) 35162306a36Sopenharmony_ci *pg = (u64)&hwq->pbl_ptr[pg_num]; 35262306a36Sopenharmony_ci return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx); 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cistatic inline void *bnxt_qplib_get_prod_qe(struct bnxt_qplib_hwq *hwq, u32 idx) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci idx += hwq->prod; 35862306a36Sopenharmony_ci if (idx >= hwq->depth) 35962306a36Sopenharmony_ci idx -= hwq->depth; 36062306a36Sopenharmony_ci return bnxt_qplib_get_qe(hwq, idx, NULL); 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci#define to_bnxt_qplib(ptr, type, member) \ 36462306a36Sopenharmony_ci container_of(ptr, type, member) 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistruct bnxt_qplib_pd; 36762306a36Sopenharmony_cistruct bnxt_qplib_dev_attr; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_civoid bnxt_qplib_free_hwq(struct bnxt_qplib_res *res, 37062306a36Sopenharmony_ci struct bnxt_qplib_hwq *hwq); 37162306a36Sopenharmony_ciint bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq, 37262306a36Sopenharmony_ci struct bnxt_qplib_hwq_attr *hwq_attr); 37362306a36Sopenharmony_ciint bnxt_qplib_alloc_pd(struct bnxt_qplib_res *res, 37462306a36Sopenharmony_ci struct bnxt_qplib_pd *pd); 37562306a36Sopenharmony_ciint bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res, 37662306a36Sopenharmony_ci struct bnxt_qplib_pd_tbl *pd_tbl, 37762306a36Sopenharmony_ci struct bnxt_qplib_pd *pd); 37862306a36Sopenharmony_ciint bnxt_qplib_alloc_dpi(struct bnxt_qplib_res *res, 37962306a36Sopenharmony_ci struct bnxt_qplib_dpi *dpi, 38062306a36Sopenharmony_ci void *app, u8 type); 38162306a36Sopenharmony_ciint bnxt_qplib_dealloc_dpi(struct bnxt_qplib_res *res, 38262306a36Sopenharmony_ci struct bnxt_qplib_dpi *dpi); 38362306a36Sopenharmony_civoid bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res); 38462306a36Sopenharmony_ciint bnxt_qplib_init_res(struct bnxt_qplib_res *res); 38562306a36Sopenharmony_civoid bnxt_qplib_free_res(struct bnxt_qplib_res *res); 38662306a36Sopenharmony_ciint bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev, 38762306a36Sopenharmony_ci struct net_device *netdev, 38862306a36Sopenharmony_ci struct bnxt_qplib_dev_attr *dev_attr); 38962306a36Sopenharmony_civoid bnxt_qplib_free_ctx(struct bnxt_qplib_res *res, 39062306a36Sopenharmony_ci struct bnxt_qplib_ctx *ctx); 39162306a36Sopenharmony_ciint bnxt_qplib_alloc_ctx(struct bnxt_qplib_res *res, 39262306a36Sopenharmony_ci struct bnxt_qplib_ctx *ctx, 39362306a36Sopenharmony_ci bool virt_fn, bool is_p5); 39462306a36Sopenharmony_ciint bnxt_qplib_map_db_bar(struct bnxt_qplib_res *res); 39562306a36Sopenharmony_civoid bnxt_qplib_unmap_db_bar(struct bnxt_qplib_res *res); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ciint bnxt_qplib_determine_atomics(struct pci_dev *dev); 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic inline void bnxt_qplib_hwq_incr_prod(struct bnxt_qplib_hwq *hwq, u32 cnt) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci hwq->prod = (hwq->prod + cnt) % hwq->depth; 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic inline void bnxt_qplib_hwq_incr_cons(struct bnxt_qplib_hwq *hwq, 40562306a36Sopenharmony_ci u32 cnt) 40662306a36Sopenharmony_ci{ 40762306a36Sopenharmony_ci hwq->cons = (hwq->cons + cnt) % hwq->depth; 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistatic inline void bnxt_qplib_ring_db32(struct bnxt_qplib_db_info *info, 41162306a36Sopenharmony_ci bool arm) 41262306a36Sopenharmony_ci{ 41362306a36Sopenharmony_ci u32 key; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci key = info->hwq->cons & (info->hwq->max_elements - 1); 41662306a36Sopenharmony_ci key |= (CMPL_DOORBELL_IDX_VALID | 41762306a36Sopenharmony_ci (CMPL_DOORBELL_KEY_CMPL & CMPL_DOORBELL_KEY_MASK)); 41862306a36Sopenharmony_ci if (!arm) 41962306a36Sopenharmony_ci key |= CMPL_DOORBELL_MASK; 42062306a36Sopenharmony_ci writel(key, info->db); 42162306a36Sopenharmony_ci} 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_cistatic inline void bnxt_qplib_ring_db(struct bnxt_qplib_db_info *info, 42462306a36Sopenharmony_ci u32 type) 42562306a36Sopenharmony_ci{ 42662306a36Sopenharmony_ci u64 key = 0; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type; 42962306a36Sopenharmony_ci key <<= 32; 43062306a36Sopenharmony_ci key |= (info->hwq->cons & (info->hwq->max_elements - 1)) & 43162306a36Sopenharmony_ci DBC_DBC_INDEX_MASK; 43262306a36Sopenharmony_ci writeq(key, info->db); 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic inline void bnxt_qplib_ring_prod_db(struct bnxt_qplib_db_info *info, 43662306a36Sopenharmony_ci u32 type) 43762306a36Sopenharmony_ci{ 43862306a36Sopenharmony_ci u64 key = 0; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type; 44162306a36Sopenharmony_ci key <<= 32; 44262306a36Sopenharmony_ci key |= ((info->hwq->prod / info->max_slot)) & DBC_DBC_INDEX_MASK; 44362306a36Sopenharmony_ci writeq(key, info->db); 44462306a36Sopenharmony_ci} 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_cistatic inline void bnxt_qplib_armen_db(struct bnxt_qplib_db_info *info, 44762306a36Sopenharmony_ci u32 type) 44862306a36Sopenharmony_ci{ 44962306a36Sopenharmony_ci u64 key = 0; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type; 45262306a36Sopenharmony_ci key <<= 32; 45362306a36Sopenharmony_ci writeq(key, info->priv_db); 45462306a36Sopenharmony_ci} 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistatic inline void bnxt_qplib_srq_arm_db(struct bnxt_qplib_db_info *info, 45762306a36Sopenharmony_ci u32 th) 45862306a36Sopenharmony_ci{ 45962306a36Sopenharmony_ci u64 key = 0; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | th; 46262306a36Sopenharmony_ci key <<= 32; 46362306a36Sopenharmony_ci key |= th & DBC_DBC_INDEX_MASK; 46462306a36Sopenharmony_ci writeq(key, info->priv_db); 46562306a36Sopenharmony_ci} 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistatic inline void bnxt_qplib_ring_nq_db(struct bnxt_qplib_db_info *info, 46862306a36Sopenharmony_ci struct bnxt_qplib_chip_ctx *cctx, 46962306a36Sopenharmony_ci bool arm) 47062306a36Sopenharmony_ci{ 47162306a36Sopenharmony_ci u32 type; 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ; 47462306a36Sopenharmony_ci if (bnxt_qplib_is_chip_gen_p5(cctx)) 47562306a36Sopenharmony_ci bnxt_qplib_ring_db(info, type); 47662306a36Sopenharmony_ci else 47762306a36Sopenharmony_ci bnxt_qplib_ring_db32(info, arm); 47862306a36Sopenharmony_ci} 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_cistatic inline bool _is_ext_stats_supported(u16 dev_cap_flags) 48162306a36Sopenharmony_ci{ 48262306a36Sopenharmony_ci return dev_cap_flags & 48362306a36Sopenharmony_ci CREQ_QUERY_FUNC_RESP_SB_EXT_STATS; 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic inline u8 bnxt_qplib_dbr_pacing_en(struct bnxt_qplib_chip_ctx *cctx) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci return cctx->modes.dbr_pacing; 48962306a36Sopenharmony_ci} 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci#endif /* __BNXT_QPLIB_RES_H__ */ 492