nfp: add devlink param infrastructure
authorDirk van der Merwe <dirk.vandermerwe@netronome.com>
Sun, 8 Sep 2019 23:54:23 +0000 (00:54 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 10 Sep 2019 16:29:27 +0000 (17:29 +0100)
Register devlink parameters for driver use. Subsequent patches will add
support for specific parameters.

In order to support devlink parameters, the management firmware needs to
be able to lookup and set hwinfo keys.

Signed-off-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/Makefile
drivers/net/ethernet/netronome/nfp/devlink_param.c [new file with mode: 0644]
drivers/net/ethernet/netronome/nfp/nfp_main.h
drivers/net/ethernet/netronome/nfp/nfp_net_main.c

index 2805641965f36f5976ae919a7c4e3dd662444671..d31772ae511d1d00a1df0ffe8e6d5987174748ba 100644 (file)
@@ -17,6 +17,7 @@ nfp-objs := \
            nfpcore/nfp_target.o \
            ccm.o \
            ccm_mbox.o \
+           devlink_param.o \
            nfp_asm.o \
            nfp_app.o \
            nfp_app_nic.o \
diff --git a/drivers/net/ethernet/netronome/nfp/devlink_param.c b/drivers/net/ethernet/netronome/nfp/devlink_param.c
new file mode 100644 (file)
index 0000000..aece985
--- /dev/null
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/* Copyright (C) 2019 Netronome Systems, Inc. */
+
+#include <net/devlink.h>
+
+#include "nfpcore/nfp_nsp.h"
+#include "nfp_main.h"
+
+static const struct devlink_param nfp_devlink_params[] = {
+};
+
+static int nfp_devlink_supports_params(struct nfp_pf *pf)
+{
+       struct nfp_nsp *nsp;
+       bool supported;
+       int err;
+
+       nsp = nfp_nsp_open(pf->cpp);
+       if (IS_ERR(nsp)) {
+               err = PTR_ERR(nsp);
+               dev_err(&pf->pdev->dev, "Failed to access the NSP: %d\n", err);
+               return err;
+       }
+
+       supported = nfp_nsp_has_hwinfo_lookup(nsp) &&
+                   nfp_nsp_has_hwinfo_set(nsp);
+
+       nfp_nsp_close(nsp);
+       return supported;
+}
+
+int nfp_devlink_params_register(struct nfp_pf *pf)
+{
+       struct devlink *devlink = priv_to_devlink(pf);
+       int err;
+
+       err = nfp_devlink_supports_params(pf);
+       if (err <= 0)
+               return err;
+
+       err = devlink_params_register(devlink, nfp_devlink_params,
+                                     ARRAY_SIZE(nfp_devlink_params));
+       if (err)
+               return err;
+
+       devlink_params_publish(devlink);
+       return 0;
+}
+
+void nfp_devlink_params_unregister(struct nfp_pf *pf)
+{
+       int err;
+
+       err = nfp_devlink_supports_params(pf);
+       if (err <= 0)
+               return;
+
+       devlink_params_unregister(priv_to_devlink(pf), nfp_devlink_params,
+                                 ARRAY_SIZE(nfp_devlink_params));
+}
index bd6450b0f23f2daa59e8a51d2fe7887e84b20488..5d5812fd93176aacbf4615c170afd5a4cf095651 100644 (file)
@@ -187,4 +187,7 @@ int nfp_shared_buf_pool_get(struct nfp_pf *pf, unsigned int sb, u16 pool_index,
 int nfp_shared_buf_pool_set(struct nfp_pf *pf, unsigned int sb,
                            u16 pool_index, u32 size,
                            enum devlink_sb_threshold_type threshold_type);
+
+int nfp_devlink_params_register(struct nfp_pf *pf);
+void nfp_devlink_params_unregister(struct nfp_pf *pf);
 #endif /* NFP_MAIN_H */
index 68db47d8e8b6993e7a918eb959ca2cdd4bcc1975..921db40047d780b2039d413609ae8cb12f961bb7 100644 (file)
@@ -709,6 +709,10 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
        if (err)
                goto err_devlink_unreg;
 
+       err = nfp_devlink_params_register(pf);
+       if (err)
+               goto err_shared_buf_unreg;
+
        mutex_lock(&pf->lock);
        pf->ddir = nfp_net_debugfs_device_add(pf->pdev);
 
@@ -742,6 +746,8 @@ err_free_vnics:
 err_clean_ddir:
        nfp_net_debugfs_dir_clean(&pf->ddir);
        mutex_unlock(&pf->lock);
+       nfp_devlink_params_unregister(pf);
+err_shared_buf_unreg:
        nfp_shared_buf_unregister(pf);
 err_devlink_unreg:
        cancel_work_sync(&pf->port_refresh_work);
@@ -771,6 +777,7 @@ void nfp_net_pci_remove(struct nfp_pf *pf)
 
        mutex_unlock(&pf->lock);
 
+       nfp_devlink_params_unregister(pf);
        nfp_shared_buf_unregister(pf);
        devlink_unregister(priv_to_devlink(pf));