Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2021 Marvell. 3 : : */ 4 : : 5 : : #include "roc_api.h" 6 : : #include "roc_priv.h" 7 : : 8 : : int 9 : 0 : roc_nix_mcast_mcam_entry_alloc(struct roc_nix *roc_nix, uint16_t nb_entries, 10 : : uint8_t priority, uint16_t index[]) 11 : : { 12 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 13 : : struct dev *dev = &nix->dev; 14 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 15 : : struct npc_mcam_alloc_entry_req *req; 16 : : struct npc_mcam_alloc_entry_rsp *rsp; 17 : : int rc = -ENOSPC, i; 18 : : 19 : 0 : req = mbox_alloc_msg_npc_mcam_alloc_entry(mbox); 20 [ # # ]: 0 : if (req == NULL) 21 : 0 : goto exit; 22 : 0 : req->priority = priority; 23 : 0 : req->count = nb_entries; 24 : : 25 : : rc = mbox_process_msg(mbox, (void *)&rsp); 26 [ # # ]: 0 : if (rc) 27 : 0 : goto exit; 28 : : 29 [ # # ]: 0 : for (i = 0; i < rsp->count; i++) 30 : 0 : index[i] = rsp->entry_list[i]; 31 : : 32 : 0 : rc = rsp->count; 33 : 0 : exit: 34 : : mbox_put(mbox); 35 : 0 : return rc; 36 : : } 37 : : 38 : : int 39 : 0 : roc_nix_mcast_mcam_entry_free(struct roc_nix *roc_nix, uint32_t index) 40 : : { 41 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 42 : : struct dev *dev = &nix->dev; 43 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 44 : : struct npc_mcam_free_entry_req *req; 45 : : int rc = -ENOSPC; 46 : : 47 : 0 : req = mbox_alloc_msg_npc_mcam_free_entry(mbox); 48 [ # # ]: 0 : if (req == NULL) 49 : 0 : goto exit; 50 : 0 : req->entry = index; 51 : : 52 : : rc = mbox_process_msg(mbox, NULL); 53 : 0 : exit: 54 : : mbox_put(mbox); 55 : 0 : return rc; 56 : : } 57 : : 58 : : int 59 : 0 : roc_nix_mcast_mcam_entry_write(struct roc_nix *roc_nix, 60 : : struct mcam_entry *entry, uint32_t index, 61 : : uint8_t intf, uint64_t action) 62 : : { 63 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 64 : : struct dev *dev = &nix->dev; 65 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 66 : : struct npc_mcam_write_entry_req *req; 67 : : int rc = -ENOSPC; 68 : : 69 : 0 : req = mbox_alloc_msg_npc_mcam_write_entry(mbox); 70 [ # # ]: 0 : if (req == NULL) 71 : 0 : goto exit; 72 : 0 : req->entry = index; 73 : 0 : req->intf = intf; 74 : 0 : req->enable_entry = true; 75 [ # # ]: 0 : mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry)); 76 : 0 : req->entry_data.action = action; 77 : : 78 : 0 : rc = mbox_process(mbox); 79 : 0 : exit: 80 : : mbox_put(mbox); 81 : 0 : return rc; 82 : : } 83 : : 84 : : int 85 : 0 : roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix *roc_nix, uint32_t index, 86 : : bool enable) 87 : : { 88 : : struct npc_mcam_ena_dis_entry_req *req; 89 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 90 : : struct dev *dev = &nix->dev; 91 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 92 : : int rc = -ENOSPC; 93 : : 94 [ # # ]: 0 : if (enable) { 95 : 0 : req = mbox_alloc_msg_npc_mcam_ena_entry(mbox); 96 [ # # ]: 0 : if (req == NULL) 97 : 0 : goto exit; 98 : : } else { 99 : 0 : req = mbox_alloc_msg_npc_mcam_dis_entry(mbox); 100 [ # # ]: 0 : if (req == NULL) 101 : 0 : goto exit; 102 : : } 103 : : 104 : 0 : req->entry = index; 105 : 0 : rc = mbox_process(mbox); 106 : 0 : exit: 107 : : mbox_put(mbox); 108 : 0 : return rc; 109 : : }