octeontx2-af: Add Marvell OcteonTX2 RVU AF driver
authorSunil Goutham <sgoutham@marvell.com>
Wed, 10 Oct 2018 12:44:21 +0000 (18:14 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 10 Oct 2018 17:06:01 +0000 (10:06 -0700)
This patch adds basic template for Marvell OcteonTX2's
resource virtualization unit (RVU) admin function (AF)
driver. Just the driver registration and probe.

Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/Kconfig
drivers/net/ethernet/marvell/Makefile
drivers/net/ethernet/marvell/octeontx2/Kconfig [new file with mode: 0644]
drivers/net/ethernet/marvell/octeontx2/Makefile [new file with mode: 0644]
drivers/net/ethernet/marvell/octeontx2/af/Makefile [new file with mode: 0644]
drivers/net/ethernet/marvell/octeontx2/af/rvu.c [new file with mode: 0644]
drivers/net/ethernet/marvell/octeontx2/af/rvu.h [new file with mode: 0644]

index f33fd22b351c856a3544cdd9628a9da500d13abf..3238aa7f5dac03b6499e595916d03315873b05f6 100644 (file)
@@ -167,4 +167,7 @@ config SKY2_DEBUG
 
          If unsure, say N.
 
+
+source "drivers/net/ethernet/marvell/octeontx2/Kconfig"
+
 endif # NET_VENDOR_MARVELL
index 55d4d10aa7d38f8452915b56ff1b1fdf0d8b0f4f..89dea7284d5bd3d08fa20a067203380d032e8f3f 100644 (file)
@@ -11,3 +11,4 @@ obj-$(CONFIG_MVPP2) += mvpp2/
 obj-$(CONFIG_PXA168_ETH) += pxa168_eth.o
 obj-$(CONFIG_SKGE) += skge.o
 obj-$(CONFIG_SKY2) += sky2.o
+obj-y          += octeontx2/
diff --git a/drivers/net/ethernet/marvell/octeontx2/Kconfig b/drivers/net/ethernet/marvell/octeontx2/Kconfig
new file mode 100644 (file)
index 0000000..8823152
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# Marvell OcteonTX2 drivers configuration
+#
+
+config OCTEONTX2_AF
+       tristate "Marvell OcteonTX2 RVU Admin Function driver"
+       depends on (64BIT && COMPILE_TEST) || ARM64
+       depends on PCI
+       help
+         This driver supports Marvell's OcteonTX2 Resource Virtualization
+         Unit's admin function manager which manages all RVU HW resources
+         and provides a medium to other PF/VFs to configure HW. Should be
+         enabled for other RVU device drivers to work.
diff --git a/drivers/net/ethernet/marvell/octeontx2/Makefile b/drivers/net/ethernet/marvell/octeontx2/Makefile
new file mode 100644 (file)
index 0000000..e579dcd
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for Marvell OcteonTX2 device drivers.
+#
+
+obj-$(CONFIG_OCTEONTX2_AF) += af/
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/Makefile b/drivers/net/ethernet/marvell/octeontx2/af/Makefile
new file mode 100644 (file)
index 0000000..dacbd16
--- /dev/null
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Makefile for Marvell's OcteonTX2 RVU Admin Function driver
+#
+
+obj-$(CONFIG_OCTEONTX2_AF) += octeontx2_af.o
+
+octeontx2_af-y := rvu.o
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
new file mode 100644 (file)
index 0000000..5af4da6
--- /dev/null
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Marvell OcteonTx2 RVU Admin Function driver
+ *
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/pci.h>
+#include <linux/sysfs.h>
+
+#include "rvu.h"
+
+#define DRV_NAME       "octeontx2-af"
+#define DRV_STRING      "Marvell OcteonTX2 RVU Admin Function Driver"
+#define DRV_VERSION    "1.0"
+
+/* Supported devices */
+static const struct pci_device_id rvu_id_table[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_OCTEONTX2_RVU_AF) },
+       { 0, }  /* end of table */
+};
+
+MODULE_AUTHOR("Marvell International Ltd.");
+MODULE_DESCRIPTION(DRV_STRING);
+MODULE_LICENSE("GPL v2");
+MODULE_VERSION(DRV_VERSION);
+MODULE_DEVICE_TABLE(pci, rvu_id_table);
+
+static int rvu_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       struct device *dev = &pdev->dev;
+       struct rvu *rvu;
+       int    err;
+
+       rvu = devm_kzalloc(dev, sizeof(*rvu), GFP_KERNEL);
+       if (!rvu)
+               return -ENOMEM;
+
+       pci_set_drvdata(pdev, rvu);
+       rvu->pdev = pdev;
+       rvu->dev = &pdev->dev;
+
+       err = pci_enable_device(pdev);
+       if (err) {
+               dev_err(dev, "Failed to enable PCI device\n");
+               goto err_freemem;
+       }
+
+       err = pci_request_regions(pdev, DRV_NAME);
+       if (err) {
+               dev_err(dev, "PCI request regions failed 0x%x\n", err);
+               goto err_disable_device;
+       }
+
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(48));
+       if (err) {
+               dev_err(dev, "Unable to set DMA mask\n");
+               goto err_release_regions;
+       }
+
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(48));
+       if (err) {
+               dev_err(dev, "Unable to set consistent DMA mask\n");
+               goto err_release_regions;
+       }
+
+       /* Map Admin function CSRs */
+       rvu->afreg_base = pcim_iomap(pdev, PCI_AF_REG_BAR_NUM, 0);
+       rvu->pfreg_base = pcim_iomap(pdev, PCI_PF_REG_BAR_NUM, 0);
+       if (!rvu->afreg_base || !rvu->pfreg_base) {
+               dev_err(dev, "Unable to map admin function CSRs, aborting\n");
+               err = -ENOMEM;
+               goto err_release_regions;
+       }
+
+       return 0;
+
+err_release_regions:
+       pci_release_regions(pdev);
+err_disable_device:
+       pci_disable_device(pdev);
+err_freemem:
+       pci_set_drvdata(pdev, NULL);
+       devm_kfree(dev, rvu);
+       return err;
+}
+
+static void rvu_remove(struct pci_dev *pdev)
+{
+       struct rvu *rvu = pci_get_drvdata(pdev);
+
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+
+       devm_kfree(&pdev->dev, rvu);
+}
+
+static struct pci_driver rvu_driver = {
+       .name = DRV_NAME,
+       .id_table = rvu_id_table,
+       .probe = rvu_probe,
+       .remove = rvu_remove,
+};
+
+static int __init rvu_init_module(void)
+{
+       pr_info("%s: %s\n", DRV_NAME, DRV_STRING);
+
+       return pci_register_driver(&rvu_driver);
+}
+
+static void __exit rvu_cleanup_module(void)
+{
+       pci_unregister_driver(&rvu_driver);
+}
+
+module_init(rvu_init_module);
+module_exit(rvu_cleanup_module);
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.h b/drivers/net/ethernet/marvell/octeontx2/af/rvu.h
new file mode 100644 (file)
index 0000000..4a4b0ad
--- /dev/null
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0
+ * Marvell OcteonTx2 RVU Admin Function driver
+ *
+ * Copyright (C) 2018 Marvell International Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef RVU_H
+#define RVU_H
+
+/* PCI device IDs */
+#define        PCI_DEVID_OCTEONTX2_RVU_AF              0xA065
+
+/* PCI BAR nos */
+#define        PCI_AF_REG_BAR_NUM                      0
+#define        PCI_PF_REG_BAR_NUM                      2
+#define        PCI_MBOX_BAR_NUM                        4
+
+#define NAME_SIZE                              32
+
+struct rvu {
+       void __iomem            *afreg_base;
+       void __iomem            *pfreg_base;
+       struct pci_dev          *pdev;
+       struct device           *dev;
+};
+
+#endif /* RVU_H */