* [PATCH v8] FlexRM support in VFIO platform
@ 2017-09-06 11:18 ` Anup Patel
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-06 11:18 UTC (permalink / raw)
To: Will Deacon, Robin Murphy, Joerg Roedel, Baptiste Reynal,
Alex Williamson
Cc: Scott Branden, linux-kernel, linux-arm-kernel, iommu, kvm,
bcm-kernel-feedback-list, Anup Patel
This patchset primarily adds Broadcom FlexRM reset module for
VFIO platform driver.
The patches are based on Linux-4.13-rc3 and can also be
found at flexrm-vfio-v8 branch of
https://github.com/Broadcom/arm64-linux.git
Changes since v7:
- Use "ret |= rc" instead of "ret = rc" in
vfio_platform_bcmflexrm_reset()
Changes since v6:
- Update the FlexRM ring flush sequence as suggested
by HW folks
- Shutdown all FlexRM ring anyway even if it fails on
any of the FlexRM rings
- Use dev_warn() instead of pr_warn()
Changes since v5:
- Make kconfig option VFIO_PLATFORM_BCMFLEXRM_RESET
default to ARCH_BCM_IPROC
Changes since v4:
- Use "--timeout" instead of "timeout--" in
vfio_platform_bcmflexrm_shutdown()
Changes since v3:
- Improve "depends on" for Kconfig option
VFIO_PLATFORM_BCMFLEXRM_RESET
- Fix typo in pr_warn() called by
vfio_platform_bcmflexrm_shutdown()
- Return error from vfio_platform_bcmflexrm_shutdown()
when FlexRM ring flush timeout happens
Changes since v2:
- Remove PATCH1 because fixing VFIO no-IOMMU mode is
a separate topic
Changes since v1:
- Remove iommu_present() check in vfio_iommu_group_get()
- Drop PATCH1-to-PATCH3 because IOMMU_CAP_BYPASS is not
required
- Move additional comments out of license header in
vfio_platform_bcmflexrm.c
Anup Patel (1):
vfio: platform: reset: Add Broadcom FlexRM reset module
drivers/vfio/platform/reset/Kconfig | 9 ++
drivers/vfio/platform/reset/Makefile | 1 +
.../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
3 files changed, 125 insertions(+)
create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
--
2.7.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v8] FlexRM support in VFIO platform
@ 2017-09-06 11:18 ` Anup Patel
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-06 11:18 UTC (permalink / raw)
To: linux-arm-kernel
This patchset primarily adds Broadcom FlexRM reset module for
VFIO platform driver.
The patches are based on Linux-4.13-rc3 and can also be
found at flexrm-vfio-v8 branch of
https://github.com/Broadcom/arm64-linux.git
Changes since v7:
- Use "ret |= rc" instead of "ret = rc" in
vfio_platform_bcmflexrm_reset()
Changes since v6:
- Update the FlexRM ring flush sequence as suggested
by HW folks
- Shutdown all FlexRM ring anyway even if it fails on
any of the FlexRM rings
- Use dev_warn() instead of pr_warn()
Changes since v5:
- Make kconfig option VFIO_PLATFORM_BCMFLEXRM_RESET
default to ARCH_BCM_IPROC
Changes since v4:
- Use "--timeout" instead of "timeout--" in
vfio_platform_bcmflexrm_shutdown()
Changes since v3:
- Improve "depends on" for Kconfig option
VFIO_PLATFORM_BCMFLEXRM_RESET
- Fix typo in pr_warn() called by
vfio_platform_bcmflexrm_shutdown()
- Return error from vfio_platform_bcmflexrm_shutdown()
when FlexRM ring flush timeout happens
Changes since v2:
- Remove PATCH1 because fixing VFIO no-IOMMU mode is
a separate topic
Changes since v1:
- Remove iommu_present() check in vfio_iommu_group_get()
- Drop PATCH1-to-PATCH3 because IOMMU_CAP_BYPASS is not
required
- Move additional comments out of license header in
vfio_platform_bcmflexrm.c
Anup Patel (1):
vfio: platform: reset: Add Broadcom FlexRM reset module
drivers/vfio/platform/reset/Kconfig | 9 ++
drivers/vfio/platform/reset/Makefile | 1 +
.../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
3 files changed, 125 insertions(+)
create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
--
2.7.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
2017-09-06 11:18 ` Anup Patel
@ 2017-09-06 11:18 ` Anup Patel
-1 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-06 11:18 UTC (permalink / raw)
To: Will Deacon, Robin Murphy, Joerg Roedel, Baptiste Reynal,
Alex Williamson
Cc: Scott Branden, linux-kernel, linux-arm-kernel, iommu, kvm,
bcm-kernel-feedback-list, Anup Patel
This patch adds Broadcom FlexRM low-level reset for
VFIO platform.
It will do the following:
1. Disable/Deactivate each FlexRM ring
2. Flush each FlexRM ring
The cleanup sequence for FlexRM rings is adapted from
Broadcom FlexRM mailbox driver.
Signed-off-by: Anup Patel <anup.patel@broadcom.com>
Reviewed-by: Oza Oza <oza.oza@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
---
drivers/vfio/platform/reset/Kconfig | 9 ++
drivers/vfio/platform/reset/Makefile | 1 +
.../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
3 files changed, 125 insertions(+)
create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
index 70cccc5..392e3c0 100644
--- a/drivers/vfio/platform/reset/Kconfig
+++ b/drivers/vfio/platform/reset/Kconfig
@@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
Enables the VFIO platform driver to handle reset for AMD XGBE
If you don't know what to do here, say N.
+
+config VFIO_PLATFORM_BCMFLEXRM_RESET
+ tristate "VFIO support for Broadcom FlexRM reset"
+ depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
+ default ARCH_BCM_IPROC
+ help
+ Enables the VFIO platform driver to handle reset for Broadcom FlexRM
+
+ If you don't know what to do here, say N.
diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
index 93f4e23..8d9874b 100644
--- a/drivers/vfio/platform/reset/Makefile
+++ b/drivers/vfio/platform/reset/Makefile
@@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
+obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
new file mode 100644
index 0000000..5a17d50
--- /dev/null
+++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 Broadcom
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This driver provides reset support for Broadcom FlexRM ring manager
+ * to VFIO platform.
+ */
+
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include "vfio_platform_private.h"
+
+/* FlexRM configuration */
+#define RING_REGS_SIZE 0x10000
+#define RING_VER_MAGIC 0x76303031
+
+/* Per-Ring register offsets */
+#define RING_VER 0x000
+#define RING_CONTROL 0x034
+#define RING_FLUSH_DONE 0x038
+
+/* Register RING_CONTROL fields */
+#define CONTROL_FLUSH_SHIFT 5
+
+/* Register RING_FLUSH_DONE fields */
+#define FLUSH_DONE_MASK 0x1
+
+static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
+{
+ unsigned int timeout;
+
+ /* Disable/inactivate ring */
+ writel_relaxed(0x0, ring + RING_CONTROL);
+
+ /* Set ring flush state */
+ timeout = 1000; /* timeout of 1s */
+ writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
+ do {
+ if (readl_relaxed(ring + RING_FLUSH_DONE) &
+ FLUSH_DONE_MASK)
+ break;
+ mdelay(1);
+ } while (--timeout);
+ if (!timeout)
+ return -ETIMEDOUT;
+
+ /* Clear ring flush state */
+ timeout = 1000; /* timeout of 1s */
+ writel_relaxed(0x0, ring + RING_CONTROL);
+ do {
+ if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
+ FLUSH_DONE_MASK))
+ break;
+ mdelay(1);
+ } while (--timeout);
+ if (!timeout)
+ return -ETIMEDOUT;
+
+ return 0;
+}
+
+static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
+{
+ void __iomem *ring;
+ int rc = 0, ret = 0, ring_num = 0;
+ struct vfio_platform_region *reg = &vdev->regions[0];
+
+ /* Map FlexRM ring registers if not mapped */
+ if (!reg->ioaddr) {
+ reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
+ if (!reg->ioaddr)
+ return -ENOMEM;
+ }
+
+ /* Discover and shutdown each FlexRM ring */
+ for (ring = reg->ioaddr;
+ ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
+ if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
+ rc = vfio_platform_bcmflexrm_shutdown(ring);
+ if (rc) {
+ dev_warn(vdev->device,
+ "FlexRM ring%d shutdown error %d\n",
+ ring_num, rc);
+ ret |= rc;
+ }
+ }
+ }
+
+ return ret;
+}
+
+module_vfio_reset_handler("brcm,iproc-flexrm-mbox",
+ vfio_platform_bcmflexrm_reset);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Anup Patel <anup.patel@broadcom.com>");
+MODULE_DESCRIPTION("Reset support for Broadcom FlexRM VFIO platform device");
--
2.7.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
@ 2017-09-06 11:18 ` Anup Patel
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-06 11:18 UTC (permalink / raw)
To: linux-arm-kernel
This patch adds Broadcom FlexRM low-level reset for
VFIO platform.
It will do the following:
1. Disable/Deactivate each FlexRM ring
2. Flush each FlexRM ring
The cleanup sequence for FlexRM rings is adapted from
Broadcom FlexRM mailbox driver.
Signed-off-by: Anup Patel <anup.patel@broadcom.com>
Reviewed-by: Oza Oza <oza.oza@broadcom.com>
Reviewed-by: Scott Branden <scott.branden@broadcom.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
---
drivers/vfio/platform/reset/Kconfig | 9 ++
drivers/vfio/platform/reset/Makefile | 1 +
.../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
3 files changed, 125 insertions(+)
create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
index 70cccc5..392e3c0 100644
--- a/drivers/vfio/platform/reset/Kconfig
+++ b/drivers/vfio/platform/reset/Kconfig
@@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
Enables the VFIO platform driver to handle reset for AMD XGBE
If you don't know what to do here, say N.
+
+config VFIO_PLATFORM_BCMFLEXRM_RESET
+ tristate "VFIO support for Broadcom FlexRM reset"
+ depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
+ default ARCH_BCM_IPROC
+ help
+ Enables the VFIO platform driver to handle reset for Broadcom FlexRM
+
+ If you don't know what to do here, say N.
diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
index 93f4e23..8d9874b 100644
--- a/drivers/vfio/platform/reset/Makefile
+++ b/drivers/vfio/platform/reset/Makefile
@@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
+obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
new file mode 100644
index 0000000..5a17d50
--- /dev/null
+++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 Broadcom
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This driver provides reset support for Broadcom FlexRM ring manager
+ * to VFIO platform.
+ */
+
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+
+#include "vfio_platform_private.h"
+
+/* FlexRM configuration */
+#define RING_REGS_SIZE 0x10000
+#define RING_VER_MAGIC 0x76303031
+
+/* Per-Ring register offsets */
+#define RING_VER 0x000
+#define RING_CONTROL 0x034
+#define RING_FLUSH_DONE 0x038
+
+/* Register RING_CONTROL fields */
+#define CONTROL_FLUSH_SHIFT 5
+
+/* Register RING_FLUSH_DONE fields */
+#define FLUSH_DONE_MASK 0x1
+
+static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
+{
+ unsigned int timeout;
+
+ /* Disable/inactivate ring */
+ writel_relaxed(0x0, ring + RING_CONTROL);
+
+ /* Set ring flush state */
+ timeout = 1000; /* timeout of 1s */
+ writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
+ do {
+ if (readl_relaxed(ring + RING_FLUSH_DONE) &
+ FLUSH_DONE_MASK)
+ break;
+ mdelay(1);
+ } while (--timeout);
+ if (!timeout)
+ return -ETIMEDOUT;
+
+ /* Clear ring flush state */
+ timeout = 1000; /* timeout of 1s */
+ writel_relaxed(0x0, ring + RING_CONTROL);
+ do {
+ if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
+ FLUSH_DONE_MASK))
+ break;
+ mdelay(1);
+ } while (--timeout);
+ if (!timeout)
+ return -ETIMEDOUT;
+
+ return 0;
+}
+
+static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
+{
+ void __iomem *ring;
+ int rc = 0, ret = 0, ring_num = 0;
+ struct vfio_platform_region *reg = &vdev->regions[0];
+
+ /* Map FlexRM ring registers if not mapped */
+ if (!reg->ioaddr) {
+ reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
+ if (!reg->ioaddr)
+ return -ENOMEM;
+ }
+
+ /* Discover and shutdown each FlexRM ring */
+ for (ring = reg->ioaddr;
+ ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
+ if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
+ rc = vfio_platform_bcmflexrm_shutdown(ring);
+ if (rc) {
+ dev_warn(vdev->device,
+ "FlexRM ring%d shutdown error %d\n",
+ ring_num, rc);
+ ret |= rc;
+ }
+ }
+ }
+
+ return ret;
+}
+
+module_vfio_reset_handler("brcm,iproc-flexrm-mbox",
+ vfio_platform_bcmflexrm_reset);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Anup Patel <anup.patel@broadcom.com>");
+MODULE_DESCRIPTION("Reset support for Broadcom FlexRM VFIO platform device");
--
2.7.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
2017-09-06 11:18 ` Anup Patel
@ 2017-09-08 15:58 ` Auger Eric
-1 siblings, 0 replies; 9+ messages in thread
From: Auger Eric @ 2017-09-08 15:58 UTC (permalink / raw)
To: Anup Patel, Will Deacon, Robin Murphy, Joerg Roedel,
Baptiste Reynal, Alex Williamson
Cc: kvm, Scott Branden, linux-kernel, iommu,
bcm-kernel-feedback-list, linux-arm-kernel
Hi Anup,
On 06/09/2017 13:18, Anup Patel wrote:
> This patch adds Broadcom FlexRM low-level reset for
> VFIO platform.
>
> It will do the following:
> 1. Disable/Deactivate each FlexRM ring
> 2. Flush each FlexRM ring
>
> The cleanup sequence for FlexRM rings is adapted from
> Broadcom FlexRM mailbox driver.
>
> Signed-off-by: Anup Patel <anup.patel@broadcom.com>
> Reviewed-by: Oza Oza <oza.oza@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> Reviewed-by: Eric Auger <eric.auger@redhat.com>
> ---
> drivers/vfio/platform/reset/Kconfig | 9 ++
> drivers/vfio/platform/reset/Makefile | 1 +
> .../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
> 3 files changed, 125 insertions(+)
> create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>
> diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
> index 70cccc5..392e3c0 100644
> --- a/drivers/vfio/platform/reset/Kconfig
> +++ b/drivers/vfio/platform/reset/Kconfig
> @@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
> Enables the VFIO platform driver to handle reset for AMD XGBE
>
> If you don't know what to do here, say N.
> +
> +config VFIO_PLATFORM_BCMFLEXRM_RESET
> + tristate "VFIO support for Broadcom FlexRM reset"
> + depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
> + default ARCH_BCM_IPROC
> + help
> + Enables the VFIO platform driver to handle reset for Broadcom FlexRM
> +
> + If you don't know what to do here, say N.
> diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
> index 93f4e23..8d9874b 100644
> --- a/drivers/vfio/platform/reset/Makefile
> +++ b/drivers/vfio/platform/reset/Makefile
> @@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
>
> obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
> obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
> +obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
> diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
> new file mode 100644
> index 0000000..5a17d50
> --- /dev/null
> +++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
> @@ -0,0 +1,115 @@
> +/*
> + * Copyright (C) 2017 Broadcom
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * This driver provides reset support for Broadcom FlexRM ring manager
> + * to VFIO platform.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +#include <linux/init.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +
> +#include "vfio_platform_private.h"
> +
> +/* FlexRM configuration */
> +#define RING_REGS_SIZE 0x10000
> +#define RING_VER_MAGIC 0x76303031
> +
> +/* Per-Ring register offsets */
> +#define RING_VER 0x000
> +#define RING_CONTROL 0x034
> +#define RING_FLUSH_DONE 0x038
> +
> +/* Register RING_CONTROL fields */
> +#define CONTROL_FLUSH_SHIFT 5
> +
> +/* Register RING_FLUSH_DONE fields */
> +#define FLUSH_DONE_MASK 0x1
> +
> +static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
> +{
> + unsigned int timeout;
> +
> + /* Disable/inactivate ring */
> + writel_relaxed(0x0, ring + RING_CONTROL);
> +
> + /* Set ring flush state */
> + timeout = 1000; /* timeout of 1s */
> + writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
> + do {
> + if (readl_relaxed(ring + RING_FLUSH_DONE) &
> + FLUSH_DONE_MASK)
> + break;
> + mdelay(1);
> + } while (--timeout);
> + if (!timeout)
> + return -ETIMEDOUT;
> +
> + /* Clear ring flush state */
> + timeout = 1000; /* timeout of 1s */
> + writel_relaxed(0x0, ring + RING_CONTROL);
> + do {
> + if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
> + FLUSH_DONE_MASK))
> + break;
> + mdelay(1);
> + } while (--timeout);
> + if (!timeout)
> + return -ETIMEDOUT;
As this sequence is not part of flexrm_shutdown() in
drivers/mailbox/bcm-flexrm-mailbox.c, do you plan to update the native
driver with that addition?
> +
> + return 0;
> +}
> +
> +static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
> +{
> + void __iomem *ring;
> + int rc = 0, ret = 0, ring_num = 0;
> + struct vfio_platform_region *reg = &vdev->regions[0];
> +
> + /* Map FlexRM ring registers if not mapped */
> + if (!reg->ioaddr) {
> + reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
> + if (!reg->ioaddr)
> + return -ENOMEM;
> + }
> +
> + /* Discover and shutdown each FlexRM ring */
> + for (ring = reg->ioaddr;
> + ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
> + if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
> + rc = vfio_platform_bcmflexrm_shutdown(ring);
> + if (rc) {
> + dev_warn(vdev->device,
> + "FlexRM ring%d shutdown error %d\n",
> + ring_num, rc);
sorry but ring_num sticks to 0.
Thanks
Eric
> + ret |= rc;
> + }
> + }
> + }
> +
> + return ret;
> +}
> +
> +module_vfio_reset_handler("brcm,iproc-flexrm-mbox",
> + vfio_platform_bcmflexrm_reset);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_AUTHOR("Anup Patel <anup.patel@broadcom.com>");
> +MODULE_DESCRIPTION("Reset support for Broadcom FlexRM VFIO platform device");
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
@ 2017-09-08 15:58 ` Auger Eric
0 siblings, 0 replies; 9+ messages in thread
From: Auger Eric @ 2017-09-08 15:58 UTC (permalink / raw)
To: linux-arm-kernel
Hi Anup,
On 06/09/2017 13:18, Anup Patel wrote:
> This patch adds Broadcom FlexRM low-level reset for
> VFIO platform.
>
> It will do the following:
> 1. Disable/Deactivate each FlexRM ring
> 2. Flush each FlexRM ring
>
> The cleanup sequence for FlexRM rings is adapted from
> Broadcom FlexRM mailbox driver.
>
> Signed-off-by: Anup Patel <anup.patel@broadcom.com>
> Reviewed-by: Oza Oza <oza.oza@broadcom.com>
> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
> Reviewed-by: Eric Auger <eric.auger@redhat.com>
> ---
> drivers/vfio/platform/reset/Kconfig | 9 ++
> drivers/vfio/platform/reset/Makefile | 1 +
> .../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
> 3 files changed, 125 insertions(+)
> create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>
> diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
> index 70cccc5..392e3c0 100644
> --- a/drivers/vfio/platform/reset/Kconfig
> +++ b/drivers/vfio/platform/reset/Kconfig
> @@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
> Enables the VFIO platform driver to handle reset for AMD XGBE
>
> If you don't know what to do here, say N.
> +
> +config VFIO_PLATFORM_BCMFLEXRM_RESET
> + tristate "VFIO support for Broadcom FlexRM reset"
> + depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
> + default ARCH_BCM_IPROC
> + help
> + Enables the VFIO platform driver to handle reset for Broadcom FlexRM
> +
> + If you don't know what to do here, say N.
> diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
> index 93f4e23..8d9874b 100644
> --- a/drivers/vfio/platform/reset/Makefile
> +++ b/drivers/vfio/platform/reset/Makefile
> @@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
>
> obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
> obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
> +obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
> diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
> new file mode 100644
> index 0000000..5a17d50
> --- /dev/null
> +++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
> @@ -0,0 +1,115 @@
> +/*
> + * Copyright (C) 2017 Broadcom
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * This driver provides reset support for Broadcom FlexRM ring manager
> + * to VFIO platform.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/device.h>
> +#include <linux/init.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +
> +#include "vfio_platform_private.h"
> +
> +/* FlexRM configuration */
> +#define RING_REGS_SIZE 0x10000
> +#define RING_VER_MAGIC 0x76303031
> +
> +/* Per-Ring register offsets */
> +#define RING_VER 0x000
> +#define RING_CONTROL 0x034
> +#define RING_FLUSH_DONE 0x038
> +
> +/* Register RING_CONTROL fields */
> +#define CONTROL_FLUSH_SHIFT 5
> +
> +/* Register RING_FLUSH_DONE fields */
> +#define FLUSH_DONE_MASK 0x1
> +
> +static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
> +{
> + unsigned int timeout;
> +
> + /* Disable/inactivate ring */
> + writel_relaxed(0x0, ring + RING_CONTROL);
> +
> + /* Set ring flush state */
> + timeout = 1000; /* timeout of 1s */
> + writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
> + do {
> + if (readl_relaxed(ring + RING_FLUSH_DONE) &
> + FLUSH_DONE_MASK)
> + break;
> + mdelay(1);
> + } while (--timeout);
> + if (!timeout)
> + return -ETIMEDOUT;
> +
> + /* Clear ring flush state */
> + timeout = 1000; /* timeout of 1s */
> + writel_relaxed(0x0, ring + RING_CONTROL);
> + do {
> + if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
> + FLUSH_DONE_MASK))
> + break;
> + mdelay(1);
> + } while (--timeout);
> + if (!timeout)
> + return -ETIMEDOUT;
As this sequence is not part of flexrm_shutdown() in
drivers/mailbox/bcm-flexrm-mailbox.c, do you plan to update the native
driver with that addition?
> +
> + return 0;
> +}
> +
> +static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
> +{
> + void __iomem *ring;
> + int rc = 0, ret = 0, ring_num = 0;
> + struct vfio_platform_region *reg = &vdev->regions[0];
> +
> + /* Map FlexRM ring registers if not mapped */
> + if (!reg->ioaddr) {
> + reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
> + if (!reg->ioaddr)
> + return -ENOMEM;
> + }
> +
> + /* Discover and shutdown each FlexRM ring */
> + for (ring = reg->ioaddr;
> + ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
> + if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
> + rc = vfio_platform_bcmflexrm_shutdown(ring);
> + if (rc) {
> + dev_warn(vdev->device,
> + "FlexRM ring%d shutdown error %d\n",
> + ring_num, rc);
sorry but ring_num sticks to 0.
Thanks
Eric
> + ret |= rc;
> + }
> + }
> + }
> +
> + return ret;
> +}
> +
> +module_vfio_reset_handler("brcm,iproc-flexrm-mbox",
> + vfio_platform_bcmflexrm_reset);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_AUTHOR("Anup Patel <anup.patel@broadcom.com>");
> +MODULE_DESCRIPTION("Reset support for Broadcom FlexRM VFIO platform device");
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
@ 2017-09-10 5:47 ` Anup Patel via iommu
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-10 5:47 UTC (permalink / raw)
To: Auger Eric
Cc: Will Deacon, Robin Murphy, Joerg Roedel, Baptiste Reynal,
Alex Williamson, kvm, Scott Branden, Linux Kernel, Linux IOMMU,
BCM Kernel Feedback, Linux ARM Kernel
On Fri, Sep 8, 2017 at 9:28 PM, Auger Eric <eric.auger@redhat.com> wrote:
> Hi Anup,
>
> On 06/09/2017 13:18, Anup Patel wrote:
>> This patch adds Broadcom FlexRM low-level reset for
>> VFIO platform.
>>
>> It will do the following:
>> 1. Disable/Deactivate each FlexRM ring
>> 2. Flush each FlexRM ring
>>
>> The cleanup sequence for FlexRM rings is adapted from
>> Broadcom FlexRM mailbox driver.
>>
>> Signed-off-by: Anup Patel <anup.patel@broadcom.com>
>> Reviewed-by: Oza Oza <oza.oza@broadcom.com>
>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>> Reviewed-by: Eric Auger <eric.auger@redhat.com>
>> ---
>> drivers/vfio/platform/reset/Kconfig | 9 ++
>> drivers/vfio/platform/reset/Makefile | 1 +
>> .../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
>> 3 files changed, 125 insertions(+)
>> create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>>
>> diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
>> index 70cccc5..392e3c0 100644
>> --- a/drivers/vfio/platform/reset/Kconfig
>> +++ b/drivers/vfio/platform/reset/Kconfig
>> @@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
>> Enables the VFIO platform driver to handle reset for AMD XGBE
>>
>> If you don't know what to do here, say N.
>> +
>> +config VFIO_PLATFORM_BCMFLEXRM_RESET
>> + tristate "VFIO support for Broadcom FlexRM reset"
>> + depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
>> + default ARCH_BCM_IPROC
>> + help
>> + Enables the VFIO platform driver to handle reset for Broadcom FlexRM
>> +
>> + If you don't know what to do here, say N.
>> diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
>> index 93f4e23..8d9874b 100644
>> --- a/drivers/vfio/platform/reset/Makefile
>> +++ b/drivers/vfio/platform/reset/Makefile
>> @@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
>>
>> obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
>> obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
>> +obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
>> diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> new file mode 100644
>> index 0000000..5a17d50
>> --- /dev/null
>> +++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> @@ -0,0 +1,115 @@
>> +/*
>> + * Copyright (C) 2017 Broadcom
>> + *
>> + * 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.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +/*
>> + * This driver provides reset support for Broadcom FlexRM ring manager
>> + * to VFIO platform.
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/device.h>
>> +#include <linux/init.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +
>> +#include "vfio_platform_private.h"
>> +
>> +/* FlexRM configuration */
>> +#define RING_REGS_SIZE 0x10000
>> +#define RING_VER_MAGIC 0x76303031
>> +
>> +/* Per-Ring register offsets */
>> +#define RING_VER 0x000
>> +#define RING_CONTROL 0x034
>> +#define RING_FLUSH_DONE 0x038
>> +
>> +/* Register RING_CONTROL fields */
>> +#define CONTROL_FLUSH_SHIFT 5
>> +
>> +/* Register RING_FLUSH_DONE fields */
>> +#define FLUSH_DONE_MASK 0x1
>> +
>> +static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
>> +{
>> + unsigned int timeout;
>> +
>> + /* Disable/inactivate ring */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> +
>> + /* Set ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
>> + do {
>> + if (readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK)
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
>> +
>> + /* Clear ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> + do {
>> + if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK))
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
> As this sequence is not part of flexrm_shutdown() in
> drivers/mailbox/bcm-flexrm-mailbox.c, do you plan to update the native
> driver with that addition?
Yes, we have to send fix for bcm-flexrm-mailbox.c which should
also be taken by Linux stable tree.
>
>> +
>> + return 0;
>> +}
>> +
>> +static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
>> +{
>> + void __iomem *ring;
>> + int rc = 0, ret = 0, ring_num = 0;
>> + struct vfio_platform_region *reg = &vdev->regions[0];
>> +
>> + /* Map FlexRM ring registers if not mapped */
>> + if (!reg->ioaddr) {
>> + reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
>> + if (!reg->ioaddr)
>> + return -ENOMEM;
>> + }
>> +
>> + /* Discover and shutdown each FlexRM ring */
>> + for (ring = reg->ioaddr;
>> + ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
>> + if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
>> + rc = vfio_platform_bcmflexrm_shutdown(ring);
>> + if (rc) {
>> + dev_warn(vdev->device,
>> + "FlexRM ring%d shutdown error %d\n",
>> + ring_num, rc);
> sorry but ring_num sticks to 0.
Ahh, good catch.
Thanks,
Anup
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
@ 2017-09-10 5:47 ` Anup Patel via iommu
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel via iommu @ 2017-09-10 5:47 UTC (permalink / raw)
To: Auger Eric
Cc: Scott Branden, kvm-u79uwXL29TY76Z2rM5mHXA, Will Deacon,
Linux Kernel, Linux IOMMU, BCM Kernel Feedback, Linux ARM Kernel
On Fri, Sep 8, 2017 at 9:28 PM, Auger Eric <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote:
> Hi Anup,
>
> On 06/09/2017 13:18, Anup Patel wrote:
>> This patch adds Broadcom FlexRM low-level reset for
>> VFIO platform.
>>
>> It will do the following:
>> 1. Disable/Deactivate each FlexRM ring
>> 2. Flush each FlexRM ring
>>
>> The cleanup sequence for FlexRM rings is adapted from
>> Broadcom FlexRM mailbox driver.
>>
>> Signed-off-by: Anup Patel <anup.patel-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
>> Reviewed-by: Oza Oza <oza.oza-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
>> Reviewed-by: Scott Branden <scott.branden-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
>> Reviewed-by: Eric Auger <eric.auger-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
>> ---
>> drivers/vfio/platform/reset/Kconfig | 9 ++
>> drivers/vfio/platform/reset/Makefile | 1 +
>> .../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
>> 3 files changed, 125 insertions(+)
>> create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>>
>> diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
>> index 70cccc5..392e3c0 100644
>> --- a/drivers/vfio/platform/reset/Kconfig
>> +++ b/drivers/vfio/platform/reset/Kconfig
>> @@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
>> Enables the VFIO platform driver to handle reset for AMD XGBE
>>
>> If you don't know what to do here, say N.
>> +
>> +config VFIO_PLATFORM_BCMFLEXRM_RESET
>> + tristate "VFIO support for Broadcom FlexRM reset"
>> + depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
>> + default ARCH_BCM_IPROC
>> + help
>> + Enables the VFIO platform driver to handle reset for Broadcom FlexRM
>> +
>> + If you don't know what to do here, say N.
>> diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
>> index 93f4e23..8d9874b 100644
>> --- a/drivers/vfio/platform/reset/Makefile
>> +++ b/drivers/vfio/platform/reset/Makefile
>> @@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
>>
>> obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
>> obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
>> +obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
>> diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> new file mode 100644
>> index 0000000..5a17d50
>> --- /dev/null
>> +++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> @@ -0,0 +1,115 @@
>> +/*
>> + * Copyright (C) 2017 Broadcom
>> + *
>> + * 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.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +/*
>> + * This driver provides reset support for Broadcom FlexRM ring manager
>> + * to VFIO platform.
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/device.h>
>> +#include <linux/init.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +
>> +#include "vfio_platform_private.h"
>> +
>> +/* FlexRM configuration */
>> +#define RING_REGS_SIZE 0x10000
>> +#define RING_VER_MAGIC 0x76303031
>> +
>> +/* Per-Ring register offsets */
>> +#define RING_VER 0x000
>> +#define RING_CONTROL 0x034
>> +#define RING_FLUSH_DONE 0x038
>> +
>> +/* Register RING_CONTROL fields */
>> +#define CONTROL_FLUSH_SHIFT 5
>> +
>> +/* Register RING_FLUSH_DONE fields */
>> +#define FLUSH_DONE_MASK 0x1
>> +
>> +static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
>> +{
>> + unsigned int timeout;
>> +
>> + /* Disable/inactivate ring */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> +
>> + /* Set ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
>> + do {
>> + if (readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK)
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
>> +
>> + /* Clear ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> + do {
>> + if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK))
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
> As this sequence is not part of flexrm_shutdown() in
> drivers/mailbox/bcm-flexrm-mailbox.c, do you plan to update the native
> driver with that addition?
Yes, we have to send fix for bcm-flexrm-mailbox.c which should
also be taken by Linux stable tree.
>
>> +
>> + return 0;
>> +}
>> +
>> +static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
>> +{
>> + void __iomem *ring;
>> + int rc = 0, ret = 0, ring_num = 0;
>> + struct vfio_platform_region *reg = &vdev->regions[0];
>> +
>> + /* Map FlexRM ring registers if not mapped */
>> + if (!reg->ioaddr) {
>> + reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
>> + if (!reg->ioaddr)
>> + return -ENOMEM;
>> + }
>> +
>> + /* Discover and shutdown each FlexRM ring */
>> + for (ring = reg->ioaddr;
>> + ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
>> + if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
>> + rc = vfio_platform_bcmflexrm_shutdown(ring);
>> + if (rc) {
>> + dev_warn(vdev->device,
>> + "FlexRM ring%d shutdown error %d\n",
>> + ring_num, rc);
> sorry but ring_num sticks to 0.
Ahh, good catch.
Thanks,
Anup
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module
@ 2017-09-10 5:47 ` Anup Patel via iommu
0 siblings, 0 replies; 9+ messages in thread
From: Anup Patel @ 2017-09-10 5:47 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Sep 8, 2017 at 9:28 PM, Auger Eric <eric.auger@redhat.com> wrote:
> Hi Anup,
>
> On 06/09/2017 13:18, Anup Patel wrote:
>> This patch adds Broadcom FlexRM low-level reset for
>> VFIO platform.
>>
>> It will do the following:
>> 1. Disable/Deactivate each FlexRM ring
>> 2. Flush each FlexRM ring
>>
>> The cleanup sequence for FlexRM rings is adapted from
>> Broadcom FlexRM mailbox driver.
>>
>> Signed-off-by: Anup Patel <anup.patel@broadcom.com>
>> Reviewed-by: Oza Oza <oza.oza@broadcom.com>
>> Reviewed-by: Scott Branden <scott.branden@broadcom.com>
>> Reviewed-by: Eric Auger <eric.auger@redhat.com>
>> ---
>> drivers/vfio/platform/reset/Kconfig | 9 ++
>> drivers/vfio/platform/reset/Makefile | 1 +
>> .../vfio/platform/reset/vfio_platform_bcmflexrm.c | 115 +++++++++++++++++++++
>> 3 files changed, 125 insertions(+)
>> create mode 100644 drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>>
>> diff --git a/drivers/vfio/platform/reset/Kconfig b/drivers/vfio/platform/reset/Kconfig
>> index 70cccc5..392e3c0 100644
>> --- a/drivers/vfio/platform/reset/Kconfig
>> +++ b/drivers/vfio/platform/reset/Kconfig
>> @@ -13,3 +13,12 @@ config VFIO_PLATFORM_AMDXGBE_RESET
>> Enables the VFIO platform driver to handle reset for AMD XGBE
>>
>> If you don't know what to do here, say N.
>> +
>> +config VFIO_PLATFORM_BCMFLEXRM_RESET
>> + tristate "VFIO support for Broadcom FlexRM reset"
>> + depends on VFIO_PLATFORM && (ARCH_BCM_IPROC || COMPILE_TEST)
>> + default ARCH_BCM_IPROC
>> + help
>> + Enables the VFIO platform driver to handle reset for Broadcom FlexRM
>> +
>> + If you don't know what to do here, say N.
>> diff --git a/drivers/vfio/platform/reset/Makefile b/drivers/vfio/platform/reset/Makefile
>> index 93f4e23..8d9874b 100644
>> --- a/drivers/vfio/platform/reset/Makefile
>> +++ b/drivers/vfio/platform/reset/Makefile
>> @@ -5,3 +5,4 @@ ccflags-y += -Idrivers/vfio/platform
>>
>> obj-$(CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET) += vfio-platform-calxedaxgmac.o
>> obj-$(CONFIG_VFIO_PLATFORM_AMDXGBE_RESET) += vfio-platform-amdxgbe.o
>> +obj-$(CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET) += vfio_platform_bcmflexrm.o
>> diff --git a/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> new file mode 100644
>> index 0000000..5a17d50
>> --- /dev/null
>> +++ b/drivers/vfio/platform/reset/vfio_platform_bcmflexrm.c
>> @@ -0,0 +1,115 @@
>> +/*
>> + * Copyright (C) 2017 Broadcom
>> + *
>> + * 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.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +/*
>> + * This driver provides reset support for Broadcom FlexRM ring manager
>> + * to VFIO platform.
>> + */
>> +
>> +#include <linux/delay.h>
>> +#include <linux/device.h>
>> +#include <linux/init.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/module.h>
>> +
>> +#include "vfio_platform_private.h"
>> +
>> +/* FlexRM configuration */
>> +#define RING_REGS_SIZE 0x10000
>> +#define RING_VER_MAGIC 0x76303031
>> +
>> +/* Per-Ring register offsets */
>> +#define RING_VER 0x000
>> +#define RING_CONTROL 0x034
>> +#define RING_FLUSH_DONE 0x038
>> +
>> +/* Register RING_CONTROL fields */
>> +#define CONTROL_FLUSH_SHIFT 5
>> +
>> +/* Register RING_FLUSH_DONE fields */
>> +#define FLUSH_DONE_MASK 0x1
>> +
>> +static int vfio_platform_bcmflexrm_shutdown(void __iomem *ring)
>> +{
>> + unsigned int timeout;
>> +
>> + /* Disable/inactivate ring */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> +
>> + /* Set ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(BIT(CONTROL_FLUSH_SHIFT), ring + RING_CONTROL);
>> + do {
>> + if (readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK)
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
>> +
>> + /* Clear ring flush state */
>> + timeout = 1000; /* timeout of 1s */
>> + writel_relaxed(0x0, ring + RING_CONTROL);
>> + do {
>> + if (!(readl_relaxed(ring + RING_FLUSH_DONE) &
>> + FLUSH_DONE_MASK))
>> + break;
>> + mdelay(1);
>> + } while (--timeout);
>> + if (!timeout)
>> + return -ETIMEDOUT;
> As this sequence is not part of flexrm_shutdown() in
> drivers/mailbox/bcm-flexrm-mailbox.c, do you plan to update the native
> driver with that addition?
Yes, we have to send fix for bcm-flexrm-mailbox.c which should
also be taken by Linux stable tree.
>
>> +
>> + return 0;
>> +}
>> +
>> +static int vfio_platform_bcmflexrm_reset(struct vfio_platform_device *vdev)
>> +{
>> + void __iomem *ring;
>> + int rc = 0, ret = 0, ring_num = 0;
>> + struct vfio_platform_region *reg = &vdev->regions[0];
>> +
>> + /* Map FlexRM ring registers if not mapped */
>> + if (!reg->ioaddr) {
>> + reg->ioaddr = ioremap_nocache(reg->addr, reg->size);
>> + if (!reg->ioaddr)
>> + return -ENOMEM;
>> + }
>> +
>> + /* Discover and shutdown each FlexRM ring */
>> + for (ring = reg->ioaddr;
>> + ring < (reg->ioaddr + reg->size); ring += RING_REGS_SIZE) {
>> + if (readl_relaxed(ring + RING_VER) == RING_VER_MAGIC) {
>> + rc = vfio_platform_bcmflexrm_shutdown(ring);
>> + if (rc) {
>> + dev_warn(vdev->device,
>> + "FlexRM ring%d shutdown error %d\n",
>> + ring_num, rc);
> sorry but ring_num sticks to 0.
Ahh, good catch.
Thanks,
Anup
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-09-10 5:47 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-06 11:18 [PATCH v8] FlexRM support in VFIO platform Anup Patel
2017-09-06 11:18 ` Anup Patel
2017-09-06 11:18 ` [PATCH v8] vfio: platform: reset: Add Broadcom FlexRM reset module Anup Patel
2017-09-06 11:18 ` Anup Patel
2017-09-08 15:58 ` Auger Eric
2017-09-08 15:58 ` Auger Eric
2017-09-10 5:47 ` Anup Patel
2017-09-10 5:47 ` Anup Patel
2017-09-10 5:47 ` Anup Patel via iommu
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.