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 : : } 110 : : 111 : : int 112 : 0 : roc_nix_mcast_list_setup(struct mbox *mbox, uint8_t intf, int nb_entries, uint16_t *pf_funcs, 113 : : uint16_t *channels, uint32_t *rqs, uint32_t *grp_index, 114 : : uint32_t *start_index) 115 : : { 116 : : struct nix_mcast_grp_create_req *mce_grp_create_req; 117 : : struct nix_mcast_grp_create_rsp *mce_grp_create_rsp; 118 : : struct nix_mcast_grp_update_req *mce_grp_update_req; 119 : : struct nix_mcast_grp_update_rsp *mce_grp_update_rsp; 120 : : int rc = 0, i; 121 : : 122 : : mbox_get(mbox); 123 : : 124 : 0 : mce_grp_create_req = mbox_alloc_msg_nix_mcast_grp_create(mbox); 125 [ # # ]: 0 : if (mce_grp_create_req == NULL) { 126 : : rc = -ENOSPC; 127 : 0 : goto exit; 128 : : } 129 : : 130 : 0 : mce_grp_create_req->dir = intf; 131 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_create_rsp); 132 [ # # ]: 0 : if (rc) { 133 : 0 : plt_err("Failed to create mirror list"); 134 : 0 : goto exit; 135 : : } 136 : : 137 : 0 : *grp_index = mce_grp_create_rsp->mcast_grp_idx; 138 : : 139 : 0 : mce_grp_update_req = mbox_alloc_msg_nix_mcast_grp_update(mbox); 140 [ # # ]: 0 : if (mce_grp_update_req == NULL) { 141 : : rc = -ENOSPC; 142 : 0 : goto exit; 143 : : } 144 : : 145 : 0 : mce_grp_update_req->mcast_grp_idx = *grp_index; 146 : 0 : mce_grp_update_req->op = NIX_MCAST_OP_ADD_ENTRY; 147 : 0 : mce_grp_update_req->num_mce_entry = nb_entries; 148 [ # # ]: 0 : for (i = 0; i < nb_entries; i++) { 149 : 0 : mce_grp_update_req->pcifunc[i] = pf_funcs[i]; 150 : 0 : mce_grp_update_req->channel[i] = channels[i]; 151 : 0 : mce_grp_update_req->rq_rss_index[i] = rqs[i]; 152 : 0 : mce_grp_update_req->dest_type[i] = NIX_RX_RQ; 153 : : } 154 : : 155 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_update_rsp); 156 [ # # ]: 0 : if (rc) { 157 : 0 : plt_err("Failed to create mirror list"); 158 : 0 : goto exit; 159 : : } 160 : : 161 : 0 : *start_index = (mce_grp_update_rsp->mce_start_index & 0xFFFFF); 162 : : 163 : : rc = 0; 164 : 0 : exit: 165 : : mbox_put(mbox); 166 : 0 : return rc; 167 : : } 168 : : 169 : : int 170 : 0 : roc_nix_mcast_list_free(struct mbox *mbox, uint32_t mcast_grp_index) 171 : : { 172 : : struct nix_mcast_grp_destroy_req *mce_grp_destroy_req; 173 : : struct nix_mcast_grp_destroy_rsp *mce_grp_destroy_rsp; 174 : : int rc = 0; 175 : : 176 : : mbox_get(mbox); 177 : : 178 : 0 : mce_grp_destroy_req = mbox_alloc_msg_nix_mcast_grp_destroy(mbox); 179 [ # # ]: 0 : if (mce_grp_destroy_req == NULL) { 180 : : rc = -ENOSPC; 181 : 0 : goto exit; 182 : : } 183 : : 184 : 0 : mce_grp_destroy_req->mcast_grp_idx = mcast_grp_index; 185 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_destroy_rsp); 186 [ # # ]: 0 : if (rc) { 187 : 0 : plt_err("Failed to destroy mirror group index"); 188 : 0 : goto exit; 189 : : } 190 : : 191 : : rc = 0; 192 : 0 : exit: 193 : : mbox_put(mbox); 194 : 0 : return rc; 195 : : }