xref: /dpdk/drivers/common/idpf/idpf_common_device.c (revision 4baf54ed9dc87b89ea2150578c51120bc0157bb0)
173c9b8c3SBeilei Xing /* SPDX-License-Identifier: BSD-3-Clause
273c9b8c3SBeilei Xing  * Copyright(c) 2023 Intel Corporation
373c9b8c3SBeilei Xing  */
473c9b8c3SBeilei Xing 
573c9b8c3SBeilei Xing #include <rte_log.h>
6ec4b04a7SQi Zhang #include "idpf_common_device.h"
7ec4b04a7SQi Zhang #include "idpf_common_virtchnl.h"
8b2f9d478SBeilei Xing 
9b2f9d478SBeilei Xing static void
10b2f9d478SBeilei Xing idpf_reset_pf(struct idpf_hw *hw)
11b2f9d478SBeilei Xing {
12b2f9d478SBeilei Xing 	uint32_t reg;
13b2f9d478SBeilei Xing 
14b2f9d478SBeilei Xing 	reg = IDPF_READ_REG(hw, PFGEN_CTRL);
15b2f9d478SBeilei Xing 	IDPF_WRITE_REG(hw, PFGEN_CTRL, (reg | PFGEN_CTRL_PFSWR));
16b2f9d478SBeilei Xing }
17b2f9d478SBeilei Xing 
18b2f9d478SBeilei Xing #define IDPF_RESET_WAIT_CNT 100
1932bcd47eSBeilei Xing 
20b2f9d478SBeilei Xing static int
21b2f9d478SBeilei Xing idpf_check_pf_reset_done(struct idpf_hw *hw)
22b2f9d478SBeilei Xing {
23b2f9d478SBeilei Xing 	uint32_t reg;
24b2f9d478SBeilei Xing 	int i;
25b2f9d478SBeilei Xing 
26b2f9d478SBeilei Xing 	for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) {
27b2f9d478SBeilei Xing 		reg = IDPF_READ_REG(hw, PFGEN_RSTAT);
28b2f9d478SBeilei Xing 		if (reg != 0xFFFFFFFF && (reg & PFGEN_RSTAT_PFR_STATE_M))
29b2f9d478SBeilei Xing 			return 0;
30b2f9d478SBeilei Xing 		rte_delay_ms(1000);
31b2f9d478SBeilei Xing 	}
32b2f9d478SBeilei Xing 
33b2f9d478SBeilei Xing 	DRV_LOG(ERR, "IDPF reset timeout");
34b2f9d478SBeilei Xing 	return -EBUSY;
35b2f9d478SBeilei Xing }
36b2f9d478SBeilei Xing 
37b2f9d478SBeilei Xing static int
3832bcd47eSBeilei Xing idpf_check_vf_reset_done(struct idpf_hw *hw)
39b2f9d478SBeilei Xing {
4032bcd47eSBeilei Xing 	uint32_t reg;
4132bcd47eSBeilei Xing 	int i;
4232bcd47eSBeilei Xing 
4332bcd47eSBeilei Xing 	for (i = 0; i < IDPF_RESET_WAIT_CNT; i++) {
4432bcd47eSBeilei Xing 		reg = IDPF_READ_REG(hw, VFGEN_RSTAT);
4532bcd47eSBeilei Xing 		if (reg != 0xFFFFFFFF && (reg & VFGEN_RSTAT_VFR_STATE_M))
4632bcd47eSBeilei Xing 			return 0;
4732bcd47eSBeilei Xing 		rte_delay_ms(1000);
4832bcd47eSBeilei Xing 	}
4932bcd47eSBeilei Xing 
5032bcd47eSBeilei Xing 	DRV_LOG(ERR, "VF reset timeout");
5132bcd47eSBeilei Xing 	return -EBUSY;
5232bcd47eSBeilei Xing }
5332bcd47eSBeilei Xing 
5432bcd47eSBeilei Xing #define IDPF_CTLQ_NUM 2
5532bcd47eSBeilei Xing 
5632bcd47eSBeilei Xing struct idpf_ctlq_create_info pf_ctlq_info[IDPF_CTLQ_NUM] = {
57b2f9d478SBeilei Xing 	{
58b2f9d478SBeilei Xing 		.type = IDPF_CTLQ_TYPE_MAILBOX_TX,
59b2f9d478SBeilei Xing 		.id = IDPF_CTLQ_ID,
60b2f9d478SBeilei Xing 		.len = IDPF_CTLQ_LEN,
61b2f9d478SBeilei Xing 		.buf_size = IDPF_DFLT_MBX_BUF_SIZE,
62b2f9d478SBeilei Xing 		.reg = {
63b2f9d478SBeilei Xing 			.head = PF_FW_ATQH,
64b2f9d478SBeilei Xing 			.tail = PF_FW_ATQT,
65b2f9d478SBeilei Xing 			.len = PF_FW_ATQLEN,
66b2f9d478SBeilei Xing 			.bah = PF_FW_ATQBAH,
67b2f9d478SBeilei Xing 			.bal = PF_FW_ATQBAL,
68b2f9d478SBeilei Xing 			.len_mask = PF_FW_ATQLEN_ATQLEN_M,
69b2f9d478SBeilei Xing 			.len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M,
70b2f9d478SBeilei Xing 			.head_mask = PF_FW_ATQH_ATQH_M,
71b2f9d478SBeilei Xing 		}
72b2f9d478SBeilei Xing 	},
73b2f9d478SBeilei Xing 	{
74b2f9d478SBeilei Xing 		.type = IDPF_CTLQ_TYPE_MAILBOX_RX,
75b2f9d478SBeilei Xing 		.id = IDPF_CTLQ_ID,
76b2f9d478SBeilei Xing 		.len = IDPF_CTLQ_LEN,
77b2f9d478SBeilei Xing 		.buf_size = IDPF_DFLT_MBX_BUF_SIZE,
78b2f9d478SBeilei Xing 		.reg = {
79b2f9d478SBeilei Xing 			.head = PF_FW_ARQH,
80b2f9d478SBeilei Xing 			.tail = PF_FW_ARQT,
81b2f9d478SBeilei Xing 			.len = PF_FW_ARQLEN,
82b2f9d478SBeilei Xing 			.bah = PF_FW_ARQBAH,
83b2f9d478SBeilei Xing 			.bal = PF_FW_ARQBAL,
84b2f9d478SBeilei Xing 			.len_mask = PF_FW_ARQLEN_ARQLEN_M,
85b2f9d478SBeilei Xing 			.len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M,
86b2f9d478SBeilei Xing 			.head_mask = PF_FW_ARQH_ARQH_M,
87b2f9d478SBeilei Xing 		}
88b2f9d478SBeilei Xing 	}
89b2f9d478SBeilei Xing };
90b2f9d478SBeilei Xing 
9132bcd47eSBeilei Xing struct idpf_ctlq_create_info vf_ctlq_info[IDPF_CTLQ_NUM] = {
9232bcd47eSBeilei Xing 	{
9332bcd47eSBeilei Xing 		.type = IDPF_CTLQ_TYPE_MAILBOX_TX,
9432bcd47eSBeilei Xing 		.id = IDPF_CTLQ_ID,
9532bcd47eSBeilei Xing 		.len = IDPF_CTLQ_LEN,
9632bcd47eSBeilei Xing 		.buf_size = IDPF_DFLT_MBX_BUF_SIZE,
9732bcd47eSBeilei Xing 		.reg = {
9832bcd47eSBeilei Xing 			.head = VF_ATQH,
9932bcd47eSBeilei Xing 			.tail = VF_ATQT,
10032bcd47eSBeilei Xing 			.len = VF_ATQLEN,
10132bcd47eSBeilei Xing 			.bah = VF_ATQBAH,
10232bcd47eSBeilei Xing 			.bal = VF_ATQBAL,
10332bcd47eSBeilei Xing 			.len_mask = VF_ATQLEN_ATQLEN_M,
10432bcd47eSBeilei Xing 			.len_ena_mask = VF_ATQLEN_ATQENABLE_M,
10532bcd47eSBeilei Xing 			.head_mask = VF_ATQH_ATQH_M,
10632bcd47eSBeilei Xing 		}
10732bcd47eSBeilei Xing 	},
10832bcd47eSBeilei Xing 	{
10932bcd47eSBeilei Xing 		.type = IDPF_CTLQ_TYPE_MAILBOX_RX,
11032bcd47eSBeilei Xing 		.id = IDPF_CTLQ_ID,
11132bcd47eSBeilei Xing 		.len = IDPF_CTLQ_LEN,
11232bcd47eSBeilei Xing 		.buf_size = IDPF_DFLT_MBX_BUF_SIZE,
11332bcd47eSBeilei Xing 		.reg = {
11432bcd47eSBeilei Xing 			.head = VF_ARQH,
11532bcd47eSBeilei Xing 			.tail = VF_ARQT,
11632bcd47eSBeilei Xing 			.len = VF_ARQLEN,
11732bcd47eSBeilei Xing 			.bah = VF_ARQBAH,
11832bcd47eSBeilei Xing 			.bal = VF_ARQBAL,
11932bcd47eSBeilei Xing 			.len_mask = VF_ARQLEN_ARQLEN_M,
12032bcd47eSBeilei Xing 			.len_ena_mask = VF_ARQLEN_ARQENABLE_M,
12132bcd47eSBeilei Xing 			.head_mask = VF_ARQH_ARQH_M,
12232bcd47eSBeilei Xing 		}
12332bcd47eSBeilei Xing 	}
12432bcd47eSBeilei Xing };
12532bcd47eSBeilei Xing 
12632bcd47eSBeilei Xing static int
12732bcd47eSBeilei Xing idpf_init_mbx(struct idpf_hw *hw)
12832bcd47eSBeilei Xing {
12932bcd47eSBeilei Xing 	struct idpf_ctlq_info *ctlq;
13032bcd47eSBeilei Xing 	int ret = 0;
13132bcd47eSBeilei Xing 
13232bcd47eSBeilei Xing 	if (hw->device_id == IDPF_DEV_ID_SRIOV)
13332bcd47eSBeilei Xing 		ret = idpf_ctlq_init(hw, IDPF_CTLQ_NUM, vf_ctlq_info);
13432bcd47eSBeilei Xing 	else
13532bcd47eSBeilei Xing 		ret = idpf_ctlq_init(hw, IDPF_CTLQ_NUM, pf_ctlq_info);
136b2f9d478SBeilei Xing 	if (ret != 0)
137b2f9d478SBeilei Xing 		return ret;
138b2f9d478SBeilei Xing 
139*4baf54edSStephen Hemminger 	LIST_FOR_EACH_ENTRY(ctlq, &hw->cq_list_head, struct idpf_ctlq_info, cq_list) {
140b2f9d478SBeilei Xing 		if (ctlq->q_id == IDPF_CTLQ_ID &&
141b2f9d478SBeilei Xing 		    ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_TX)
142b2f9d478SBeilei Xing 			hw->asq = ctlq;
143b2f9d478SBeilei Xing 		if (ctlq->q_id == IDPF_CTLQ_ID &&
144b2f9d478SBeilei Xing 		    ctlq->cq_type == IDPF_CTLQ_TYPE_MAILBOX_RX)
145b2f9d478SBeilei Xing 			hw->arq = ctlq;
146b2f9d478SBeilei Xing 	}
147b2f9d478SBeilei Xing 
148b2f9d478SBeilei Xing 	if (hw->asq == NULL || hw->arq == NULL) {
149b2f9d478SBeilei Xing 		idpf_ctlq_deinit(hw);
150b2f9d478SBeilei Xing 		ret = -ENOENT;
151b2f9d478SBeilei Xing 	}
152b2f9d478SBeilei Xing 
153b2f9d478SBeilei Xing 	return ret;
154b2f9d478SBeilei Xing }
155b2f9d478SBeilei Xing 
1561b828adfSBeilei Xing static int
1571b828adfSBeilei Xing idpf_get_pkt_type(struct idpf_adapter *adapter)
1581b828adfSBeilei Xing {
159811bbeabSBeilei Xing 	struct virtchnl2_get_ptype_info *req_ptype_info;
160811bbeabSBeilei Xing 	struct virtchnl2_get_ptype_info *recv_ptype_info;
161811bbeabSBeilei Xing 	uint16_t recv_num_ptypes = 0;
1621b828adfSBeilei Xing 	uint16_t ptype_offset, i, j;
163811bbeabSBeilei Xing 	uint16_t start_ptype_id = 0;
1641b828adfSBeilei Xing 	int ret;
1651b828adfSBeilei Xing 
166811bbeabSBeilei Xing 	req_ptype_info = rte_zmalloc("req_ptype_info", IDPF_DFLT_MBX_BUF_SIZE, 0);
167811bbeabSBeilei Xing 	if (req_ptype_info == NULL)
1681b828adfSBeilei Xing 		return -ENOMEM;
1691b828adfSBeilei Xing 
170811bbeabSBeilei Xing 	recv_ptype_info = rte_zmalloc("recv_ptype_info", IDPF_DFLT_MBX_BUF_SIZE, 0);
171811bbeabSBeilei Xing 	if (recv_ptype_info == NULL) {
172811bbeabSBeilei Xing 		ret = -ENOMEM;
173811bbeabSBeilei Xing 		goto free_req_ptype_info;
1741b828adfSBeilei Xing 	}
1751b828adfSBeilei Xing 
176811bbeabSBeilei Xing 	while (start_ptype_id < IDPF_MAX_PKT_TYPE) {
177811bbeabSBeilei Xing 		memset(req_ptype_info, 0, sizeof(*req_ptype_info));
178811bbeabSBeilei Xing 		memset(recv_ptype_info, 0, sizeof(*recv_ptype_info));
179811bbeabSBeilei Xing 
180811bbeabSBeilei Xing 		if ((start_ptype_id + IDPF_RX_MAX_PTYPES_PER_BUF) > IDPF_MAX_PKT_TYPE)
181811bbeabSBeilei Xing 			req_ptype_info->num_ptypes =
182811bbeabSBeilei Xing 				rte_cpu_to_le_16(IDPF_MAX_PKT_TYPE - start_ptype_id);
183811bbeabSBeilei Xing 		else
184811bbeabSBeilei Xing 			req_ptype_info->num_ptypes = rte_cpu_to_le_16(IDPF_RX_MAX_PTYPES_PER_BUF);
185811bbeabSBeilei Xing 		req_ptype_info->start_ptype_id = start_ptype_id;
186811bbeabSBeilei Xing 
187811bbeabSBeilei Xing 		ret = idpf_vc_ptype_info_query(adapter, req_ptype_info, recv_ptype_info);
188811bbeabSBeilei Xing 		if (ret != 0) {
189811bbeabSBeilei Xing 			DRV_LOG(ERR, "Fail to query packet type information");
190811bbeabSBeilei Xing 			goto free_recv_ptype_info;
191811bbeabSBeilei Xing 		}
192811bbeabSBeilei Xing 
193811bbeabSBeilei Xing 		recv_num_ptypes += rte_le_to_cpu_16(recv_ptype_info->num_ptypes);
194811bbeabSBeilei Xing 		if (recv_num_ptypes > IDPF_MAX_PKT_TYPE) {
195811bbeabSBeilei Xing 			ret = -EINVAL;
196811bbeabSBeilei Xing 			goto free_recv_ptype_info;
197811bbeabSBeilei Xing 		}
198811bbeabSBeilei Xing 
199811bbeabSBeilei Xing 		start_ptype_id = rte_le_to_cpu_16(req_ptype_info->start_ptype_id) +
200811bbeabSBeilei Xing 			rte_le_to_cpu_16(req_ptype_info->num_ptypes);
201811bbeabSBeilei Xing 
2021b828adfSBeilei Xing 		ptype_offset = sizeof(struct virtchnl2_get_ptype_info) -
2031b828adfSBeilei Xing 						sizeof(struct virtchnl2_ptype);
2041b828adfSBeilei Xing 
205811bbeabSBeilei Xing 		for (i = 0; i < rte_le_to_cpu_16(recv_ptype_info->num_ptypes); i++) {
2061b828adfSBeilei Xing 			bool is_inner = false, is_ip = false;
2071b828adfSBeilei Xing 			struct virtchnl2_ptype *ptype;
2081b828adfSBeilei Xing 			uint32_t proto_hdr = 0;
2091b828adfSBeilei Xing 
2101b828adfSBeilei Xing 			ptype = (struct virtchnl2_ptype *)
211811bbeabSBeilei Xing 					((uint8_t *)recv_ptype_info + ptype_offset);
2121b828adfSBeilei Xing 			ptype_offset += IDPF_GET_PTYPE_SIZE(ptype);
2131b828adfSBeilei Xing 			if (ptype_offset > IDPF_DFLT_MBX_BUF_SIZE) {
2141b828adfSBeilei Xing 				ret = -EINVAL;
215811bbeabSBeilei Xing 				goto free_recv_ptype_info;
2161b828adfSBeilei Xing 			}
2171b828adfSBeilei Xing 
2181b828adfSBeilei Xing 			for (j = 0; j < ptype->proto_id_count; j++) {
219811bbeabSBeilei Xing 				switch (rte_le_to_cpu_16(ptype->proto_id[j])) {
2201b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GRE:
2211b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_VXLAN:
2221b828adfSBeilei Xing 					proto_hdr &= ~RTE_PTYPE_L4_MASK;
2231b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_TUNNEL_GRENAT;
2241b828adfSBeilei Xing 					is_inner = true;
2251b828adfSBeilei Xing 					break;
2261b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_MAC:
2271b828adfSBeilei Xing 					if (is_inner) {
2281b828adfSBeilei Xing 						proto_hdr &= ~RTE_PTYPE_INNER_L2_MASK;
2291b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L2_ETHER;
2301b828adfSBeilei Xing 					} else {
2311b828adfSBeilei Xing 						proto_hdr &= ~RTE_PTYPE_L2_MASK;
2321b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L2_ETHER;
2331b828adfSBeilei Xing 					}
2341b828adfSBeilei Xing 					break;
2351b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_VLAN:
2361b828adfSBeilei Xing 					if (is_inner) {
2371b828adfSBeilei Xing 						proto_hdr &= ~RTE_PTYPE_INNER_L2_MASK;
2381b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L2_ETHER_VLAN;
2391b828adfSBeilei Xing 					}
2401b828adfSBeilei Xing 					break;
2411b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PTP:
2421b828adfSBeilei Xing 					proto_hdr &= ~RTE_PTYPE_L2_MASK;
2431b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_L2_ETHER_TIMESYNC;
2441b828adfSBeilei Xing 					break;
2451b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_LLDP:
2461b828adfSBeilei Xing 					proto_hdr &= ~RTE_PTYPE_L2_MASK;
2471b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_L2_ETHER_LLDP;
2481b828adfSBeilei Xing 					break;
2491b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ARP:
2501b828adfSBeilei Xing 					proto_hdr &= ~RTE_PTYPE_L2_MASK;
2511b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_L2_ETHER_ARP;
2521b828adfSBeilei Xing 					break;
2531b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PPPOE:
2541b828adfSBeilei Xing 					proto_hdr &= ~RTE_PTYPE_L2_MASK;
2551b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_L2_ETHER_PPPOE;
2561b828adfSBeilei Xing 					break;
2571b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IPV4:
2581b828adfSBeilei Xing 					if (!is_ip) {
2591b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
2601b828adfSBeilei Xing 						is_ip = true;
2611b828adfSBeilei Xing 					} else {
2621b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2631b828adfSBeilei Xing 							     RTE_PTYPE_TUNNEL_IP;
2641b828adfSBeilei Xing 						is_inner = true;
2651b828adfSBeilei Xing 					}
2661b828adfSBeilei Xing 						break;
2671b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IPV6:
2681b828adfSBeilei Xing 					if (!is_ip) {
2691b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
2701b828adfSBeilei Xing 						is_ip = true;
2711b828adfSBeilei Xing 					} else {
2721b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2731b828adfSBeilei Xing 							     RTE_PTYPE_TUNNEL_IP;
2741b828adfSBeilei Xing 						is_inner = true;
2751b828adfSBeilei Xing 					}
2761b828adfSBeilei Xing 					break;
2771b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IPV4_FRAG:
2781b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IPV6_FRAG:
2791b828adfSBeilei Xing 					if (is_inner)
2801b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_FRAG;
2811b828adfSBeilei Xing 					else
2821b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_FRAG;
2831b828adfSBeilei Xing 					break;
2841b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_UDP:
2851b828adfSBeilei Xing 					if (is_inner)
2861b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_UDP;
2871b828adfSBeilei Xing 					else
2881b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_UDP;
2891b828adfSBeilei Xing 					break;
2901b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_TCP:
2911b828adfSBeilei Xing 					if (is_inner)
2921b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_TCP;
2931b828adfSBeilei Xing 					else
2941b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_TCP;
2951b828adfSBeilei Xing 					break;
2961b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_SCTP:
2971b828adfSBeilei Xing 					if (is_inner)
2981b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_SCTP;
2991b828adfSBeilei Xing 					else
3001b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_SCTP;
3011b828adfSBeilei Xing 					break;
3021b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ICMP:
3031b828adfSBeilei Xing 					if (is_inner)
3041b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_ICMP;
3051b828adfSBeilei Xing 					else
3061b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_ICMP;
3071b828adfSBeilei Xing 					break;
3081b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ICMPV6:
3091b828adfSBeilei Xing 					if (is_inner)
3101b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_INNER_L4_ICMP;
3111b828adfSBeilei Xing 					else
3121b828adfSBeilei Xing 						proto_hdr |= RTE_PTYPE_L4_ICMP;
3131b828adfSBeilei Xing 					break;
3141b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_L2TPV2:
3151b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_L2TPV2_CONTROL:
3161b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_L2TPV3:
3171b828adfSBeilei Xing 					is_inner = true;
3181b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_TUNNEL_L2TP;
3191b828adfSBeilei Xing 					break;
3201b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_NVGRE:
3211b828adfSBeilei Xing 					is_inner = true;
3221b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_TUNNEL_NVGRE;
3231b828adfSBeilei Xing 					break;
3241b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTPC_TEID:
3251b828adfSBeilei Xing 					is_inner = true;
3261b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_TUNNEL_GTPC;
3271b828adfSBeilei Xing 					break;
3281b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTPU:
3291b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTPU_UL:
3301b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTPU_DL:
3311b828adfSBeilei Xing 					is_inner = true;
3321b828adfSBeilei Xing 					proto_hdr |= RTE_PTYPE_TUNNEL_GTPU;
3331b828adfSBeilei Xing 					break;
3341b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PAY:
3351b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IPV6_EH:
3361b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PRE_MAC:
3371b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_POST_MAC:
3381b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ETHERTYPE:
3391b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_SVLAN:
3401b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_CVLAN:
3411b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_MPLS:
3421b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_MMPLS:
3431b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_CTRL:
3441b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ECP:
3451b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_EAPOL:
3461b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PPPOD:
3471b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IGMP:
3481b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_AH:
3491b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ESP:
3501b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_IKE:
3511b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_NATT_KEEP:
3521b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTP:
3531b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTP_EH:
3541b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GTPCV2:
3551b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_ECPRI:
3561b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_VRRP:
3571b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_OSPF:
3581b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_TUN:
3591b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_VXLAN_GPE:
3601b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_GENEVE:
3611b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_NSH:
3621b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_QUIC:
3631b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PFCP:
3641b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PFCP_NODE:
3651b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_PFCP_SESSION:
3661b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_RTP:
3671b828adfSBeilei Xing 				case VIRTCHNL2_PROTO_HDR_NO_PROTO:
3681b828adfSBeilei Xing 				default:
3691b828adfSBeilei Xing 					continue;
3701b828adfSBeilei Xing 				}
3711b828adfSBeilei Xing 				adapter->ptype_tbl[ptype->ptype_id_10] = proto_hdr;
3721b828adfSBeilei Xing 			}
3731b828adfSBeilei Xing 		}
3741b828adfSBeilei Xing 	}
3751b828adfSBeilei Xing 
376811bbeabSBeilei Xing free_recv_ptype_info:
377811bbeabSBeilei Xing 	rte_free(recv_ptype_info);
378811bbeabSBeilei Xing free_req_ptype_info:
379811bbeabSBeilei Xing 	rte_free(req_ptype_info);
3801b828adfSBeilei Xing 	clear_cmd(adapter);
3811b828adfSBeilei Xing 	return ret;
3821b828adfSBeilei Xing }
3831b828adfSBeilei Xing 
384b2f9d478SBeilei Xing int
385b2f9d478SBeilei Xing idpf_adapter_init(struct idpf_adapter *adapter)
386b2f9d478SBeilei Xing {
387b2f9d478SBeilei Xing 	struct idpf_hw *hw = &adapter->hw;
388b2f9d478SBeilei Xing 	int ret;
389b2f9d478SBeilei Xing 
39032bcd47eSBeilei Xing 	if (hw->device_id == IDPF_DEV_ID_SRIOV) {
39132bcd47eSBeilei Xing 		ret = idpf_check_vf_reset_done(hw);
39232bcd47eSBeilei Xing 	} else {
393b2f9d478SBeilei Xing 		idpf_reset_pf(hw);
394b2f9d478SBeilei Xing 		ret = idpf_check_pf_reset_done(hw);
39532bcd47eSBeilei Xing 	}
396b2f9d478SBeilei Xing 	if (ret != 0) {
397b2f9d478SBeilei Xing 		DRV_LOG(ERR, "IDPF is still resetting");
398b2f9d478SBeilei Xing 		goto err_check_reset;
399b2f9d478SBeilei Xing 	}
400b2f9d478SBeilei Xing 
401b2f9d478SBeilei Xing 	ret = idpf_init_mbx(hw);
402b2f9d478SBeilei Xing 	if (ret != 0) {
403b2f9d478SBeilei Xing 		DRV_LOG(ERR, "Failed to init mailbox");
404b2f9d478SBeilei Xing 		goto err_check_reset;
405b2f9d478SBeilei Xing 	}
406b2f9d478SBeilei Xing 
407b2f9d478SBeilei Xing 	adapter->mbx_resp = rte_zmalloc("idpf_adapter_mbx_resp",
408b2f9d478SBeilei Xing 					IDPF_DFLT_MBX_BUF_SIZE, 0);
409b2f9d478SBeilei Xing 	if (adapter->mbx_resp == NULL) {
410b2f9d478SBeilei Xing 		DRV_LOG(ERR, "Failed to allocate idpf_adapter_mbx_resp memory");
411b2f9d478SBeilei Xing 		ret = -ENOMEM;
412b2f9d478SBeilei Xing 		goto err_mbx_resp;
413b2f9d478SBeilei Xing 	}
414b2f9d478SBeilei Xing 
415ba6b8cd4SBeilei Xing 	ret = idpf_vc_api_version_check(adapter);
416b2f9d478SBeilei Xing 	if (ret != 0) {
417b2f9d478SBeilei Xing 		DRV_LOG(ERR, "Failed to check api version");
418b2f9d478SBeilei Xing 		goto err_check_api;
419b2f9d478SBeilei Xing 	}
420b2f9d478SBeilei Xing 
421ba6b8cd4SBeilei Xing 	ret = idpf_vc_caps_get(adapter);
422b2f9d478SBeilei Xing 	if (ret != 0) {
423b2f9d478SBeilei Xing 		DRV_LOG(ERR, "Failed to get capabilities");
424b2f9d478SBeilei Xing 		goto err_check_api;
425b2f9d478SBeilei Xing 	}
426b2f9d478SBeilei Xing 
4271b828adfSBeilei Xing 	ret = idpf_get_pkt_type(adapter);
4281b828adfSBeilei Xing 	if (ret != 0) {
4291b828adfSBeilei Xing 		DRV_LOG(ERR, "Failed to set ptype table");
4301b828adfSBeilei Xing 		goto err_check_api;
4311b828adfSBeilei Xing 	}
4321b828adfSBeilei Xing 
433b2f9d478SBeilei Xing 	return 0;
434b2f9d478SBeilei Xing 
435b2f9d478SBeilei Xing err_check_api:
436b2f9d478SBeilei Xing 	rte_free(adapter->mbx_resp);
437b2f9d478SBeilei Xing 	adapter->mbx_resp = NULL;
438b2f9d478SBeilei Xing err_mbx_resp:
439b2f9d478SBeilei Xing 	idpf_ctlq_deinit(hw);
440b2f9d478SBeilei Xing err_check_reset:
441b2f9d478SBeilei Xing 	return ret;
442b2f9d478SBeilei Xing }
443b2f9d478SBeilei Xing 
444b2f9d478SBeilei Xing int
445b2f9d478SBeilei Xing idpf_adapter_deinit(struct idpf_adapter *adapter)
446b2f9d478SBeilei Xing {
447b2f9d478SBeilei Xing 	struct idpf_hw *hw = &adapter->hw;
448b2f9d478SBeilei Xing 
449b2f9d478SBeilei Xing 	idpf_ctlq_deinit(hw);
450b2f9d478SBeilei Xing 	rte_free(adapter->mbx_resp);
451b2f9d478SBeilei Xing 	adapter->mbx_resp = NULL;
452b2f9d478SBeilei Xing 
453b2f9d478SBeilei Xing 	return 0;
454b2f9d478SBeilei Xing }
45573c9b8c3SBeilei Xing 
456c2769cadSBeilei Xing int
457c2769cadSBeilei Xing idpf_vport_init(struct idpf_vport *vport,
458c2769cadSBeilei Xing 		struct virtchnl2_create_vport *create_vport_info,
459c2769cadSBeilei Xing 		void *dev_data)
460c2769cadSBeilei Xing {
461c2769cadSBeilei Xing 	struct virtchnl2_create_vport *vport_info;
462c2769cadSBeilei Xing 	int i, type, ret;
463c2769cadSBeilei Xing 
464ba6b8cd4SBeilei Xing 	ret = idpf_vc_vport_create(vport, create_vport_info);
465c2769cadSBeilei Xing 	if (ret != 0) {
466c2769cadSBeilei Xing 		DRV_LOG(ERR, "Failed to create vport.");
467c2769cadSBeilei Xing 		goto err_create_vport;
468c2769cadSBeilei Xing 	}
469c2769cadSBeilei Xing 
470c2769cadSBeilei Xing 	vport_info = &(vport->vport_info.info);
471c2769cadSBeilei Xing 	vport->vport_id = vport_info->vport_id;
472c2769cadSBeilei Xing 	vport->txq_model = vport_info->txq_model;
473c2769cadSBeilei Xing 	vport->rxq_model = vport_info->rxq_model;
474c2769cadSBeilei Xing 	vport->num_tx_q = vport_info->num_tx_q;
475c2769cadSBeilei Xing 	vport->num_tx_complq = vport_info->num_tx_complq;
476c2769cadSBeilei Xing 	vport->num_rx_q = vport_info->num_rx_q;
477c2769cadSBeilei Xing 	vport->num_rx_bufq = vport_info->num_rx_bufq;
478c2769cadSBeilei Xing 	vport->max_mtu = vport_info->max_mtu;
479c2769cadSBeilei Xing 	rte_memcpy(vport->default_mac_addr,
480c2769cadSBeilei Xing 		   vport_info->default_mac_addr, ETH_ALEN);
481c2769cadSBeilei Xing 	vport->rss_algorithm = vport_info->rss_algorithm;
482c2769cadSBeilei Xing 	vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN,
483c2769cadSBeilei Xing 				      vport_info->rss_key_size);
484c2769cadSBeilei Xing 	vport->rss_lut_size = vport_info->rss_lut_size;
485c2769cadSBeilei Xing 
486c2769cadSBeilei Xing 	for (i = 0; i < vport_info->chunks.num_chunks; i++) {
487c2769cadSBeilei Xing 		type = vport_info->chunks.chunks[i].type;
488c2769cadSBeilei Xing 		switch (type) {
489c2769cadSBeilei Xing 		case VIRTCHNL2_QUEUE_TYPE_TX:
490c2769cadSBeilei Xing 			vport->chunks_info.tx_start_qid =
491c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].start_queue_id;
492c2769cadSBeilei Xing 			vport->chunks_info.tx_qtail_start =
493c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_start;
494c2769cadSBeilei Xing 			vport->chunks_info.tx_qtail_spacing =
495c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_spacing;
496c2769cadSBeilei Xing 			break;
497c2769cadSBeilei Xing 		case VIRTCHNL2_QUEUE_TYPE_RX:
498c2769cadSBeilei Xing 			vport->chunks_info.rx_start_qid =
499c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].start_queue_id;
500c2769cadSBeilei Xing 			vport->chunks_info.rx_qtail_start =
501c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_start;
502c2769cadSBeilei Xing 			vport->chunks_info.rx_qtail_spacing =
503c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_spacing;
504c2769cadSBeilei Xing 			break;
505c2769cadSBeilei Xing 		case VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION:
506c2769cadSBeilei Xing 			vport->chunks_info.tx_compl_start_qid =
507c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].start_queue_id;
508c2769cadSBeilei Xing 			vport->chunks_info.tx_compl_qtail_start =
509c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_start;
510c2769cadSBeilei Xing 			vport->chunks_info.tx_compl_qtail_spacing =
511c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_spacing;
512c2769cadSBeilei Xing 			break;
513c2769cadSBeilei Xing 		case VIRTCHNL2_QUEUE_TYPE_RX_BUFFER:
514c2769cadSBeilei Xing 			vport->chunks_info.rx_buf_start_qid =
515c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].start_queue_id;
516c2769cadSBeilei Xing 			vport->chunks_info.rx_buf_qtail_start =
517c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_start;
518c2769cadSBeilei Xing 			vport->chunks_info.rx_buf_qtail_spacing =
519c2769cadSBeilei Xing 				vport_info->chunks.chunks[i].qtail_reg_spacing;
520c2769cadSBeilei Xing 			break;
521c2769cadSBeilei Xing 		default:
522c2769cadSBeilei Xing 			DRV_LOG(ERR, "Unsupported queue type");
523c2769cadSBeilei Xing 			break;
524c2769cadSBeilei Xing 		}
525c2769cadSBeilei Xing 	}
526c2769cadSBeilei Xing 
527c2769cadSBeilei Xing 	vport->dev_data = dev_data;
528c2769cadSBeilei Xing 
529c2769cadSBeilei Xing 	vport->rss_key = rte_zmalloc("rss_key",
530c2769cadSBeilei Xing 				     vport->rss_key_size, 0);
531c2769cadSBeilei Xing 	if (vport->rss_key == NULL) {
532c2769cadSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate RSS key");
533c2769cadSBeilei Xing 		ret = -ENOMEM;
534c2769cadSBeilei Xing 		goto err_rss_key;
535c2769cadSBeilei Xing 	}
536c2769cadSBeilei Xing 
537c2769cadSBeilei Xing 	vport->rss_lut = rte_zmalloc("rss_lut",
538c2769cadSBeilei Xing 				     sizeof(uint32_t) * vport->rss_lut_size, 0);
539c2769cadSBeilei Xing 	if (vport->rss_lut == NULL) {
540c2769cadSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate RSS lut");
541c2769cadSBeilei Xing 		ret = -ENOMEM;
542c2769cadSBeilei Xing 		goto err_rss_lut;
543c2769cadSBeilei Xing 	}
544c2769cadSBeilei Xing 
545ddb59a7dSBeilei Xing 	/* recv_vectors is used for VIRTCHNL2_OP_ALLOC_VECTORS response,
546ddb59a7dSBeilei Xing 	 * reserve maximum size for it now, may need optimization in future.
547ddb59a7dSBeilei Xing 	 */
548ddb59a7dSBeilei Xing 	vport->recv_vectors = rte_zmalloc("recv_vectors", IDPF_DFLT_MBX_BUF_SIZE, 0);
549ddb59a7dSBeilei Xing 	if (vport->recv_vectors == NULL) {
550ddb59a7dSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate recv_vectors");
551ddb59a7dSBeilei Xing 		ret = -ENOMEM;
552ddb59a7dSBeilei Xing 		goto err_recv_vec;
553ddb59a7dSBeilei Xing 	}
554ddb59a7dSBeilei Xing 
555c2769cadSBeilei Xing 	return 0;
556c2769cadSBeilei Xing 
557ddb59a7dSBeilei Xing err_recv_vec:
558ddb59a7dSBeilei Xing 	rte_free(vport->rss_lut);
559ddb59a7dSBeilei Xing 	vport->rss_lut = NULL;
560c2769cadSBeilei Xing err_rss_lut:
561c2769cadSBeilei Xing 	vport->dev_data = NULL;
562c2769cadSBeilei Xing 	rte_free(vport->rss_key);
563c2769cadSBeilei Xing 	vport->rss_key = NULL;
564c2769cadSBeilei Xing err_rss_key:
565ba6b8cd4SBeilei Xing 	idpf_vc_vport_destroy(vport);
566c2769cadSBeilei Xing err_create_vport:
567c2769cadSBeilei Xing 	return ret;
568c2769cadSBeilei Xing }
569c2769cadSBeilei Xing int
570c2769cadSBeilei Xing idpf_vport_deinit(struct idpf_vport *vport)
571c2769cadSBeilei Xing {
572ddb59a7dSBeilei Xing 	rte_free(vport->recv_vectors);
573ddb59a7dSBeilei Xing 	vport->recv_vectors = NULL;
574c2769cadSBeilei Xing 	rte_free(vport->rss_lut);
575c2769cadSBeilei Xing 	vport->rss_lut = NULL;
576c2769cadSBeilei Xing 
577c2769cadSBeilei Xing 	rte_free(vport->rss_key);
578c2769cadSBeilei Xing 	vport->rss_key = NULL;
579c2769cadSBeilei Xing 
580c2769cadSBeilei Xing 	vport->dev_data = NULL;
581c2769cadSBeilei Xing 
582ba6b8cd4SBeilei Xing 	idpf_vc_vport_destroy(vport);
583c2769cadSBeilei Xing 
584c2769cadSBeilei Xing 	return 0;
585c2769cadSBeilei Xing }
5861d33ffdfSBeilei Xing int
587513a7eceSBeilei Xing idpf_vport_rss_config(struct idpf_vport *vport)
5881d33ffdfSBeilei Xing {
5891d33ffdfSBeilei Xing 	int ret;
5901d33ffdfSBeilei Xing 
591ba6b8cd4SBeilei Xing 	ret = idpf_vc_rss_key_set(vport);
5921d33ffdfSBeilei Xing 	if (ret != 0) {
5931d33ffdfSBeilei Xing 		DRV_LOG(ERR, "Failed to configure RSS key");
5941d33ffdfSBeilei Xing 		return ret;
5951d33ffdfSBeilei Xing 	}
5961d33ffdfSBeilei Xing 
597ba6b8cd4SBeilei Xing 	ret = idpf_vc_rss_lut_set(vport);
5981d33ffdfSBeilei Xing 	if (ret != 0) {
5991d33ffdfSBeilei Xing 		DRV_LOG(ERR, "Failed to configure RSS lut");
6001d33ffdfSBeilei Xing 		return ret;
6011d33ffdfSBeilei Xing 	}
6021d33ffdfSBeilei Xing 
603ba6b8cd4SBeilei Xing 	ret = idpf_vc_rss_hash_set(vport);
6041d33ffdfSBeilei Xing 	if (ret != 0) {
6051d33ffdfSBeilei Xing 		DRV_LOG(ERR, "Failed to configure RSS hash");
6061d33ffdfSBeilei Xing 		return ret;
6071d33ffdfSBeilei Xing 	}
6081d33ffdfSBeilei Xing 
6091d33ffdfSBeilei Xing 	return ret;
6101d33ffdfSBeilei Xing }
611ddb59a7dSBeilei Xing 
612ddb59a7dSBeilei Xing int
613513a7eceSBeilei Xing idpf_vport_irq_map_config(struct idpf_vport *vport, uint16_t nb_rx_queues)
614ddb59a7dSBeilei Xing {
615ddb59a7dSBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
616ddb59a7dSBeilei Xing 	struct virtchnl2_queue_vector *qv_map;
617ddb59a7dSBeilei Xing 	struct idpf_hw *hw = &adapter->hw;
618ddb59a7dSBeilei Xing 	uint32_t dynctl_val, itrn_val;
619ddb59a7dSBeilei Xing 	uint32_t dynctl_reg_start;
620ddb59a7dSBeilei Xing 	uint32_t itrn_reg_start;
621ddb59a7dSBeilei Xing 	uint16_t i;
622ddb59a7dSBeilei Xing 	int ret;
623ddb59a7dSBeilei Xing 
624ddb59a7dSBeilei Xing 	qv_map = rte_zmalloc("qv_map",
625ddb59a7dSBeilei Xing 			     nb_rx_queues *
626ddb59a7dSBeilei Xing 			     sizeof(struct virtchnl2_queue_vector), 0);
627ddb59a7dSBeilei Xing 	if (qv_map == NULL) {
628ddb59a7dSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate %d queue-vector map",
629ddb59a7dSBeilei Xing 			nb_rx_queues);
630ddb59a7dSBeilei Xing 		ret = -ENOMEM;
631ddb59a7dSBeilei Xing 		goto qv_map_alloc_err;
632ddb59a7dSBeilei Xing 	}
633ddb59a7dSBeilei Xing 
634ddb59a7dSBeilei Xing 	/* Rx interrupt disabled, Map interrupt only for writeback */
635ddb59a7dSBeilei Xing 
636ddb59a7dSBeilei Xing 	/* The capability flags adapter->caps.other_caps should be
637ddb59a7dSBeilei Xing 	 * compared with bit VIRTCHNL2_CAP_WB_ON_ITR here. The if
638ddb59a7dSBeilei Xing 	 * condition should be updated when the FW can return the
639ddb59a7dSBeilei Xing 	 * correct flag bits.
640ddb59a7dSBeilei Xing 	 */
641ddb59a7dSBeilei Xing 	dynctl_reg_start =
642ddb59a7dSBeilei Xing 		vport->recv_vectors->vchunks.vchunks->dynctl_reg_start;
643ddb59a7dSBeilei Xing 	itrn_reg_start =
644ddb59a7dSBeilei Xing 		vport->recv_vectors->vchunks.vchunks->itrn_reg_start;
645ddb59a7dSBeilei Xing 	dynctl_val = IDPF_READ_REG(hw, dynctl_reg_start);
646ddb59a7dSBeilei Xing 	DRV_LOG(DEBUG, "Value of dynctl_reg_start is 0x%x", dynctl_val);
647ddb59a7dSBeilei Xing 	itrn_val = IDPF_READ_REG(hw, itrn_reg_start);
648ddb59a7dSBeilei Xing 	DRV_LOG(DEBUG, "Value of itrn_reg_start is 0x%x", itrn_val);
649ddb59a7dSBeilei Xing 	/* Force write-backs by setting WB_ON_ITR bit in DYN_CTL
650ddb59a7dSBeilei Xing 	 * register. WB_ON_ITR and INTENA are mutually exclusive
651ddb59a7dSBeilei Xing 	 * bits. Setting WB_ON_ITR bits means TX and RX Descs
652ddb59a7dSBeilei Xing 	 * are written back based on ITR expiration irrespective
653ddb59a7dSBeilei Xing 	 * of INTENA setting.
654ddb59a7dSBeilei Xing 	 */
655ddb59a7dSBeilei Xing 	/* TBD: need to tune INTERVAL value for better performance. */
656ddb59a7dSBeilei Xing 	itrn_val = (itrn_val == 0) ? IDPF_DFLT_INTERVAL : itrn_val;
657ddb59a7dSBeilei Xing 	dynctl_val = VIRTCHNL2_ITR_IDX_0  <<
658ddb59a7dSBeilei Xing 		     PF_GLINT_DYN_CTL_ITR_INDX_S |
659ddb59a7dSBeilei Xing 		     PF_GLINT_DYN_CTL_WB_ON_ITR_M |
660ddb59a7dSBeilei Xing 		     itrn_val << PF_GLINT_DYN_CTL_INTERVAL_S;
661ddb59a7dSBeilei Xing 	IDPF_WRITE_REG(hw, dynctl_reg_start, dynctl_val);
662ddb59a7dSBeilei Xing 
663ddb59a7dSBeilei Xing 	for (i = 0; i < nb_rx_queues; i++) {
664ddb59a7dSBeilei Xing 		/* map all queues to the same vector */
665ddb59a7dSBeilei Xing 		qv_map[i].queue_id = vport->chunks_info.rx_start_qid + i;
666ddb59a7dSBeilei Xing 		qv_map[i].vector_id =
667ddb59a7dSBeilei Xing 			vport->recv_vectors->vchunks.vchunks->start_vector_id;
668ddb59a7dSBeilei Xing 	}
669ddb59a7dSBeilei Xing 	vport->qv_map = qv_map;
670ddb59a7dSBeilei Xing 
671ba6b8cd4SBeilei Xing 	ret = idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, true);
672ddb59a7dSBeilei Xing 	if (ret != 0) {
673ddb59a7dSBeilei Xing 		DRV_LOG(ERR, "config interrupt mapping failed");
674ddb59a7dSBeilei Xing 		goto config_irq_map_err;
675ddb59a7dSBeilei Xing 	}
676ddb59a7dSBeilei Xing 
677ddb59a7dSBeilei Xing 	return 0;
678ddb59a7dSBeilei Xing 
679ddb59a7dSBeilei Xing config_irq_map_err:
680ddb59a7dSBeilei Xing 	rte_free(vport->qv_map);
681ddb59a7dSBeilei Xing 	vport->qv_map = NULL;
682ddb59a7dSBeilei Xing 
683ddb59a7dSBeilei Xing qv_map_alloc_err:
684ddb59a7dSBeilei Xing 	return ret;
685ddb59a7dSBeilei Xing }
686ddb59a7dSBeilei Xing 
687ddb59a7dSBeilei Xing int
6881e8c00f5SBeilei Xing idpf_vport_irq_map_config_by_qids(struct idpf_vport *vport, uint32_t *qids, uint16_t nb_rx_queues)
6891e8c00f5SBeilei Xing {
6901e8c00f5SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
6911e8c00f5SBeilei Xing 	struct virtchnl2_queue_vector *qv_map;
6921e8c00f5SBeilei Xing 	struct idpf_hw *hw = &adapter->hw;
6931e8c00f5SBeilei Xing 	uint32_t dynctl_val, itrn_val;
6941e8c00f5SBeilei Xing 	uint32_t dynctl_reg_start;
6951e8c00f5SBeilei Xing 	uint32_t itrn_reg_start;
6961e8c00f5SBeilei Xing 	uint16_t i;
6971e8c00f5SBeilei Xing 	int ret;
6981e8c00f5SBeilei Xing 
6991e8c00f5SBeilei Xing 	qv_map = rte_zmalloc("qv_map",
7001e8c00f5SBeilei Xing 			     nb_rx_queues *
7011e8c00f5SBeilei Xing 			     sizeof(struct virtchnl2_queue_vector), 0);
7021e8c00f5SBeilei Xing 	if (qv_map == NULL) {
7031e8c00f5SBeilei Xing 		DRV_LOG(ERR, "Failed to allocate %d queue-vector map",
7041e8c00f5SBeilei Xing 			nb_rx_queues);
7051e8c00f5SBeilei Xing 		ret = -ENOMEM;
7061e8c00f5SBeilei Xing 		goto qv_map_alloc_err;
7071e8c00f5SBeilei Xing 	}
7081e8c00f5SBeilei Xing 
7091e8c00f5SBeilei Xing 	/* Rx interrupt disabled, Map interrupt only for writeback */
7101e8c00f5SBeilei Xing 
7111e8c00f5SBeilei Xing 	/* The capability flags adapter->caps.other_caps should be
7121e8c00f5SBeilei Xing 	 * compared with bit VIRTCHNL2_CAP_WB_ON_ITR here. The if
7131e8c00f5SBeilei Xing 	 * condition should be updated when the FW can return the
7141e8c00f5SBeilei Xing 	 * correct flag bits.
7151e8c00f5SBeilei Xing 	 */
7161e8c00f5SBeilei Xing 	dynctl_reg_start =
7171e8c00f5SBeilei Xing 		vport->recv_vectors->vchunks.vchunks->dynctl_reg_start;
7181e8c00f5SBeilei Xing 	itrn_reg_start =
7191e8c00f5SBeilei Xing 		vport->recv_vectors->vchunks.vchunks->itrn_reg_start;
7201e8c00f5SBeilei Xing 	dynctl_val = IDPF_READ_REG(hw, dynctl_reg_start);
7211e8c00f5SBeilei Xing 	DRV_LOG(DEBUG, "Value of dynctl_reg_start is 0x%x", dynctl_val);
7221e8c00f5SBeilei Xing 	itrn_val = IDPF_READ_REG(hw, itrn_reg_start);
7231e8c00f5SBeilei Xing 	DRV_LOG(DEBUG, "Value of itrn_reg_start is 0x%x", itrn_val);
7241e8c00f5SBeilei Xing 	/* Force write-backs by setting WB_ON_ITR bit in DYN_CTL
7251e8c00f5SBeilei Xing 	 * register. WB_ON_ITR and INTENA are mutually exclusive
7261e8c00f5SBeilei Xing 	 * bits. Setting WB_ON_ITR bits means TX and RX Descs
7271e8c00f5SBeilei Xing 	 * are written back based on ITR expiration irrespective
7281e8c00f5SBeilei Xing 	 * of INTENA setting.
7291e8c00f5SBeilei Xing 	 */
7301e8c00f5SBeilei Xing 	/* TBD: need to tune INTERVAL value for better performance. */
7311e8c00f5SBeilei Xing 	itrn_val = (itrn_val == 0) ? IDPF_DFLT_INTERVAL : itrn_val;
7321e8c00f5SBeilei Xing 	dynctl_val = VIRTCHNL2_ITR_IDX_0  <<
7331e8c00f5SBeilei Xing 		     PF_GLINT_DYN_CTL_ITR_INDX_S |
7341e8c00f5SBeilei Xing 		     PF_GLINT_DYN_CTL_WB_ON_ITR_M |
7351e8c00f5SBeilei Xing 		     itrn_val << PF_GLINT_DYN_CTL_INTERVAL_S;
7361e8c00f5SBeilei Xing 	IDPF_WRITE_REG(hw, dynctl_reg_start, dynctl_val);
7371e8c00f5SBeilei Xing 
7381e8c00f5SBeilei Xing 	for (i = 0; i < nb_rx_queues; i++) {
7391e8c00f5SBeilei Xing 		/* map all queues to the same vector */
7401e8c00f5SBeilei Xing 		qv_map[i].queue_id = qids[i];
7411e8c00f5SBeilei Xing 		qv_map[i].vector_id =
7421e8c00f5SBeilei Xing 			vport->recv_vectors->vchunks.vchunks->start_vector_id;
7431e8c00f5SBeilei Xing 	}
7441e8c00f5SBeilei Xing 	vport->qv_map = qv_map;
7451e8c00f5SBeilei Xing 
7461e8c00f5SBeilei Xing 	ret = idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, true);
7471e8c00f5SBeilei Xing 	if (ret != 0) {
7481e8c00f5SBeilei Xing 		DRV_LOG(ERR, "config interrupt mapping failed");
7491e8c00f5SBeilei Xing 		goto config_irq_map_err;
7501e8c00f5SBeilei Xing 	}
7511e8c00f5SBeilei Xing 
7521e8c00f5SBeilei Xing 	return 0;
7531e8c00f5SBeilei Xing 
7541e8c00f5SBeilei Xing config_irq_map_err:
7551e8c00f5SBeilei Xing 	rte_free(vport->qv_map);
7561e8c00f5SBeilei Xing 	vport->qv_map = NULL;
7571e8c00f5SBeilei Xing 
7581e8c00f5SBeilei Xing qv_map_alloc_err:
7591e8c00f5SBeilei Xing 	return ret;
7601e8c00f5SBeilei Xing }
7611e8c00f5SBeilei Xing 
7621e8c00f5SBeilei Xing int
763513a7eceSBeilei Xing idpf_vport_irq_unmap_config(struct idpf_vport *vport, uint16_t nb_rx_queues)
764ddb59a7dSBeilei Xing {
765ba6b8cd4SBeilei Xing 	idpf_vc_irq_map_unmap_config(vport, nb_rx_queues, false);
766ddb59a7dSBeilei Xing 
767ddb59a7dSBeilei Xing 	rte_free(vport->qv_map);
768ddb59a7dSBeilei Xing 	vport->qv_map = NULL;
769ddb59a7dSBeilei Xing 
770ddb59a7dSBeilei Xing 	return 0;
771ddb59a7dSBeilei Xing }
772ddb59a7dSBeilei Xing 
7737f47b20bSBeilei Xing int
774513a7eceSBeilei Xing idpf_vport_info_init(struct idpf_vport *vport,
7757f47b20bSBeilei Xing 			    struct virtchnl2_create_vport *vport_info)
7767f47b20bSBeilei Xing {
7777f47b20bSBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
7787f47b20bSBeilei Xing 
7797f47b20bSBeilei Xing 	vport_info->vport_type = rte_cpu_to_le_16(VIRTCHNL2_VPORT_TYPE_DEFAULT);
780181348d3SMingxia Liu 	if (!adapter->is_tx_singleq) {
7817f47b20bSBeilei Xing 		vport_info->txq_model =
7827f47b20bSBeilei Xing 			rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SPLIT);
7837f47b20bSBeilei Xing 		vport_info->num_tx_q =
7847f47b20bSBeilei Xing 			rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM);
7857f47b20bSBeilei Xing 		vport_info->num_tx_complq =
7867f47b20bSBeilei Xing 			rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM * IDPF_TX_COMPLQ_PER_GRP);
7877f47b20bSBeilei Xing 	} else {
7887f47b20bSBeilei Xing 		vport_info->txq_model =
7897f47b20bSBeilei Xing 			rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE);
7907f47b20bSBeilei Xing 		vport_info->num_tx_q = rte_cpu_to_le_16(IDPF_DEFAULT_TXQ_NUM);
7917f47b20bSBeilei Xing 		vport_info->num_tx_complq = 0;
7927f47b20bSBeilei Xing 	}
793181348d3SMingxia Liu 	if (!adapter->is_rx_singleq) {
7947f47b20bSBeilei Xing 		vport_info->rxq_model =
7957f47b20bSBeilei Xing 			rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SPLIT);
7967f47b20bSBeilei Xing 		vport_info->num_rx_q = rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM);
7977f47b20bSBeilei Xing 		vport_info->num_rx_bufq =
7987f47b20bSBeilei Xing 			rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM * IDPF_RX_BUFQ_PER_GRP);
7997f47b20bSBeilei Xing 	} else {
8007f47b20bSBeilei Xing 		vport_info->rxq_model =
8017f47b20bSBeilei Xing 			rte_cpu_to_le_16(VIRTCHNL2_QUEUE_MODEL_SINGLE);
8027f47b20bSBeilei Xing 		vport_info->num_rx_q = rte_cpu_to_le_16(IDPF_DEFAULT_RXQ_NUM);
8037f47b20bSBeilei Xing 		vport_info->num_rx_bufq = 0;
8047f47b20bSBeilei Xing 	}
8057f47b20bSBeilei Xing 
8067f47b20bSBeilei Xing 	return 0;
8077f47b20bSBeilei Xing }
8087f47b20bSBeilei Xing 
8097514d76dSMingxia Liu void
8107514d76dSMingxia Liu idpf_vport_stats_update(struct virtchnl2_vport_stats *oes, struct virtchnl2_vport_stats *nes)
8117514d76dSMingxia Liu {
8127514d76dSMingxia Liu 	nes->rx_bytes = nes->rx_bytes - oes->rx_bytes;
8137514d76dSMingxia Liu 	nes->rx_unicast = nes->rx_unicast - oes->rx_unicast;
8147514d76dSMingxia Liu 	nes->rx_multicast = nes->rx_multicast - oes->rx_multicast;
8157514d76dSMingxia Liu 	nes->rx_broadcast = nes->rx_broadcast - oes->rx_broadcast;
8167514d76dSMingxia Liu 	nes->rx_errors = nes->rx_errors - oes->rx_errors;
8177514d76dSMingxia Liu 	nes->rx_discards = nes->rx_discards - oes->rx_discards;
8187514d76dSMingxia Liu 	nes->tx_bytes = nes->tx_bytes - oes->tx_bytes;
8197514d76dSMingxia Liu 	nes->tx_unicast = nes->tx_unicast - oes->tx_unicast;
8207514d76dSMingxia Liu 	nes->tx_multicast = nes->tx_multicast - oes->tx_multicast;
8217514d76dSMingxia Liu 	nes->tx_broadcast = nes->tx_broadcast - oes->tx_broadcast;
8227514d76dSMingxia Liu 	nes->tx_errors = nes->tx_errors - oes->tx_errors;
8237514d76dSMingxia Liu 	nes->tx_discards = nes->tx_discards - oes->tx_discards;
8247514d76dSMingxia Liu }
8257514d76dSMingxia Liu 
82673c9b8c3SBeilei Xing RTE_LOG_REGISTER_SUFFIX(idpf_common_logtype, common, NOTICE);
827