xref: /dpdk/drivers/common/idpf/idpf_common_virtchnl.c (revision ff0e6d8ef48617af882f5c7b3b0e33117f706c4e)
173c9b8c3SBeilei Xing /* SPDX-License-Identifier: BSD-3-Clause
273c9b8c3SBeilei Xing  * Copyright(c) 2023 Intel Corporation
373c9b8c3SBeilei Xing  */
473c9b8c3SBeilei Xing 
5ec4b04a7SQi Zhang #include "idpf_common_virtchnl.h"
6ec4b04a7SQi Zhang #include "idpf_common_logs.h"
773c9b8c3SBeilei Xing 
873c9b8c3SBeilei Xing static int
idpf_vc_clean(struct idpf_adapter * adapter)973c9b8c3SBeilei Xing idpf_vc_clean(struct idpf_adapter *adapter)
1073c9b8c3SBeilei Xing {
1173c9b8c3SBeilei Xing 	struct idpf_ctlq_msg *q_msg[IDPF_CTLQ_LEN];
1273c9b8c3SBeilei Xing 	uint16_t num_q_msg = IDPF_CTLQ_LEN;
1373c9b8c3SBeilei Xing 	struct idpf_dma_mem *dma_mem;
1473c9b8c3SBeilei Xing 	int err;
1573c9b8c3SBeilei Xing 	uint32_t i;
1673c9b8c3SBeilei Xing 
1773c9b8c3SBeilei Xing 	for (i = 0; i < 10; i++) {
1873c9b8c3SBeilei Xing 		err = idpf_ctlq_clean_sq(adapter->hw.asq, &num_q_msg, q_msg);
1973c9b8c3SBeilei Xing 		msleep(20);
2073c9b8c3SBeilei Xing 		if (num_q_msg > 0)
2173c9b8c3SBeilei Xing 			break;
2273c9b8c3SBeilei Xing 	}
2373c9b8c3SBeilei Xing 	if (err != 0)
2473c9b8c3SBeilei Xing 		return err;
2573c9b8c3SBeilei Xing 
2673c9b8c3SBeilei Xing 	/* Empty queue is not an error */
2773c9b8c3SBeilei Xing 	for (i = 0; i < num_q_msg; i++) {
2873c9b8c3SBeilei Xing 		dma_mem = q_msg[i]->ctx.indirect.payload;
2973c9b8c3SBeilei Xing 		if (dma_mem != NULL) {
3073c9b8c3SBeilei Xing 			idpf_free_dma_mem(&adapter->hw, dma_mem);
3173c9b8c3SBeilei Xing 			rte_free(dma_mem);
3273c9b8c3SBeilei Xing 		}
3373c9b8c3SBeilei Xing 		rte_free(q_msg[i]);
3473c9b8c3SBeilei Xing 	}
3573c9b8c3SBeilei Xing 
3673c9b8c3SBeilei Xing 	return 0;
3773c9b8c3SBeilei Xing }
3873c9b8c3SBeilei Xing 
3973c9b8c3SBeilei Xing static int
idpf_send_vc_msg(struct idpf_adapter * adapter,uint32_t op,uint16_t msg_size,uint8_t * msg)4073c9b8c3SBeilei Xing idpf_send_vc_msg(struct idpf_adapter *adapter, uint32_t op,
4173c9b8c3SBeilei Xing 		 uint16_t msg_size, uint8_t *msg)
4273c9b8c3SBeilei Xing {
4373c9b8c3SBeilei Xing 	struct idpf_ctlq_msg *ctlq_msg;
4473c9b8c3SBeilei Xing 	struct idpf_dma_mem *dma_mem;
4573c9b8c3SBeilei Xing 	int err;
4673c9b8c3SBeilei Xing 
4773c9b8c3SBeilei Xing 	err = idpf_vc_clean(adapter);
4873c9b8c3SBeilei Xing 	if (err != 0)
4973c9b8c3SBeilei Xing 		goto err;
5073c9b8c3SBeilei Xing 
5173c9b8c3SBeilei Xing 	ctlq_msg = rte_zmalloc(NULL, sizeof(struct idpf_ctlq_msg), 0);
5273c9b8c3SBeilei Xing 	if (ctlq_msg == NULL) {
5373c9b8c3SBeilei Xing 		err = -ENOMEM;
5473c9b8c3SBeilei Xing 		goto err;
5573c9b8c3SBeilei Xing 	}
5673c9b8c3SBeilei Xing 
5773c9b8c3SBeilei Xing 	dma_mem = rte_zmalloc(NULL, sizeof(struct idpf_dma_mem), 0);
5873c9b8c3SBeilei Xing 	if (dma_mem == NULL) {
5973c9b8c3SBeilei Xing 		err = -ENOMEM;
6073c9b8c3SBeilei Xing 		goto dma_mem_error;
6173c9b8c3SBeilei Xing 	}
6273c9b8c3SBeilei Xing 
6373c9b8c3SBeilei Xing 	dma_mem->size = IDPF_DFLT_MBX_BUF_SIZE;
6473c9b8c3SBeilei Xing 	idpf_alloc_dma_mem(&adapter->hw, dma_mem, dma_mem->size);
6573c9b8c3SBeilei Xing 	if (dma_mem->va == NULL) {
6673c9b8c3SBeilei Xing 		err = -ENOMEM;
6773c9b8c3SBeilei Xing 		goto dma_alloc_error;
6873c9b8c3SBeilei Xing 	}
6973c9b8c3SBeilei Xing 
7073c9b8c3SBeilei Xing 	memcpy(dma_mem->va, msg, msg_size);
7173c9b8c3SBeilei Xing 
7273c9b8c3SBeilei Xing 	ctlq_msg->opcode = idpf_mbq_opc_send_msg_to_pf;
7373c9b8c3SBeilei Xing 	ctlq_msg->func_id = 0;
7473c9b8c3SBeilei Xing 	ctlq_msg->data_len = msg_size;
7573c9b8c3SBeilei Xing 	ctlq_msg->cookie.mbx.chnl_opcode = op;
7673c9b8c3SBeilei Xing 	ctlq_msg->cookie.mbx.chnl_retval = VIRTCHNL_STATUS_SUCCESS;
7773c9b8c3SBeilei Xing 	ctlq_msg->ctx.indirect.payload = dma_mem;
7873c9b8c3SBeilei Xing 
7973c9b8c3SBeilei Xing 	err = idpf_ctlq_send(&adapter->hw, adapter->hw.asq, 1, ctlq_msg);
8073c9b8c3SBeilei Xing 	if (err != 0)
8173c9b8c3SBeilei Xing 		goto send_error;
8273c9b8c3SBeilei Xing 
8373c9b8c3SBeilei Xing 	return 0;
8473c9b8c3SBeilei Xing 
8573c9b8c3SBeilei Xing send_error:
8673c9b8c3SBeilei Xing 	idpf_free_dma_mem(&adapter->hw, dma_mem);
8773c9b8c3SBeilei Xing dma_alloc_error:
8873c9b8c3SBeilei Xing 	rte_free(dma_mem);
8973c9b8c3SBeilei Xing dma_mem_error:
9073c9b8c3SBeilei Xing 	rte_free(ctlq_msg);
9173c9b8c3SBeilei Xing err:
9273c9b8c3SBeilei Xing 	return err;
9373c9b8c3SBeilei Xing }
9473c9b8c3SBeilei Xing 
9573c9b8c3SBeilei Xing static enum idpf_vc_result
idpf_read_msg_from_cp(struct idpf_adapter * adapter,uint16_t buf_len,uint8_t * buf)9673c9b8c3SBeilei Xing idpf_read_msg_from_cp(struct idpf_adapter *adapter, uint16_t buf_len,
9773c9b8c3SBeilei Xing 		      uint8_t *buf)
9873c9b8c3SBeilei Xing {
9973c9b8c3SBeilei Xing 	struct idpf_hw *hw = &adapter->hw;
10073c9b8c3SBeilei Xing 	struct idpf_ctlq_msg ctlq_msg;
10173c9b8c3SBeilei Xing 	struct idpf_dma_mem *dma_mem = NULL;
10273c9b8c3SBeilei Xing 	enum idpf_vc_result result = IDPF_MSG_NON;
10373c9b8c3SBeilei Xing 	uint32_t opcode;
10473c9b8c3SBeilei Xing 	uint16_t pending = 1;
10573c9b8c3SBeilei Xing 	int ret;
10673c9b8c3SBeilei Xing 
10773c9b8c3SBeilei Xing 	ret = idpf_ctlq_recv(hw->arq, &pending, &ctlq_msg);
10873c9b8c3SBeilei Xing 	if (ret != 0) {
10973c9b8c3SBeilei Xing 		DRV_LOG(DEBUG, "Can't read msg from AQ");
11073c9b8c3SBeilei Xing 		if (ret != -ENOMSG)
11173c9b8c3SBeilei Xing 			result = IDPF_MSG_ERR;
11273c9b8c3SBeilei Xing 		return result;
11373c9b8c3SBeilei Xing 	}
11473c9b8c3SBeilei Xing 
11573c9b8c3SBeilei Xing 	rte_memcpy(buf, ctlq_msg.ctx.indirect.payload->va, buf_len);
11673c9b8c3SBeilei Xing 
11773c9b8c3SBeilei Xing 	opcode = rte_le_to_cpu_32(ctlq_msg.cookie.mbx.chnl_opcode);
11873c9b8c3SBeilei Xing 	adapter->cmd_retval = rte_le_to_cpu_32(ctlq_msg.cookie.mbx.chnl_retval);
11973c9b8c3SBeilei Xing 
12073c9b8c3SBeilei Xing 	DRV_LOG(DEBUG, "CQ from CP carries opcode %u, retval %d",
12173c9b8c3SBeilei Xing 		opcode, adapter->cmd_retval);
12273c9b8c3SBeilei Xing 
12373c9b8c3SBeilei Xing 	if (opcode == VIRTCHNL2_OP_EVENT) {
12473c9b8c3SBeilei Xing 		struct virtchnl2_event *ve = ctlq_msg.ctx.indirect.payload->va;
12573c9b8c3SBeilei Xing 
12673c9b8c3SBeilei Xing 		result = IDPF_MSG_SYS;
12773c9b8c3SBeilei Xing 		switch (ve->event) {
12873c9b8c3SBeilei Xing 		case VIRTCHNL2_EVENT_LINK_CHANGE:
12973c9b8c3SBeilei Xing 			/* TBD */
13073c9b8c3SBeilei Xing 			break;
13173c9b8c3SBeilei Xing 		default:
13273c9b8c3SBeilei Xing 			DRV_LOG(ERR, "%s: Unknown event %d from CP",
13373c9b8c3SBeilei Xing 				__func__, ve->event);
13473c9b8c3SBeilei Xing 			break;
13573c9b8c3SBeilei Xing 		}
13673c9b8c3SBeilei Xing 	} else {
13773c9b8c3SBeilei Xing 		/* async reply msg on command issued by pf previously */
13873c9b8c3SBeilei Xing 		result = IDPF_MSG_CMD;
13973c9b8c3SBeilei Xing 		if (opcode != adapter->pend_cmd) {
14073c9b8c3SBeilei Xing 			DRV_LOG(WARNING, "command mismatch, expect %u, get %u",
14173c9b8c3SBeilei Xing 				adapter->pend_cmd, opcode);
14273c9b8c3SBeilei Xing 			result = IDPF_MSG_ERR;
14373c9b8c3SBeilei Xing 		}
14473c9b8c3SBeilei Xing 	}
14573c9b8c3SBeilei Xing 
14673c9b8c3SBeilei Xing 	if (ctlq_msg.data_len != 0)
14773c9b8c3SBeilei Xing 		dma_mem = ctlq_msg.ctx.indirect.payload;
14873c9b8c3SBeilei Xing 	else
14973c9b8c3SBeilei Xing 		pending = 0;
15073c9b8c3SBeilei Xing 
15173c9b8c3SBeilei Xing 	ret = idpf_ctlq_post_rx_buffs(hw, hw->arq, &pending, &dma_mem);
15273c9b8c3SBeilei Xing 	if (ret != 0 && dma_mem != NULL)
15373c9b8c3SBeilei Xing 		idpf_free_dma_mem(hw, dma_mem);
15473c9b8c3SBeilei Xing 
15573c9b8c3SBeilei Xing 	return result;
15673c9b8c3SBeilei Xing }
15773c9b8c3SBeilei Xing 
15873c9b8c3SBeilei Xing #define MAX_TRY_TIMES 200
15973c9b8c3SBeilei Xing #define ASQ_DELAY_MS  10
16073c9b8c3SBeilei Xing 
16173c9b8c3SBeilei Xing int
idpf_vc_one_msg_read(struct idpf_adapter * adapter,uint32_t ops,uint16_t buf_len,uint8_t * buf)162ba6b8cd4SBeilei Xing idpf_vc_one_msg_read(struct idpf_adapter *adapter, uint32_t ops, uint16_t buf_len,
16373c9b8c3SBeilei Xing 		     uint8_t *buf)
16473c9b8c3SBeilei Xing {
16573c9b8c3SBeilei Xing 	int err = 0;
16673c9b8c3SBeilei Xing 	int i = 0;
16773c9b8c3SBeilei Xing 	int ret;
16873c9b8c3SBeilei Xing 
16973c9b8c3SBeilei Xing 	do {
17073c9b8c3SBeilei Xing 		ret = idpf_read_msg_from_cp(adapter, buf_len, buf);
17173c9b8c3SBeilei Xing 		if (ret == IDPF_MSG_CMD)
17273c9b8c3SBeilei Xing 			break;
17373c9b8c3SBeilei Xing 		rte_delay_ms(ASQ_DELAY_MS);
17473c9b8c3SBeilei Xing 	} while (i++ < MAX_TRY_TIMES);
17573c9b8c3SBeilei Xing 	if (i >= MAX_TRY_TIMES ||
17673c9b8c3SBeilei Xing 	    adapter->cmd_retval != VIRTCHNL_STATUS_SUCCESS) {
17773c9b8c3SBeilei Xing 		err = -EBUSY;
17873c9b8c3SBeilei Xing 		DRV_LOG(ERR, "No response or return failure (%d) for cmd %d",
17973c9b8c3SBeilei Xing 			adapter->cmd_retval, ops);
18073c9b8c3SBeilei Xing 	}
18173c9b8c3SBeilei Xing 
18273c9b8c3SBeilei Xing 	return err;
18373c9b8c3SBeilei Xing }
18473c9b8c3SBeilei Xing 
18573c9b8c3SBeilei Xing int
idpf_vc_cmd_execute(struct idpf_adapter * adapter,struct idpf_cmd_info * args)186ba6b8cd4SBeilei Xing idpf_vc_cmd_execute(struct idpf_adapter *adapter, struct idpf_cmd_info *args)
18773c9b8c3SBeilei Xing {
18873c9b8c3SBeilei Xing 	int err = 0;
18973c9b8c3SBeilei Xing 	int i = 0;
19073c9b8c3SBeilei Xing 	int ret;
19173c9b8c3SBeilei Xing 
19273c9b8c3SBeilei Xing 	if (atomic_set_cmd(adapter, args->ops))
19373c9b8c3SBeilei Xing 		return -EINVAL;
19473c9b8c3SBeilei Xing 
19573c9b8c3SBeilei Xing 	ret = idpf_send_vc_msg(adapter, args->ops, args->in_args_size, args->in_args);
19673c9b8c3SBeilei Xing 	if (ret != 0) {
19773c9b8c3SBeilei Xing 		DRV_LOG(ERR, "fail to send cmd %d", args->ops);
19873c9b8c3SBeilei Xing 		clear_cmd(adapter);
19973c9b8c3SBeilei Xing 		return ret;
20073c9b8c3SBeilei Xing 	}
20173c9b8c3SBeilei Xing 
20273c9b8c3SBeilei Xing 	switch (args->ops) {
20373c9b8c3SBeilei Xing 	case VIRTCHNL_OP_VERSION:
20473c9b8c3SBeilei Xing 	case VIRTCHNL2_OP_GET_CAPS:
205811bbeabSBeilei Xing 	case VIRTCHNL2_OP_GET_PTYPE_INFO:
20673c9b8c3SBeilei Xing 		/* for init virtchnl ops, need to poll the response */
207ba6b8cd4SBeilei Xing 		err = idpf_vc_one_msg_read(adapter, args->ops, args->out_size, args->out_buffer);
20873c9b8c3SBeilei Xing 		clear_cmd(adapter);
20973c9b8c3SBeilei Xing 		break;
21073c9b8c3SBeilei Xing 	default:
21173c9b8c3SBeilei Xing 		/* For other virtchnl ops in running time,
21273c9b8c3SBeilei Xing 		 * wait for the cmd done flag.
21373c9b8c3SBeilei Xing 		 */
21473c9b8c3SBeilei Xing 		do {
21573c9b8c3SBeilei Xing 			if (adapter->pend_cmd == VIRTCHNL_OP_UNKNOWN)
21673c9b8c3SBeilei Xing 				break;
21773c9b8c3SBeilei Xing 			rte_delay_ms(ASQ_DELAY_MS);
21873c9b8c3SBeilei Xing 			/* If don't read msg or read sys event, continue */
21973c9b8c3SBeilei Xing 		} while (i++ < MAX_TRY_TIMES);
22073c9b8c3SBeilei Xing 		/* If there's no response is received, clear command */
22173c9b8c3SBeilei Xing 		if (i >= MAX_TRY_TIMES  ||
22273c9b8c3SBeilei Xing 		    adapter->cmd_retval != VIRTCHNL_STATUS_SUCCESS) {
22373c9b8c3SBeilei Xing 			err = -EBUSY;
22473c9b8c3SBeilei Xing 			DRV_LOG(ERR, "No response or return failure (%d) for cmd %d",
22573c9b8c3SBeilei Xing 				adapter->cmd_retval, args->ops);
22673c9b8c3SBeilei Xing 			clear_cmd(adapter);
22773c9b8c3SBeilei Xing 		}
22873c9b8c3SBeilei Xing 		break;
22973c9b8c3SBeilei Xing 	}
23073c9b8c3SBeilei Xing 
23173c9b8c3SBeilei Xing 	return err;
23273c9b8c3SBeilei Xing }
23373c9b8c3SBeilei Xing 
23473c9b8c3SBeilei Xing int
idpf_vc_api_version_check(struct idpf_adapter * adapter)235ba6b8cd4SBeilei Xing idpf_vc_api_version_check(struct idpf_adapter *adapter)
23673c9b8c3SBeilei Xing {
23773c9b8c3SBeilei Xing 	struct virtchnl2_version_info version, *pver;
23873c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
23973c9b8c3SBeilei Xing 	int err;
24073c9b8c3SBeilei Xing 
24173c9b8c3SBeilei Xing 	memset(&version, 0, sizeof(struct virtchnl_version_info));
24273c9b8c3SBeilei Xing 	version.major = VIRTCHNL2_VERSION_MAJOR_2;
24373c9b8c3SBeilei Xing 	version.minor = VIRTCHNL2_VERSION_MINOR_0;
24473c9b8c3SBeilei Xing 
24573c9b8c3SBeilei Xing 	args.ops = VIRTCHNL_OP_VERSION;
24673c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)&version;
24773c9b8c3SBeilei Xing 	args.in_args_size = sizeof(version);
24873c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
24973c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
25073c9b8c3SBeilei Xing 
251ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
25273c9b8c3SBeilei Xing 	if (err != 0) {
25373c9b8c3SBeilei Xing 		DRV_LOG(ERR,
25473c9b8c3SBeilei Xing 			"Failed to execute command of VIRTCHNL_OP_VERSION");
25573c9b8c3SBeilei Xing 		return err;
25673c9b8c3SBeilei Xing 	}
25773c9b8c3SBeilei Xing 
25873c9b8c3SBeilei Xing 	pver = (struct virtchnl2_version_info *)args.out_buffer;
25973c9b8c3SBeilei Xing 	adapter->virtchnl_version = *pver;
26073c9b8c3SBeilei Xing 
26173c9b8c3SBeilei Xing 	if (adapter->virtchnl_version.major != VIRTCHNL2_VERSION_MAJOR_2 ||
26273c9b8c3SBeilei Xing 	    adapter->virtchnl_version.minor != VIRTCHNL2_VERSION_MINOR_0) {
26373c9b8c3SBeilei Xing 		DRV_LOG(ERR, "VIRTCHNL API version mismatch:(%u.%u)-(%u.%u)",
26473c9b8c3SBeilei Xing 			adapter->virtchnl_version.major,
26573c9b8c3SBeilei Xing 			adapter->virtchnl_version.minor,
26673c9b8c3SBeilei Xing 			VIRTCHNL2_VERSION_MAJOR_2,
26773c9b8c3SBeilei Xing 			VIRTCHNL2_VERSION_MINOR_0);
26873c9b8c3SBeilei Xing 		return -EINVAL;
26973c9b8c3SBeilei Xing 	}
27073c9b8c3SBeilei Xing 
27173c9b8c3SBeilei Xing 	return 0;
27273c9b8c3SBeilei Xing }
27373c9b8c3SBeilei Xing 
27473c9b8c3SBeilei Xing int
idpf_vc_caps_get(struct idpf_adapter * adapter)275ba6b8cd4SBeilei Xing idpf_vc_caps_get(struct idpf_adapter *adapter)
27673c9b8c3SBeilei Xing {
27773c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
27873c9b8c3SBeilei Xing 	int err;
27973c9b8c3SBeilei Xing 
28073c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_GET_CAPS;
281fd92bc1aSBeilei Xing 	args.in_args = (uint8_t *)&adapter->caps;
282fd92bc1aSBeilei Xing 	args.in_args_size = sizeof(struct virtchnl2_get_capabilities);
28373c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
28473c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
28573c9b8c3SBeilei Xing 
286ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
28773c9b8c3SBeilei Xing 	if (err != 0) {
28873c9b8c3SBeilei Xing 		DRV_LOG(ERR,
28973c9b8c3SBeilei Xing 			"Failed to execute command of VIRTCHNL2_OP_GET_CAPS");
29073c9b8c3SBeilei Xing 		return err;
29173c9b8c3SBeilei Xing 	}
29273c9b8c3SBeilei Xing 
293fd92bc1aSBeilei Xing 	rte_memcpy(&adapter->caps, args.out_buffer, sizeof(struct virtchnl2_get_capabilities));
29473c9b8c3SBeilei Xing 
29573c9b8c3SBeilei Xing 	return 0;
29673c9b8c3SBeilei Xing }
29773c9b8c3SBeilei Xing 
29873c9b8c3SBeilei Xing int
idpf_vc_vport_create(struct idpf_vport * vport,struct virtchnl2_create_vport * create_vport_info)299ba6b8cd4SBeilei Xing idpf_vc_vport_create(struct idpf_vport *vport,
300c2769cadSBeilei Xing 		     struct virtchnl2_create_vport *create_vport_info)
30173c9b8c3SBeilei Xing {
30273c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
30373c9b8c3SBeilei Xing 	struct virtchnl2_create_vport vport_msg;
30473c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
30573c9b8c3SBeilei Xing 	int err = -1;
30673c9b8c3SBeilei Xing 
30773c9b8c3SBeilei Xing 	memset(&vport_msg, 0, sizeof(struct virtchnl2_create_vport));
308c2769cadSBeilei Xing 	vport_msg.vport_type = create_vport_info->vport_type;
309c2769cadSBeilei Xing 	vport_msg.txq_model = create_vport_info->txq_model;
310c2769cadSBeilei Xing 	vport_msg.rxq_model = create_vport_info->rxq_model;
311c2769cadSBeilei Xing 	vport_msg.num_tx_q = create_vport_info->num_tx_q;
312c2769cadSBeilei Xing 	vport_msg.num_tx_complq = create_vport_info->num_tx_complq;
313c2769cadSBeilei Xing 	vport_msg.num_rx_q = create_vport_info->num_rx_q;
314c2769cadSBeilei Xing 	vport_msg.num_rx_bufq = create_vport_info->num_rx_bufq;
31573c9b8c3SBeilei Xing 
31673c9b8c3SBeilei Xing 	memset(&args, 0, sizeof(args));
31773c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_CREATE_VPORT;
31873c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)&vport_msg;
31973c9b8c3SBeilei Xing 	args.in_args_size = sizeof(vport_msg);
32073c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
32173c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
32273c9b8c3SBeilei Xing 
323ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
32473c9b8c3SBeilei Xing 	if (err != 0) {
32573c9b8c3SBeilei Xing 		DRV_LOG(ERR,
32673c9b8c3SBeilei Xing 			"Failed to execute command of VIRTCHNL2_OP_CREATE_VPORT");
32773c9b8c3SBeilei Xing 		return err;
32873c9b8c3SBeilei Xing 	}
32973c9b8c3SBeilei Xing 
330c2769cadSBeilei Xing 	rte_memcpy(&(vport->vport_info.info), args.out_buffer, IDPF_DFLT_MBX_BUF_SIZE);
33173c9b8c3SBeilei Xing 	return 0;
33273c9b8c3SBeilei Xing }
33373c9b8c3SBeilei Xing 
33473c9b8c3SBeilei Xing int
idpf_vc_vport_destroy(struct idpf_vport * vport)335ba6b8cd4SBeilei Xing idpf_vc_vport_destroy(struct idpf_vport *vport)
33673c9b8c3SBeilei Xing {
33773c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
33873c9b8c3SBeilei Xing 	struct virtchnl2_vport vc_vport;
33973c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
34073c9b8c3SBeilei Xing 	int err;
34173c9b8c3SBeilei Xing 
34273c9b8c3SBeilei Xing 	vc_vport.vport_id = vport->vport_id;
34373c9b8c3SBeilei Xing 
34473c9b8c3SBeilei Xing 	memset(&args, 0, sizeof(args));
34573c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_DESTROY_VPORT;
34673c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)&vc_vport;
34773c9b8c3SBeilei Xing 	args.in_args_size = sizeof(vc_vport);
34873c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
34973c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
35073c9b8c3SBeilei Xing 
351ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
35273c9b8c3SBeilei Xing 	if (err != 0)
35373c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_DESTROY_VPORT");
35473c9b8c3SBeilei Xing 
35573c9b8c3SBeilei Xing 	return err;
35673c9b8c3SBeilei Xing }
35773c9b8c3SBeilei Xing 
35873c9b8c3SBeilei Xing int
idpf_vc_queue_grps_add(struct idpf_vport * vport,struct virtchnl2_add_queue_groups * p2p_queue_grps_info,uint8_t * p2p_queue_grps_out)35978423e76SBeilei Xing idpf_vc_queue_grps_add(struct idpf_vport *vport,
36078423e76SBeilei Xing 		       struct virtchnl2_add_queue_groups *p2p_queue_grps_info,
36178423e76SBeilei Xing 		       uint8_t *p2p_queue_grps_out)
36278423e76SBeilei Xing {
36378423e76SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
36478423e76SBeilei Xing 	struct idpf_cmd_info args;
36578423e76SBeilei Xing 	int size, qg_info_size;
36678423e76SBeilei Xing 	int err = -1;
36778423e76SBeilei Xing 
36878423e76SBeilei Xing 	size = sizeof(*p2p_queue_grps_info) +
3691203f94aSSoumyadeep Hore 	       (p2p_queue_grps_info->num_queue_groups - 1) *
37078423e76SBeilei Xing 		   sizeof(struct virtchnl2_queue_group_info);
37178423e76SBeilei Xing 
37278423e76SBeilei Xing 	memset(&args, 0, sizeof(args));
37378423e76SBeilei Xing 	args.ops = VIRTCHNL2_OP_ADD_QUEUE_GROUPS;
37478423e76SBeilei Xing 	args.in_args = (uint8_t *)p2p_queue_grps_info;
37578423e76SBeilei Xing 	args.in_args_size = size;
37678423e76SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
37778423e76SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
37878423e76SBeilei Xing 
37978423e76SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
38078423e76SBeilei Xing 	if (err != 0) {
38178423e76SBeilei Xing 		DRV_LOG(ERR,
38278423e76SBeilei Xing 			"Failed to execute command of VIRTCHNL2_OP_ADD_QUEUE_GROUPS");
38378423e76SBeilei Xing 		return err;
38478423e76SBeilei Xing 	}
38578423e76SBeilei Xing 
38678423e76SBeilei Xing 	rte_memcpy(p2p_queue_grps_out, args.out_buffer, IDPF_DFLT_MBX_BUF_SIZE);
38778423e76SBeilei Xing 	return 0;
38878423e76SBeilei Xing }
38978423e76SBeilei Xing 
idpf_vc_queue_grps_del(struct idpf_vport * vport,uint16_t num_q_grps,struct virtchnl2_queue_group_id * qg_ids)39078423e76SBeilei Xing int idpf_vc_queue_grps_del(struct idpf_vport *vport,
39178423e76SBeilei Xing 			  uint16_t num_q_grps,
39278423e76SBeilei Xing 			  struct virtchnl2_queue_group_id *qg_ids)
39378423e76SBeilei Xing {
39478423e76SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
39578423e76SBeilei Xing 	struct virtchnl2_delete_queue_groups *vc_del_q_grps;
39678423e76SBeilei Xing 	struct idpf_cmd_info args;
39778423e76SBeilei Xing 	int size;
39878423e76SBeilei Xing 	int err;
39978423e76SBeilei Xing 
40078423e76SBeilei Xing 	size = sizeof(*vc_del_q_grps) +
40178423e76SBeilei Xing 	       (num_q_grps - 1) * sizeof(struct virtchnl2_queue_group_id);
40278423e76SBeilei Xing 	vc_del_q_grps = rte_zmalloc("vc_del_q_grps", size, 0);
40378423e76SBeilei Xing 
40478423e76SBeilei Xing 	vc_del_q_grps->vport_id = vport->vport_id;
40578423e76SBeilei Xing 	vc_del_q_grps->num_queue_groups = num_q_grps;
40678423e76SBeilei Xing 	memcpy(vc_del_q_grps->qg_ids, qg_ids,
40778423e76SBeilei Xing 	       num_q_grps * sizeof(struct virtchnl2_queue_group_id));
40878423e76SBeilei Xing 
40978423e76SBeilei Xing 	memset(&args, 0, sizeof(args));
41078423e76SBeilei Xing 	args.ops = VIRTCHNL2_OP_DEL_QUEUE_GROUPS;
41178423e76SBeilei Xing 	args.in_args = (uint8_t *)vc_del_q_grps;
41278423e76SBeilei Xing 	args.in_args_size = size;
41378423e76SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
41478423e76SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
41578423e76SBeilei Xing 
41678423e76SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
41778423e76SBeilei Xing 	if (err != 0)
41878423e76SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_DEL_QUEUE_GROUPS");
41978423e76SBeilei Xing 
42078423e76SBeilei Xing 	rte_free(vc_del_q_grps);
42178423e76SBeilei Xing 	return err;
42278423e76SBeilei Xing }
42378423e76SBeilei Xing 
42478423e76SBeilei Xing int
idpf_vc_rss_key_set(struct idpf_vport * vport)425ba6b8cd4SBeilei Xing idpf_vc_rss_key_set(struct idpf_vport *vport)
42673c9b8c3SBeilei Xing {
42773c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
42873c9b8c3SBeilei Xing 	struct virtchnl2_rss_key *rss_key;
42973c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
43073c9b8c3SBeilei Xing 	int len, err;
43173c9b8c3SBeilei Xing 
43273c9b8c3SBeilei Xing 	len = sizeof(*rss_key) + sizeof(rss_key->key[0]) *
43373c9b8c3SBeilei Xing 		(vport->rss_key_size - 1);
43473c9b8c3SBeilei Xing 	rss_key = rte_zmalloc("rss_key", len, 0);
43573c9b8c3SBeilei Xing 	if (rss_key == NULL)
43673c9b8c3SBeilei Xing 		return -ENOMEM;
43773c9b8c3SBeilei Xing 
43873c9b8c3SBeilei Xing 	rss_key->vport_id = vport->vport_id;
43973c9b8c3SBeilei Xing 	rss_key->key_len = vport->rss_key_size;
44073c9b8c3SBeilei Xing 	rte_memcpy(rss_key->key, vport->rss_key,
44173c9b8c3SBeilei Xing 		   sizeof(rss_key->key[0]) * vport->rss_key_size);
44273c9b8c3SBeilei Xing 
44373c9b8c3SBeilei Xing 	memset(&args, 0, sizeof(args));
44473c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_SET_RSS_KEY;
44573c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)rss_key;
44673c9b8c3SBeilei Xing 	args.in_args_size = len;
44773c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
44873c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
44973c9b8c3SBeilei Xing 
450ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
45173c9b8c3SBeilei Xing 	if (err != 0)
45273c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_SET_RSS_KEY");
45373c9b8c3SBeilei Xing 
45473c9b8c3SBeilei Xing 	rte_free(rss_key);
45573c9b8c3SBeilei Xing 	return err;
45673c9b8c3SBeilei Xing }
45773c9b8c3SBeilei Xing 
idpf_vc_rss_key_get(struct idpf_vport * vport)458e4f3de91SMingxia Liu int idpf_vc_rss_key_get(struct idpf_vport *vport)
459e4f3de91SMingxia Liu {
460e4f3de91SMingxia Liu 	struct idpf_adapter *adapter = vport->adapter;
461e4f3de91SMingxia Liu 	struct virtchnl2_rss_key *rss_key_ret;
462e4f3de91SMingxia Liu 	struct virtchnl2_rss_key rss_key;
463e4f3de91SMingxia Liu 	struct idpf_cmd_info args;
464e4f3de91SMingxia Liu 	int err;
465e4f3de91SMingxia Liu 
466e4f3de91SMingxia Liu 	memset(&rss_key, 0, sizeof(rss_key));
467e4f3de91SMingxia Liu 	rss_key.vport_id = vport->vport_id;
468e4f3de91SMingxia Liu 
469e4f3de91SMingxia Liu 	memset(&args, 0, sizeof(args));
470e4f3de91SMingxia Liu 	args.ops = VIRTCHNL2_OP_GET_RSS_KEY;
471e4f3de91SMingxia Liu 	args.in_args = (uint8_t *)&rss_key;
472e4f3de91SMingxia Liu 	args.in_args_size = sizeof(rss_key);
473e4f3de91SMingxia Liu 	args.out_buffer = adapter->mbx_resp;
474e4f3de91SMingxia Liu 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
475e4f3de91SMingxia Liu 
476e4f3de91SMingxia Liu 	err = idpf_vc_cmd_execute(adapter, &args);
477e4f3de91SMingxia Liu 
478e4f3de91SMingxia Liu 	if (!err) {
479e4f3de91SMingxia Liu 		rss_key_ret = (struct virtchnl2_rss_key *)args.out_buffer;
480e4f3de91SMingxia Liu 		if (rss_key_ret->key_len != vport->rss_key_size) {
481e4f3de91SMingxia Liu 			rte_free(vport->rss_key);
482e4f3de91SMingxia Liu 			vport->rss_key = NULL;
483e4f3de91SMingxia Liu 			vport->rss_key_size = RTE_MIN(IDPF_RSS_KEY_LEN,
484e4f3de91SMingxia Liu 						      rss_key_ret->key_len);
485e4f3de91SMingxia Liu 			vport->rss_key = rte_zmalloc("rss_key", vport->rss_key_size, 0);
486e4f3de91SMingxia Liu 			if (!vport->rss_key) {
487e4f3de91SMingxia Liu 				vport->rss_key_size = 0;
488e4f3de91SMingxia Liu 				DRV_LOG(ERR, "Failed to allocate RSS key");
489e4f3de91SMingxia Liu 				return -ENOMEM;
490e4f3de91SMingxia Liu 			}
491e4f3de91SMingxia Liu 		}
492e4f3de91SMingxia Liu 		rte_memcpy(vport->rss_key, rss_key_ret->key, vport->rss_key_size);
493e4f3de91SMingxia Liu 	} else {
494e4f3de91SMingxia Liu 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_GET_RSS_KEY");
495e4f3de91SMingxia Liu 	}
496e4f3de91SMingxia Liu 
497e4f3de91SMingxia Liu 	return err;
498e4f3de91SMingxia Liu }
499e4f3de91SMingxia Liu 
50073c9b8c3SBeilei Xing int
idpf_vc_rss_lut_set(struct idpf_vport * vport)501ba6b8cd4SBeilei Xing idpf_vc_rss_lut_set(struct idpf_vport *vport)
50273c9b8c3SBeilei Xing {
50373c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
50473c9b8c3SBeilei Xing 	struct virtchnl2_rss_lut *rss_lut;
50573c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
50673c9b8c3SBeilei Xing 	int len, err;
50773c9b8c3SBeilei Xing 
50873c9b8c3SBeilei Xing 	len = sizeof(*rss_lut) + sizeof(rss_lut->lut[0]) *
50973c9b8c3SBeilei Xing 		(vport->rss_lut_size - 1);
51073c9b8c3SBeilei Xing 	rss_lut = rte_zmalloc("rss_lut", len, 0);
51173c9b8c3SBeilei Xing 	if (rss_lut == NULL)
51273c9b8c3SBeilei Xing 		return -ENOMEM;
51373c9b8c3SBeilei Xing 
51473c9b8c3SBeilei Xing 	rss_lut->vport_id = vport->vport_id;
51573c9b8c3SBeilei Xing 	rss_lut->lut_entries = vport->rss_lut_size;
51673c9b8c3SBeilei Xing 	rte_memcpy(rss_lut->lut, vport->rss_lut,
51773c9b8c3SBeilei Xing 		   sizeof(rss_lut->lut[0]) * vport->rss_lut_size);
51873c9b8c3SBeilei Xing 
51973c9b8c3SBeilei Xing 	memset(&args, 0, sizeof(args));
52073c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_SET_RSS_LUT;
52173c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)rss_lut;
52273c9b8c3SBeilei Xing 	args.in_args_size = len;
52373c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
52473c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
52573c9b8c3SBeilei Xing 
526ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
52773c9b8c3SBeilei Xing 	if (err != 0)
52873c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_SET_RSS_LUT");
52973c9b8c3SBeilei Xing 
53073c9b8c3SBeilei Xing 	rte_free(rss_lut);
53173c9b8c3SBeilei Xing 	return err;
53273c9b8c3SBeilei Xing }
53373c9b8c3SBeilei Xing 
53473c9b8c3SBeilei Xing int
idpf_vc_rss_lut_get(struct idpf_vport * vport)535e4f3de91SMingxia Liu idpf_vc_rss_lut_get(struct idpf_vport *vport)
536e4f3de91SMingxia Liu {
537e4f3de91SMingxia Liu 	struct idpf_adapter *adapter = vport->adapter;
538e4f3de91SMingxia Liu 	struct virtchnl2_rss_lut *rss_lut_ret;
539e4f3de91SMingxia Liu 	struct virtchnl2_rss_lut rss_lut;
540e4f3de91SMingxia Liu 	struct idpf_cmd_info args;
541e4f3de91SMingxia Liu 	int err;
542e4f3de91SMingxia Liu 
543e4f3de91SMingxia Liu 	memset(&rss_lut, 0, sizeof(rss_lut));
544e4f3de91SMingxia Liu 	rss_lut.vport_id = vport->vport_id;
545e4f3de91SMingxia Liu 
546e4f3de91SMingxia Liu 	memset(&args, 0, sizeof(args));
547e4f3de91SMingxia Liu 	args.ops = VIRTCHNL2_OP_GET_RSS_LUT;
548e4f3de91SMingxia Liu 	args.in_args = (uint8_t *)&rss_lut;
549e4f3de91SMingxia Liu 	args.in_args_size = sizeof(rss_lut);
550e4f3de91SMingxia Liu 	args.out_buffer = adapter->mbx_resp;
551e4f3de91SMingxia Liu 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
552e4f3de91SMingxia Liu 
553e4f3de91SMingxia Liu 	err = idpf_vc_cmd_execute(adapter, &args);
554e4f3de91SMingxia Liu 
555e4f3de91SMingxia Liu 	if (!err) {
556e4f3de91SMingxia Liu 		rss_lut_ret = (struct virtchnl2_rss_lut *)args.out_buffer;
557e4f3de91SMingxia Liu 		if (rss_lut_ret->lut_entries != vport->rss_lut_size) {
558e4f3de91SMingxia Liu 			rte_free(vport->rss_lut);
559e4f3de91SMingxia Liu 			vport->rss_lut = NULL;
560e4f3de91SMingxia Liu 			vport->rss_lut = rte_zmalloc("rss_lut",
561e4f3de91SMingxia Liu 				     sizeof(uint32_t) * rss_lut_ret->lut_entries, 0);
562e4f3de91SMingxia Liu 			if (vport->rss_lut == NULL) {
563e4f3de91SMingxia Liu 				DRV_LOG(ERR, "Failed to allocate RSS lut");
564e4f3de91SMingxia Liu 				return -ENOMEM;
565e4f3de91SMingxia Liu 			}
566e4f3de91SMingxia Liu 		}
567e4f3de91SMingxia Liu 		rte_memcpy(vport->rss_lut, rss_lut_ret->lut, rss_lut_ret->lut_entries);
568e4f3de91SMingxia Liu 		vport->rss_lut_size = rss_lut_ret->lut_entries;
569e4f3de91SMingxia Liu 	} else {
570e4f3de91SMingxia Liu 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_GET_RSS_LUT");
571e4f3de91SMingxia Liu 	}
572e4f3de91SMingxia Liu 
573e4f3de91SMingxia Liu 	return err;
574e4f3de91SMingxia Liu }
575e4f3de91SMingxia Liu 
576e4f3de91SMingxia Liu int
idpf_vc_rss_hash_get(struct idpf_vport * vport)577e4f3de91SMingxia Liu idpf_vc_rss_hash_get(struct idpf_vport *vport)
578e4f3de91SMingxia Liu {
579e4f3de91SMingxia Liu 	struct idpf_adapter *adapter = vport->adapter;
580e4f3de91SMingxia Liu 	struct virtchnl2_rss_hash *rss_hash_ret;
581e4f3de91SMingxia Liu 	struct virtchnl2_rss_hash rss_hash;
582e4f3de91SMingxia Liu 	struct idpf_cmd_info args;
583e4f3de91SMingxia Liu 	int err;
584e4f3de91SMingxia Liu 
585e4f3de91SMingxia Liu 	memset(&rss_hash, 0, sizeof(rss_hash));
586e4f3de91SMingxia Liu 	rss_hash.ptype_groups = vport->rss_hf;
587e4f3de91SMingxia Liu 	rss_hash.vport_id = vport->vport_id;
588e4f3de91SMingxia Liu 
589e4f3de91SMingxia Liu 	memset(&args, 0, sizeof(args));
590e4f3de91SMingxia Liu 	args.ops = VIRTCHNL2_OP_GET_RSS_HASH;
591e4f3de91SMingxia Liu 	args.in_args = (uint8_t *)&rss_hash;
592e4f3de91SMingxia Liu 	args.in_args_size = sizeof(rss_hash);
593e4f3de91SMingxia Liu 	args.out_buffer = adapter->mbx_resp;
594e4f3de91SMingxia Liu 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
595e4f3de91SMingxia Liu 
596e4f3de91SMingxia Liu 	err = idpf_vc_cmd_execute(adapter, &args);
597e4f3de91SMingxia Liu 
598e4f3de91SMingxia Liu 	if (!err) {
599e4f3de91SMingxia Liu 		rss_hash_ret = (struct virtchnl2_rss_hash *)args.out_buffer;
600e4f3de91SMingxia Liu 		vport->rss_hf = rss_hash_ret->ptype_groups;
601e4f3de91SMingxia Liu 	} else {
602e4f3de91SMingxia Liu 		DRV_LOG(ERR, "Failed to execute command of OP_GET_RSS_HASH");
603e4f3de91SMingxia Liu 	}
604e4f3de91SMingxia Liu 
605e4f3de91SMingxia Liu 	return err;
606e4f3de91SMingxia Liu }
607e4f3de91SMingxia Liu 
608e4f3de91SMingxia Liu int
idpf_vc_rss_hash_set(struct idpf_vport * vport)609ba6b8cd4SBeilei Xing idpf_vc_rss_hash_set(struct idpf_vport *vport)
61073c9b8c3SBeilei Xing {
61173c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
61273c9b8c3SBeilei Xing 	struct virtchnl2_rss_hash rss_hash;
61373c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
61473c9b8c3SBeilei Xing 	int err;
61573c9b8c3SBeilei Xing 
61673c9b8c3SBeilei Xing 	memset(&rss_hash, 0, sizeof(rss_hash));
61773c9b8c3SBeilei Xing 	rss_hash.ptype_groups = vport->rss_hf;
61873c9b8c3SBeilei Xing 	rss_hash.vport_id = vport->vport_id;
61973c9b8c3SBeilei Xing 
62073c9b8c3SBeilei Xing 	memset(&args, 0, sizeof(args));
62173c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_SET_RSS_HASH;
62273c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)&rss_hash;
62373c9b8c3SBeilei Xing 	args.in_args_size = sizeof(rss_hash);
62473c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
62573c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
62673c9b8c3SBeilei Xing 
627ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
62873c9b8c3SBeilei Xing 	if (err != 0)
62973c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of OP_SET_RSS_HASH");
63073c9b8c3SBeilei Xing 
63173c9b8c3SBeilei Xing 	return err;
63273c9b8c3SBeilei Xing }
63373c9b8c3SBeilei Xing 
63473c9b8c3SBeilei Xing int
idpf_vc_irq_map_unmap_config(struct idpf_vport * vport,uint16_t nb_rxq,bool map)635ba6b8cd4SBeilei Xing idpf_vc_irq_map_unmap_config(struct idpf_vport *vport, uint16_t nb_rxq, bool map)
63673c9b8c3SBeilei Xing {
63773c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
63873c9b8c3SBeilei Xing 	struct virtchnl2_queue_vector_maps *map_info;
63973c9b8c3SBeilei Xing 	struct virtchnl2_queue_vector *vecmap;
64073c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
64173c9b8c3SBeilei Xing 	int len, i, err = 0;
64273c9b8c3SBeilei Xing 
64373c9b8c3SBeilei Xing 	len = sizeof(struct virtchnl2_queue_vector_maps) +
64473c9b8c3SBeilei Xing 		(nb_rxq - 1) * sizeof(struct virtchnl2_queue_vector);
64573c9b8c3SBeilei Xing 
64673c9b8c3SBeilei Xing 	map_info = rte_zmalloc("map_info", len, 0);
64773c9b8c3SBeilei Xing 	if (map_info == NULL)
64873c9b8c3SBeilei Xing 		return -ENOMEM;
64973c9b8c3SBeilei Xing 
65073c9b8c3SBeilei Xing 	map_info->vport_id = vport->vport_id;
65173c9b8c3SBeilei Xing 	map_info->num_qv_maps = nb_rxq;
65273c9b8c3SBeilei Xing 	for (i = 0; i < nb_rxq; i++) {
65373c9b8c3SBeilei Xing 		vecmap = &map_info->qv_maps[i];
65473c9b8c3SBeilei Xing 		vecmap->queue_id = vport->qv_map[i].queue_id;
65573c9b8c3SBeilei Xing 		vecmap->vector_id = vport->qv_map[i].vector_id;
65673c9b8c3SBeilei Xing 		vecmap->itr_idx = VIRTCHNL2_ITR_IDX_0;
65773c9b8c3SBeilei Xing 		vecmap->queue_type = VIRTCHNL2_QUEUE_TYPE_RX;
65873c9b8c3SBeilei Xing 	}
65973c9b8c3SBeilei Xing 
66073c9b8c3SBeilei Xing 	args.ops = map ? VIRTCHNL2_OP_MAP_QUEUE_VECTOR :
66173c9b8c3SBeilei Xing 		VIRTCHNL2_OP_UNMAP_QUEUE_VECTOR;
66273c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)map_info;
66373c9b8c3SBeilei Xing 	args.in_args_size = len;
66473c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
66573c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
666ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
66773c9b8c3SBeilei Xing 	if (err != 0)
66873c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_%s_QUEUE_VECTOR",
66973c9b8c3SBeilei Xing 			map ? "MAP" : "UNMAP");
67073c9b8c3SBeilei Xing 
67173c9b8c3SBeilei Xing 	rte_free(map_info);
67273c9b8c3SBeilei Xing 	return err;
67373c9b8c3SBeilei Xing }
67473c9b8c3SBeilei Xing 
67573c9b8c3SBeilei Xing int
idpf_vc_vectors_alloc(struct idpf_vport * vport,uint16_t num_vectors)676ba6b8cd4SBeilei Xing idpf_vc_vectors_alloc(struct idpf_vport *vport, uint16_t num_vectors)
67773c9b8c3SBeilei Xing {
67873c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
67973c9b8c3SBeilei Xing 	struct virtchnl2_alloc_vectors *alloc_vec;
68073c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
68173c9b8c3SBeilei Xing 	int err, len;
68273c9b8c3SBeilei Xing 
68373c9b8c3SBeilei Xing 	len = sizeof(struct virtchnl2_alloc_vectors) +
68473c9b8c3SBeilei Xing 		(num_vectors - 1) * sizeof(struct virtchnl2_vector_chunk);
68573c9b8c3SBeilei Xing 	alloc_vec = rte_zmalloc("alloc_vec", len, 0);
68673c9b8c3SBeilei Xing 	if (alloc_vec == NULL)
68773c9b8c3SBeilei Xing 		return -ENOMEM;
68873c9b8c3SBeilei Xing 
68973c9b8c3SBeilei Xing 	alloc_vec->num_vectors = num_vectors;
69073c9b8c3SBeilei Xing 
69173c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_ALLOC_VECTORS;
69273c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)alloc_vec;
69373c9b8c3SBeilei Xing 	args.in_args_size = len;
69473c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
69573c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
696ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
69773c9b8c3SBeilei Xing 	if (err != 0)
69873c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command VIRTCHNL2_OP_ALLOC_VECTORS");
69973c9b8c3SBeilei Xing 
70073c9b8c3SBeilei Xing 	rte_memcpy(vport->recv_vectors, args.out_buffer, len);
70173c9b8c3SBeilei Xing 	rte_free(alloc_vec);
70273c9b8c3SBeilei Xing 	return err;
70373c9b8c3SBeilei Xing }
70473c9b8c3SBeilei Xing 
70573c9b8c3SBeilei Xing int
idpf_vc_vectors_dealloc(struct idpf_vport * vport)706ba6b8cd4SBeilei Xing idpf_vc_vectors_dealloc(struct idpf_vport *vport)
70773c9b8c3SBeilei Xing {
70873c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
70973c9b8c3SBeilei Xing 	struct virtchnl2_alloc_vectors *alloc_vec;
71073c9b8c3SBeilei Xing 	struct virtchnl2_vector_chunks *vcs;
71173c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
71273c9b8c3SBeilei Xing 	int err, len;
71373c9b8c3SBeilei Xing 
71473c9b8c3SBeilei Xing 	alloc_vec = vport->recv_vectors;
71573c9b8c3SBeilei Xing 	vcs = &alloc_vec->vchunks;
71673c9b8c3SBeilei Xing 
71773c9b8c3SBeilei Xing 	len = sizeof(struct virtchnl2_vector_chunks) +
71873c9b8c3SBeilei Xing 		(vcs->num_vchunks - 1) * sizeof(struct virtchnl2_vector_chunk);
71973c9b8c3SBeilei Xing 
72073c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_DEALLOC_VECTORS;
72173c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)vcs;
72273c9b8c3SBeilei Xing 	args.in_args_size = len;
72373c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
72473c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
725ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
72673c9b8c3SBeilei Xing 	if (err != 0)
72773c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command VIRTCHNL2_OP_DEALLOC_VECTORS");
72873c9b8c3SBeilei Xing 
72973c9b8c3SBeilei Xing 	return err;
73073c9b8c3SBeilei Xing }
73173c9b8c3SBeilei Xing 
7321dae095fSBeilei Xing int
idpf_vc_ena_dis_one_queue(struct idpf_vport * vport,uint16_t qid,uint32_t type,bool on)73373c9b8c3SBeilei Xing idpf_vc_ena_dis_one_queue(struct idpf_vport *vport, uint16_t qid,
73473c9b8c3SBeilei Xing 			  uint32_t type, bool on)
73573c9b8c3SBeilei Xing {
73673c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
73773c9b8c3SBeilei Xing 	struct virtchnl2_del_ena_dis_queues *queue_select;
73873c9b8c3SBeilei Xing 	struct virtchnl2_queue_chunk *queue_chunk;
73973c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
74073c9b8c3SBeilei Xing 	int err, len;
74173c9b8c3SBeilei Xing 
74273c9b8c3SBeilei Xing 	len = sizeof(struct virtchnl2_del_ena_dis_queues);
74373c9b8c3SBeilei Xing 	queue_select = rte_zmalloc("queue_select", len, 0);
74473c9b8c3SBeilei Xing 	if (queue_select == NULL)
74573c9b8c3SBeilei Xing 		return -ENOMEM;
74673c9b8c3SBeilei Xing 
74773c9b8c3SBeilei Xing 	queue_chunk = queue_select->chunks.chunks;
74873c9b8c3SBeilei Xing 	queue_select->chunks.num_chunks = 1;
74973c9b8c3SBeilei Xing 	queue_select->vport_id = vport->vport_id;
75073c9b8c3SBeilei Xing 
75173c9b8c3SBeilei Xing 	queue_chunk->type = type;
75273c9b8c3SBeilei Xing 	queue_chunk->start_queue_id = qid;
75373c9b8c3SBeilei Xing 	queue_chunk->num_queues = 1;
75473c9b8c3SBeilei Xing 
75573c9b8c3SBeilei Xing 	args.ops = on ? VIRTCHNL2_OP_ENABLE_QUEUES :
75673c9b8c3SBeilei Xing 		VIRTCHNL2_OP_DISABLE_QUEUES;
75773c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)queue_select;
75873c9b8c3SBeilei Xing 	args.in_args_size = len;
75973c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
76073c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
761ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
76273c9b8c3SBeilei Xing 	if (err != 0)
76373c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_%s_QUEUES",
76473c9b8c3SBeilei Xing 			on ? "ENABLE" : "DISABLE");
76573c9b8c3SBeilei Xing 
76673c9b8c3SBeilei Xing 	rte_free(queue_select);
76773c9b8c3SBeilei Xing 	return err;
76873c9b8c3SBeilei Xing }
76973c9b8c3SBeilei Xing 
77073c9b8c3SBeilei Xing int
idpf_vc_queue_switch(struct idpf_vport * vport,uint16_t qid,bool rx,bool on,uint32_t type)771ba6b8cd4SBeilei Xing idpf_vc_queue_switch(struct idpf_vport *vport, uint16_t qid,
772*ff0e6d8eSSoumyadeep Hore 		     bool rx, bool on, uint32_t type)
77373c9b8c3SBeilei Xing {
77473c9b8c3SBeilei Xing 	int err, queue_id;
77573c9b8c3SBeilei Xing 
776*ff0e6d8eSSoumyadeep Hore 	if (rx)
77773c9b8c3SBeilei Xing 		queue_id = vport->chunks_info.rx_start_qid + qid;
77873c9b8c3SBeilei Xing 	else
77973c9b8c3SBeilei Xing 		queue_id = vport->chunks_info.tx_start_qid + qid;
78073c9b8c3SBeilei Xing 	err = idpf_vc_ena_dis_one_queue(vport, queue_id, type, on);
78173c9b8c3SBeilei Xing 	if (err != 0)
78273c9b8c3SBeilei Xing 		return err;
78373c9b8c3SBeilei Xing 
78473c9b8c3SBeilei Xing 	/* switch tx completion queue */
78573c9b8c3SBeilei Xing 	if (!rx && vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
78673c9b8c3SBeilei Xing 		type = VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION;
78773c9b8c3SBeilei Xing 		queue_id = vport->chunks_info.tx_compl_start_qid + qid;
78873c9b8c3SBeilei Xing 		err = idpf_vc_ena_dis_one_queue(vport, queue_id, type, on);
78973c9b8c3SBeilei Xing 		if (err != 0)
79073c9b8c3SBeilei Xing 			return err;
79173c9b8c3SBeilei Xing 	}
79273c9b8c3SBeilei Xing 
79373c9b8c3SBeilei Xing 	/* switch rx buffer queue */
79473c9b8c3SBeilei Xing 	if (rx && vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
79573c9b8c3SBeilei Xing 		type = VIRTCHNL2_QUEUE_TYPE_RX_BUFFER;
79673c9b8c3SBeilei Xing 		queue_id = vport->chunks_info.rx_buf_start_qid + 2 * qid;
79773c9b8c3SBeilei Xing 		err = idpf_vc_ena_dis_one_queue(vport, queue_id, type, on);
79873c9b8c3SBeilei Xing 		if (err != 0)
79973c9b8c3SBeilei Xing 			return err;
80073c9b8c3SBeilei Xing 		queue_id++;
80173c9b8c3SBeilei Xing 		err = idpf_vc_ena_dis_one_queue(vport, queue_id, type, on);
80273c9b8c3SBeilei Xing 		if (err != 0)
80373c9b8c3SBeilei Xing 			return err;
80473c9b8c3SBeilei Xing 	}
80573c9b8c3SBeilei Xing 
80673c9b8c3SBeilei Xing 	return err;
80773c9b8c3SBeilei Xing }
80873c9b8c3SBeilei Xing 
80973c9b8c3SBeilei Xing #define IDPF_RXTX_QUEUE_CHUNKS_NUM	2
81073c9b8c3SBeilei Xing int
idpf_vc_queues_ena_dis(struct idpf_vport * vport,bool enable)811ba6b8cd4SBeilei Xing idpf_vc_queues_ena_dis(struct idpf_vport *vport, bool enable)
81273c9b8c3SBeilei Xing {
81373c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
81473c9b8c3SBeilei Xing 	struct virtchnl2_del_ena_dis_queues *queue_select;
81573c9b8c3SBeilei Xing 	struct virtchnl2_queue_chunk *queue_chunk;
81673c9b8c3SBeilei Xing 	uint32_t type;
81773c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
81873c9b8c3SBeilei Xing 	uint16_t num_chunks;
81973c9b8c3SBeilei Xing 	int err, len;
82073c9b8c3SBeilei Xing 
82173c9b8c3SBeilei Xing 	num_chunks = IDPF_RXTX_QUEUE_CHUNKS_NUM;
82273c9b8c3SBeilei Xing 	if (vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT)
82373c9b8c3SBeilei Xing 		num_chunks++;
82473c9b8c3SBeilei Xing 	if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT)
82573c9b8c3SBeilei Xing 		num_chunks++;
82673c9b8c3SBeilei Xing 
82773c9b8c3SBeilei Xing 	len = sizeof(struct virtchnl2_del_ena_dis_queues) +
82873c9b8c3SBeilei Xing 		sizeof(struct virtchnl2_queue_chunk) * (num_chunks - 1);
82973c9b8c3SBeilei Xing 	queue_select = rte_zmalloc("queue_select", len, 0);
83073c9b8c3SBeilei Xing 	if (queue_select == NULL)
83173c9b8c3SBeilei Xing 		return -ENOMEM;
83273c9b8c3SBeilei Xing 
83373c9b8c3SBeilei Xing 	queue_chunk = queue_select->chunks.chunks;
83473c9b8c3SBeilei Xing 	queue_select->chunks.num_chunks = num_chunks;
83573c9b8c3SBeilei Xing 	queue_select->vport_id = vport->vport_id;
83673c9b8c3SBeilei Xing 
83773c9b8c3SBeilei Xing 	type = VIRTCHNL_QUEUE_TYPE_RX;
83873c9b8c3SBeilei Xing 	queue_chunk[type].type = type;
83973c9b8c3SBeilei Xing 	queue_chunk[type].start_queue_id = vport->chunks_info.rx_start_qid;
84073c9b8c3SBeilei Xing 	queue_chunk[type].num_queues = vport->num_rx_q;
84173c9b8c3SBeilei Xing 
84273c9b8c3SBeilei Xing 	type = VIRTCHNL2_QUEUE_TYPE_TX;
84373c9b8c3SBeilei Xing 	queue_chunk[type].type = type;
84473c9b8c3SBeilei Xing 	queue_chunk[type].start_queue_id = vport->chunks_info.tx_start_qid;
84573c9b8c3SBeilei Xing 	queue_chunk[type].num_queues = vport->num_tx_q;
84673c9b8c3SBeilei Xing 
84773c9b8c3SBeilei Xing 	if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
84873c9b8c3SBeilei Xing 		type = VIRTCHNL2_QUEUE_TYPE_RX_BUFFER;
84973c9b8c3SBeilei Xing 		queue_chunk[type].type = type;
85073c9b8c3SBeilei Xing 		queue_chunk[type].start_queue_id =
85173c9b8c3SBeilei Xing 			vport->chunks_info.rx_buf_start_qid;
85273c9b8c3SBeilei Xing 		queue_chunk[type].num_queues = vport->num_rx_bufq;
85373c9b8c3SBeilei Xing 	}
85473c9b8c3SBeilei Xing 
85573c9b8c3SBeilei Xing 	if (vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SPLIT) {
85673c9b8c3SBeilei Xing 		type = VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION;
85773c9b8c3SBeilei Xing 		queue_chunk[type].type = type;
85873c9b8c3SBeilei Xing 		queue_chunk[type].start_queue_id =
85973c9b8c3SBeilei Xing 			vport->chunks_info.tx_compl_start_qid;
86073c9b8c3SBeilei Xing 		queue_chunk[type].num_queues = vport->num_tx_complq;
86173c9b8c3SBeilei Xing 	}
86273c9b8c3SBeilei Xing 
86373c9b8c3SBeilei Xing 	args.ops = enable ? VIRTCHNL2_OP_ENABLE_QUEUES :
86473c9b8c3SBeilei Xing 		VIRTCHNL2_OP_DISABLE_QUEUES;
86573c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)queue_select;
86673c9b8c3SBeilei Xing 	args.in_args_size = len;
86773c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
86873c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
869ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
87073c9b8c3SBeilei Xing 	if (err != 0)
87173c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_%s_QUEUES",
87273c9b8c3SBeilei Xing 			enable ? "ENABLE" : "DISABLE");
87373c9b8c3SBeilei Xing 
87473c9b8c3SBeilei Xing 	rte_free(queue_select);
87573c9b8c3SBeilei Xing 	return err;
87673c9b8c3SBeilei Xing }
87773c9b8c3SBeilei Xing 
87873c9b8c3SBeilei Xing int
idpf_vc_vport_ena_dis(struct idpf_vport * vport,bool enable)879ba6b8cd4SBeilei Xing idpf_vc_vport_ena_dis(struct idpf_vport *vport, bool enable)
88073c9b8c3SBeilei Xing {
88173c9b8c3SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
88273c9b8c3SBeilei Xing 	struct virtchnl2_vport vc_vport;
88373c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
88473c9b8c3SBeilei Xing 	int err;
88573c9b8c3SBeilei Xing 
88673c9b8c3SBeilei Xing 	vc_vport.vport_id = vport->vport_id;
88773c9b8c3SBeilei Xing 	args.ops = enable ? VIRTCHNL2_OP_ENABLE_VPORT :
88873c9b8c3SBeilei Xing 		VIRTCHNL2_OP_DISABLE_VPORT;
88973c9b8c3SBeilei Xing 	args.in_args = (uint8_t *)&vc_vport;
89073c9b8c3SBeilei Xing 	args.in_args_size = sizeof(vc_vport);
89173c9b8c3SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
89273c9b8c3SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
89373c9b8c3SBeilei Xing 
894ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
89573c9b8c3SBeilei Xing 	if (err != 0) {
89673c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_%s_VPORT",
89773c9b8c3SBeilei Xing 			enable ? "ENABLE" : "DISABLE");
89873c9b8c3SBeilei Xing 	}
89973c9b8c3SBeilei Xing 
90073c9b8c3SBeilei Xing 	return err;
90173c9b8c3SBeilei Xing }
90273c9b8c3SBeilei Xing 
90373c9b8c3SBeilei Xing int
idpf_vc_ptype_info_query(struct idpf_adapter * adapter,struct virtchnl2_get_ptype_info * req_ptype_info,struct virtchnl2_get_ptype_info * recv_ptype_info)904811bbeabSBeilei Xing idpf_vc_ptype_info_query(struct idpf_adapter *adapter,
905811bbeabSBeilei Xing 			 struct virtchnl2_get_ptype_info *req_ptype_info,
906811bbeabSBeilei Xing 			 struct virtchnl2_get_ptype_info *recv_ptype_info)
90773c9b8c3SBeilei Xing {
90873c9b8c3SBeilei Xing 	struct idpf_cmd_info args;
909811bbeabSBeilei Xing 	int err;
91073c9b8c3SBeilei Xing 
91173c9b8c3SBeilei Xing 	args.ops = VIRTCHNL2_OP_GET_PTYPE_INFO;
912811bbeabSBeilei Xing 	args.in_args = (uint8_t *)req_ptype_info;
913811bbeabSBeilei Xing 	args.in_args_size = sizeof(struct virtchnl2_get_ptype_info);
914811bbeabSBeilei Xing 	args.out_buffer = adapter->mbx_resp;
915811bbeabSBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
91673c9b8c3SBeilei Xing 
917ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
91873c9b8c3SBeilei Xing 	if (err != 0)
91973c9b8c3SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_GET_PTYPE_INFO");
92073c9b8c3SBeilei Xing 
921811bbeabSBeilei Xing 	rte_memcpy(recv_ptype_info, args.out_buffer, IDPF_DFLT_MBX_BUF_SIZE);
92273c9b8c3SBeilei Xing 	return err;
92373c9b8c3SBeilei Xing }
9248b95ced4SBeilei Xing 
9257514d76dSMingxia Liu int
idpf_vc_stats_query(struct idpf_vport * vport,struct virtchnl2_vport_stats ** pstats)9267514d76dSMingxia Liu idpf_vc_stats_query(struct idpf_vport *vport,
9277514d76dSMingxia Liu 		struct virtchnl2_vport_stats **pstats)
9287514d76dSMingxia Liu {
9297514d76dSMingxia Liu 	struct idpf_adapter *adapter = vport->adapter;
9307514d76dSMingxia Liu 	struct virtchnl2_vport_stats vport_stats;
9317514d76dSMingxia Liu 	struct idpf_cmd_info args;
9327514d76dSMingxia Liu 	int err;
9337514d76dSMingxia Liu 
9347514d76dSMingxia Liu 	vport_stats.vport_id = vport->vport_id;
9357514d76dSMingxia Liu 	args.ops = VIRTCHNL2_OP_GET_STATS;
9367514d76dSMingxia Liu 	args.in_args = (u8 *)&vport_stats;
9377514d76dSMingxia Liu 	args.in_args_size = sizeof(vport_stats);
9387514d76dSMingxia Liu 	args.out_buffer = adapter->mbx_resp;
9397514d76dSMingxia Liu 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
9407514d76dSMingxia Liu 
9417514d76dSMingxia Liu 	err = idpf_vc_cmd_execute(adapter, &args);
9427514d76dSMingxia Liu 	if (err) {
9437514d76dSMingxia Liu 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_GET_STATS");
9447514d76dSMingxia Liu 		*pstats = NULL;
9457514d76dSMingxia Liu 		return err;
9467514d76dSMingxia Liu 	}
9477514d76dSMingxia Liu 	*pstats = (struct virtchnl2_vport_stats *)args.out_buffer;
9487514d76dSMingxia Liu 	return 0;
9497514d76dSMingxia Liu }
9507514d76dSMingxia Liu 
9518b95ced4SBeilei Xing #define IDPF_RX_BUF_STRIDE		64
9528b95ced4SBeilei Xing int
idpf_vc_rxq_config(struct idpf_vport * vport,struct idpf_rx_queue * rxq)953ba6b8cd4SBeilei Xing idpf_vc_rxq_config(struct idpf_vport *vport, struct idpf_rx_queue *rxq)
9548b95ced4SBeilei Xing {
9558b95ced4SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
9568b95ced4SBeilei Xing 	struct virtchnl2_config_rx_queues *vc_rxqs = NULL;
9578b95ced4SBeilei Xing 	struct virtchnl2_rxq_info *rxq_info;
9588b95ced4SBeilei Xing 	struct idpf_cmd_info args;
9598b95ced4SBeilei Xing 	uint16_t num_qs;
9608b95ced4SBeilei Xing 	int size, err, i;
9618b95ced4SBeilei Xing 
9628b95ced4SBeilei Xing 	if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SINGLE)
9638b95ced4SBeilei Xing 		num_qs = IDPF_RXQ_PER_GRP;
9648b95ced4SBeilei Xing 	else
9658b95ced4SBeilei Xing 		num_qs = IDPF_RXQ_PER_GRP + IDPF_RX_BUFQ_PER_GRP;
9668b95ced4SBeilei Xing 
9678b95ced4SBeilei Xing 	size = sizeof(*vc_rxqs) + (num_qs - 1) *
9688b95ced4SBeilei Xing 		sizeof(struct virtchnl2_rxq_info);
9698b95ced4SBeilei Xing 	vc_rxqs = rte_zmalloc("cfg_rxqs", size, 0);
9708b95ced4SBeilei Xing 	if (vc_rxqs == NULL) {
9718b95ced4SBeilei Xing 		DRV_LOG(ERR, "Failed to allocate virtchnl2_config_rx_queues");
9728b95ced4SBeilei Xing 		err = -ENOMEM;
9738b95ced4SBeilei Xing 		return err;
9748b95ced4SBeilei Xing 	}
9758b95ced4SBeilei Xing 	vc_rxqs->vport_id = vport->vport_id;
9768b95ced4SBeilei Xing 	vc_rxqs->num_qinfo = num_qs;
9778b95ced4SBeilei Xing 	if (vport->rxq_model == VIRTCHNL2_QUEUE_MODEL_SINGLE) {
9788b95ced4SBeilei Xing 		rxq_info = &vc_rxqs->qinfo[0];
9798b95ced4SBeilei Xing 		rxq_info->dma_ring_addr = rxq->rx_ring_phys_addr;
9808b95ced4SBeilei Xing 		rxq_info->type = VIRTCHNL2_QUEUE_TYPE_RX;
9818b95ced4SBeilei Xing 		rxq_info->queue_id = rxq->queue_id;
9828b95ced4SBeilei Xing 		rxq_info->model = VIRTCHNL2_QUEUE_MODEL_SINGLE;
9838b95ced4SBeilei Xing 		rxq_info->data_buffer_size = rxq->rx_buf_len;
9848b95ced4SBeilei Xing 		rxq_info->max_pkt_size = vport->max_pkt_len;
9858b95ced4SBeilei Xing 
9868b95ced4SBeilei Xing 		rxq_info->desc_ids = VIRTCHNL2_RXDID_2_FLEX_SQ_NIC_M;
9878b95ced4SBeilei Xing 		rxq_info->qflags |= VIRTCHNL2_RX_DESC_SIZE_32BYTE;
9888b95ced4SBeilei Xing 
9898b95ced4SBeilei Xing 		rxq_info->ring_len = rxq->nb_rx_desc;
9908b95ced4SBeilei Xing 	}  else {
9918b95ced4SBeilei Xing 		/* Rx queue */
9928b95ced4SBeilei Xing 		rxq_info = &vc_rxqs->qinfo[0];
9938b95ced4SBeilei Xing 		rxq_info->dma_ring_addr = rxq->rx_ring_phys_addr;
9948b95ced4SBeilei Xing 		rxq_info->type = VIRTCHNL2_QUEUE_TYPE_RX;
9958b95ced4SBeilei Xing 		rxq_info->queue_id = rxq->queue_id;
9968b95ced4SBeilei Xing 		rxq_info->model = VIRTCHNL2_QUEUE_MODEL_SPLIT;
9978b95ced4SBeilei Xing 		rxq_info->data_buffer_size = rxq->rx_buf_len;
9988b95ced4SBeilei Xing 		rxq_info->max_pkt_size = vport->max_pkt_len;
9998b95ced4SBeilei Xing 
10008b95ced4SBeilei Xing 		rxq_info->desc_ids = VIRTCHNL2_RXDID_2_FLEX_SPLITQ_M;
10018b95ced4SBeilei Xing 		rxq_info->qflags |= VIRTCHNL2_RX_DESC_SIZE_32BYTE;
10028b95ced4SBeilei Xing 
10038b95ced4SBeilei Xing 		rxq_info->ring_len = rxq->nb_rx_desc;
10048b95ced4SBeilei Xing 		rxq_info->rx_bufq1_id = rxq->bufq1->queue_id;
10053c0696d5SBeilei Xing 		rxq_info->bufq2_ena = 1;
10068b95ced4SBeilei Xing 		rxq_info->rx_bufq2_id = rxq->bufq2->queue_id;
10078b95ced4SBeilei Xing 		rxq_info->rx_buffer_low_watermark = 64;
10088b95ced4SBeilei Xing 
10098b95ced4SBeilei Xing 		/* Buffer queue */
10108b95ced4SBeilei Xing 		for (i = 1; i <= IDPF_RX_BUFQ_PER_GRP; i++) {
10118b95ced4SBeilei Xing 			struct idpf_rx_queue *bufq = i == 1 ? rxq->bufq1 : rxq->bufq2;
10128b95ced4SBeilei Xing 			rxq_info = &vc_rxqs->qinfo[i];
10138b95ced4SBeilei Xing 			rxq_info->dma_ring_addr = bufq->rx_ring_phys_addr;
10148b95ced4SBeilei Xing 			rxq_info->type = VIRTCHNL2_QUEUE_TYPE_RX_BUFFER;
10158b95ced4SBeilei Xing 			rxq_info->queue_id = bufq->queue_id;
10168b95ced4SBeilei Xing 			rxq_info->model = VIRTCHNL2_QUEUE_MODEL_SPLIT;
10178b95ced4SBeilei Xing 			rxq_info->data_buffer_size = bufq->rx_buf_len;
10188b95ced4SBeilei Xing 			rxq_info->desc_ids = VIRTCHNL2_RXDID_2_FLEX_SPLITQ_M;
10198b95ced4SBeilei Xing 			rxq_info->ring_len = bufq->nb_rx_desc;
10208b95ced4SBeilei Xing 
10218b95ced4SBeilei Xing 			rxq_info->buffer_notif_stride = IDPF_RX_BUF_STRIDE;
10228b95ced4SBeilei Xing 			rxq_info->rx_buffer_low_watermark = 64;
10238b95ced4SBeilei Xing 		}
10248b95ced4SBeilei Xing 	}
10258b95ced4SBeilei Xing 
10268b95ced4SBeilei Xing 	memset(&args, 0, sizeof(args));
10278b95ced4SBeilei Xing 	args.ops = VIRTCHNL2_OP_CONFIG_RX_QUEUES;
10288b95ced4SBeilei Xing 	args.in_args = (uint8_t *)vc_rxqs;
10298b95ced4SBeilei Xing 	args.in_args_size = size;
10308b95ced4SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
10318b95ced4SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
10328b95ced4SBeilei Xing 
1033ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
10348b95ced4SBeilei Xing 	rte_free(vc_rxqs);
10358b95ced4SBeilei Xing 	if (err != 0)
10368b95ced4SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_CONFIG_RX_QUEUES");
10378b95ced4SBeilei Xing 
10388b95ced4SBeilei Xing 	return err;
10398b95ced4SBeilei Xing }
10408b95ced4SBeilei Xing 
idpf_vc_rxq_config_by_info(struct idpf_vport * vport,struct virtchnl2_rxq_info * rxq_info,uint16_t num_qs)104194364eccSBeilei Xing int idpf_vc_rxq_config_by_info(struct idpf_vport *vport, struct virtchnl2_rxq_info *rxq_info,
104294364eccSBeilei Xing 			       uint16_t num_qs)
104394364eccSBeilei Xing {
104494364eccSBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
104594364eccSBeilei Xing 	struct virtchnl2_config_rx_queues *vc_rxqs = NULL;
104694364eccSBeilei Xing 	struct idpf_cmd_info args;
104794364eccSBeilei Xing 	int size, err, i;
104894364eccSBeilei Xing 
104994364eccSBeilei Xing 	size = sizeof(*vc_rxqs) + (num_qs - 1) *
105094364eccSBeilei Xing 		sizeof(struct virtchnl2_rxq_info);
105194364eccSBeilei Xing 	vc_rxqs = rte_zmalloc("cfg_rxqs", size, 0);
105294364eccSBeilei Xing 	if (vc_rxqs == NULL) {
105394364eccSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate virtchnl2_config_rx_queues");
105494364eccSBeilei Xing 		err = -ENOMEM;
105594364eccSBeilei Xing 		return err;
105694364eccSBeilei Xing 	}
105794364eccSBeilei Xing 	vc_rxqs->vport_id = vport->vport_id;
105894364eccSBeilei Xing 	vc_rxqs->num_qinfo = num_qs;
105994364eccSBeilei Xing 	memcpy(vc_rxqs->qinfo, rxq_info, num_qs * sizeof(struct virtchnl2_rxq_info));
106094364eccSBeilei Xing 
106194364eccSBeilei Xing 	memset(&args, 0, sizeof(args));
106294364eccSBeilei Xing 	args.ops = VIRTCHNL2_OP_CONFIG_RX_QUEUES;
106394364eccSBeilei Xing 	args.in_args = (uint8_t *)vc_rxqs;
106494364eccSBeilei Xing 	args.in_args_size = size;
106594364eccSBeilei Xing 	args.out_buffer = adapter->mbx_resp;
106694364eccSBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
106794364eccSBeilei Xing 
106894364eccSBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
106994364eccSBeilei Xing 	rte_free(vc_rxqs);
107094364eccSBeilei Xing 	if (err != 0)
107194364eccSBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_CONFIG_RX_QUEUES");
107294364eccSBeilei Xing 
107394364eccSBeilei Xing 	return err;
107494364eccSBeilei Xing }
107594364eccSBeilei Xing 
10768b95ced4SBeilei Xing int
idpf_vc_txq_config(struct idpf_vport * vport,struct idpf_tx_queue * txq)1077ba6b8cd4SBeilei Xing idpf_vc_txq_config(struct idpf_vport *vport, struct idpf_tx_queue *txq)
10788b95ced4SBeilei Xing {
10798b95ced4SBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
10808b95ced4SBeilei Xing 	struct virtchnl2_config_tx_queues *vc_txqs = NULL;
10818b95ced4SBeilei Xing 	struct virtchnl2_txq_info *txq_info;
10828b95ced4SBeilei Xing 	struct idpf_cmd_info args;
10838b95ced4SBeilei Xing 	uint16_t num_qs;
10848b95ced4SBeilei Xing 	int size, err;
10858b95ced4SBeilei Xing 
10868b95ced4SBeilei Xing 	if (vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SINGLE)
10878b95ced4SBeilei Xing 		num_qs = IDPF_TXQ_PER_GRP;
10888b95ced4SBeilei Xing 	else
10898b95ced4SBeilei Xing 		num_qs = IDPF_TXQ_PER_GRP + IDPF_TX_COMPLQ_PER_GRP;
10908b95ced4SBeilei Xing 
10918b95ced4SBeilei Xing 	size = sizeof(*vc_txqs) + (num_qs - 1) *
10928b95ced4SBeilei Xing 		sizeof(struct virtchnl2_txq_info);
10938b95ced4SBeilei Xing 	vc_txqs = rte_zmalloc("cfg_txqs", size, 0);
10948b95ced4SBeilei Xing 	if (vc_txqs == NULL) {
10958b95ced4SBeilei Xing 		DRV_LOG(ERR, "Failed to allocate virtchnl2_config_tx_queues");
10968b95ced4SBeilei Xing 		err = -ENOMEM;
10978b95ced4SBeilei Xing 		return err;
10988b95ced4SBeilei Xing 	}
10998b95ced4SBeilei Xing 	vc_txqs->vport_id = vport->vport_id;
11008b95ced4SBeilei Xing 	vc_txqs->num_qinfo = num_qs;
11018b95ced4SBeilei Xing 
11028b95ced4SBeilei Xing 	if (vport->txq_model == VIRTCHNL2_QUEUE_MODEL_SINGLE) {
11038b95ced4SBeilei Xing 		txq_info = &vc_txqs->qinfo[0];
11048b95ced4SBeilei Xing 		txq_info->dma_ring_addr = txq->tx_ring_phys_addr;
11058b95ced4SBeilei Xing 		txq_info->type = VIRTCHNL2_QUEUE_TYPE_TX;
11068b95ced4SBeilei Xing 		txq_info->queue_id = txq->queue_id;
11078b95ced4SBeilei Xing 		txq_info->model = VIRTCHNL2_QUEUE_MODEL_SINGLE;
11088b95ced4SBeilei Xing 		txq_info->sched_mode = VIRTCHNL2_TXQ_SCHED_MODE_QUEUE;
11098b95ced4SBeilei Xing 		txq_info->ring_len = txq->nb_tx_desc;
11108b95ced4SBeilei Xing 	} else {
11118b95ced4SBeilei Xing 		/* txq info */
11128b95ced4SBeilei Xing 		txq_info = &vc_txqs->qinfo[0];
11138b95ced4SBeilei Xing 		txq_info->dma_ring_addr = txq->tx_ring_phys_addr;
11148b95ced4SBeilei Xing 		txq_info->type = VIRTCHNL2_QUEUE_TYPE_TX;
11158b95ced4SBeilei Xing 		txq_info->queue_id = txq->queue_id;
11168b95ced4SBeilei Xing 		txq_info->model = VIRTCHNL2_QUEUE_MODEL_SPLIT;
11178b95ced4SBeilei Xing 		txq_info->sched_mode = VIRTCHNL2_TXQ_SCHED_MODE_FLOW;
11188b95ced4SBeilei Xing 		txq_info->ring_len = txq->nb_tx_desc;
11198b95ced4SBeilei Xing 		txq_info->tx_compl_queue_id = txq->complq->queue_id;
11208b95ced4SBeilei Xing 		txq_info->relative_queue_id = txq_info->queue_id;
11218b95ced4SBeilei Xing 
11228b95ced4SBeilei Xing 		/* tx completion queue info */
11238b95ced4SBeilei Xing 		txq_info = &vc_txqs->qinfo[1];
11248b95ced4SBeilei Xing 		txq_info->dma_ring_addr = txq->complq->tx_ring_phys_addr;
11258b95ced4SBeilei Xing 		txq_info->type = VIRTCHNL2_QUEUE_TYPE_TX_COMPLETION;
11268b95ced4SBeilei Xing 		txq_info->queue_id = txq->complq->queue_id;
11278b95ced4SBeilei Xing 		txq_info->model = VIRTCHNL2_QUEUE_MODEL_SPLIT;
11288b95ced4SBeilei Xing 		txq_info->sched_mode = VIRTCHNL2_TXQ_SCHED_MODE_FLOW;
11298b95ced4SBeilei Xing 		txq_info->ring_len = txq->complq->nb_tx_desc;
11308b95ced4SBeilei Xing 	}
11318b95ced4SBeilei Xing 
11328b95ced4SBeilei Xing 	memset(&args, 0, sizeof(args));
11338b95ced4SBeilei Xing 	args.ops = VIRTCHNL2_OP_CONFIG_TX_QUEUES;
11348b95ced4SBeilei Xing 	args.in_args = (uint8_t *)vc_txqs;
11358b95ced4SBeilei Xing 	args.in_args_size = size;
11368b95ced4SBeilei Xing 	args.out_buffer = adapter->mbx_resp;
11378b95ced4SBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
11388b95ced4SBeilei Xing 
1139ba6b8cd4SBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
11408b95ced4SBeilei Xing 	rte_free(vc_txqs);
11418b95ced4SBeilei Xing 	if (err != 0)
11428b95ced4SBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_CONFIG_TX_QUEUES");
11438b95ced4SBeilei Xing 
11448b95ced4SBeilei Xing 	return err;
11458b95ced4SBeilei Xing }
1146d633a485SMingxia Liu 
1147d633a485SMingxia Liu int
idpf_vc_txq_config_by_info(struct idpf_vport * vport,struct virtchnl2_txq_info * txq_info,uint16_t num_qs)114894364eccSBeilei Xing idpf_vc_txq_config_by_info(struct idpf_vport *vport, struct virtchnl2_txq_info *txq_info,
114994364eccSBeilei Xing 		       uint16_t num_qs)
115094364eccSBeilei Xing {
115194364eccSBeilei Xing 	struct idpf_adapter *adapter = vport->adapter;
115294364eccSBeilei Xing 	struct virtchnl2_config_tx_queues *vc_txqs = NULL;
115394364eccSBeilei Xing 	struct idpf_cmd_info args;
115494364eccSBeilei Xing 	int size, err;
115594364eccSBeilei Xing 
115694364eccSBeilei Xing 	size = sizeof(*vc_txqs) + (num_qs - 1) * sizeof(struct virtchnl2_txq_info);
115794364eccSBeilei Xing 	vc_txqs = rte_zmalloc("cfg_txqs", size, 0);
115894364eccSBeilei Xing 	if (vc_txqs == NULL) {
115994364eccSBeilei Xing 		DRV_LOG(ERR, "Failed to allocate virtchnl2_config_tx_queues");
116094364eccSBeilei Xing 		err = -ENOMEM;
116194364eccSBeilei Xing 		return err;
116294364eccSBeilei Xing 	}
116394364eccSBeilei Xing 	vc_txqs->vport_id = vport->vport_id;
116494364eccSBeilei Xing 	vc_txqs->num_qinfo = num_qs;
116594364eccSBeilei Xing 	memcpy(vc_txqs->qinfo, txq_info, num_qs * sizeof(struct virtchnl2_txq_info));
116694364eccSBeilei Xing 
116794364eccSBeilei Xing 	memset(&args, 0, sizeof(args));
116894364eccSBeilei Xing 	args.ops = VIRTCHNL2_OP_CONFIG_TX_QUEUES;
116994364eccSBeilei Xing 	args.in_args = (uint8_t *)vc_txqs;
117094364eccSBeilei Xing 	args.in_args_size = size;
117194364eccSBeilei Xing 	args.out_buffer = adapter->mbx_resp;
117294364eccSBeilei Xing 	args.out_size = IDPF_DFLT_MBX_BUF_SIZE;
117394364eccSBeilei Xing 
117494364eccSBeilei Xing 	err = idpf_vc_cmd_execute(adapter, &args);
117594364eccSBeilei Xing 	rte_free(vc_txqs);
117694364eccSBeilei Xing 	if (err != 0)
117794364eccSBeilei Xing 		DRV_LOG(ERR, "Failed to execute command of VIRTCHNL2_OP_CONFIG_TX_QUEUES");
117894364eccSBeilei Xing 
117994364eccSBeilei Xing 	return err;
118094364eccSBeilei Xing }
118194364eccSBeilei Xing 
118294364eccSBeilei Xing int
idpf_vc_ctlq_recv(struct idpf_ctlq_info * cq,u16 * num_q_msg,struct idpf_ctlq_msg * q_msg)1183d633a485SMingxia Liu idpf_vc_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg,
1184d633a485SMingxia Liu 		  struct idpf_ctlq_msg *q_msg)
1185d633a485SMingxia Liu {
1186d633a485SMingxia Liu 	return idpf_ctlq_recv(cq, num_q_msg, q_msg);
1187d633a485SMingxia Liu }
1188d633a485SMingxia Liu 
1189d633a485SMingxia Liu int
idpf_vc_ctlq_post_rx_buffs(struct idpf_hw * hw,struct idpf_ctlq_info * cq,u16 * buff_count,struct idpf_dma_mem ** buffs)1190d633a485SMingxia Liu idpf_vc_ctlq_post_rx_buffs(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
1191d633a485SMingxia Liu 			   u16 *buff_count, struct idpf_dma_mem **buffs)
1192d633a485SMingxia Liu {
1193d633a485SMingxia Liu 	return idpf_ctlq_post_rx_buffs(hw, cq, buff_count, buffs);
1194d633a485SMingxia Liu }
1195