1dc8ee812SKishore Padmanabha /* SPDX-License-Identifier: BSD-3-Clause 2d9e70b1dSRandy Schacher * Copyright(c) 2014-2023 Broadcom 3dc8ee812SKishore Padmanabha * All rights reserved. 4dc8ee812SKishore Padmanabha */ 5dc8ee812SKishore Padmanabha 6dc8ee812SKishore Padmanabha #include <rte_malloc.h> 7dc8ee812SKishore Padmanabha #include "bnxt.h" 8dc8ee812SKishore Padmanabha #include "bnxt_vnic.h" 9dc8ee812SKishore Padmanabha #include "bnxt_tf_common.h" 100c036a14SPeter Spreadborough #include "bnxt_ulp_utils.h" 11ad9eed02SKishore Padmanabha #include "bnxt_tf_pmd_shim.h" 12dc8ee812SKishore Padmanabha #include "ulp_port_db.h" 133fe124d2SKishore Padmanabha #include "tfp.h" 14ad9eed02SKishore Padmanabha 15dc8ee812SKishore Padmanabha static uint32_t 16dc8ee812SKishore Padmanabha ulp_port_db_allocate_ifindex(struct bnxt_ulp_port_db *port_db) 17dc8ee812SKishore Padmanabha { 18dc8ee812SKishore Padmanabha uint32_t idx = 1; 19dc8ee812SKishore Padmanabha 20dc8ee812SKishore Padmanabha while (idx < port_db->ulp_intf_list_size && 21dc8ee812SKishore Padmanabha port_db->ulp_intf_list[idx].type != BNXT_ULP_INTF_TYPE_INVALID) 22dc8ee812SKishore Padmanabha idx++; 23dc8ee812SKishore Padmanabha 24dc8ee812SKishore Padmanabha if (idx >= port_db->ulp_intf_list_size) { 25dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Port DB interface list is full\n"); 26dc8ee812SKishore Padmanabha return 0; 27dc8ee812SKishore Padmanabha } 28dc8ee812SKishore Padmanabha return idx; 29dc8ee812SKishore Padmanabha } 30dc8ee812SKishore Padmanabha 31dc8ee812SKishore Padmanabha /* 32dc8ee812SKishore Padmanabha * Initialize the port database. Memory is allocated in this 33dc8ee812SKishore Padmanabha * call and assigned to the port database. 34dc8ee812SKishore Padmanabha * 35dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 36dc8ee812SKishore Padmanabha * 37dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 38dc8ee812SKishore Padmanabha */ 3945e8e1d4SVenkat Duvvuru int32_t ulp_port_db_init(struct bnxt_ulp_context *ulp_ctxt, uint8_t port_cnt) 40dc8ee812SKishore Padmanabha { 41dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 42dc8ee812SKishore Padmanabha 43dc8ee812SKishore Padmanabha port_db = rte_zmalloc("bnxt_ulp_port_db", 44dc8ee812SKishore Padmanabha sizeof(struct bnxt_ulp_port_db), 0); 45dc8ee812SKishore Padmanabha if (!port_db) { 46dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Failed to allocate memory for port db\n"); 47dc8ee812SKishore Padmanabha return -ENOMEM; 48dc8ee812SKishore Padmanabha } 49dc8ee812SKishore Padmanabha 50dc8ee812SKishore Padmanabha /* Attach the port database to the ulp context. */ 51dc8ee812SKishore Padmanabha bnxt_ulp_cntxt_ptr2_port_db_set(ulp_ctxt, port_db); 52dc8ee812SKishore Padmanabha 532921498cSMike Baucom /* 256 VFs + PFs etc. so making it 512*/ 542921498cSMike Baucom port_db->ulp_intf_list_size = BNXT_PORT_DB_MAX_INTF_LIST * 2; 55dc8ee812SKishore Padmanabha /* Allocate the port tables */ 56dc8ee812SKishore Padmanabha port_db->ulp_intf_list = rte_zmalloc("bnxt_ulp_port_db_intf_list", 57dc8ee812SKishore Padmanabha port_db->ulp_intf_list_size * 58dc8ee812SKishore Padmanabha sizeof(struct ulp_interface_info), 59dc8ee812SKishore Padmanabha 0); 60dc8ee812SKishore Padmanabha if (!port_db->ulp_intf_list) { 61dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, 62dc8ee812SKishore Padmanabha "Failed to allocate mem for port interface list\n"); 63dc8ee812SKishore Padmanabha goto error_free; 64dc8ee812SKishore Padmanabha } 6545e8e1d4SVenkat Duvvuru 6645e8e1d4SVenkat Duvvuru /* Allocate the phy port list */ 6745e8e1d4SVenkat Duvvuru port_db->phy_port_list = rte_zmalloc("bnxt_ulp_phy_port_list", 6845e8e1d4SVenkat Duvvuru port_cnt * 6945e8e1d4SVenkat Duvvuru sizeof(struct ulp_phy_port_info), 7045e8e1d4SVenkat Duvvuru 0); 7145e8e1d4SVenkat Duvvuru if (!port_db->phy_port_list) { 72dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, 7345e8e1d4SVenkat Duvvuru "Failed to allocate mem for phy port list\n"); 7445e8e1d4SVenkat Duvvuru goto error_free; 7545e8e1d4SVenkat Duvvuru } 763c334fcdSKishore Padmanabha port_db->phy_port_cnt = port_cnt; 77dc8ee812SKishore Padmanabha return 0; 78dc8ee812SKishore Padmanabha 79dc8ee812SKishore Padmanabha error_free: 80dc8ee812SKishore Padmanabha ulp_port_db_deinit(ulp_ctxt); 81dc8ee812SKishore Padmanabha return -ENOMEM; 82dc8ee812SKishore Padmanabha } 83dc8ee812SKishore Padmanabha 84dc8ee812SKishore Padmanabha /* 85dc8ee812SKishore Padmanabha * Deinitialize the port database. Memory is deallocated in 86dc8ee812SKishore Padmanabha * this call. 87dc8ee812SKishore Padmanabha * 88dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 89dc8ee812SKishore Padmanabha * 90dc8ee812SKishore Padmanabha * Returns 0 on success. 91dc8ee812SKishore Padmanabha */ 92dc8ee812SKishore Padmanabha int32_t ulp_port_db_deinit(struct bnxt_ulp_context *ulp_ctxt) 93dc8ee812SKishore Padmanabha { 94dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 95dc8ee812SKishore Padmanabha 96dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 97dc8ee812SKishore Padmanabha if (!port_db) { 98dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 99dc8ee812SKishore Padmanabha return -EINVAL; 100dc8ee812SKishore Padmanabha } 101dc8ee812SKishore Padmanabha 102dc8ee812SKishore Padmanabha /* Detach the flow database from the ulp context. */ 103dc8ee812SKishore Padmanabha bnxt_ulp_cntxt_ptr2_port_db_set(ulp_ctxt, NULL); 104dc8ee812SKishore Padmanabha 105dc8ee812SKishore Padmanabha /* Free up all the memory. */ 10645e8e1d4SVenkat Duvvuru rte_free(port_db->phy_port_list); 107dc8ee812SKishore Padmanabha rte_free(port_db->ulp_intf_list); 108dc8ee812SKishore Padmanabha rte_free(port_db); 109dc8ee812SKishore Padmanabha return 0; 110dc8ee812SKishore Padmanabha } 111dc8ee812SKishore Padmanabha 112dc8ee812SKishore Padmanabha /* 113dc8ee812SKishore Padmanabha * Update the port database.This api is called when the port 114dc8ee812SKishore Padmanabha * details are available during the startup. 115dc8ee812SKishore Padmanabha * 116dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 117dc8ee812SKishore Padmanabha * bp [in]. ptr to the device function. 118dc8ee812SKishore Padmanabha * 119dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 120dc8ee812SKishore Padmanabha */ 121d9e70b1dSRandy Schacher int32_t ulp_port_db_port_update(struct bnxt_ulp_context *ulp_ctxt, 122410e5b8bSVenkat Duvvuru struct rte_eth_dev *eth_dev) 123dc8ee812SKishore Padmanabha { 124410e5b8bSVenkat Duvvuru uint32_t port_id = eth_dev->data->port_id; 12535a7fe80SVenkat Duvvuru struct ulp_phy_port_info *port_data; 12635a7fe80SVenkat Duvvuru struct bnxt_ulp_port_db *port_db; 127dc8ee812SKishore Padmanabha struct ulp_interface_info *intf; 12845e8e1d4SVenkat Duvvuru struct ulp_func_if_info *func; 12935a7fe80SVenkat Duvvuru uint32_t ifindex; 130dd0191d5SShuanglin Wang uint8_t tsid; 131dc8ee812SKishore Padmanabha int32_t rc; 132dc8ee812SKishore Padmanabha 133dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 134dc8ee812SKishore Padmanabha if (!port_db) { 135dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 136dc8ee812SKishore Padmanabha return -EINVAL; 137dc8ee812SKishore Padmanabha } 138dc8ee812SKishore Padmanabha 139dc8ee812SKishore Padmanabha rc = ulp_port_db_dev_port_to_ulp_index(ulp_ctxt, port_id, &ifindex); 140dc8ee812SKishore Padmanabha if (rc == -ENOENT) { 141dc8ee812SKishore Padmanabha /* port not found, allocate one */ 142dc8ee812SKishore Padmanabha ifindex = ulp_port_db_allocate_ifindex(port_db); 143dc8ee812SKishore Padmanabha if (!ifindex) 144dc8ee812SKishore Padmanabha return -ENOMEM; 145dc8ee812SKishore Padmanabha port_db->dev_port_list[port_id] = ifindex; 146dc8ee812SKishore Padmanabha } else if (rc == -EINVAL) { 147dc8ee812SKishore Padmanabha return -EINVAL; 148dc8ee812SKishore Padmanabha } 149dc8ee812SKishore Padmanabha 150dc8ee812SKishore Padmanabha /* update the interface details */ 151dc8ee812SKishore Padmanabha intf = &port_db->ulp_intf_list[ifindex]; 15235a7fe80SVenkat Duvvuru 1531993b267SShahaji Bhosle intf->type = bnxt_pmd_get_interface_type(port_id); 1546d160d77SRandy Schacher if (intf->type == BNXT_ULP_INTF_TYPE_PF) 1556d160d77SRandy Schacher intf->type_is_pf = 1; 1566d160d77SRandy Schacher else 1576d160d77SRandy Schacher intf->type_is_pf = 0; 1586d160d77SRandy Schacher 1591993b267SShahaji Bhosle intf->drv_func_id = bnxt_pmd_get_fw_func_id(port_id, 16045e8e1d4SVenkat Duvvuru BNXT_ULP_INTF_TYPE_INVALID); 16135a7fe80SVenkat Duvvuru 16245e8e1d4SVenkat Duvvuru func = &port_db->ulp_func_id_tbl[intf->drv_func_id]; 16345e8e1d4SVenkat Duvvuru if (!func->func_valid) { 1641993b267SShahaji Bhosle func->func_svif = bnxt_pmd_get_svif(port_id, true, 16545e8e1d4SVenkat Duvvuru BNXT_ULP_INTF_TYPE_INVALID); 1661993b267SShahaji Bhosle func->func_spif = bnxt_pmd_get_phy_port_id(port_id); 16745e8e1d4SVenkat Duvvuru func->func_parif = 1681993b267SShahaji Bhosle bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); 16945e8e1d4SVenkat Duvvuru func->func_vnic = 1701993b267SShahaji Bhosle bnxt_pmd_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_INVALID); 1711993b267SShahaji Bhosle func->phy_port_id = bnxt_pmd_get_phy_port_id(port_id); 17245e8e1d4SVenkat Duvvuru func->func_valid = true; 17314f260c0SKishore Padmanabha func->ifindex = ifindex; 174dd0191d5SShuanglin Wang /* Table scope is defined for all devices, ignore failures. */ 175dd0191d5SShuanglin Wang if (!bnxt_ulp_cntxt_tsid_get(ulp_ctxt, &tsid)) 176dd0191d5SShuanglin Wang func->table_scope = tsid; 17745e8e1d4SVenkat Duvvuru } 17835a7fe80SVenkat Duvvuru 17945e8e1d4SVenkat Duvvuru if (intf->type == BNXT_ULP_INTF_TYPE_VF_REP) { 18045e8e1d4SVenkat Duvvuru intf->vf_func_id = 1811993b267SShahaji Bhosle bnxt_pmd_get_fw_func_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); 18245e8e1d4SVenkat Duvvuru 18345e8e1d4SVenkat Duvvuru func = &port_db->ulp_func_id_tbl[intf->vf_func_id]; 18445e8e1d4SVenkat Duvvuru func->func_svif = 1851993b267SShahaji Bhosle bnxt_pmd_get_svif(port_id, true, BNXT_ULP_INTF_TYPE_VF_REP); 18645e8e1d4SVenkat Duvvuru func->func_spif = 1871993b267SShahaji Bhosle bnxt_pmd_get_phy_port_id(port_id); 18845e8e1d4SVenkat Duvvuru func->func_parif = 1891993b267SShahaji Bhosle bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); 19045e8e1d4SVenkat Duvvuru func->func_vnic = 1911993b267SShahaji Bhosle bnxt_pmd_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); 1921993b267SShahaji Bhosle func->phy_port_id = bnxt_pmd_get_phy_port_id(port_id); 19314f260c0SKishore Padmanabha func->ifindex = ifindex; 1946d160d77SRandy Schacher func->func_valid = true; 1956d160d77SRandy Schacher func->vf_meta_data = tfp_cpu_to_be_16(BNXT_ULP_META_VF_FLAG | 1966d160d77SRandy Schacher intf->vf_func_id); 197dd0191d5SShuanglin Wang if (!bnxt_ulp_cntxt_tsid_get(ulp_ctxt, &tsid)) 198dd0191d5SShuanglin Wang func->table_scope = tsid; 19945e8e1d4SVenkat Duvvuru } 20045e8e1d4SVenkat Duvvuru 201ddaf0afaSKishore Padmanabha /* When there is no match, the default action is to send the packet to 202ddaf0afaSKishore Padmanabha * the kernel. And to send it to the kernel, we need the PF's vnic id. 203ddaf0afaSKishore Padmanabha */ 2041993b267SShahaji Bhosle func->func_parent_vnic = bnxt_pmd_get_parent_vnic_id(port_id, intf->type); 2053fe124d2SKishore Padmanabha func->func_parent_vnic = tfp_cpu_to_be_16(func->func_parent_vnic); 2061993b267SShahaji Bhosle bnxt_pmd_get_iface_mac(port_id, intf->type, func->func_mac, 207ddaf0afaSKishore Padmanabha func->func_parent_mac); 208ddaf0afaSKishore Padmanabha 20945e8e1d4SVenkat Duvvuru port_data = &port_db->phy_port_list[func->phy_port_id]; 21045e8e1d4SVenkat Duvvuru if (!port_data->port_valid) { 21145e8e1d4SVenkat Duvvuru port_data->port_svif = 2121993b267SShahaji Bhosle bnxt_pmd_get_svif(port_id, false, BNXT_ULP_INTF_TYPE_INVALID); 2131993b267SShahaji Bhosle port_data->port_spif = bnxt_pmd_get_phy_port_id(port_id); 21445e8e1d4SVenkat Duvvuru port_data->port_parif = 2151993b267SShahaji Bhosle bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); 2161993b267SShahaji Bhosle port_data->port_vport = bnxt_pmd_get_vport(port_id); 21745e8e1d4SVenkat Duvvuru port_data->port_valid = true; 218dc8ee812SKishore Padmanabha } 219dc8ee812SKishore Padmanabha return 0; 220dc8ee812SKishore Padmanabha } 221dc8ee812SKishore Padmanabha 222dc8ee812SKishore Padmanabha /* 223dc8ee812SKishore Padmanabha * Api to get the ulp ifindex for a given device port. 224dc8ee812SKishore Padmanabha * 225dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 226dc8ee812SKishore Padmanabha * port_id [in].device port id 227dc8ee812SKishore Padmanabha * ifindex [out] ulp ifindex 228dc8ee812SKishore Padmanabha * 229dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 230dc8ee812SKishore Padmanabha */ 231dc8ee812SKishore Padmanabha int32_t 232dc8ee812SKishore Padmanabha ulp_port_db_dev_port_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt, 233dc8ee812SKishore Padmanabha uint32_t port_id, 234dc8ee812SKishore Padmanabha uint32_t *ifindex) 235dc8ee812SKishore Padmanabha { 236dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 237dc8ee812SKishore Padmanabha 238dc8ee812SKishore Padmanabha *ifindex = 0; 239dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 240dc8ee812SKishore Padmanabha if (!port_db || port_id >= RTE_MAX_ETHPORTS) { 241dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 242dc8ee812SKishore Padmanabha return -EINVAL; 243dc8ee812SKishore Padmanabha } 244dc8ee812SKishore Padmanabha if (!port_db->dev_port_list[port_id]) 245dc8ee812SKishore Padmanabha return -ENOENT; 246dc8ee812SKishore Padmanabha 247dc8ee812SKishore Padmanabha *ifindex = port_db->dev_port_list[port_id]; 248dc8ee812SKishore Padmanabha return 0; 249dc8ee812SKishore Padmanabha } 250dc8ee812SKishore Padmanabha 251dc8ee812SKishore Padmanabha /* 252dc8ee812SKishore Padmanabha * Api to get the function id for a given ulp ifindex. 253dc8ee812SKishore Padmanabha * 254dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 255dc8ee812SKishore Padmanabha * ifindex [in] ulp ifindex 256dc8ee812SKishore Padmanabha * func_id [out] the function id of the given ifindex. 257dc8ee812SKishore Padmanabha * 258dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 259dc8ee812SKishore Padmanabha */ 260dc8ee812SKishore Padmanabha int32_t 261dc8ee812SKishore Padmanabha ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt, 262dc8ee812SKishore Padmanabha uint32_t ifindex, 26345e8e1d4SVenkat Duvvuru uint32_t fid_type, 264dc8ee812SKishore Padmanabha uint16_t *func_id) 265dc8ee812SKishore Padmanabha { 266dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 267dc8ee812SKishore Padmanabha 268dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 269dc8ee812SKishore Padmanabha if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 270dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 271dc8ee812SKishore Padmanabha return -EINVAL; 272dc8ee812SKishore Padmanabha } 27345e8e1d4SVenkat Duvvuru 27445e8e1d4SVenkat Duvvuru if (fid_type == BNXT_ULP_DRV_FUNC_FID) 27545e8e1d4SVenkat Duvvuru *func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 27645e8e1d4SVenkat Duvvuru else 27745e8e1d4SVenkat Duvvuru *func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 27845e8e1d4SVenkat Duvvuru 279dc8ee812SKishore Padmanabha return 0; 280dc8ee812SKishore Padmanabha } 281dc8ee812SKishore Padmanabha 282dc8ee812SKishore Padmanabha /* 28335a7fe80SVenkat Duvvuru * Api to get the svif for a given ulp ifindex. 284dc8ee812SKishore Padmanabha * 285dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 286dc8ee812SKishore Padmanabha * ifindex [in] ulp ifindex 28745e8e1d4SVenkat Duvvuru * svif_type [in] the svif type of the given ifindex. 288dc8ee812SKishore Padmanabha * svif [out] the svif of the given ifindex. 289dc8ee812SKishore Padmanabha * 290dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 291dc8ee812SKishore Padmanabha */ 292dc8ee812SKishore Padmanabha int32_t 293dc8ee812SKishore Padmanabha ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt, 294dc8ee812SKishore Padmanabha uint32_t ifindex, 29545e8e1d4SVenkat Duvvuru uint32_t svif_type, 296dc8ee812SKishore Padmanabha uint16_t *svif) 297dc8ee812SKishore Padmanabha { 298dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 29945e8e1d4SVenkat Duvvuru uint16_t phy_port_id, func_id; 300dc8ee812SKishore Padmanabha 301dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 302dc8ee812SKishore Padmanabha if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 303dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 304dc8ee812SKishore Padmanabha return -EINVAL; 305dc8ee812SKishore Padmanabha } 30645e8e1d4SVenkat Duvvuru 30745e8e1d4SVenkat Duvvuru if (svif_type == BNXT_ULP_DRV_FUNC_SVIF) { 30845e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 30945e8e1d4SVenkat Duvvuru *svif = port_db->ulp_func_id_tbl[func_id].func_svif; 31045e8e1d4SVenkat Duvvuru } else if (svif_type == BNXT_ULP_VF_FUNC_SVIF) { 31145e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 31245e8e1d4SVenkat Duvvuru *svif = port_db->ulp_func_id_tbl[func_id].func_svif; 31335a7fe80SVenkat Duvvuru } else { 31445e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 31545e8e1d4SVenkat Duvvuru phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; 31635a7fe80SVenkat Duvvuru *svif = port_db->phy_port_list[phy_port_id].port_svif; 31735a7fe80SVenkat Duvvuru } 31835a7fe80SVenkat Duvvuru 31935a7fe80SVenkat Duvvuru return 0; 32035a7fe80SVenkat Duvvuru } 32135a7fe80SVenkat Duvvuru 32235a7fe80SVenkat Duvvuru /* 32335a7fe80SVenkat Duvvuru * Api to get the spif for a given ulp ifindex. 32435a7fe80SVenkat Duvvuru * 32535a7fe80SVenkat Duvvuru * ulp_ctxt [in] Ptr to ulp context 32635a7fe80SVenkat Duvvuru * ifindex [in] ulp ifindex 32745e8e1d4SVenkat Duvvuru * spif_type [in] the spif type of the given ifindex. 32835a7fe80SVenkat Duvvuru * spif [out] the spif of the given ifindex. 32935a7fe80SVenkat Duvvuru * 33035a7fe80SVenkat Duvvuru * Returns 0 on success or negative number on failure. 33135a7fe80SVenkat Duvvuru */ 33235a7fe80SVenkat Duvvuru int32_t 33335a7fe80SVenkat Duvvuru ulp_port_db_spif_get(struct bnxt_ulp_context *ulp_ctxt, 33435a7fe80SVenkat Duvvuru uint32_t ifindex, 33545e8e1d4SVenkat Duvvuru uint32_t spif_type, 33635a7fe80SVenkat Duvvuru uint16_t *spif) 33735a7fe80SVenkat Duvvuru { 33835a7fe80SVenkat Duvvuru struct bnxt_ulp_port_db *port_db; 33945e8e1d4SVenkat Duvvuru uint16_t phy_port_id, func_id; 34035a7fe80SVenkat Duvvuru 34135a7fe80SVenkat Duvvuru port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 34235a7fe80SVenkat Duvvuru if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 343dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 34435a7fe80SVenkat Duvvuru return -EINVAL; 34535a7fe80SVenkat Duvvuru } 34645e8e1d4SVenkat Duvvuru 34745e8e1d4SVenkat Duvvuru if (spif_type == BNXT_ULP_DRV_FUNC_SPIF) { 34845e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 34945e8e1d4SVenkat Duvvuru *spif = port_db->ulp_func_id_tbl[func_id].func_spif; 35045e8e1d4SVenkat Duvvuru } else if (spif_type == BNXT_ULP_VF_FUNC_SPIF) { 35145e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 35245e8e1d4SVenkat Duvvuru *spif = port_db->ulp_func_id_tbl[func_id].func_spif; 35335a7fe80SVenkat Duvvuru } else { 35445e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 35545e8e1d4SVenkat Duvvuru phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; 35635a7fe80SVenkat Duvvuru *spif = port_db->phy_port_list[phy_port_id].port_spif; 35735a7fe80SVenkat Duvvuru } 35835a7fe80SVenkat Duvvuru 35935a7fe80SVenkat Duvvuru return 0; 36035a7fe80SVenkat Duvvuru } 36135a7fe80SVenkat Duvvuru 36235a7fe80SVenkat Duvvuru /* 36335a7fe80SVenkat Duvvuru * Api to get the parif for a given ulp ifindex. 36435a7fe80SVenkat Duvvuru * 36535a7fe80SVenkat Duvvuru * ulp_ctxt [in] Ptr to ulp context 36635a7fe80SVenkat Duvvuru * ifindex [in] ulp ifindex 36745e8e1d4SVenkat Duvvuru * parif_type [in] the parif type of the given ifindex. 36835a7fe80SVenkat Duvvuru * parif [out] the parif of the given ifindex. 36935a7fe80SVenkat Duvvuru * 37035a7fe80SVenkat Duvvuru * Returns 0 on success or negative number on failure. 37135a7fe80SVenkat Duvvuru */ 37235a7fe80SVenkat Duvvuru int32_t 37335a7fe80SVenkat Duvvuru ulp_port_db_parif_get(struct bnxt_ulp_context *ulp_ctxt, 37435a7fe80SVenkat Duvvuru uint32_t ifindex, 37545e8e1d4SVenkat Duvvuru uint32_t parif_type, 37635a7fe80SVenkat Duvvuru uint16_t *parif) 37735a7fe80SVenkat Duvvuru { 37835a7fe80SVenkat Duvvuru struct bnxt_ulp_port_db *port_db; 37945e8e1d4SVenkat Duvvuru uint16_t phy_port_id, func_id; 38035a7fe80SVenkat Duvvuru 38135a7fe80SVenkat Duvvuru port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 38235a7fe80SVenkat Duvvuru if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 383dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 38435a7fe80SVenkat Duvvuru return -EINVAL; 38535a7fe80SVenkat Duvvuru } 38645e8e1d4SVenkat Duvvuru if (parif_type == BNXT_ULP_DRV_FUNC_PARIF) { 38745e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 38845e8e1d4SVenkat Duvvuru *parif = port_db->ulp_func_id_tbl[func_id].func_parif; 38945e8e1d4SVenkat Duvvuru } else if (parif_type == BNXT_ULP_VF_FUNC_PARIF) { 39045e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 39145e8e1d4SVenkat Duvvuru *parif = port_db->ulp_func_id_tbl[func_id].func_parif; 39235a7fe80SVenkat Duvvuru } else { 39345e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 39445e8e1d4SVenkat Duvvuru phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; 39535a7fe80SVenkat Duvvuru *parif = port_db->phy_port_list[phy_port_id].port_parif; 39635a7fe80SVenkat Duvvuru } 397f7df1c75SKishore Padmanabha /* Parif needs to be reset to a free partition */ 398f7df1c75SKishore Padmanabha *parif += BNXT_ULP_FREE_PARIF_BASE; 39935a7fe80SVenkat Duvvuru 400dc8ee812SKishore Padmanabha return 0; 401dc8ee812SKishore Padmanabha } 402dc8ee812SKishore Padmanabha 403dc8ee812SKishore Padmanabha /* 404dc8ee812SKishore Padmanabha * Api to get the vnic id for a given ulp ifindex. 405dc8ee812SKishore Padmanabha * 406dc8ee812SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 407dc8ee812SKishore Padmanabha * ifindex [in] ulp ifindex 408dc8ee812SKishore Padmanabha * vnic [out] the vnic of the given ifindex. 409dc8ee812SKishore Padmanabha * 410dc8ee812SKishore Padmanabha * Returns 0 on success or negative number on failure. 411dc8ee812SKishore Padmanabha */ 412dc8ee812SKishore Padmanabha int32_t 413dc8ee812SKishore Padmanabha ulp_port_db_default_vnic_get(struct bnxt_ulp_context *ulp_ctxt, 414dc8ee812SKishore Padmanabha uint32_t ifindex, 41545e8e1d4SVenkat Duvvuru uint32_t vnic_type, 416dc8ee812SKishore Padmanabha uint16_t *vnic) 417dc8ee812SKishore Padmanabha { 418dc8ee812SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 41945e8e1d4SVenkat Duvvuru uint16_t func_id; 420dc8ee812SKishore Padmanabha 421dc8ee812SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 422dc8ee812SKishore Padmanabha if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 423dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 424dc8ee812SKishore Padmanabha return -EINVAL; 425dc8ee812SKishore Padmanabha } 42645e8e1d4SVenkat Duvvuru 42745e8e1d4SVenkat Duvvuru if (vnic_type == BNXT_ULP_DRV_FUNC_VNIC) { 42845e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 42945e8e1d4SVenkat Duvvuru *vnic = port_db->ulp_func_id_tbl[func_id].func_vnic; 43045e8e1d4SVenkat Duvvuru } else { 43145e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 43245e8e1d4SVenkat Duvvuru *vnic = port_db->ulp_func_id_tbl[func_id].func_vnic; 43345e8e1d4SVenkat Duvvuru } 43445e8e1d4SVenkat Duvvuru 435dc8ee812SKishore Padmanabha return 0; 436dc8ee812SKishore Padmanabha } 43735a7fe80SVenkat Duvvuru 43835a7fe80SVenkat Duvvuru /* 43935a7fe80SVenkat Duvvuru * Api to get the vport id for a given ulp ifindex. 44035a7fe80SVenkat Duvvuru * 44135a7fe80SVenkat Duvvuru * ulp_ctxt [in] Ptr to ulp context 44235a7fe80SVenkat Duvvuru * ifindex [in] ulp ifindex 44335a7fe80SVenkat Duvvuru * vport [out] the port of the given ifindex. 44435a7fe80SVenkat Duvvuru * 44535a7fe80SVenkat Duvvuru * Returns 0 on success or negative number on failure. 44635a7fe80SVenkat Duvvuru */ 44735a7fe80SVenkat Duvvuru int32_t 44835a7fe80SVenkat Duvvuru ulp_port_db_vport_get(struct bnxt_ulp_context *ulp_ctxt, 44935a7fe80SVenkat Duvvuru uint32_t ifindex, uint16_t *vport) 45035a7fe80SVenkat Duvvuru { 45135a7fe80SVenkat Duvvuru struct bnxt_ulp_port_db *port_db; 45245e8e1d4SVenkat Duvvuru uint16_t phy_port_id, func_id; 45335a7fe80SVenkat Duvvuru 45435a7fe80SVenkat Duvvuru port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 45535a7fe80SVenkat Duvvuru if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 456dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 45735a7fe80SVenkat Duvvuru return -EINVAL; 45835a7fe80SVenkat Duvvuru } 45945e8e1d4SVenkat Duvvuru 46045e8e1d4SVenkat Duvvuru func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 46145e8e1d4SVenkat Duvvuru phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; 46235a7fe80SVenkat Duvvuru *vport = port_db->phy_port_list[phy_port_id].port_vport; 46335a7fe80SVenkat Duvvuru return 0; 46435a7fe80SVenkat Duvvuru } 4653c334fcdSKishore Padmanabha 4663c334fcdSKishore Padmanabha /* 4673c334fcdSKishore Padmanabha * Api to get the vport for a given physical port. 4683c334fcdSKishore Padmanabha * 4693c334fcdSKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 4703c334fcdSKishore Padmanabha * phy_port [in] physical port index 4713c334fcdSKishore Padmanabha * out_port [out] the port of the given physical index 4723c334fcdSKishore Padmanabha * 4733c334fcdSKishore Padmanabha * Returns 0 on success or negative number on failure. 4743c334fcdSKishore Padmanabha */ 4753c334fcdSKishore Padmanabha int32_t 4763c334fcdSKishore Padmanabha ulp_port_db_phy_port_vport_get(struct bnxt_ulp_context *ulp_ctxt, 4773c334fcdSKishore Padmanabha uint32_t phy_port, 4783c334fcdSKishore Padmanabha uint16_t *out_port) 4793c334fcdSKishore Padmanabha { 4803c334fcdSKishore Padmanabha struct bnxt_ulp_port_db *port_db; 4813c334fcdSKishore Padmanabha 4823c334fcdSKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 4833c334fcdSKishore Padmanabha if (!port_db || phy_port >= port_db->phy_port_cnt) { 484dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 4853c334fcdSKishore Padmanabha return -EINVAL; 4863c334fcdSKishore Padmanabha } 4873c334fcdSKishore Padmanabha *out_port = port_db->phy_port_list[phy_port].port_vport; 4883c334fcdSKishore Padmanabha return 0; 4893c334fcdSKishore Padmanabha } 49014f260c0SKishore Padmanabha 49114f260c0SKishore Padmanabha /* 49277b359eeSKishore Padmanabha * Api to get the svif for a given physical port. 49377b359eeSKishore Padmanabha * 49477b359eeSKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 49577b359eeSKishore Padmanabha * phy_port [in] physical port index 49677b359eeSKishore Padmanabha * svif [out] the svif of the given physical index 49777b359eeSKishore Padmanabha * 49877b359eeSKishore Padmanabha * Returns 0 on success or negative number on failure. 49977b359eeSKishore Padmanabha */ 50077b359eeSKishore Padmanabha int32_t 50177b359eeSKishore Padmanabha ulp_port_db_phy_port_svif_get(struct bnxt_ulp_context *ulp_ctxt, 50277b359eeSKishore Padmanabha uint32_t phy_port, 50377b359eeSKishore Padmanabha uint16_t *svif) 50477b359eeSKishore Padmanabha { 50577b359eeSKishore Padmanabha struct bnxt_ulp_port_db *port_db; 50677b359eeSKishore Padmanabha 50777b359eeSKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 50877b359eeSKishore Padmanabha if (!port_db || phy_port >= port_db->phy_port_cnt) { 509dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 51077b359eeSKishore Padmanabha return -EINVAL; 51177b359eeSKishore Padmanabha } 51277b359eeSKishore Padmanabha *svif = port_db->phy_port_list[phy_port].port_svif; 51377b359eeSKishore Padmanabha return 0; 51477b359eeSKishore Padmanabha } 51577b359eeSKishore Padmanabha 51677b359eeSKishore Padmanabha /* 517*d4b36fc5SKishore Padmanabha * Api to get the socket direct svif for a given device port. 518*d4b36fc5SKishore Padmanabha * 519*d4b36fc5SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 520*d4b36fc5SKishore Padmanabha * port_id [in] device port id 521*d4b36fc5SKishore Padmanabha * svif [out] the socket direct svif of the given device index 522*d4b36fc5SKishore Padmanabha * 523*d4b36fc5SKishore Padmanabha * Returns 0 on success or negative number on failure. 524*d4b36fc5SKishore Padmanabha */ 525*d4b36fc5SKishore Padmanabha int32_t 526*d4b36fc5SKishore Padmanabha ulp_port_db_dev_port_socket_direct_svif_get(struct bnxt_ulp_context *ulp_ctxt, 527*d4b36fc5SKishore Padmanabha uint32_t port_id, 528*d4b36fc5SKishore Padmanabha uint16_t *svif) 529*d4b36fc5SKishore Padmanabha { 530*d4b36fc5SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 531*d4b36fc5SKishore Padmanabha uint32_t ifindex; 532*d4b36fc5SKishore Padmanabha uint16_t phy_port_id, func_id; 533*d4b36fc5SKishore Padmanabha 534*d4b36fc5SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 535*d4b36fc5SKishore Padmanabha 536*d4b36fc5SKishore Padmanabha if (!port_db || port_id >= RTE_MAX_ETHPORTS) { 537*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 538*d4b36fc5SKishore Padmanabha return -EINVAL; 539*d4b36fc5SKishore Padmanabha } 540*d4b36fc5SKishore Padmanabha if (!port_db->dev_port_list[port_id]) 541*d4b36fc5SKishore Padmanabha return -ENOENT; 542*d4b36fc5SKishore Padmanabha 543*d4b36fc5SKishore Padmanabha /* Get physical port id */ 544*d4b36fc5SKishore Padmanabha ifindex = port_db->dev_port_list[port_id]; 545*d4b36fc5SKishore Padmanabha func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 546*d4b36fc5SKishore Padmanabha phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; 547*d4b36fc5SKishore Padmanabha 548*d4b36fc5SKishore Padmanabha /* Calculate physical port id for socket direct port */ 549*d4b36fc5SKishore Padmanabha phy_port_id = phy_port_id ? 0 : 1; 550*d4b36fc5SKishore Padmanabha if (phy_port_id >= port_db->phy_port_cnt) { 551*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 552*d4b36fc5SKishore Padmanabha return -EINVAL; 553*d4b36fc5SKishore Padmanabha } 554*d4b36fc5SKishore Padmanabha 555*d4b36fc5SKishore Padmanabha *svif = port_db->phy_port_list[phy_port_id].port_svif; 556*d4b36fc5SKishore Padmanabha return 0; 557*d4b36fc5SKishore Padmanabha } 558*d4b36fc5SKishore Padmanabha 559*d4b36fc5SKishore Padmanabha /* 56014f260c0SKishore Padmanabha * Api to get the port type for a given ulp ifindex. 56114f260c0SKishore Padmanabha * 56214f260c0SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 56314f260c0SKishore Padmanabha * ifindex [in] ulp ifindex 56414f260c0SKishore Padmanabha * 56514f260c0SKishore Padmanabha * Returns port type. 56614f260c0SKishore Padmanabha */ 56714f260c0SKishore Padmanabha enum bnxt_ulp_intf_type 56814f260c0SKishore Padmanabha ulp_port_db_port_type_get(struct bnxt_ulp_context *ulp_ctxt, 56914f260c0SKishore Padmanabha uint32_t ifindex) 57014f260c0SKishore Padmanabha { 57114f260c0SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 57214f260c0SKishore Padmanabha 57314f260c0SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 57414f260c0SKishore Padmanabha if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) { 575dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 57614f260c0SKishore Padmanabha return BNXT_ULP_INTF_TYPE_INVALID; 57714f260c0SKishore Padmanabha } 57814f260c0SKishore Padmanabha return port_db->ulp_intf_list[ifindex].type; 57914f260c0SKishore Padmanabha } 58014f260c0SKishore Padmanabha 58114f260c0SKishore Padmanabha /* 58214f260c0SKishore Padmanabha * Api to get the ulp ifindex for a given function id. 58314f260c0SKishore Padmanabha * 58414f260c0SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 58514f260c0SKishore Padmanabha * func_id [in].device func id 58614f260c0SKishore Padmanabha * ifindex [out] ulp ifindex 58714f260c0SKishore Padmanabha * 58814f260c0SKishore Padmanabha * Returns 0 on success or negative number on failure. 58914f260c0SKishore Padmanabha */ 59014f260c0SKishore Padmanabha int32_t 59114f260c0SKishore Padmanabha ulp_port_db_dev_func_id_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt, 59214f260c0SKishore Padmanabha uint32_t func_id, uint32_t *ifindex) 59314f260c0SKishore Padmanabha { 59414f260c0SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 59514f260c0SKishore Padmanabha 59614f260c0SKishore Padmanabha *ifindex = 0; 59714f260c0SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 59814f260c0SKishore Padmanabha if (!port_db || func_id >= BNXT_PORT_DB_MAX_FUNC) { 599dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 60014f260c0SKishore Padmanabha return -EINVAL; 60114f260c0SKishore Padmanabha } 60214f260c0SKishore Padmanabha if (!port_db->ulp_func_id_tbl[func_id].func_valid) 60314f260c0SKishore Padmanabha return -ENOENT; 60414f260c0SKishore Padmanabha 60514f260c0SKishore Padmanabha *ifindex = port_db->ulp_func_id_tbl[func_id].ifindex; 60614f260c0SKishore Padmanabha return 0; 60714f260c0SKishore Padmanabha } 608c53c2f43SKishore Padmanabha 609c53c2f43SKishore Padmanabha /* 610c53c2f43SKishore Padmanabha * Api to get the function id for a given port id. 611c53c2f43SKishore Padmanabha * 612c53c2f43SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 613c53c2f43SKishore Padmanabha * port_id [in] dpdk port id 614c53c2f43SKishore Padmanabha * func_id [out] the function id of the given ifindex. 615c53c2f43SKishore Padmanabha * 616c53c2f43SKishore Padmanabha * Returns 0 on success or negative number on failure. 617c53c2f43SKishore Padmanabha */ 618c53c2f43SKishore Padmanabha int32_t 619c53c2f43SKishore Padmanabha ulp_port_db_port_func_id_get(struct bnxt_ulp_context *ulp_ctxt, 620c53c2f43SKishore Padmanabha uint16_t port_id, uint16_t *func_id) 621c53c2f43SKishore Padmanabha { 622c53c2f43SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 623c53c2f43SKishore Padmanabha uint32_t ifindex; 624c53c2f43SKishore Padmanabha 625c53c2f43SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 626c53c2f43SKishore Padmanabha if (!port_db || port_id >= RTE_MAX_ETHPORTS) { 627dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 628c53c2f43SKishore Padmanabha return -EINVAL; 629c53c2f43SKishore Padmanabha } 630c53c2f43SKishore Padmanabha ifindex = port_db->dev_port_list[port_id]; 631c53c2f43SKishore Padmanabha if (!ifindex) 632c53c2f43SKishore Padmanabha return -ENOENT; 633c53c2f43SKishore Padmanabha 634c53c2f43SKishore Padmanabha switch (port_db->ulp_intf_list[ifindex].type) { 635c53c2f43SKishore Padmanabha case BNXT_ULP_INTF_TYPE_TRUSTED_VF: 636c53c2f43SKishore Padmanabha case BNXT_ULP_INTF_TYPE_PF: 637c53c2f43SKishore Padmanabha *func_id = port_db->ulp_intf_list[ifindex].drv_func_id; 638c53c2f43SKishore Padmanabha break; 639c53c2f43SKishore Padmanabha case BNXT_ULP_INTF_TYPE_VF: 640c53c2f43SKishore Padmanabha case BNXT_ULP_INTF_TYPE_VF_REP: 641c53c2f43SKishore Padmanabha *func_id = port_db->ulp_intf_list[ifindex].vf_func_id; 642c53c2f43SKishore Padmanabha break; 643c53c2f43SKishore Padmanabha default: 644c53c2f43SKishore Padmanabha *func_id = 0; 645c53c2f43SKishore Padmanabha break; 646c53c2f43SKishore Padmanabha } 647c53c2f43SKishore Padmanabha return 0; 648c53c2f43SKishore Padmanabha } 649ddaf0afaSKishore Padmanabha 6503fe124d2SKishore Padmanabha /* internal function to get the */ 6513fe124d2SKishore Padmanabha static struct ulp_func_if_info* 6523fe124d2SKishore Padmanabha ulp_port_db_func_if_info_get(struct bnxt_ulp_context *ulp_ctxt, 6533fe124d2SKishore Padmanabha uint32_t port_id) 6543fe124d2SKishore Padmanabha { 6553fe124d2SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 6563fe124d2SKishore Padmanabha uint16_t func_id; 6573fe124d2SKishore Padmanabha 6583fe124d2SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 6593fe124d2SKishore Padmanabha if (ulp_port_db_port_func_id_get(ulp_ctxt, port_id, &func_id)) { 660dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid port_id %x\n", port_id); 6613fe124d2SKishore Padmanabha return NULL; 6623fe124d2SKishore Padmanabha } 6633fe124d2SKishore Padmanabha 6643fe124d2SKishore Padmanabha if (!port_db->ulp_func_id_tbl[func_id].func_valid) { 665dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid func_id %x\n", func_id); 6663fe124d2SKishore Padmanabha return NULL; 6673fe124d2SKishore Padmanabha } 6683fe124d2SKishore Padmanabha return &port_db->ulp_func_id_tbl[func_id]; 6693fe124d2SKishore Padmanabha } 6703fe124d2SKishore Padmanabha 671ddaf0afaSKishore Padmanabha /* 672ddaf0afaSKishore Padmanabha * Api to get the parent mac address for a given port id. 673ddaf0afaSKishore Padmanabha * 674ddaf0afaSKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 6753fe124d2SKishore Padmanabha * port_id [in] device port id 676ddaf0afaSKishore Padmanabha * mac_addr [out] mac address 677ddaf0afaSKishore Padmanabha * 678ddaf0afaSKishore Padmanabha * Returns 0 on success or negative number on failure. 679ddaf0afaSKishore Padmanabha */ 680ddaf0afaSKishore Padmanabha int32_t 681ddaf0afaSKishore Padmanabha ulp_port_db_parent_mac_addr_get(struct bnxt_ulp_context *ulp_ctxt, 682ddaf0afaSKishore Padmanabha uint32_t port_id, uint8_t **mac_addr) 683ddaf0afaSKishore Padmanabha { 6843fe124d2SKishore Padmanabha struct ulp_func_if_info *info; 685ddaf0afaSKishore Padmanabha 6863fe124d2SKishore Padmanabha info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 6873fe124d2SKishore Padmanabha if (info) { 6883fe124d2SKishore Padmanabha *mac_addr = info->func_parent_mac; 6893fe124d2SKishore Padmanabha return 0; 6903fe124d2SKishore Padmanabha } 691ddaf0afaSKishore Padmanabha return -EINVAL; 692ddaf0afaSKishore Padmanabha } 693ddaf0afaSKishore Padmanabha 6943fe124d2SKishore Padmanabha /* 6953fe124d2SKishore Padmanabha * Api to get the mac address for a given port id. 6963fe124d2SKishore Padmanabha * 6973fe124d2SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 6983fe124d2SKishore Padmanabha * port_id [in] device port id 6993fe124d2SKishore Padmanabha * mac_addr [out] mac address 7003fe124d2SKishore Padmanabha * 7013fe124d2SKishore Padmanabha * Returns 0 on success or negative number on failure. 7023fe124d2SKishore Padmanabha */ 7033fe124d2SKishore Padmanabha int32_t 7043fe124d2SKishore Padmanabha ulp_port_db_drv_mac_addr_get(struct bnxt_ulp_context *ulp_ctxt, 7053fe124d2SKishore Padmanabha uint32_t port_id, uint8_t **mac_addr) 7063fe124d2SKishore Padmanabha { 7073fe124d2SKishore Padmanabha struct ulp_func_if_info *info; 7083fe124d2SKishore Padmanabha 7093fe124d2SKishore Padmanabha info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 7103fe124d2SKishore Padmanabha if (info) { 7113fe124d2SKishore Padmanabha *mac_addr = info->func_mac; 712ddaf0afaSKishore Padmanabha return 0; 713ddaf0afaSKishore Padmanabha } 7143fe124d2SKishore Padmanabha return -EINVAL; 7153fe124d2SKishore Padmanabha } 7163fe124d2SKishore Padmanabha 7173fe124d2SKishore Padmanabha /* 7183fe124d2SKishore Padmanabha * Api to get the parent vnic for a given port id. 7193fe124d2SKishore Padmanabha * 7203fe124d2SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 7213fe124d2SKishore Padmanabha * port_id [in] device port id 7223fe124d2SKishore Padmanabha * vnic [out] parent vnic 7233fe124d2SKishore Padmanabha * 7243fe124d2SKishore Padmanabha * Returns 0 on success or negative number on failure. 7253fe124d2SKishore Padmanabha */ 7263fe124d2SKishore Padmanabha int32_t 7273fe124d2SKishore Padmanabha ulp_port_db_parent_vnic_get(struct bnxt_ulp_context *ulp_ctxt, 7283fe124d2SKishore Padmanabha uint32_t port_id, uint8_t **vnic) 7293fe124d2SKishore Padmanabha { 7303fe124d2SKishore Padmanabha struct ulp_func_if_info *info; 7313fe124d2SKishore Padmanabha 7323fe124d2SKishore Padmanabha info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 7333fe124d2SKishore Padmanabha if (info) { 7343fe124d2SKishore Padmanabha *vnic = (uint8_t *)&info->func_parent_vnic; 7353fe124d2SKishore Padmanabha return 0; 7363fe124d2SKishore Padmanabha } 7373fe124d2SKishore Padmanabha return -EINVAL; 7383fe124d2SKishore Padmanabha } 73962d8961fSKishore Padmanabha 74062d8961fSKishore Padmanabha /* 74162d8961fSKishore Padmanabha * Api to get the phy port for a given port id. 74262d8961fSKishore Padmanabha * 74362d8961fSKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 74462d8961fSKishore Padmanabha * port_id [in] device port id 74562d8961fSKishore Padmanabha * phy_port [out] phy_port of the dpdk port_id 74662d8961fSKishore Padmanabha * 74762d8961fSKishore Padmanabha * Returns 0 on success or negative number on failure. 74862d8961fSKishore Padmanabha */ 74962d8961fSKishore Padmanabha int32_t 75062d8961fSKishore Padmanabha ulp_port_db_phy_port_get(struct bnxt_ulp_context *ulp_ctxt, 75162d8961fSKishore Padmanabha uint32_t port_id, uint16_t *phy_port) 75262d8961fSKishore Padmanabha { 75362d8961fSKishore Padmanabha struct ulp_func_if_info *info; 75462d8961fSKishore Padmanabha 75562d8961fSKishore Padmanabha info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 75662d8961fSKishore Padmanabha if (info) { 75762d8961fSKishore Padmanabha *phy_port = info->phy_port_id; 75862d8961fSKishore Padmanabha return 0; 75962d8961fSKishore Padmanabha } 76062d8961fSKishore Padmanabha return -EINVAL; 76162d8961fSKishore Padmanabha } 7626d160d77SRandy Schacher 7636d160d77SRandy Schacher /* 7646d160d77SRandy Schacher * Api to get the port type for a given port id. 7656d160d77SRandy Schacher * 7666d160d77SRandy Schacher * ulp_ctxt [in] Ptr to ulp context 7676d160d77SRandy Schacher * port_id [in] device port id 7686d160d77SRandy Schacher * type [out] type if pf or not 7696d160d77SRandy Schacher * 7706d160d77SRandy Schacher * Returns 0 on success or negative number on failure. 7716d160d77SRandy Schacher */ 7726d160d77SRandy Schacher int32_t 7736d160d77SRandy Schacher ulp_port_db_port_is_pf_get(struct bnxt_ulp_context *ulp_ctxt, 7746d160d77SRandy Schacher uint32_t port_id, uint8_t **type) 7756d160d77SRandy Schacher { 7766d160d77SRandy Schacher struct ulp_func_if_info *info; 7776d160d77SRandy Schacher struct bnxt_ulp_port_db *port_db; 7786d160d77SRandy Schacher uint16_t pid; 7796d160d77SRandy Schacher 7806d160d77SRandy Schacher port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 7816d160d77SRandy Schacher info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 7826d160d77SRandy Schacher if (info) { 7836d160d77SRandy Schacher pid = info->ifindex; 7846d160d77SRandy Schacher *type = &port_db->ulp_intf_list[pid].type_is_pf; 7856d160d77SRandy Schacher return 0; 7866d160d77SRandy Schacher } 7876d160d77SRandy Schacher return -EINVAL; 7886d160d77SRandy Schacher } 7896d160d77SRandy Schacher 7906d160d77SRandy Schacher /* 7916d160d77SRandy Schacher * Api to get the meta data for a given port id. 7926d160d77SRandy Schacher * 7936d160d77SRandy Schacher * ulp_ctxt [in] Ptr to ulp context 7946d160d77SRandy Schacher * port_id [in] dpdk port id 7956d160d77SRandy Schacher * meta data [out] the meta data of the given port 7966d160d77SRandy Schacher * 7976d160d77SRandy Schacher * Returns 0 on success or negative number on failure. 7986d160d77SRandy Schacher */ 7996d160d77SRandy Schacher int32_t 8006d160d77SRandy Schacher ulp_port_db_port_meta_data_get(struct bnxt_ulp_context *ulp_ctxt, 8016d160d77SRandy Schacher uint16_t port_id, uint8_t **meta_data) 8026d160d77SRandy Schacher { 8036d160d77SRandy Schacher struct ulp_func_if_info *info; 8046d160d77SRandy Schacher 8056d160d77SRandy Schacher info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 8066d160d77SRandy Schacher if (info) { 8076d160d77SRandy Schacher *meta_data = (uint8_t *)&info->vf_meta_data; 8086d160d77SRandy Schacher return 0; 8096d160d77SRandy Schacher } 8106d160d77SRandy Schacher return -EINVAL; 8116d160d77SRandy Schacher } 812032d49efSKishore Padmanabha 813032d49efSKishore Padmanabha /* Api to get the function id for a given port id 814032d49efSKishore Padmanabha * 815032d49efSKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 816032d49efSKishore Padmanabha * port_id [in] dpdk port id 817032d49efSKishore Padmanabha * fid_data [out] the function id of the given port 818032d49efSKishore Padmanabha * 819032d49efSKishore Padmanabha * Returns 0 on success or negative number on failure. 820032d49efSKishore Padmanabha */ 821032d49efSKishore Padmanabha int32_t 822032d49efSKishore Padmanabha ulp_port_db_port_vf_fid_get(struct bnxt_ulp_context *ulp_ctxt, 823032d49efSKishore Padmanabha uint16_t port_id, uint8_t **fid_data) 824032d49efSKishore Padmanabha { 825032d49efSKishore Padmanabha struct bnxt_ulp_port_db *port_db; 826032d49efSKishore Padmanabha uint32_t ifindex; 827032d49efSKishore Padmanabha 828032d49efSKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 829032d49efSKishore Padmanabha if (!port_db || port_id >= RTE_MAX_ETHPORTS) { 830dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 831032d49efSKishore Padmanabha return -EINVAL; 832032d49efSKishore Padmanabha } 833032d49efSKishore Padmanabha ifindex = port_db->dev_port_list[port_id]; 834032d49efSKishore Padmanabha if (!ifindex) 835032d49efSKishore Padmanabha return -ENOENT; 836032d49efSKishore Padmanabha 837032d49efSKishore Padmanabha if (port_db->ulp_intf_list[ifindex].type != BNXT_ULP_INTF_TYPE_VF && 838032d49efSKishore Padmanabha port_db->ulp_intf_list[ifindex].type != BNXT_ULP_INTF_TYPE_VF_REP) 839032d49efSKishore Padmanabha return -EINVAL; 840032d49efSKishore Padmanabha 841032d49efSKishore Padmanabha *fid_data = (uint8_t *)&port_db->ulp_intf_list[ifindex].vf_func_id; 842032d49efSKishore Padmanabha return 0; 843032d49efSKishore Padmanabha } 844dd0191d5SShuanglin Wang 845dd0191d5SShuanglin Wang int32_t 846dd0191d5SShuanglin Wang ulp_port_db_port_table_scope_get(struct bnxt_ulp_context *ulp_ctxt, 847dd0191d5SShuanglin Wang uint16_t port_id, uint8_t **tsid) 848dd0191d5SShuanglin Wang { 849dd0191d5SShuanglin Wang struct ulp_func_if_info *info; 850dd0191d5SShuanglin Wang 851dd0191d5SShuanglin Wang info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); 852dd0191d5SShuanglin Wang if (info) { 853dd0191d5SShuanglin Wang *tsid = &info->table_scope; 854dd0191d5SShuanglin Wang return 0; 855dd0191d5SShuanglin Wang } 856dd0191d5SShuanglin Wang return -EINVAL; 857dd0191d5SShuanglin Wang } 858*d4b36fc5SKishore Padmanabha 859*d4b36fc5SKishore Padmanabha /* Api to get the PF Mirror Id for a given port id 860*d4b36fc5SKishore Padmanabha * 861*d4b36fc5SKishore Padmanabha * ulp_ctxt [in] Ptr to ulp context 862*d4b36fc5SKishore Padmanabha * port_id [in] dpdk port id 863*d4b36fc5SKishore Padmanabha * mirror id [in] mirror id 864*d4b36fc5SKishore Padmanabha * 865*d4b36fc5SKishore Padmanabha * Returns 0 on success or negative number on failure. 866*d4b36fc5SKishore Padmanabha */ 867*d4b36fc5SKishore Padmanabha int32_t 868*d4b36fc5SKishore Padmanabha ulp_port_db_port_table_mirror_set(struct bnxt_ulp_context *ulp_ctxt, 869*d4b36fc5SKishore Padmanabha uint16_t port_id, uint32_t mirror_id) 870*d4b36fc5SKishore Padmanabha { 871*d4b36fc5SKishore Padmanabha struct ulp_phy_port_info *port_data; 872*d4b36fc5SKishore Padmanabha struct bnxt_ulp_port_db *port_db; 873*d4b36fc5SKishore Padmanabha struct ulp_interface_info *intf; 874*d4b36fc5SKishore Padmanabha struct ulp_func_if_info *func; 875*d4b36fc5SKishore Padmanabha uint32_t ifindex; 876*d4b36fc5SKishore Padmanabha 877*d4b36fc5SKishore Padmanabha port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); 878*d4b36fc5SKishore Padmanabha if (!port_db) { 879*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid Arguments\n"); 880*d4b36fc5SKishore Padmanabha return -EINVAL; 881*d4b36fc5SKishore Padmanabha } 882*d4b36fc5SKishore Padmanabha 883*d4b36fc5SKishore Padmanabha if (ulp_port_db_dev_port_to_ulp_index(ulp_ctxt, port_id, &ifindex)) { 884*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid port id %u\n", port_id); 885*d4b36fc5SKishore Padmanabha return -EINVAL; 886*d4b36fc5SKishore Padmanabha } 887*d4b36fc5SKishore Padmanabha 888*d4b36fc5SKishore Padmanabha intf = &port_db->ulp_intf_list[ifindex]; 889*d4b36fc5SKishore Padmanabha func = &port_db->ulp_func_id_tbl[intf->drv_func_id]; 890*d4b36fc5SKishore Padmanabha if (!func->func_valid) { 891*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid func for port id %u\n", port_id); 892*d4b36fc5SKishore Padmanabha return -EINVAL; 893*d4b36fc5SKishore Padmanabha } 894*d4b36fc5SKishore Padmanabha 895*d4b36fc5SKishore Padmanabha port_data = &port_db->phy_port_list[func->phy_port_id]; 896*d4b36fc5SKishore Padmanabha if (!port_data->port_valid) { 897*d4b36fc5SKishore Padmanabha BNXT_DRV_DBG(ERR, "Invalid phy port\n"); 898*d4b36fc5SKishore Padmanabha return -EINVAL; 899*d4b36fc5SKishore Padmanabha } 900*d4b36fc5SKishore Padmanabha 901*d4b36fc5SKishore Padmanabha port_data->port_mirror_id = mirror_id; 902*d4b36fc5SKishore Padmanabha return 0; 903*d4b36fc5SKishore Padmanabha } 904