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 : : void
9 : 0 : roc_nix_rss_key_default_fill(struct roc_nix *roc_nix,
10 : : uint8_t key[ROC_NIX_RSS_KEY_LEN])
11 : : {
12 : : PLT_SET_USED(roc_nix);
13 : 0 : const uint8_t default_key[ROC_NIX_RSS_KEY_LEN] = {
14 : : 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED,
15 : : 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD,
16 : : 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED,
17 : : 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD,
18 : : 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD};
19 : :
20 : : memcpy(key, default_key, ROC_NIX_RSS_KEY_LEN);
21 : 0 : }
22 : :
23 : : void
24 : 0 : roc_nix_rss_key_set(struct roc_nix *roc_nix,
25 : : const uint8_t key[ROC_NIX_RSS_KEY_LEN])
26 : : {
27 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
28 : : const uint64_t *keyptr;
29 : : uint64_t val;
30 : : uint32_t idx;
31 : :
32 : : keyptr = (const uint64_t *)key;
33 [ # # ]: 0 : for (idx = 0; idx < (ROC_NIX_RSS_KEY_LEN >> 3); idx++) {
34 [ # # ]: 0 : val = plt_cpu_to_be_64(keyptr[idx]);
35 : 0 : plt_write64(val, nix->base + NIX_LF_RX_SECRETX(idx));
36 : : }
37 : 0 : }
38 : :
39 : : void
40 : 0 : roc_nix_rss_key_get(struct roc_nix *roc_nix, uint8_t key[ROC_NIX_RSS_KEY_LEN])
41 : : {
42 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
43 : : uint64_t *keyptr = (uint64_t *)key;
44 : : uint64_t val;
45 : : uint32_t idx;
46 : :
47 [ # # ]: 0 : for (idx = 0; idx < (ROC_NIX_RSS_KEY_LEN >> 3); idx++) {
48 [ # # ]: 0 : val = plt_read64(nix->base + NIX_LF_RX_SECRETX(idx));
49 [ # # ]: 0 : keyptr[idx] = plt_be_to_cpu_64(val);
50 : : }
51 : 0 : }
52 : :
53 : : static int
54 : 0 : nix_cn9k_rss_reta_set(struct nix *nix, uint8_t group,
55 : : uint16_t reta[ROC_NIX_RSS_RETA_MAX], uint8_t lock_rx_ctx)
56 : : {
57 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox);
58 : : struct nix_aq_enq_req *req;
59 : : uint16_t idx;
60 : : int rc;
61 : :
62 [ # # ]: 0 : for (idx = 0; idx < nix->reta_sz; idx++) {
63 : 0 : req = mbox_alloc_msg_nix_aq_enq(mbox);
64 [ # # ]: 0 : if (!req) {
65 : : /* The shared memory buffer can be full.
66 : : * Flush it and retry
67 : : */
68 : 0 : rc = mbox_process(mbox);
69 [ # # ]: 0 : if (rc < 0)
70 : 0 : goto exit;
71 : 0 : req = mbox_alloc_msg_nix_aq_enq(mbox);
72 [ # # ]: 0 : if (!req) {
73 : : rc = NIX_ERR_NO_MEM;
74 : 0 : goto exit;
75 : : }
76 : : }
77 : 0 : req->rss.rq = reta[idx];
78 : : /* Fill AQ info */
79 : 0 : req->qidx = (group * nix->reta_sz) + idx;
80 : 0 : req->ctype = NIX_AQ_CTYPE_RSS;
81 : 0 : req->op = NIX_AQ_INSTOP_INIT;
82 : :
83 [ # # ]: 0 : if (!lock_rx_ctx)
84 : 0 : continue;
85 : :
86 : 0 : req = mbox_alloc_msg_nix_aq_enq(mbox);
87 [ # # ]: 0 : if (!req) {
88 : : /* The shared memory buffer can be full.
89 : : * Flush it and retry
90 : : */
91 : 0 : rc = mbox_process(mbox);
92 [ # # ]: 0 : if (rc < 0)
93 : 0 : goto exit;
94 : 0 : req = mbox_alloc_msg_nix_aq_enq(mbox);
95 [ # # ]: 0 : if (!req) {
96 : : rc = NIX_ERR_NO_MEM;
97 : 0 : goto exit;
98 : : }
99 : : }
100 : 0 : req->rss.rq = reta[idx];
101 : : /* Fill AQ info */
102 : 0 : req->qidx = (group * nix->reta_sz) + idx;
103 : 0 : req->ctype = NIX_AQ_CTYPE_RSS;
104 : 0 : req->op = NIX_AQ_INSTOP_LOCK;
105 : : }
106 : :
107 : 0 : rc = mbox_process(mbox);
108 : : if (rc < 0)
109 : : goto exit;
110 : :
111 : : rc = 0;
112 : 0 : exit:
113 : : mbox_put(mbox);
114 : 0 : return rc;
115 : : }
116 : :
117 : : static int
118 : 0 : nix_rss_reta_set(struct nix *nix, uint8_t group,
119 : : uint16_t reta[ROC_NIX_RSS_RETA_MAX], uint8_t lock_rx_ctx)
120 : : {
121 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox);
122 : : struct nix_cn10k_aq_enq_req *req;
123 : : uint16_t idx;
124 : : int rc;
125 : :
126 [ # # ]: 0 : for (idx = 0; idx < nix->reta_sz; idx++) {
127 : 0 : req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
128 [ # # ]: 0 : if (!req) {
129 : : /* The shared memory buffer can be full.
130 : : * Flush it and retry
131 : : */
132 : 0 : rc = mbox_process(mbox);
133 [ # # ]: 0 : if (rc < 0)
134 : 0 : goto exit;
135 : 0 : req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
136 [ # # ]: 0 : if (!req) {
137 : : rc = NIX_ERR_NO_MEM;
138 : 0 : goto exit;
139 : : }
140 : : }
141 : 0 : req->rss.rq = reta[idx];
142 : : /* Fill AQ info */
143 : 0 : req->qidx = (group * nix->reta_sz) + idx;
144 : 0 : req->ctype = NIX_AQ_CTYPE_RSS;
145 : 0 : req->op = NIX_AQ_INSTOP_INIT;
146 : :
147 [ # # ]: 0 : if (!lock_rx_ctx)
148 : 0 : continue;
149 : :
150 : 0 : req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
151 [ # # ]: 0 : if (!req) {
152 : : /* The shared memory buffer can be full.
153 : : * Flush it and retry
154 : : */
155 : 0 : rc = mbox_process(mbox);
156 [ # # ]: 0 : if (rc < 0)
157 : 0 : goto exit;
158 : 0 : req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
159 [ # # ]: 0 : if (!req) {
160 : : rc = NIX_ERR_NO_MEM;
161 : 0 : goto exit;
162 : : }
163 : : }
164 : 0 : req->rss.rq = reta[idx];
165 : : /* Fill AQ info */
166 : 0 : req->qidx = (group * nix->reta_sz) + idx;
167 : 0 : req->ctype = NIX_AQ_CTYPE_RSS;
168 : 0 : req->op = NIX_AQ_INSTOP_LOCK;
169 : : }
170 : :
171 : 0 : rc = mbox_process(mbox);
172 : : if (rc < 0)
173 : : goto exit;
174 : :
175 : : rc = 0;
176 : 0 : exit:
177 : : mbox_put(mbox);
178 : 0 : return rc;
179 : : }
180 : :
181 : : int
182 [ # # ]: 0 : roc_nix_rss_reta_set(struct roc_nix *roc_nix, uint8_t group,
183 : : uint16_t reta[ROC_NIX_RSS_RETA_MAX])
184 : : {
185 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
186 : : int rc;
187 : :
188 [ # # ]: 0 : if (group >= ROC_NIX_RSS_GRPS)
189 : : return NIX_ERR_PARAM;
190 : :
191 [ # # ]: 0 : if (roc_model_is_cn9k())
192 : 0 : rc = nix_cn9k_rss_reta_set(nix, group, reta,
193 : 0 : roc_nix->lock_rx_ctx);
194 : : else
195 : 0 : rc = nix_rss_reta_set(nix, group, reta, roc_nix->lock_rx_ctx);
196 [ # # ]: 0 : if (rc)
197 : : return rc;
198 : :
199 : 0 : memcpy(&nix->reta[group], reta, ROC_NIX_RSS_RETA_MAX);
200 : 0 : return 0;
201 : : }
202 : :
203 : : int
204 : 0 : roc_nix_rss_reta_get(struct roc_nix *roc_nix, uint8_t group,
205 : : uint16_t reta[ROC_NIX_RSS_RETA_MAX])
206 : : {
207 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
208 : :
209 [ # # ]: 0 : if (group >= ROC_NIX_RSS_GRPS)
210 : : return NIX_ERR_PARAM;
211 : :
212 : 0 : memcpy(reta, &nix->reta[group], ROC_NIX_RSS_RETA_MAX);
213 : 0 : return 0;
214 : : }
215 : :
216 : : int
217 : 0 : roc_nix_rss_flowkey_set(struct roc_nix *roc_nix, uint8_t *alg_idx,
218 : : uint32_t flowkey, uint8_t group, int mcam_index)
219 : : {
220 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
221 : : struct nix_rss_flowkey_cfg_rsp *rss_rsp;
222 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox);
223 : : struct nix_rss_flowkey_cfg *cfg;
224 : : int rc = -ENOSPC;
225 : :
226 [ # # ]: 0 : if (group >= ROC_NIX_RSS_GRPS) {
227 : : rc = NIX_ERR_PARAM;
228 : 0 : goto exit;
229 : : }
230 : :
231 : 0 : cfg = mbox_alloc_msg_nix_rss_flowkey_cfg(mbox);
232 [ # # ]: 0 : if (cfg == NULL)
233 : 0 : goto exit;
234 : 0 : cfg->flowkey_cfg = flowkey;
235 : 0 : cfg->mcam_index = mcam_index; /* -1 indicates default group */
236 : 0 : cfg->group = group; /* 0 is default group */
237 : : rc = mbox_process_msg(mbox, (void *)&rss_rsp);
238 [ # # ]: 0 : if (rc)
239 : 0 : goto exit;
240 [ # # ]: 0 : if (alg_idx)
241 : 0 : *alg_idx = rss_rsp->alg_idx;
242 : :
243 : 0 : exit:
244 : : mbox_put(mbox);
245 : 0 : return rc;
246 : : }
247 : :
248 : : int
249 : 0 : roc_nix_rss_default_setup(struct roc_nix *roc_nix, uint32_t flowkey)
250 : : {
251 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix);
252 : 0 : uint16_t idx, qcnt = nix->nb_rx_queues;
253 : : uint16_t reta[ROC_NIX_RSS_RETA_MAX];
254 : : uint8_t key[ROC_NIX_RSS_KEY_LEN];
255 : : uint8_t alg_idx;
256 : : int rc;
257 : :
258 : 0 : roc_nix_rss_key_default_fill(roc_nix, key);
259 : 0 : roc_nix_rss_key_set(roc_nix, key);
260 : :
261 : : /* Update default RSS RETA */
262 [ # # ]: 0 : for (idx = 0; idx < nix->reta_sz; idx++)
263 : 0 : reta[idx] = idx % qcnt;
264 : 0 : rc = roc_nix_rss_reta_set(roc_nix, 0, reta);
265 [ # # ]: 0 : if (rc) {
266 : 0 : plt_err("Failed to set RSS reta table rc=%d", rc);
267 : 0 : goto fail;
268 : : }
269 : :
270 : : /* Update the default flowkey */
271 : 0 : rc = roc_nix_rss_flowkey_set(roc_nix, &alg_idx, flowkey,
272 : : ROC_NIX_RSS_GROUP_DEFAULT, -1);
273 [ # # ]: 0 : if (rc) {
274 : 0 : plt_err("Failed to set RSS flowkey rc=%d", rc);
275 : 0 : goto fail;
276 : : }
277 : :
278 : 0 : nix->rss_alg_idx = alg_idx;
279 : 0 : fail:
280 : 0 : return rc;
281 : : }
|