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