X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Ftf_ulp%2Fulp_port_db.c;h=7d9865b3e31d5bc70419103a3d12a5acd10cb814;hb=53a80512644c8a12cb8efc903f77dd7b42263565;hp=0fc7c0ab21fefdce09e561a3e0464a70e6aaf2a3;hpb=77b359eea6ae9a66da33f9e0a42c768761b16520;p=dpdk.git diff --git a/drivers/net/bnxt/tf_ulp/ulp_port_db.c b/drivers/net/bnxt/tf_ulp/ulp_port_db.c index 0fc7c0ab21..7d9865b3e3 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_port_db.c +++ b/drivers/net/bnxt/tf_ulp/ulp_port_db.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2014-2020 Broadcom + * Copyright(c) 2014-2021 Broadcom * All rights reserved. */ @@ -7,7 +7,13 @@ #include "bnxt.h" #include "bnxt_vnic.h" #include "bnxt_tf_common.h" +#include "bnxt_tf_pmd_shim.h" #include "ulp_port_db.h" +#include "tfp.h" + +#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG +#include "ulp_tf_debug.h" +#endif static uint32_t ulp_port_db_allocate_ifindex(struct bnxt_ulp_port_db *port_db) @@ -147,53 +153,64 @@ int32_t ulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt, /* update the interface details */ intf = &port_db->ulp_intf_list[ifindex]; - intf->type = bnxt_get_interface_type(port_id); - intf->drv_func_id = bnxt_get_fw_func_id(port_id, + intf->type = bnxt_pmd_get_interface_type(port_id); + intf->drv_func_id = bnxt_pmd_get_fw_func_id(port_id, BNXT_ULP_INTF_TYPE_INVALID); func = &port_db->ulp_func_id_tbl[intf->drv_func_id]; if (!func->func_valid) { - func->func_svif = bnxt_get_svif(port_id, true, + func->func_svif = bnxt_pmd_get_svif(port_id, true, BNXT_ULP_INTF_TYPE_INVALID); - func->func_spif = bnxt_get_phy_port_id(port_id); + func->func_spif = bnxt_pmd_get_phy_port_id(port_id); func->func_parif = - bnxt_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); + bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); func->func_vnic = - bnxt_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_INVALID); - func->phy_port_id = bnxt_get_phy_port_id(port_id); + bnxt_pmd_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_INVALID); + func->phy_port_id = bnxt_pmd_get_phy_port_id(port_id); func->func_valid = true; func->ifindex = ifindex; } if (intf->type == BNXT_ULP_INTF_TYPE_VF_REP) { intf->vf_func_id = - bnxt_get_fw_func_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); + bnxt_pmd_get_fw_func_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); func = &port_db->ulp_func_id_tbl[intf->vf_func_id]; func->func_svif = - bnxt_get_svif(port_id, true, BNXT_ULP_INTF_TYPE_VF_REP); + bnxt_pmd_get_svif(port_id, true, BNXT_ULP_INTF_TYPE_VF_REP); func->func_spif = - bnxt_get_phy_port_id(port_id); + bnxt_pmd_get_phy_port_id(port_id); func->func_parif = - bnxt_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); + bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); func->func_vnic = - bnxt_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); - func->phy_port_id = bnxt_get_phy_port_id(port_id); + bnxt_pmd_get_vnic_id(port_id, BNXT_ULP_INTF_TYPE_VF_REP); + func->phy_port_id = bnxt_pmd_get_phy_port_id(port_id); func->ifindex = ifindex; } + /* When there is no match, the default action is to send the packet to + * the kernel. And to send it to the kernel, we need the PF's vnic id. + */ + func->func_parent_vnic = bnxt_pmd_get_parent_vnic_id(port_id, intf->type); + func->func_parent_vnic = tfp_cpu_to_be_16(func->func_parent_vnic); + bnxt_pmd_get_iface_mac(port_id, intf->type, func->func_mac, + func->func_parent_mac); + port_data = &port_db->phy_port_list[func->phy_port_id]; if (!port_data->port_valid) { port_data->port_svif = - bnxt_get_svif(port_id, false, - BNXT_ULP_INTF_TYPE_INVALID); - port_data->port_spif = bnxt_get_phy_port_id(port_id); + bnxt_pmd_get_svif(port_id, false, BNXT_ULP_INTF_TYPE_INVALID); + port_data->port_spif = bnxt_pmd_get_phy_port_id(port_id); port_data->port_parif = - bnxt_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); - port_data->port_vport = bnxt_get_vport(port_id); + bnxt_pmd_get_parif(port_id, BNXT_ULP_INTF_TYPE_INVALID); + port_data->port_vport = bnxt_pmd_get_vport(port_id); port_data->port_valid = true; } - +#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG +#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_PORT + ulp_port_db_dump(port_db, intf, port_id); +#endif +#endif return 0; } @@ -372,6 +389,8 @@ ulp_port_db_parif_get(struct bnxt_ulp_context *ulp_ctxt, phy_port_id = port_db->ulp_func_id_tbl[func_id].phy_port_id; *parif = port_db->phy_port_list[phy_port_id].port_parif; } + /* Parif needs to be reset to a free partition */ + *parif += BNXT_ULP_FREE_PARIF_BASE; return 0; } @@ -538,3 +557,134 @@ ulp_port_db_dev_func_id_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt, *ifindex = port_db->ulp_func_id_tbl[func_id].ifindex; return 0; } + +/* + * Api to get the function id for a given port id. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in] dpdk port id + * func_id [out] the function id of the given ifindex. + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_port_func_id_get(struct bnxt_ulp_context *ulp_ctxt, + uint16_t port_id, uint16_t *func_id) +{ + struct bnxt_ulp_port_db *port_db; + uint32_t ifindex; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (!port_db || port_id >= RTE_MAX_ETHPORTS) { + BNXT_TF_DBG(ERR, "Invalid Arguments\n"); + return -EINVAL; + } + ifindex = port_db->dev_port_list[port_id]; + if (!ifindex) + return -ENOENT; + + switch (port_db->ulp_intf_list[ifindex].type) { + case BNXT_ULP_INTF_TYPE_TRUSTED_VF: + case BNXT_ULP_INTF_TYPE_PF: + *func_id = port_db->ulp_intf_list[ifindex].drv_func_id; + break; + case BNXT_ULP_INTF_TYPE_VF: + case BNXT_ULP_INTF_TYPE_VF_REP: + *func_id = port_db->ulp_intf_list[ifindex].vf_func_id; + break; + default: + *func_id = 0; + break; + } + return 0; +} + +/* internal function to get the */ +static struct ulp_func_if_info* +ulp_port_db_func_if_info_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id) +{ + struct bnxt_ulp_port_db *port_db; + uint16_t func_id; + + port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt); + if (ulp_port_db_port_func_id_get(ulp_ctxt, port_id, &func_id)) { + BNXT_TF_DBG(ERR, "Invalid port_id %x\n", port_id); + return NULL; + } + + if (!port_db->ulp_func_id_tbl[func_id].func_valid) { + BNXT_TF_DBG(ERR, "Invalid func_id %x\n", func_id); + return NULL; + } + return &port_db->ulp_func_id_tbl[func_id]; +} + +/* + * Api to get the parent mac address for a given port id. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in] device port id + * mac_addr [out] mac address + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_parent_mac_addr_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id, uint8_t **mac_addr) +{ + struct ulp_func_if_info *info; + + info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); + if (info) { + *mac_addr = info->func_parent_mac; + return 0; + } + return -EINVAL; +} + +/* + * Api to get the mac address for a given port id. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in] device port id + * mac_addr [out] mac address + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_drv_mac_addr_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id, uint8_t **mac_addr) +{ + struct ulp_func_if_info *info; + + info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); + if (info) { + *mac_addr = info->func_mac; + return 0; + } + return -EINVAL; +} + +/* + * Api to get the parent vnic for a given port id. + * + * ulp_ctxt [in] Ptr to ulp context + * port_id [in] device port id + * vnic [out] parent vnic + * + * Returns 0 on success or negative number on failure. + */ +int32_t +ulp_port_db_parent_vnic_get(struct bnxt_ulp_context *ulp_ctxt, + uint32_t port_id, uint8_t **vnic) +{ + struct ulp_func_if_info *info; + + info = ulp_port_db_func_if_info_get(ulp_ctxt, port_id); + if (info) { + *vnic = (uint8_t *)&info->func_parent_vnic; + return 0; + } + return -EINVAL; +}