1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
8 static inline struct mbox *
9 get_mbox(struct roc_nix *roc_nix)
11 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
12 struct dev *dev = &nix->dev;
18 nix_lso_tcp(struct nix_lso_format_cfg *req, bool v4)
20 __io struct nix_lso_format *field;
22 /* Format works only with TCP packet marked by OL3/OL4 */
23 field = (__io struct nix_lso_format *)&req->fields[0];
24 req->field_mask = NIX_LSO_FIELD_MASK;
26 field->layer = NIX_TXLAYER_OL3;
27 field->offset = v4 ? 2 : 4;
28 field->sizem1 = 1; /* 2B */
29 field->alg = NIX_LSOALG_ADD_PAYLEN;
33 field->layer = NIX_TXLAYER_OL3;
36 /* Incremented linearly per segment */
37 field->alg = NIX_LSOALG_ADD_SEGNUM;
41 /* TCP sequence number update */
42 field->layer = NIX_TXLAYER_OL4;
44 field->sizem1 = 3; /* 4 bytes */
45 field->alg = NIX_LSOALG_ADD_OFFSET;
48 field->layer = NIX_TXLAYER_OL4;
51 field->alg = NIX_LSOALG_TCP_FLAGS;
56 nix_lso_udp_tun_tcp(struct nix_lso_format_cfg *req, bool outer_v4,
59 __io struct nix_lso_format *field;
61 field = (__io struct nix_lso_format *)&req->fields[0];
62 req->field_mask = NIX_LSO_FIELD_MASK;
63 /* Outer IPv4/IPv6 len */
64 field->layer = NIX_TXLAYER_OL3;
65 field->offset = outer_v4 ? 2 : 4;
66 field->sizem1 = 1; /* 2B */
67 field->alg = NIX_LSOALG_ADD_PAYLEN;
71 field->layer = NIX_TXLAYER_OL3;
74 /* Incremented linearly per segment */
75 field->alg = NIX_LSOALG_ADD_SEGNUM;
79 /* Outer UDP length */
80 field->layer = NIX_TXLAYER_OL4;
83 field->alg = NIX_LSOALG_ADD_PAYLEN;
87 field->layer = NIX_TXLAYER_IL3;
88 field->offset = inner_v4 ? 2 : 4;
89 field->sizem1 = 1; /* 2B */
90 field->alg = NIX_LSOALG_ADD_PAYLEN;
94 field->layer = NIX_TXLAYER_IL3;
97 /* Incremented linearly per segment */
98 field->alg = NIX_LSOALG_ADD_SEGNUM;
102 /* TCP sequence number update */
103 field->layer = NIX_TXLAYER_IL4;
105 field->sizem1 = 3; /* 4 bytes */
106 field->alg = NIX_LSOALG_ADD_OFFSET;
109 /* TCP flags field */
110 field->layer = NIX_TXLAYER_IL4;
113 field->alg = NIX_LSOALG_TCP_FLAGS;
118 nix_lso_tun_tcp(struct nix_lso_format_cfg *req, bool outer_v4, bool inner_v4)
120 __io struct nix_lso_format *field;
122 field = (__io struct nix_lso_format *)&req->fields[0];
123 req->field_mask = NIX_LSO_FIELD_MASK;
124 /* Outer IPv4/IPv6 len */
125 field->layer = NIX_TXLAYER_OL3;
126 field->offset = outer_v4 ? 2 : 4;
127 field->sizem1 = 1; /* 2B */
128 field->alg = NIX_LSOALG_ADD_PAYLEN;
132 field->layer = NIX_TXLAYER_OL3;
135 /* Incremented linearly per segment */
136 field->alg = NIX_LSOALG_ADD_SEGNUM;
140 /* Inner IPv4/IPv6 */
141 field->layer = NIX_TXLAYER_IL3;
142 field->offset = inner_v4 ? 2 : 4;
143 field->sizem1 = 1; /* 2B */
144 field->alg = NIX_LSOALG_ADD_PAYLEN;
148 field->layer = NIX_TXLAYER_IL3;
151 /* Incremented linearly per segment */
152 field->alg = NIX_LSOALG_ADD_SEGNUM;
156 /* TCP sequence number update */
157 field->layer = NIX_TXLAYER_IL4;
159 field->sizem1 = 3; /* 4 bytes */
160 field->alg = NIX_LSOALG_ADD_OFFSET;
163 /* TCP flags field */
164 field->layer = NIX_TXLAYER_IL4;
167 field->alg = NIX_LSOALG_TCP_FLAGS;
172 roc_nix_lso_custom_fmt_setup(struct roc_nix *roc_nix,
173 struct nix_lso_format *fields, uint16_t nb_fields)
175 struct mbox *mbox = get_mbox(roc_nix);
176 struct nix_lso_format_cfg_rsp *rsp;
177 struct nix_lso_format_cfg *req;
180 if (nb_fields > NIX_LSO_FIELD_MAX)
183 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
187 req->field_mask = NIX_LSO_FIELD_MASK;
188 mbox_memcpy(req->fields, fields,
189 sizeof(struct nix_lso_format) * nb_fields);
191 rc = mbox_process_msg(mbox, (void *)&rsp);
195 plt_nix_dbg("Setup custom format %u", rsp->lso_format_idx);
196 return rsp->lso_format_idx;
200 roc_nix_lso_fmt_setup(struct roc_nix *roc_nix)
202 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
203 struct mbox *mbox = get_mbox(roc_nix);
204 struct nix_lso_format_cfg_rsp *rsp;
205 struct nix_lso_format_cfg *req;
211 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
214 nix_lso_tcp(req, true);
215 rc = mbox_process_msg(mbox, (void *)&rsp);
219 if (rsp->lso_format_idx != NIX_LSO_FORMAT_IDX_TSOV4)
220 return NIX_ERR_INTERNAL;
222 plt_nix_dbg("tcpv4 lso fmt=%u\n", rsp->lso_format_idx);
227 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
230 nix_lso_tcp(req, false);
231 rc = mbox_process_msg(mbox, (void *)&rsp);
235 if (rsp->lso_format_idx != NIX_LSO_FORMAT_IDX_TSOV6)
236 return NIX_ERR_INTERNAL;
238 plt_nix_dbg("tcpv6 lso fmt=%u\n", rsp->lso_format_idx);
241 * IPv4/UDP/TUN HDR/IPv4/TCP LSO
243 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
246 nix_lso_udp_tun_tcp(req, true, true);
247 rc = mbox_process_msg(mbox, (void *)&rsp);
251 nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V4] = rsp->lso_format_idx;
252 plt_nix_dbg("udp tun v4v4 fmt=%u\n", rsp->lso_format_idx);
255 * IPv4/UDP/TUN HDR/IPv6/TCP LSO
257 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
260 nix_lso_udp_tun_tcp(req, true, false);
261 rc = mbox_process_msg(mbox, (void *)&rsp);
265 nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V4V6] = rsp->lso_format_idx;
266 plt_nix_dbg("udp tun v4v6 fmt=%u\n", rsp->lso_format_idx);
269 * IPv6/UDP/TUN HDR/IPv4/TCP LSO
271 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
274 nix_lso_udp_tun_tcp(req, false, true);
275 rc = mbox_process_msg(mbox, (void *)&rsp);
279 nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V4] = rsp->lso_format_idx;
280 plt_nix_dbg("udp tun v6v4 fmt=%u\n", rsp->lso_format_idx);
283 * IPv6/UDP/TUN HDR/IPv6/TCP LSO
285 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
288 nix_lso_udp_tun_tcp(req, false, false);
289 rc = mbox_process_msg(mbox, (void *)&rsp);
293 nix->lso_udp_tun_idx[ROC_NIX_LSO_TUN_V6V6] = rsp->lso_format_idx;
294 plt_nix_dbg("udp tun v6v6 fmt=%u\n", rsp->lso_format_idx);
297 * IPv4/TUN HDR/IPv4/TCP LSO
299 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
302 nix_lso_tun_tcp(req, true, true);
303 rc = mbox_process_msg(mbox, (void *)&rsp);
307 nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V4] = rsp->lso_format_idx;
308 plt_nix_dbg("tun v4v4 fmt=%u\n", rsp->lso_format_idx);
311 * IPv4/TUN HDR/IPv6/TCP LSO
313 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
316 nix_lso_tun_tcp(req, true, false);
317 rc = mbox_process_msg(mbox, (void *)&rsp);
321 nix->lso_tun_idx[ROC_NIX_LSO_TUN_V4V6] = rsp->lso_format_idx;
322 plt_nix_dbg("tun v4v6 fmt=%u\n", rsp->lso_format_idx);
325 * IPv6/TUN HDR/IPv4/TCP LSO
327 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
330 nix_lso_tun_tcp(req, false, true);
331 rc = mbox_process_msg(mbox, (void *)&rsp);
335 nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V4] = rsp->lso_format_idx;
336 plt_nix_dbg("tun v6v4 fmt=%u\n", rsp->lso_format_idx);
339 * IPv6/TUN HDR/IPv6/TCP LSO
341 req = mbox_alloc_msg_nix_lso_format_cfg(mbox);
344 nix_lso_tun_tcp(req, false, false);
345 rc = mbox_process_msg(mbox, (void *)&rsp);
349 nix->lso_tun_idx[ROC_NIX_LSO_TUN_V6V6] = rsp->lso_format_idx;
350 plt_nix_dbg("tun v6v6 fmt=%u\n", rsp->lso_format_idx);
355 roc_nix_lso_fmt_get(struct roc_nix *roc_nix,
356 uint8_t udp_tun[ROC_NIX_LSO_TUN_MAX],
357 uint8_t tun[ROC_NIX_LSO_TUN_MAX])
359 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
361 memcpy(udp_tun, nix->lso_udp_tun_idx, ROC_NIX_LSO_TUN_MAX);
362 memcpy(tun, nix->lso_tun_idx, ROC_NIX_LSO_TUN_MAX);
367 roc_nix_switch_hdr_set(struct roc_nix *roc_nix, uint64_t switch_header_type)
369 struct mbox *mbox = get_mbox(roc_nix);
370 struct npc_set_pkind *req;
371 struct msg_resp *rsp;
374 if (switch_header_type == 0)
375 switch_header_type = ROC_PRIV_FLAGS_DEFAULT;
377 if (switch_header_type != ROC_PRIV_FLAGS_DEFAULT &&
378 switch_header_type != ROC_PRIV_FLAGS_EDSA &&
379 switch_header_type != ROC_PRIV_FLAGS_HIGIG &&
380 switch_header_type != ROC_PRIV_FLAGS_LEN_90B &&
381 switch_header_type != ROC_PRIV_FLAGS_EXDSA &&
382 switch_header_type != ROC_PRIV_FLAGS_VLAN_EXDSA &&
383 switch_header_type != ROC_PRIV_FLAGS_CUSTOM) {
384 plt_err("switch header type is not supported");
385 return NIX_ERR_PARAM;
388 if (switch_header_type == ROC_PRIV_FLAGS_LEN_90B &&
389 !roc_nix_is_sdp(roc_nix)) {
390 plt_err("chlen90b is not supported on non-SDP device");
391 return NIX_ERR_PARAM;
394 if (switch_header_type == ROC_PRIV_FLAGS_HIGIG &&
395 roc_nix_is_vf_or_sdp(roc_nix)) {
396 plt_err("higig2 is supported on PF devices only");
397 return NIX_ERR_PARAM;
400 req = mbox_alloc_msg_npc_set_pkind(mbox);
403 req->mode = switch_header_type;
405 if (switch_header_type == ROC_PRIV_FLAGS_LEN_90B) {
406 req->mode = ROC_PRIV_FLAGS_CUSTOM;
407 req->pkind = NPC_RX_CHLEN90B_PKIND;
408 } else if (switch_header_type == ROC_PRIV_FLAGS_EXDSA) {
409 req->mode = ROC_PRIV_FLAGS_CUSTOM;
410 req->pkind = NPC_RX_EXDSA_PKIND;
411 } else if (switch_header_type == ROC_PRIV_FLAGS_VLAN_EXDSA) {
412 req->mode = ROC_PRIV_FLAGS_CUSTOM;
413 req->pkind = NPC_RX_VLAN_EXDSA_PKIND;
417 rc = mbox_process_msg(mbox, (void *)&rsp);
421 req = mbox_alloc_msg_npc_set_pkind(mbox);
424 req->mode = switch_header_type;
426 return mbox_process_msg(mbox, (void *)&rsp);
430 roc_nix_eeprom_info_get(struct roc_nix *roc_nix,
431 struct roc_nix_eeprom_info *info)
433 struct mbox *mbox = get_mbox(roc_nix);
434 struct cgx_fw_data *rsp = NULL;
438 plt_err("Input buffer is NULL");
439 return NIX_ERR_PARAM;
442 mbox_alloc_msg_cgx_get_aux_link_info(mbox);
443 rc = mbox_process_msg(mbox, (void *)&rsp);
445 plt_err("Failed to get fw data: %d", rc);
449 info->sff_id = rsp->fwdata.sfp_eeprom.sff_id;
450 mbox_memcpy(info->buf, rsp->fwdata.sfp_eeprom.buf, SFP_EEPROM_SIZE);
455 roc_nix_rx_drop_re_set(struct roc_nix *roc_nix, bool ena)
457 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
458 struct mbox *mbox = get_mbox(roc_nix);
459 struct nix_rx_cfg *req;
462 /* No-op if no change */
463 if (ena == !!(nix->rx_cfg & ROC_NIX_LF_RX_CFG_DROP_RE))
466 req = mbox_alloc_msg_nix_set_rx_cfg(mbox);
471 req->len_verify |= NIX_RX_DROP_RE;
472 /* Keep other flags intact */
473 if (nix->rx_cfg & ROC_NIX_LF_RX_CFG_LEN_OL3)
474 req->len_verify |= NIX_RX_OL3_VERIFY;
476 if (nix->rx_cfg & ROC_NIX_LF_RX_CFG_LEN_OL4)
477 req->len_verify |= NIX_RX_OL4_VERIFY;
479 if (nix->rx_cfg & ROC_NIX_LF_RX_CFG_CSUM_OL4)
480 req->csum_verify |= NIX_RX_CSUM_OL4_VERIFY;
482 rc = mbox_process(mbox);
487 nix->rx_cfg |= ROC_NIX_LF_RX_CFG_DROP_RE;
489 nix->rx_cfg &= ~ROC_NIX_LF_RX_CFG_DROP_RE;