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_vlan_mcam_entry_read(struct roc_nix *roc_nix, uint32_t index, 10 : : struct npc_mcam_read_entry_rsp **rsp) 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_read_entry_req *req; 16 : : int rc = -ENOSPC; 17 : : 18 : 0 : req = mbox_alloc_msg_npc_mcam_read_entry(mbox); 19 [ # # ]: 0 : if (req == NULL) 20 : 0 : goto exit; 21 : 0 : req->entry = index; 22 : : 23 : : rc = mbox_process_msg(mbox, (void **)rsp); 24 : 0 : exit: 25 : : mbox_put(mbox); 26 : 0 : return rc; 27 : : } 28 : : 29 : : int 30 : 0 : roc_nix_vlan_mcam_entry_write(struct roc_nix *roc_nix, uint32_t index, 31 : : struct mcam_entry *entry, uint8_t intf, 32 : : uint8_t enable) 33 : : { 34 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 35 : : struct dev *dev = &nix->dev; 36 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 37 : : struct npc_mcam_write_entry_req *req; 38 : : struct msghdr *rsp; 39 : : int rc = -ENOSPC; 40 : : 41 : 0 : req = mbox_alloc_msg_npc_mcam_write_entry(mbox); 42 [ # # ]: 0 : if (req == NULL) 43 : 0 : goto exit; 44 : 0 : req->entry = index; 45 : 0 : req->intf = intf; 46 : 0 : req->enable_entry = enable; 47 [ # # ]: 0 : mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry)); 48 : : 49 : : rc = mbox_process_msg(mbox, (void *)&rsp); 50 : 0 : exit: 51 : : mbox_put(mbox); 52 : 0 : return rc; 53 : : } 54 : : 55 : : int 56 : 0 : roc_nix_vlan_mcam_entry_alloc_and_write(struct roc_nix *roc_nix, 57 : : struct mcam_entry *entry, uint8_t intf, 58 : : uint8_t priority, uint8_t ref_entry) 59 : : { 60 : : struct npc_mcam_alloc_and_write_entry_req *req; 61 : : struct npc_mcam_alloc_and_write_entry_rsp *rsp; 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 : req = mbox_alloc_msg_npc_mcam_alloc_and_write_entry(mbox); 68 [ # # ]: 0 : if (req == NULL) 69 : 0 : goto exit; 70 : 0 : req->priority = priority; 71 : 0 : req->ref_entry = ref_entry; 72 : 0 : req->intf = intf; 73 : 0 : req->enable_entry = true; 74 [ # # ]: 0 : mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry)); 75 : : 76 : : rc = mbox_process_msg(mbox, (void *)&rsp); 77 [ # # ]: 0 : if (rc) 78 : 0 : goto exit; 79 : : 80 : 0 : rc = rsp->entry; 81 : 0 : exit: 82 : : mbox_put(mbox); 83 : 0 : return rc; 84 : : } 85 : : 86 : : int 87 : 0 : roc_nix_vlan_mcam_entry_free(struct roc_nix *roc_nix, uint32_t index) 88 : : { 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 : : struct npc_mcam_free_entry_req *req; 93 : : int rc = -ENOSPC; 94 : : 95 : 0 : req = mbox_alloc_msg_npc_mcam_free_entry(mbox); 96 [ # # ]: 0 : if (req == NULL) 97 : 0 : goto exit; 98 : 0 : req->entry = index; 99 : : 100 : : rc = mbox_process_msg(mbox, NULL); 101 : 0 : exit: 102 : : mbox_put(mbox); 103 : 0 : return rc; 104 : : } 105 : : 106 : : int 107 : 0 : roc_nix_vlan_mcam_entry_ena_dis(struct roc_nix *roc_nix, uint32_t index, 108 : : const int enable) 109 : : { 110 : : struct npc_mcam_ena_dis_entry_req *req; 111 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 112 : : struct dev *dev = &nix->dev; 113 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 114 : : int rc = -ENOSPC; 115 : : 116 [ # # ]: 0 : if (enable) { 117 : 0 : req = mbox_alloc_msg_npc_mcam_ena_entry(mbox); 118 [ # # ]: 0 : if (req == NULL) 119 : 0 : goto exit; 120 : : } else { 121 : 0 : req = mbox_alloc_msg_npc_mcam_dis_entry(mbox); 122 [ # # ]: 0 : if (req == NULL) 123 : 0 : goto exit; 124 : : } 125 : : 126 : 0 : req->entry = index; 127 : : rc = mbox_process_msg(mbox, NULL); 128 : 0 : exit: 129 : : mbox_put(mbox); 130 : 0 : return rc; 131 : : } 132 : : 133 : : int 134 : 0 : roc_nix_vlan_strip_vtag_ena_dis(struct roc_nix *roc_nix, bool enable) 135 : : { 136 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 137 : : struct dev *dev = &nix->dev; 138 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 139 : : struct nix_vtag_config *vtag_cfg; 140 : : int rc = -ENOSPC; 141 : : 142 : 0 : vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox); 143 [ # # ]: 0 : if (vtag_cfg == NULL) 144 : 0 : goto exit; 145 : 0 : vtag_cfg->vtag_size = NIX_VTAGSIZE_T4; 146 : 0 : vtag_cfg->cfg_type = 1; /* Rx VLAN configuration */ 147 : 0 : vtag_cfg->rx.capture_vtag = 1; /* Always capture */ 148 : 0 : vtag_cfg->rx.vtag_type = 0; /* Use index 0 */ 149 : : 150 [ # # ]: 0 : if (enable) 151 : 0 : vtag_cfg->rx.strip_vtag = 1; 152 : : else 153 : 0 : vtag_cfg->rx.strip_vtag = 0; 154 : : 155 : 0 : rc = mbox_process(mbox); 156 : 0 : exit: 157 : : mbox_put(mbox); 158 : 0 : return rc; 159 : : } 160 : : 161 : : int 162 : 0 : roc_nix_vlan_insert_ena_dis(struct roc_nix *roc_nix, 163 : : struct roc_nix_vlan_config *vlan_cfg, 164 : : uint64_t *mcam_index, bool enable) 165 : : { 166 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 167 : : struct dev *dev = &nix->dev; 168 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 169 : : struct nix_vtag_config *vtag_cfg; 170 : : struct nix_vtag_config_rsp *rsp; 171 : : int rc = -ENOSPC; 172 : : 173 : 0 : vtag_cfg = mbox_alloc_msg_nix_vtag_cfg(mbox); 174 [ # # ]: 0 : if (vtag_cfg == NULL) 175 : 0 : goto exit; 176 : 0 : vtag_cfg->cfg_type = 0; /* Tx VLAN configuration */ 177 : 0 : vtag_cfg->vtag_size = NIX_VTAGSIZE_T4; 178 : : 179 [ # # ]: 0 : if (enable) { 180 [ # # ]: 0 : if (vlan_cfg->type & ROC_NIX_VLAN_TYPE_INNER) { 181 : 0 : vtag_cfg->tx.vtag0 = vlan_cfg->vlan.vtag_inner; 182 : 0 : vtag_cfg->tx.cfg_vtag0 = true; 183 : : } 184 [ # # ]: 0 : if (vlan_cfg->type & ROC_NIX_VLAN_TYPE_OUTER) { 185 : 0 : vtag_cfg->tx.vtag1 = vlan_cfg->vlan.vtag_outer; 186 : 0 : vtag_cfg->tx.cfg_vtag1 = true; 187 : : } 188 : : } else { 189 [ # # ]: 0 : if (vlan_cfg->type & ROC_NIX_VLAN_TYPE_INNER) { 190 : 0 : vtag_cfg->tx.vtag0_idx = vlan_cfg->mcam.idx_inner; 191 : 0 : vtag_cfg->tx.free_vtag0 = true; 192 : : } 193 [ # # ]: 0 : if (vlan_cfg->type & ROC_NIX_VLAN_TYPE_OUTER) { 194 : 0 : vtag_cfg->tx.vtag1_idx = vlan_cfg->mcam.idx_outer; 195 : 0 : vtag_cfg->tx.free_vtag1 = true; 196 : : } 197 : : } 198 : : 199 : : rc = mbox_process_msg(mbox, (void *)&rsp); 200 [ # # ]: 0 : if (rc) 201 : 0 : goto exit; 202 : : 203 [ # # ]: 0 : if (enable) 204 : 0 : *mcam_index = 205 : 0 : (((uint64_t)rsp->vtag1_idx << 32) | rsp->vtag0_idx); 206 : : 207 : : rc = 0; 208 : 0 : exit: 209 : : mbox_put(mbox); 210 : 0 : return rc; 211 : : } 212 : : 213 : : int 214 : 0 : roc_nix_vlan_tpid_set(struct roc_nix *roc_nix, uint32_t type, uint16_t tpid) 215 : : { 216 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 217 : : struct dev *dev = &nix->dev; 218 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 219 : : struct nix_set_vlan_tpid *tpid_cfg; 220 : : int rc = -ENOSPC; 221 : : 222 : 0 : tpid_cfg = mbox_alloc_msg_nix_set_vlan_tpid(mbox); 223 [ # # ]: 0 : if (tpid_cfg == NULL) 224 : 0 : goto exit; 225 : 0 : tpid_cfg->tpid = tpid; 226 : : 227 [ # # ]: 0 : if (type & ROC_NIX_VLAN_TYPE_OUTER) 228 : 0 : tpid_cfg->vlan_type = NIX_VLAN_TYPE_OUTER; 229 : : else 230 : 0 : tpid_cfg->vlan_type = NIX_VLAN_TYPE_INNER; 231 : : 232 : 0 : rc = mbox_process(mbox); 233 : 0 : exit: 234 : : mbox_put(mbox); 235 : 0 : return rc; 236 : : }