18d765af5SAbhijit Gangurde // SPDX-License-Identifier: GPL-2.0 28d765af5SAbhijit Gangurde /* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */ 38d765af5SAbhijit Gangurde 48d765af5SAbhijit Gangurde #include <linux/kernel.h> 58d765af5SAbhijit Gangurde 68d765af5SAbhijit Gangurde #include <ionic.h> 78d765af5SAbhijit Gangurde #include <ionic_lif.h> 88d765af5SAbhijit Gangurde 98d765af5SAbhijit Gangurde #include "ionic_lif_cfg.h" 108d765af5SAbhijit Gangurde 118d765af5SAbhijit Gangurde #define IONIC_MIN_RDMA_VERSION 0 128d765af5SAbhijit Gangurde #define IONIC_MAX_RDMA_VERSION 2 138d765af5SAbhijit Gangurde 148d765af5SAbhijit Gangurde static u8 ionic_get_expdb(struct ionic_lif *lif) 158d765af5SAbhijit Gangurde { 168d765af5SAbhijit Gangurde u8 expdb_support = 0; 178d765af5SAbhijit Gangurde 188d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb64_pages) 198d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_64B_WQE; 208d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb128_pages) 218d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_128B_WQE; 228d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb256_pages) 238d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_256B_WQE; 248d765af5SAbhijit Gangurde if (lif->ionic->idev.phy_cmb_expdb512_pages) 258d765af5SAbhijit Gangurde expdb_support |= IONIC_EXPDB_512B_WQE; 268d765af5SAbhijit Gangurde 278d765af5SAbhijit Gangurde return expdb_support; 288d765af5SAbhijit Gangurde } 298d765af5SAbhijit Gangurde 308d765af5SAbhijit Gangurde void ionic_fill_lif_cfg(struct ionic_lif *lif, struct ionic_lif_cfg *cfg) 318d765af5SAbhijit Gangurde { 328d765af5SAbhijit Gangurde union ionic_lif_identity *ident = &lif->ionic->ident.lif; 338d765af5SAbhijit Gangurde 348d765af5SAbhijit Gangurde cfg->lif = lif; 358d765af5SAbhijit Gangurde cfg->hwdev = &lif->ionic->pdev->dev; 368d765af5SAbhijit Gangurde cfg->lif_index = lif->index; 378d765af5SAbhijit Gangurde cfg->lif_hw_index = lif->hw_index; 388d765af5SAbhijit Gangurde 398d765af5SAbhijit Gangurde cfg->dbid = lif->kern_pid; 408d765af5SAbhijit Gangurde cfg->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif); 418d765af5SAbhijit Gangurde cfg->dbpage = lif->kern_dbpage; 428d765af5SAbhijit Gangurde cfg->intr_ctrl = lif->ionic->idev.intr_ctrl; 438d765af5SAbhijit Gangurde 448d765af5SAbhijit Gangurde cfg->db_phys = lif->ionic->bars[IONIC_PCI_BAR_DBELL].bus_addr; 458d765af5SAbhijit Gangurde 468d765af5SAbhijit Gangurde if (IONIC_VERSION(ident->rdma.version, ident->rdma.minor_version) >= 478d765af5SAbhijit Gangurde IONIC_VERSION(2, 1)) 488d765af5SAbhijit Gangurde cfg->page_size_supported = 498d765af5SAbhijit Gangurde le64_to_cpu(ident->rdma.page_size_cap); 508d765af5SAbhijit Gangurde else 518d765af5SAbhijit Gangurde cfg->page_size_supported = IONIC_PAGE_SIZE_SUPPORTED; 528d765af5SAbhijit Gangurde 538d765af5SAbhijit Gangurde cfg->rdma_version = ident->rdma.version; 548d765af5SAbhijit Gangurde cfg->qp_opcodes = ident->rdma.qp_opcodes; 558d765af5SAbhijit Gangurde cfg->admin_opcodes = ident->rdma.admin_opcodes; 568d765af5SAbhijit Gangurde 578d765af5SAbhijit Gangurde cfg->stats_type = le16_to_cpu(ident->rdma.stats_type); 588d765af5SAbhijit Gangurde cfg->npts_per_lif = le32_to_cpu(ident->rdma.npts_per_lif); 598d765af5SAbhijit Gangurde cfg->nmrs_per_lif = le32_to_cpu(ident->rdma.nmrs_per_lif); 608d765af5SAbhijit Gangurde cfg->nahs_per_lif = le32_to_cpu(ident->rdma.nahs_per_lif); 618d765af5SAbhijit Gangurde 628d765af5SAbhijit Gangurde cfg->aq_base = le32_to_cpu(ident->rdma.aq_qtype.qid_base); 638d765af5SAbhijit Gangurde cfg->cq_base = le32_to_cpu(ident->rdma.cq_qtype.qid_base); 648d765af5SAbhijit Gangurde cfg->eq_base = le32_to_cpu(ident->rdma.eq_qtype.qid_base); 658d765af5SAbhijit Gangurde 668d765af5SAbhijit Gangurde /* 678d765af5SAbhijit Gangurde * ionic_create_rdma_admin() may reduce aq_count or eq_count if 688d765af5SAbhijit Gangurde * it is unable to allocate all that were requested. 698d765af5SAbhijit Gangurde * aq_count is tunable; see ionic_aq_count 708d765af5SAbhijit Gangurde * eq_count is tunable; see ionic_eq_count 718d765af5SAbhijit Gangurde */ 728d765af5SAbhijit Gangurde cfg->aq_count = le32_to_cpu(ident->rdma.aq_qtype.qid_count); 738d765af5SAbhijit Gangurde cfg->eq_count = le32_to_cpu(ident->rdma.eq_qtype.qid_count); 748d765af5SAbhijit Gangurde cfg->cq_count = le32_to_cpu(ident->rdma.cq_qtype.qid_count); 758d765af5SAbhijit Gangurde cfg->qp_count = le32_to_cpu(ident->rdma.sq_qtype.qid_count); 768d765af5SAbhijit Gangurde cfg->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif); 778d765af5SAbhijit Gangurde 788d765af5SAbhijit Gangurde cfg->aq_qtype = ident->rdma.aq_qtype.qtype; 798d765af5SAbhijit Gangurde cfg->sq_qtype = ident->rdma.sq_qtype.qtype; 808d765af5SAbhijit Gangurde cfg->rq_qtype = ident->rdma.rq_qtype.qtype; 818d765af5SAbhijit Gangurde cfg->cq_qtype = ident->rdma.cq_qtype.qtype; 828d765af5SAbhijit Gangurde cfg->eq_qtype = ident->rdma.eq_qtype.qtype; 838d765af5SAbhijit Gangurde cfg->udma_qgrp_shift = ident->rdma.udma_shift; 848d765af5SAbhijit Gangurde cfg->udma_count = 2; 858d765af5SAbhijit Gangurde 868d765af5SAbhijit Gangurde cfg->max_stride = ident->rdma.max_stride; 878d765af5SAbhijit Gangurde cfg->expdb_mask = ionic_get_expdb(lif); 888d765af5SAbhijit Gangurde 898d765af5SAbhijit Gangurde cfg->sq_expdb = 908d765af5SAbhijit Gangurde !!(lif->qtype_info[IONIC_QTYPE_TXQ].features & IONIC_QIDENT_F_EXPDB); 918d765af5SAbhijit Gangurde cfg->rq_expdb = 928d765af5SAbhijit Gangurde !!(lif->qtype_info[IONIC_QTYPE_RXQ].features & IONIC_QIDENT_F_EXPDB); 938d765af5SAbhijit Gangurde } 948d765af5SAbhijit Gangurde 958d765af5SAbhijit Gangurde struct net_device *ionic_lif_netdev(struct ionic_lif *lif) 968d765af5SAbhijit Gangurde { 978d765af5SAbhijit Gangurde struct net_device *netdev = lif->netdev; 988d765af5SAbhijit Gangurde 998d765af5SAbhijit Gangurde dev_hold(netdev); 1008d765af5SAbhijit Gangurde return netdev; 1018d765af5SAbhijit Gangurde } 102*2075bbe8SAbhijit Gangurde 103*2075bbe8SAbhijit Gangurde void ionic_lif_fw_version(struct ionic_lif *lif, char *str, size_t len) 104*2075bbe8SAbhijit Gangurde { 105*2075bbe8SAbhijit Gangurde strscpy(str, lif->ionic->idev.dev_info.fw_version, len); 106*2075bbe8SAbhijit Gangurde } 107*2075bbe8SAbhijit Gangurde 108*2075bbe8SAbhijit Gangurde u8 ionic_lif_asic_rev(struct ionic_lif *lif) 109*2075bbe8SAbhijit Gangurde { 110*2075bbe8SAbhijit Gangurde return lif->ionic->idev.dev_info.asic_rev; 111*2075bbe8SAbhijit Gangurde } 112