net/bnxt: modify port DB to handle more info

Apart from func_svif, func_id & vnic, port_db now stores and
retrieves func_spif, func_parif, phy_port_id, port_svif, port_spif,
port_parif, port_vport. New helper functions have been added to
support the same.

Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
Venkat Duvvuru 2020-07-02 16:27:55 -07:00 committed by Ferruh Yigit
parent 4e3f887bec
commit 35a7fe80c2
2 changed files with 179 additions and 38 deletions

View File

@ -106,13 +106,12 @@ int32_t ulp_port_db_deinit(struct bnxt_ulp_context *ulp_ctxt)
int32_t ulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt,
struct rte_eth_dev *eth_dev)
{
struct bnxt_ulp_port_db *port_db;
struct bnxt *bp = eth_dev->data->dev_private;
uint32_t port_id = eth_dev->data->port_id;
uint32_t ifindex;
struct ulp_phy_port_info *port_data;
struct bnxt_ulp_port_db *port_db;
struct ulp_interface_info *intf;
uint32_t ifindex;
int32_t rc;
struct bnxt_vnic_info *vnic;
port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
if (!port_db) {
@ -133,22 +132,22 @@ 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];
if (BNXT_PF(bp) || BNXT_VF(bp)) {
if (BNXT_PF(bp)) {
intf->type = BNXT_ULP_INTF_TYPE_PF;
intf->port_svif = bp->port_svif;
} else {
intf->type = BNXT_ULP_INTF_TYPE_VF;
}
intf->func_id = bp->fw_fid;
intf->func_svif = bp->func_svif;
vnic = BNXT_GET_DEFAULT_VNIC(bp);
if (vnic)
intf->default_vnic = vnic->fw_vnic_id;
intf->bp = bp;
memcpy(intf->mac_addr, bp->mac_addr, sizeof(intf->mac_addr));
} else {
BNXT_TF_DBG(ERR, "Invalid interface type\n");
intf->type = bnxt_get_interface_type(port_id);
intf->func_id = bnxt_get_fw_func_id(port_id);
intf->func_svif = bnxt_get_svif(port_id, 1);
intf->func_spif = bnxt_get_phy_port_id(port_id);
intf->func_parif = bnxt_get_parif(port_id);
intf->default_vnic = bnxt_get_vnic_id(port_id);
intf->phy_port_id = bnxt_get_phy_port_id(port_id);
if (intf->type == BNXT_ULP_INTF_TYPE_PF) {
port_data = &port_db->phy_port_list[intf->phy_port_id];
port_data->port_svif = bnxt_get_svif(port_id, 0);
port_data->port_spif = bnxt_get_phy_port_id(port_id);
port_data->port_parif = bnxt_get_parif(port_id);
port_data->port_vport = bnxt_get_vport(port_id);
}
return 0;
@ -209,7 +208,7 @@ ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt,
}
/*
* Api to get the svid for a given ulp ifindex.
* Api to get the svif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
@ -225,16 +224,88 @@ ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt,
uint16_t *svif)
{
struct bnxt_ulp_port_db *port_db;
uint16_t phy_port_id;
port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) {
BNXT_TF_DBG(ERR, "Invalid Arguments\n");
return -EINVAL;
}
if (dir == ULP_DIR_EGRESS)
if (dir == ULP_DIR_EGRESS) {
*svif = port_db->ulp_intf_list[ifindex].func_svif;
else
*svif = port_db->ulp_intf_list[ifindex].port_svif;
} else {
phy_port_id = port_db->ulp_intf_list[ifindex].phy_port_id;
*svif = port_db->phy_port_list[phy_port_id].port_svif;
}
return 0;
}
/*
* Api to get the spif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* dir [in] the direction for the flow.
* spif [out] the spif of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_spif_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex,
uint32_t dir,
uint16_t *spif)
{
struct bnxt_ulp_port_db *port_db;
uint16_t phy_port_id;
port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) {
BNXT_TF_DBG(ERR, "Invalid Arguments\n");
return -EINVAL;
}
if (dir == ULP_DIR_EGRESS) {
*spif = port_db->ulp_intf_list[ifindex].func_spif;
} else {
phy_port_id = port_db->ulp_intf_list[ifindex].phy_port_id;
*spif = port_db->phy_port_list[phy_port_id].port_spif;
}
return 0;
}
/*
* Api to get the parif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* dir [in] the direction for the flow.
* parif [out] the parif of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_parif_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex,
uint32_t dir,
uint16_t *parif)
{
struct bnxt_ulp_port_db *port_db;
uint16_t phy_port_id;
port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) {
BNXT_TF_DBG(ERR, "Invalid Arguments\n");
return -EINVAL;
}
if (dir == ULP_DIR_EGRESS) {
*parif = port_db->ulp_intf_list[ifindex].func_parif;
} else {
phy_port_id = port_db->ulp_intf_list[ifindex].phy_port_id;
*parif = port_db->phy_port_list[phy_port_id].port_parif;
}
return 0;
}
@ -262,3 +333,29 @@ ulp_port_db_default_vnic_get(struct bnxt_ulp_context *ulp_ctxt,
*vnic = port_db->ulp_intf_list[ifindex].default_vnic;
return 0;
}
/*
* Api to get the vport id for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* vport [out] the port of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_vport_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex, uint16_t *vport)
{
struct bnxt_ulp_port_db *port_db;
uint16_t phy_port_id;
port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
if (!port_db || ifindex >= port_db->ulp_intf_list_size || !ifindex) {
BNXT_TF_DBG(ERR, "Invalid Arguments\n");
return -EINVAL;
}
phy_port_id = port_db->ulp_intf_list[ifindex].phy_port_id;
*vport = port_db->phy_port_list[phy_port_id].port_vport;
return 0;
}

View File

@ -15,11 +15,17 @@ struct ulp_interface_info {
enum bnxt_ulp_intf_type type;
uint16_t func_id;
uint16_t func_svif;
uint16_t port_svif;
uint16_t func_spif;
uint16_t func_parif;
uint16_t default_vnic;
uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
/* back pointer to the bnxt driver, it is null for rep ports */
struct bnxt *bp;
uint16_t phy_port_id;
};
struct ulp_phy_port_info {
uint16_t port_svif;
uint16_t port_spif;
uint16_t port_parif;
uint16_t port_vport;
};
/* Structure for the Port database */
@ -29,6 +35,7 @@ struct bnxt_ulp_port_db {
/* dpdk device external port list */
uint16_t dev_port_list[RTE_MAX_ETHPORTS];
struct ulp_phy_port_info phy_port_list[RTE_MAX_ETHPORTS];
};
/*
@ -74,8 +81,7 @@ int32_t ulp_port_db_dev_port_intf_update(struct bnxt_ulp_context *ulp_ctxt,
*/
int32_t
ulp_port_db_dev_port_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt,
uint32_t port_id,
uint32_t *ifindex);
uint32_t port_id, uint32_t *ifindex);
/*
* Api to get the function id for a given ulp ifindex.
@ -88,11 +94,10 @@ ulp_port_db_dev_port_to_ulp_index(struct bnxt_ulp_context *ulp_ctxt,
*/
int32_t
ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex,
uint16_t *func_id);
uint32_t ifindex, uint16_t *func_id);
/*
* Api to get the svid for a given ulp ifindex.
* Api to get the svif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
@ -103,9 +108,36 @@ ulp_port_db_function_id_get(struct bnxt_ulp_context *ulp_ctxt,
*/
int32_t
ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex,
uint32_t dir,
uint16_t *svif);
uint32_t ifindex, uint32_t dir, uint16_t *svif);
/*
* Api to get the spif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* dir [in] the direction for the flow.
* spif [out] the spif of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_spif_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex, uint32_t dir, uint16_t *spif);
/*
* Api to get the parif for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* dir [in] the direction for the flow.
* parif [out] the parif of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_parif_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex, uint32_t dir, uint16_t *parif);
/*
* Api to get the vnic id for a given ulp ifindex.
@ -118,7 +150,19 @@ ulp_port_db_svif_get(struct bnxt_ulp_context *ulp_ctxt,
*/
int32_t
ulp_port_db_default_vnic_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex,
uint16_t *vnic);
uint32_t ifindex, uint16_t *vnic);
/*
* Api to get the vport id for a given ulp ifindex.
*
* ulp_ctxt [in] Ptr to ulp context
* ifindex [in] ulp ifindex
* vport [out] the port of the given ifindex.
*
* Returns 0 on success or negative number on failure.
*/
int32_t
ulp_port_db_vport_get(struct bnxt_ulp_context *ulp_ctxt,
uint32_t ifindex, uint16_t *vport);
#endif /* _ULP_PORT_DB_H_ */