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