app/testpmd: fix GTP PSC extension header length
[dpdk.git] / drivers / common / cnxk / roc_nix_mcast.c
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 static inline struct mbox *
9 get_mbox(struct roc_nix *roc_nix)
10 {
11         struct nix *nix = roc_nix_to_nix_priv(roc_nix);
12         struct dev *dev = &nix->dev;
13
14         return dev->mbox;
15 }
16
17 int
18 roc_nix_mcast_mcam_entry_alloc(struct roc_nix *roc_nix, uint16_t nb_entries,
19                                uint8_t priority, uint16_t index[])
20 {
21         struct mbox *mbox = get_mbox(roc_nix);
22         struct npc_mcam_alloc_entry_req *req;
23         struct npc_mcam_alloc_entry_rsp *rsp;
24         int rc = -ENOSPC, i;
25
26         req = mbox_alloc_msg_npc_mcam_alloc_entry(mbox);
27         if (req == NULL)
28                 return rc;
29         req->priority = priority;
30         req->count = nb_entries;
31
32         rc = mbox_process_msg(mbox, (void *)&rsp);
33         if (rc)
34                 return rc;
35
36         for (i = 0; i < rsp->count; i++)
37                 index[i] = rsp->entry_list[i];
38
39         return rsp->count;
40 }
41
42 int
43 roc_nix_mcast_mcam_entry_free(struct roc_nix *roc_nix, uint32_t index)
44 {
45         struct mbox *mbox = get_mbox(roc_nix);
46         struct npc_mcam_free_entry_req *req;
47         int rc = -ENOSPC;
48
49         req = mbox_alloc_msg_npc_mcam_free_entry(mbox);
50         if (req == NULL)
51                 return rc;
52         req->entry = index;
53
54         return mbox_process_msg(mbox, NULL);
55 }
56
57 int
58 roc_nix_mcast_mcam_entry_write(struct roc_nix *roc_nix,
59                                struct mcam_entry *entry, uint32_t index,
60                                uint8_t intf, uint64_t action)
61 {
62         struct mbox *mbox = get_mbox(roc_nix);
63         struct npc_mcam_write_entry_req *req;
64         int rc = -ENOSPC;
65
66         req = mbox_alloc_msg_npc_mcam_write_entry(mbox);
67         if (req == NULL)
68                 return rc;
69         req->entry = index;
70         req->intf = intf;
71         req->enable_entry = true;
72         mbox_memcpy(&req->entry_data, entry, sizeof(struct mcam_entry));
73         req->entry_data.action = action;
74
75         return mbox_process(mbox);
76 }
77
78 int
79 roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix *roc_nix, uint32_t index,
80                                  bool enable)
81 {
82         struct npc_mcam_ena_dis_entry_req *req;
83         struct mbox *mbox = get_mbox(roc_nix);
84         int rc = -ENOSPC;
85
86         if (enable) {
87                 req = mbox_alloc_msg_npc_mcam_ena_entry(mbox);
88                 if (req == NULL)
89                         return rc;
90         } else {
91                 req = mbox_alloc_msg_npc_mcam_dis_entry(mbox);
92                 if (req == NULL)
93                         return rc;
94         }
95
96         req->entry = index;
97         return mbox_process(mbox);
98 }