octeontx2-af: Add devlink suppoort to af driver
authorGeorge Cherian <george.cherian@marvell.com>
Fri, 11 Dec 2020 06:25:24 +0000 (11:55 +0530)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Dec 2020 01:49:28 +0000 (17:49 -0800)
Add devlink support to AF driver. Basic devlink support is added.
Currently info_get is the only supported devlink ops.

devlink ouptput looks like this
 # devlink dev
 pci/0002:01:00.0
 # devlink dev info
 pci/0002:01:00.0:
  driver octeontx2-af
 #

Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com>
Signed-off-by: Jerin Jacob <jerinj@marvell.com>
Signed-off-by: George Cherian <george.cherian@marvell.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/Kconfig
drivers/net/ethernet/marvell/octeontx2/af/Makefile
drivers/net/ethernet/marvell/octeontx2/af/rvu.c
drivers/net/ethernet/marvell/octeontx2/af/rvu.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c [new file with mode: 0644]
drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.h [new file with mode: 0644]

index 543a1d0475678c7393e53567e8eaa16ac3a6b670..16caa02095feaa98ac2e707a86e6171e05035b2b 100644 (file)
@@ -9,6 +9,7 @@ config OCTEONTX2_MBOX
 config OCTEONTX2_AF
        tristate "Marvell OcteonTX2 RVU Admin Function driver"
        select OCTEONTX2_MBOX
+       select NET_DEVLINK
        depends on (64BIT && COMPILE_TEST) || ARM64
        depends on PCI
        help
index 7100d1dd856e6782a9efacfbfd8bf7329e3eb061..eb535c98ca3812bc3e0dd6df21e81d100e97dd83 100644 (file)
@@ -10,4 +10,4 @@ obj-$(CONFIG_OCTEONTX2_AF) += octeontx2_af.o
 octeontx2_mbox-y := mbox.o rvu_trace.o
 octeontx2_af-y := cgx.o rvu.o rvu_cgx.o rvu_npa.o rvu_nix.o \
                  rvu_reg.o rvu_npc.o rvu_debugfs.o ptp.o rvu_npc_fs.o \
-                 rvu_cpt.o
+                 rvu_cpt.o rvu_devlink.o
index 9f901c0edcbbbbf34dd699a374959250a7549023..e8fd712860a161ce28728a07663c3e9976786225 100644 (file)
@@ -2826,17 +2826,23 @@ static int rvu_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (err)
                goto err_flr;
 
+       err = rvu_register_dl(rvu);
+       if (err)
+               goto err_irq;
+
        rvu_setup_rvum_blk_revid(rvu);
 
        /* Enable AF's VFs (if any) */
        err = rvu_enable_sriov(rvu);
        if (err)
-               goto err_irq;
+               goto err_dl;
 
        /* Initialize debugfs */
        rvu_dbg_init(rvu);
 
        return 0;
+err_dl:
+       rvu_unregister_dl(rvu);
 err_irq:
        rvu_unregister_interrupts(rvu);
 err_flr:
@@ -2868,6 +2874,7 @@ static void rvu_remove(struct pci_dev *pdev)
 
        rvu_dbg_exit(rvu);
        rvu_unregister_interrupts(rvu);
+       rvu_unregister_dl(rvu);
        rvu_flr_wq_destroy(rvu);
        rvu_cgx_exit(rvu);
        rvu_fwdata_exit(rvu);
index b6c0977499ab8d26a456b88e915487c58e3acc20..b1a6ecfd563ebc253fed28f75ebf8dfa7ea1275f 100644 (file)
 #define RVU_H
 
 #include <linux/pci.h>
+#include <net/devlink.h>
+
 #include "rvu_struct.h"
+#include "rvu_devlink.h"
 #include "common.h"
 #include "mbox.h"
 #include "npc.h"
@@ -422,6 +425,7 @@ struct rvu {
 #ifdef CONFIG_DEBUG_FS
        struct rvu_debugfs      rvu_dbg;
 #endif
+       struct rvu_devlink      *rvu_dl;
 };
 
 static inline void rvu_write64(struct rvu *rvu, u64 block, u64 offset, u64 val)
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.c
new file mode 100644 (file)
index 0000000..5dabca0
--- /dev/null
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Marvell OcteonTx2 RVU Devlink
+ *
+ * Copyright (C) 2020 Marvell.
+ *
+ */
+
+#include "rvu.h"
+
+#define DRV_NAME "octeontx2-af"
+
+static int rvu_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
+                               struct netlink_ext_ack *extack)
+{
+       return devlink_info_driver_name_put(req, DRV_NAME);
+}
+
+static const struct devlink_ops rvu_devlink_ops = {
+       .info_get = rvu_devlink_info_get,
+};
+
+int rvu_register_dl(struct rvu *rvu)
+{
+       struct rvu_devlink *rvu_dl;
+       struct devlink *dl;
+       int err;
+
+       rvu_dl = kzalloc(sizeof(*rvu_dl), GFP_KERNEL);
+       if (!rvu_dl)
+               return -ENOMEM;
+
+       dl = devlink_alloc(&rvu_devlink_ops, sizeof(struct rvu_devlink));
+       if (!dl) {
+               dev_warn(rvu->dev, "devlink_alloc failed\n");
+               kfree(rvu_dl);
+               return -ENOMEM;
+       }
+
+       err = devlink_register(dl, rvu->dev);
+       if (err) {
+               dev_err(rvu->dev, "devlink register failed with error %d\n", err);
+               devlink_free(dl);
+               kfree(rvu_dl);
+               return err;
+       }
+
+       rvu_dl->dl = dl;
+       rvu_dl->rvu = rvu;
+       rvu->rvu_dl = rvu_dl;
+       return 0;
+}
+
+void rvu_unregister_dl(struct rvu *rvu)
+{
+       struct rvu_devlink *rvu_dl = rvu->rvu_dl;
+       struct devlink *dl = rvu_dl->dl;
+
+       if (!dl)
+               return;
+
+       devlink_unregister(dl);
+       devlink_free(dl);
+       kfree(rvu_dl);
+}
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu_devlink.h
new file mode 100644 (file)
index 0000000..1ed6dde
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*  Marvell OcteonTx2 RVU Devlink
+ *
+ * Copyright (C) 2020 Marvell.
+ *
+ */
+
+#ifndef RVU_DEVLINK_H
+#define  RVU_DEVLINK_H
+
+struct rvu_devlink {
+       struct devlink *dl;
+       struct rvu *rvu;
+};
+
+/* Devlink APIs */
+int rvu_register_dl(struct rvu *rvu);
+void rvu_unregister_dl(struct rvu *rvu);
+
+#endif /* RVU_DEVLINK_H */