1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #include <rte_malloc.h>
8 #include "otx2_ethdev.h"
12 #define VLAN_ID_MATCH 0x1
13 #define VTAG_F_MATCH 0x2
14 #define MAC_ADDR_MATCH 0x4
15 #define QINQ_F_MATCH 0x8
16 #define VLAN_DROP 0x10
24 __rte_unused nix_vlan_mcam_enb_dis(struct otx2_eth_dev *dev,
25 uint32_t entry, const int enable)
27 struct npc_mcam_ena_dis_entry_req *req;
28 struct otx2_mbox *mbox = dev->mbox;
32 req = otx2_mbox_alloc_msg_npc_mcam_ena_entry(mbox);
34 req = otx2_mbox_alloc_msg_npc_mcam_dis_entry(mbox);
38 rc = otx2_mbox_process_msg(mbox, NULL);
43 __rte_unused nix_vlan_mcam_free(struct otx2_eth_dev *dev, uint32_t entry)
45 struct npc_mcam_free_entry_req *req;
46 struct otx2_mbox *mbox = dev->mbox;
49 req = otx2_mbox_alloc_msg_npc_mcam_free_entry(mbox);
52 rc = otx2_mbox_process_msg(mbox, NULL);
57 __rte_unused nix_vlan_mcam_write(struct rte_eth_dev *eth_dev, uint16_t ent_idx,
58 struct mcam_entry *entry, uint8_t intf)
60 struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
61 struct npc_mcam_write_entry_req *req;
62 struct otx2_mbox *mbox = dev->mbox;
66 req = otx2_mbox_alloc_msg_npc_mcam_write_entry(mbox);
70 req->enable_entry = 1;
71 memcpy(&req->entry_data, entry, sizeof(struct mcam_entry));
73 rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
78 __rte_unused nix_vlan_mcam_alloc_and_write(struct rte_eth_dev *eth_dev,
79 struct mcam_entry *entry,
80 uint8_t intf, bool drop)
82 struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
83 struct npc_mcam_alloc_and_write_entry_req *req;
84 struct npc_mcam_alloc_and_write_entry_rsp *rsp;
85 struct otx2_mbox *mbox = dev->mbox;
88 req = otx2_mbox_alloc_msg_npc_mcam_alloc_and_write_entry(mbox);
90 if (intf == NPC_MCAM_RX) {
91 if (!drop && dev->vlan_info.def_rx_mcam_idx) {
92 req->priority = NPC_MCAM_HIGHER_PRIO;
93 req->ref_entry = dev->vlan_info.def_rx_mcam_idx;
94 } else if (drop && dev->vlan_info.qinq_mcam_idx) {
95 req->priority = NPC_MCAM_LOWER_PRIO;
96 req->ref_entry = dev->vlan_info.qinq_mcam_idx;
98 req->priority = NPC_MCAM_ANY_PRIO;
102 req->priority = NPC_MCAM_ANY_PRIO;
107 req->enable_entry = 1;
108 memcpy(&req->entry_data, entry, sizeof(struct mcam_entry));
110 rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
118 nix_vlan_rx_mkex_offset(uint64_t mask)
123 nib_count += mask & 1;
127 return nib_count * 4;
131 nix_vlan_get_mkex_info(struct otx2_eth_dev *dev)
133 struct vlan_mkex_info *mkex = &dev->vlan_info.mkex;
134 struct otx2_npc_flow_info *npc = &dev->npc_flow;
135 struct npc_xtract_info *x_info = NULL;
141 otx2_err("Missing npc mkex configuration");
145 #define NPC_KEX_CHAN_NIBBLE_ENA 0x7ULL
146 #define NPC_KEX_LB_LTYPE_NIBBLE_ENA 0x1000ULL
147 #define NPC_KEX_LB_LTYPE_NIBBLE_MASK 0xFFFULL
149 rx_keyx = npc->keyx_supp_nmask[NPC_MCAM_RX];
150 if ((rx_keyx & NPC_KEX_CHAN_NIBBLE_ENA) != NPC_KEX_CHAN_NIBBLE_ENA)
153 if ((rx_keyx & NPC_KEX_LB_LTYPE_NIBBLE_ENA) !=
154 NPC_KEX_LB_LTYPE_NIBBLE_ENA)
158 nix_vlan_rx_mkex_offset(rx_keyx & NPC_KEX_LB_LTYPE_NIBBLE_MASK);
161 x_info = &(*p)[NPC_MCAM_RX][NPC_LID_LA][NPC_LT_LA_ETHER].xtract[0];
162 memcpy(&mkex->la_xtract, x_info, sizeof(struct npc_xtract_info));
163 x_info = &(*p)[NPC_MCAM_RX][NPC_LID_LB][NPC_LT_LB_CTAG].xtract[0];
164 memcpy(&mkex->lb_xtract, x_info, sizeof(struct npc_xtract_info));
170 otx2_nix_vlan_offload_init(struct rte_eth_dev *eth_dev)
172 struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
175 /* Port initialized for first time or restarted */
176 if (!dev->configured) {
177 rc = nix_vlan_get_mkex_info(dev);
179 otx2_err("Failed to get vlan mkex info rc=%d", rc);
187 otx2_nix_vlan_fini(__rte_unused struct rte_eth_dev *eth_dev)