From: Rakesh Kudurumalla <[email protected]>

Add ROC APIs for Forward Error Correction (FEC) configuration:
- roc_nix_mac_fec_set: Set FEC mode on the link
- roc_nix_mac_fec_supported_get: Query supported FEC modes
  from firmware

These APIs use CGX mailbox messages to configure and query
FEC parameters on PF interfaces.

Signed-off-by: Rakesh Kudurumalla <[email protected]>
---
 drivers/common/cnxk/roc_nix.h                 |  2 +
 drivers/common/cnxk/roc_nix_mac.c             | 51 +++++++++++++++++++
 .../common/cnxk/roc_platform_base_symbols.c   |  2 +
 3 files changed, 55 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 8ba8b3e0b6..6130e4c42b 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -975,6 +975,8 @@ int __roc_api roc_nix_mac_link_info_set(struct roc_nix 
*roc_nix,
                                        struct roc_nix_link_info *link_info);
 int __roc_api roc_nix_mac_link_info_get(struct roc_nix *roc_nix,
                                        struct roc_nix_link_info *link_info);
+int __roc_api roc_nix_mac_fec_set(struct roc_nix *roc_nix, int fec);
+int __roc_api roc_nix_mac_fec_supported_get(struct roc_nix *roc_nix, uint64_t 
*supported_fec);
 int __roc_api roc_nix_mac_mtu_set(struct roc_nix *roc_nix, uint16_t mtu);
 int __roc_api roc_nix_mac_max_rx_len_set(struct roc_nix *roc_nix,
                                         uint16_t maxlen);
diff --git a/drivers/common/cnxk/roc_nix_mac.c 
b/drivers/common/cnxk/roc_nix_mac.c
index 376ff48522..4f856677e0 100644
--- a/drivers/common/cnxk/roc_nix_mac.c
+++ b/drivers/common/cnxk/roc_nix_mac.c
@@ -257,6 +257,57 @@ roc_nix_mac_link_state_set(struct roc_nix *roc_nix, 
uint8_t up)
        return rc;
 }
 
+int
+roc_nix_mac_fec_set(struct roc_nix *roc_nix, int fec)
+{
+       struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+       struct dev *dev = &nix->dev;
+       struct mbox *mbox = mbox_get(dev->mbox);
+       struct fec_mode *req;
+       int rc = -ENOSPC;
+
+       if (roc_nix_is_vf_or_sdp(roc_nix)) {
+               rc = NIX_ERR_OP_NOTSUP;
+               goto exit;
+       }
+
+       req = mbox_alloc_msg_cgx_set_fec_param(mbox);
+       if (req == NULL)
+               goto exit;
+       req->fec = fec;
+
+       rc = mbox_process(mbox);
+exit:
+       mbox_put(mbox);
+       return rc;
+}
+
+int
+roc_nix_mac_fec_supported_get(struct roc_nix *roc_nix, uint64_t *supported_fec)
+{
+       struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+       struct dev *dev = &nix->dev;
+       struct mbox *mbox = mbox_get(dev->mbox);
+       struct cgx_fw_data *rsp = NULL;
+       int rc;
+
+       if (roc_nix_is_vf_or_sdp(roc_nix)) {
+               rc = NIX_ERR_OP_NOTSUP;
+               goto exit;
+       }
+
+       mbox_alloc_msg_cgx_get_aux_link_info(mbox);
+       rc = mbox_process_msg(mbox, (void *)&rsp);
+       if (rc)
+               goto exit;
+
+       *supported_fec = rsp->fwdata.supported_fec;
+       rc = 0;
+exit:
+       mbox_put(mbox);
+       return rc;
+}
+
 int
 roc_nix_mac_link_info_set(struct roc_nix *roc_nix,
                          struct roc_nix_link_info *link_info)
diff --git a/drivers/common/cnxk/roc_platform_base_symbols.c 
b/drivers/common/cnxk/roc_platform_base_symbols.c
index cf080b1bdc..9584c1d259 100644
--- a/drivers/common/cnxk/roc_platform_base_symbols.c
+++ b/drivers/common/cnxk/roc_platform_base_symbols.c
@@ -304,6 +304,8 @@ RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_rxtx_start_stop)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_link_event_start_stop)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_loopback_enable)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_addr_set)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_fec_set)
+RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_fec_supported_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_max_entries_get)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_addr_add)
 RTE_EXPORT_INTERNAL_SYMBOL(roc_nix_mac_addr_del)
-- 
2.25.1

Reply via email to