xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_port_db.c (revision d4b36fc5f0dc59b256441c82e5a9395054026496)
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