1*8d765af5SAbhijit Gangurde // SPDX-License-Identifier: GPL-2.0 2*8d765af5SAbhijit Gangurde /* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */ 3*8d765af5SAbhijit Gangurde 4*8d765af5SAbhijit Gangurde #include <linux/kernel.h> 5*8d765af5SAbhijit Gangurde 6*8d765af5SAbhijit Gangurde #include <ionic.h> 7*8d765af5SAbhijit Gangurde #include <ionic_lif.h> 8*8d765af5SAbhijit Gangurde 9*8d765af5SAbhijit Gangurde #include "ionic_lif_cfg.h" 10*8d765af5SAbhijit Gangurde 11*8d765af5SAbhijit Gangurde #define IONIC_MIN_RDMA_VERSION 0 12*8d765af5SAbhijit Gangurde #define IONIC_MAX_RDMA_VERSION 2 13*8d765af5SAbhijit Gangurde 14*8d765af5SAbhijit Gangurde static u8 ionic_get_expdb(struct ionic_lif *lif) 15*8d765af5SAbhijit Gangurde { 16*8d765af5SAbhijit Gangurde u8 expdb_support = 0; 17*8d765af5SAbhijit Gangurde 18*8d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb64_pages) 19*8d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_64B_WQE; 20*8d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb128_pages) 21*8d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_128B_WQE; 22*8d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb256_pages) 23*8d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_256B_WQE; 24*8d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb512_pages) 25*8d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_512B_WQE; 26*8d765af5SAbhijit Gangurde 27*8d765af5SAbhijit Gangurde return expdb_support; 28*8d765af5SAbhijit Gangurde } 29*8d765af5SAbhijit Gangurde 30*8d765af5SAbhijit Gangurde void ionic_fill_lif_cfg(struct ionic_lif *lif, struct ionic_lif_cfg *cfg) 31*8d765af5SAbhijit Gangurde { 32*8d765af5SAbhijit Gangurde union ionic_lif_identity *ident = &lif->ionic->ident.lif; 33*8d765af5SAbhijit Gangurde 34*8d765af5SAbhijit Gangurde cfg->lif = lif; 35*8d765af5SAbhijit Gangurde cfg->hwdev = &lif->ionic->pdev->dev; 36*8d765af5SAbhijit Gangurde cfg->lif_index = lif->index; 37*8d765af5SAbhijit Gangurde cfg->lif_hw_index = lif->hw_index; 38*8d765af5SAbhijit Gangurde 39*8d765af5SAbhijit Gangurde cfg->dbid = lif->kern_pid; 40*8d765af5SAbhijit Gangurde cfg->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif); 41*8d765af5SAbhijit Gangurde cfg->dbpage = lif->kern_dbpage; 42*8d765af5SAbhijit Gangurde cfg->intr_ctrl = lif->ionic->idev.intr_ctrl; 43*8d765af5SAbhijit Gangurde 44*8d765af5SAbhijit Gangurde cfg->db_phys = lif->ionic->bars[IONIC_PCI_BAR_DBELL].bus_addr; 45*8d765af5SAbhijit Gangurde 46*8d765af5SAbhijit Gangurde if (IONIC_VERSION(ident->rdma.version, ident->rdma.minor_version) >= 47*8d765af5SAbhijit Gangurde IONIC_VERSION(2, 1)) 48*8d765af5SAbhijit Gangurde cfg->page_size_supported = 49*8d765af5SAbhijit Gangurde le64_to_cpu(ident->rdma.page_size_cap); 50*8d765af5SAbhijit Gangurde else 51*8d765af5SAbhijit Gangurde cfg->page_size_supported = IONIC_PAGE_SIZE_SUPPORTED; 52*8d765af5SAbhijit Gangurde 53*8d765af5SAbhijit Gangurde cfg->rdma_version = ident->rdma.version; 54*8d765af5SAbhijit Gangurde cfg->qp_opcodes = ident->rdma.qp_opcodes; 55*8d765af5SAbhijit Gangurde cfg->admin_opcodes = ident->rdma.admin_opcodes; 56*8d765af5SAbhijit Gangurde 57*8d765af5SAbhijit Gangurde cfg->stats_type = le16_to_cpu(ident->rdma.stats_type); 58*8d765af5SAbhijit Gangurde cfg->npts_per_lif = le32_to_cpu(ident->rdma.npts_per_lif); 59*8d765af5SAbhijit Gangurde cfg->nmrs_per_lif = le32_to_cpu(ident->rdma.nmrs_per_lif); 60*8d765af5SAbhijit Gangurde cfg->nahs_per_lif = le32_to_cpu(ident->rdma.nahs_per_lif); 61*8d765af5SAbhijit Gangurde 62*8d765af5SAbhijit Gangurde cfg->aq_base = le32_to_cpu(ident->rdma.aq_qtype.qid_base); 63*8d765af5SAbhijit Gangurde cfg->cq_base = le32_to_cpu(ident->rdma.cq_qtype.qid_base); 64*8d765af5SAbhijit Gangurde cfg->eq_base = le32_to_cpu(ident->rdma.eq_qtype.qid_base); 65*8d765af5SAbhijit Gangurde 66*8d765af5SAbhijit Gangurde /* 67*8d765af5SAbhijit Gangurde * ionic_create_rdma_admin() may reduce aq_count or eq_count if 68*8d765af5SAbhijit Gangurde * it is unable to allocate all that were requested. 69*8d765af5SAbhijit Gangurde * aq_count is tunable; see ionic_aq_count 70*8d765af5SAbhijit Gangurde * eq_count is tunable; see ionic_eq_count 71*8d765af5SAbhijit Gangurde */ 72*8d765af5SAbhijit Gangurde cfg->aq_count = le32_to_cpu(ident->rdma.aq_qtype.qid_count); 73*8d765af5SAbhijit Gangurde cfg->eq_count = le32_to_cpu(ident->rdma.eq_qtype.qid_count); 74*8d765af5SAbhijit Gangurde cfg->cq_count = le32_to_cpu(ident->rdma.cq_qtype.qid_count); 75*8d765af5SAbhijit Gangurde cfg->qp_count = le32_to_cpu(ident->rdma.sq_qtype.qid_count); 76*8d765af5SAbhijit Gangurde cfg->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif); 77*8d765af5SAbhijit Gangurde 78*8d765af5SAbhijit Gangurde cfg->aq_qtype = ident->rdma.aq_qtype.qtype; 79*8d765af5SAbhijit Gangurde cfg->sq_qtype = ident->rdma.sq_qtype.qtype; 80*8d765af5SAbhijit Gangurde cfg->rq_qtype = ident->rdma.rq_qtype.qtype; 81*8d765af5SAbhijit Gangurde cfg->cq_qtype = ident->rdma.cq_qtype.qtype; 82*8d765af5SAbhijit Gangurde cfg->eq_qtype = ident->rdma.eq_qtype.qtype; 83*8d765af5SAbhijit Gangurde cfg->udma_qgrp_shift = ident->rdma.udma_shift; 84*8d765af5SAbhijit Gangurde cfg->udma_count = 2; 85*8d765af5SAbhijit Gangurde 86*8d765af5SAbhijit Gangurde cfg->max_stride = ident->rdma.max_stride; 87*8d765af5SAbhijit Gangurde cfg->expdb_mask = ionic_get_expdb(lif); 88*8d765af5SAbhijit Gangurde 89*8d765af5SAbhijit Gangurde cfg->sq_expdb = 90*8d765af5SAbhijit Gangurde !!(lif->qtype_info[IONIC_QTYPE_TXQ].features & IONIC_QIDENT_F_EXPDB); 91*8d765af5SAbhijit Gangurde cfg->rq_expdb = 92*8d765af5SAbhijit Gangurde !!(lif->qtype_info[IONIC_QTYPE_RXQ].features & IONIC_QIDENT_F_EXPDB); 93*8d765af5SAbhijit Gangurde } 94*8d765af5SAbhijit Gangurde 95*8d765af5SAbhijit Gangurde struct net_device *ionic_lif_netdev(struct ionic_lif *lif) 96*8d765af5SAbhijit Gangurde { 97*8d765af5SAbhijit Gangurde struct net_device *netdev = lif->netdev; 98*8d765af5SAbhijit Gangurde 99*8d765af5SAbhijit Gangurde dev_hold(netdev); 100*8d765af5SAbhijit Gangurde return netdev; 101*8d765af5SAbhijit Gangurde } 102