xref: /dpdk/drivers/net/nfp/nfp_net_cmsg.c (revision b6de43530dfa30cbf6b70857e3835099701063d4)
1ca65f2eeSChaoyong He /* SPDX-License-Identifier: BSD-3-Clause
2ca65f2eeSChaoyong He  * Copyright (c) 2023 Corigine, Inc.
3ca65f2eeSChaoyong He  * All rights reserved.
4ca65f2eeSChaoyong He  */
5ca65f2eeSChaoyong He 
6ca65f2eeSChaoyong He #include "nfp_net_cmsg.h"
7ca65f2eeSChaoyong He 
8ca65f2eeSChaoyong He #include <rte_malloc.h>
9ca65f2eeSChaoyong He 
10ca65f2eeSChaoyong He #include "nfp_logs.h"
11ca65f2eeSChaoyong He 
12ca65f2eeSChaoyong He struct nfp_net_cmsg *
13ca65f2eeSChaoyong He nfp_net_cmsg_alloc(uint32_t msg_size)
14ca65f2eeSChaoyong He {
15ca65f2eeSChaoyong He 	struct nfp_net_cmsg *cmsg;
16ca65f2eeSChaoyong He 
17ca65f2eeSChaoyong He 	cmsg = rte_zmalloc(NULL, msg_size, 0);
18ca65f2eeSChaoyong He 	if (cmsg == NULL) {
19ca65f2eeSChaoyong He 		PMD_DRV_LOG(ERR, "Failed malloc memory.");
20ca65f2eeSChaoyong He 		return NULL;
21ca65f2eeSChaoyong He 	}
22ca65f2eeSChaoyong He 
23ca65f2eeSChaoyong He 	return cmsg;
24ca65f2eeSChaoyong He }
25ca65f2eeSChaoyong He 
26ca65f2eeSChaoyong He void
27ca65f2eeSChaoyong He nfp_net_cmsg_free(struct nfp_net_cmsg *cmsg)
28ca65f2eeSChaoyong He {
29ca65f2eeSChaoyong He 	rte_free(cmsg);
30ca65f2eeSChaoyong He }
31ca65f2eeSChaoyong He 
32ca65f2eeSChaoyong He int
33ca65f2eeSChaoyong He nfp_net_cmsg_xmit(struct nfp_net_hw *hw,
34ca65f2eeSChaoyong He 		struct nfp_net_cmsg *cmsg,
35ca65f2eeSChaoyong He 		uint32_t msg_size)
36ca65f2eeSChaoyong He {
37ca65f2eeSChaoyong He 	int ret;
38ca65f2eeSChaoyong He 	uint32_t i;
39ca65f2eeSChaoyong He 
40ca65f2eeSChaoyong He 	for (i = 0; i < msg_size; i++)
41ca65f2eeSChaoyong He 		nn_cfg_writel(&hw->super, NFP_NET_CFG_MBOX_VAL + 4 * i, *((uint32_t *)cmsg + i));
42ca65f2eeSChaoyong He 
43ca65f2eeSChaoyong He 	ret = nfp_net_mbox_reconfig(hw, NFP_NET_CFG_MBOX_CMD_FLOW_STEER);
44ca65f2eeSChaoyong He 	switch (ret) {
45ca65f2eeSChaoyong He 	case NFP_NET_CFG_MBOX_RET_FS_OK:
46ca65f2eeSChaoyong He 		break;
47ca65f2eeSChaoyong He 	case NFP_NET_CFG_MBOX_RET_FS_ERR_NO_SPACE:
48*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "Not enough space for cmd %u.", cmsg->cmd);
49ca65f2eeSChaoyong He 		ret = -ENOSPC;
50ca65f2eeSChaoyong He 		break;
51ca65f2eeSChaoyong He 	case NFP_NET_CFG_MBOX_RET_FS_ERR_MASK_FULL:
52*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "The mask table is full for cmd %u.", cmsg->cmd);
53ca65f2eeSChaoyong He 		ret = -EXFULL;
54ca65f2eeSChaoyong He 		break;
55ca65f2eeSChaoyong He 	case NFP_NET_CFG_MBOX_RET_FS_ERR_CMD_INVALID:
56*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "The mbox cmd %u invalid.", cmsg->cmd);
57ca65f2eeSChaoyong He 		ret = -EINVAL;
58ca65f2eeSChaoyong He 		break;
59ca65f2eeSChaoyong He 	default:
60*b6de4353SZerun Fu 		PMD_DRV_LOG(ERR, "Unrecognized mbox cmd %u.", cmsg->cmd);
61ca65f2eeSChaoyong He 		ret = -EINVAL;
62ca65f2eeSChaoyong He 		break;
63ca65f2eeSChaoyong He 	}
64ca65f2eeSChaoyong He 
65ca65f2eeSChaoyong He 	return ret;
66ca65f2eeSChaoyong He }
67