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->ref_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, void *entry, uint32_t index, uint8_t intf, 60 : : uint64_t action) 61 : : { 62 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 63 : : struct dev *dev = &nix->dev; 64 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 65 : : int rc = -ENOSPC; 66 : : 67 [ # # ]: 0 : if (roc_model_is_cn20k()) { 68 : : struct npc_cn20k_mcam_write_entry_req *req; 69 : : 70 : 0 : req = mbox_alloc_msg_npc_cn20k_mcam_write_entry(mbox); 71 [ # # ]: 0 : if (req == NULL) 72 : 0 : goto exit; 73 : 0 : req->entry = index; 74 : 0 : req->intf = intf; 75 : 0 : req->enable_entry = true; 76 [ # # ]: 0 : mbox_memcpy(&req->entry_data, entry, sizeof(struct cn20k_mcam_entry)); 77 : 0 : req->entry_data.action = action; 78 : : 79 : : } else { 80 : : struct npc_mcam_write_entry_req *req; 81 : : 82 : 0 : req = mbox_alloc_msg_npc_mcam_write_entry(mbox); 83 [ # # ]: 0 : if (req == NULL) 84 : 0 : goto exit; 85 : 0 : req->entry = index; 86 : 0 : req->intf = intf; 87 : 0 : req->enable_entry = true; 88 [ # # ]: 0 : mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry)); 89 : 0 : req->entry_data.action = action; 90 : : } 91 : : 92 : 0 : rc = mbox_process(mbox); 93 : 0 : exit: 94 : : mbox_put(mbox); 95 : 0 : return rc; 96 : : } 97 : : 98 : : int 99 : 0 : roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix *roc_nix, uint32_t index, 100 : : bool enable) 101 : : { 102 : : struct npc_mcam_ena_dis_entry_req *req; 103 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 104 : : struct dev *dev = &nix->dev; 105 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 106 : : int rc = -ENOSPC; 107 : : 108 [ # # ]: 0 : if (enable) { 109 : 0 : req = mbox_alloc_msg_npc_mcam_ena_entry(mbox); 110 [ # # ]: 0 : if (req == NULL) 111 : 0 : goto exit; 112 : : } else { 113 : 0 : req = mbox_alloc_msg_npc_mcam_dis_entry(mbox); 114 [ # # ]: 0 : if (req == NULL) 115 : 0 : goto exit; 116 : : } 117 : : 118 : 0 : req->entry = index; 119 : 0 : rc = mbox_process(mbox); 120 : 0 : exit: 121 : : mbox_put(mbox); 122 : 0 : return rc; 123 : : } 124 : : 125 : : int 126 : 0 : roc_nix_mcast_list_setup(struct mbox *mbox, uint8_t intf, int nb_entries, uint16_t *pf_funcs, 127 : : uint16_t *channels, uint32_t *rqs, uint32_t *grp_index, 128 : : uint32_t *start_index) 129 : : { 130 : : struct nix_mcast_grp_create_req *mce_grp_create_req; 131 : : struct nix_mcast_grp_create_rsp *mce_grp_create_rsp; 132 : : struct nix_mcast_grp_update_req *mce_grp_update_req; 133 : : struct nix_mcast_grp_update_rsp *mce_grp_update_rsp; 134 : : int rc = 0, i; 135 : : 136 : : mbox_get(mbox); 137 : : 138 : 0 : mce_grp_create_req = mbox_alloc_msg_nix_mcast_grp_create(mbox); 139 [ # # ]: 0 : if (mce_grp_create_req == NULL) { 140 : : rc = -ENOSPC; 141 : 0 : goto exit; 142 : : } 143 : : 144 : 0 : mce_grp_create_req->dir = intf; 145 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_create_rsp); 146 [ # # ]: 0 : if (rc) { 147 : 0 : plt_err("Failed to create mirror list"); 148 : 0 : goto exit; 149 : : } 150 : : 151 : 0 : *grp_index = mce_grp_create_rsp->mcast_grp_idx; 152 : : 153 : 0 : mce_grp_update_req = mbox_alloc_msg_nix_mcast_grp_update(mbox); 154 [ # # ]: 0 : if (mce_grp_update_req == NULL) { 155 : : rc = -ENOSPC; 156 : 0 : goto exit; 157 : : } 158 : : 159 : 0 : mce_grp_update_req->mcast_grp_idx = *grp_index; 160 : 0 : mce_grp_update_req->op = NIX_MCAST_OP_ADD_ENTRY; 161 : 0 : mce_grp_update_req->num_mce_entry = nb_entries; 162 [ # # ]: 0 : for (i = 0; i < nb_entries; i++) { 163 : 0 : mce_grp_update_req->pcifunc[i] = pf_funcs[i]; 164 : 0 : mce_grp_update_req->channel[i] = channels[i]; 165 : 0 : mce_grp_update_req->rq_rss_index[i] = rqs[i]; 166 : 0 : mce_grp_update_req->dest_type[i] = NIX_RX_RQ; 167 : : } 168 : : 169 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_update_rsp); 170 [ # # ]: 0 : if (rc) { 171 : 0 : plt_err("Failed to create mirror list"); 172 : 0 : goto exit; 173 : : } 174 : : 175 : 0 : *start_index = (mce_grp_update_rsp->mce_start_index & 0xFFFFF); 176 : : 177 : : rc = 0; 178 : 0 : exit: 179 : : mbox_put(mbox); 180 : 0 : return rc; 181 : : } 182 : : 183 : : int 184 : 0 : roc_nix_mcast_list_free(struct mbox *mbox, uint32_t mcast_grp_index) 185 : : { 186 : : struct nix_mcast_grp_destroy_req *mce_grp_destroy_req; 187 : : struct nix_mcast_grp_destroy_rsp *mce_grp_destroy_rsp; 188 : : int rc = 0; 189 : : 190 : : mbox_get(mbox); 191 : : 192 : 0 : mce_grp_destroy_req = mbox_alloc_msg_nix_mcast_grp_destroy(mbox); 193 [ # # ]: 0 : if (mce_grp_destroy_req == NULL) { 194 : : rc = -ENOSPC; 195 : 0 : goto exit; 196 : : } 197 : : 198 : 0 : mce_grp_destroy_req->mcast_grp_idx = mcast_grp_index; 199 : : rc = mbox_process_msg(mbox, (void *)&mce_grp_destroy_rsp); 200 [ # # ]: 0 : if (rc) { 201 : 0 : plt_err("Failed to destroy mirror group index"); 202 : 0 : goto exit; 203 : : } 204 : : 205 : : rc = 0; 206 : 0 : exit: 207 : : mbox_put(mbox); 208 : 0 : return rc; 209 : : }