linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device
@ 2021-12-31  3:37 Ilkka Koskinen
  2021-12-31  3:37 ` [PATCH v3 1/2] ACPI: tables: Add AGDI to the list of known table signatures Ilkka Koskinen
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2021-12-31  3:37 UTC (permalink / raw)
  To: lorenzo.pieralisi, guohanjun, sudeep.holla, rafael, linux
  Cc: lenb, robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren

Arm Generic Diagnostic Dump and Reset device enables a maintainer to
request OS to perform a diagnostic dump and reset a system via SDEI
event or an interrupt. This patchset adds support for the SDEI path.

I do have a patch to enable the interrupt path as well but I'm holding
it back since AGDI table is missing interrupt configuration fields
(trigger type etc.).

The recently published specification is available at
https://developer.arm.com/documentation/den0093/latest

The patchset was tested on Ampere Altra/Mt. Jade.

The patchset applies on top of
  git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm bleeding-edge (642439a44411)


From v1:
     * Moved pdata to the stack and dropped unnecessary kzalloc() in agdi_init()
     * Changed the ACPICA patch upstreaming order comment in the paragraph above

From v2:
     * The first patch was split. The most of it was merged to ACPICA project
       at first and later ported to linux-acpi
       (fd919e37cb15914c6fe13e13d530a4f732407c6d). The rest are in the first patch.


Ilkka Koskinen (2):
  ACPI: tables: Add AGDI to the list of known table signatures
  ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset
    device

 drivers/acpi/arm64/Kconfig  |   8 +++
 drivers/acpi/arm64/Makefile |   1 +
 drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
 drivers/acpi/tables.c       |   2 +-
 4 files changed, 135 insertions(+), 1 deletion(-)
 create mode 100644 drivers/acpi/arm64/agdi.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/2] ACPI: tables: Add AGDI to the list of known table signatures
  2021-12-31  3:37 [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
@ 2021-12-31  3:37 ` Ilkka Koskinen
  2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
  2021-12-31 10:25 ` [PATCH v3 0/2] ACPI: " Russell King (Oracle)
  2 siblings, 0 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2021-12-31  3:37 UTC (permalink / raw)
  To: lorenzo.pieralisi, guohanjun, sudeep.holla, rafael, linux
  Cc: lenb, robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren

Add AGDI to the list of known ACPI table signatures to allow the
kernel to recognize it when upgrading tables via initrd.

Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
---
 drivers/acpi/tables.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index 682a3ea9cb40..973b466fa652 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -500,7 +500,7 @@ static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = {
 	ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT,
 	ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT,
 	ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT,
-	ACPI_SIG_NHLT, ACPI_SIG_AEST };
+	ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_AGDI };
 
 #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2021-12-31  3:37 [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
  2021-12-31  3:37 ` [PATCH v3 1/2] ACPI: tables: Add AGDI to the list of known table signatures Ilkka Koskinen
@ 2021-12-31  3:37 ` Ilkka Koskinen
  2022-01-04 14:28   ` Rafael J. Wysocki
                     ` (2 more replies)
  2021-12-31 10:25 ` [PATCH v3 0/2] ACPI: " Russell King (Oracle)
  2 siblings, 3 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2021-12-31  3:37 UTC (permalink / raw)
  To: lorenzo.pieralisi, guohanjun, sudeep.holla, rafael, linux
  Cc: lenb, robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren

ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
issue diagnostic dump and reset via an SDEI event or an interrupt.
This patch implements SDEI path.

[0] https://developer.arm.com/documentation/den0093/latest/

Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
---
 drivers/acpi/arm64/Kconfig  |   8 +++
 drivers/acpi/arm64/Makefile |   1 +
 drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
 3 files changed, 134 insertions(+)
 create mode 100644 drivers/acpi/arm64/agdi.c

diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
index 6dba187f4f2e..24869ba5b365 100644
--- a/drivers/acpi/arm64/Kconfig
+++ b/drivers/acpi/arm64/Kconfig
@@ -8,3 +8,11 @@ config ACPI_IORT
 
 config ACPI_GTDT
 	bool
+
+config ACPI_AGDI
+	bool "Arm Generic Diagnostic Dump and Reset Device Interface"
+	depends on ARM_SDE_INTERFACE
+	help
+	  Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
+	  a standard that enables issuing a non-maskable diagnostic dump and
+	  reset command.
diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
index 66acbe77f46e..7b9e4045659d 100644
--- a/drivers/acpi/arm64/Makefile
+++ b/drivers/acpi/arm64/Makefile
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0-only
+obj-$(CONFIG_ACPI_AGDI) 	+= agdi.o
 obj-$(CONFIG_ACPI_IORT) 	+= iort.o
 obj-$(CONFIG_ACPI_GTDT) 	+= gtdt.o
 obj-y				+= dma.o
diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
new file mode 100644
index 000000000000..6525ccbae5c1
--- /dev/null
+++ b/drivers/acpi/arm64/agdi.c
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * This file implements handling of
+ * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
+ *
+ * Copyright (c) 2021, Ampere Computing LLC
+ */
+
+#define pr_fmt(fmt) "ACPI: AGDI: " fmt
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/acpi.h>
+#include <linux/arm_sdei.h>
+#include <linux/io.h>
+
+struct agdi_data {
+	int sdei_event;
+};
+
+static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
+{
+	nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
+	return 0;
+}
+
+static int agdi_sdei_probe(struct platform_device *pdev,
+			   struct agdi_data *adata)
+{
+	int err;
+
+	err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
+	if (err) {
+		dev_err(&pdev->dev, "Failed to register for SDEI event %d",
+			adata->sdei_event);
+		return err;
+	}
+
+	err = sdei_event_enable(adata->sdei_event);
+	if (err)  {
+		sdei_event_unregister(adata->sdei_event);
+		dev_err(&pdev->dev, "Failed to enable event %d\n",
+			adata->sdei_event);
+		return err;
+	}
+
+	return 0;
+}
+
+static int agdi_probe(struct platform_device *pdev)
+{
+	struct agdi_data *adata;
+
+	adata = dev_get_platdata(&pdev->dev);
+	if (!adata)
+		return -EINVAL;
+
+	return agdi_sdei_probe(pdev, adata);
+}
+
+static int agdi_remove(struct platform_device *pdev)
+{
+	struct agdi_data *adata = platform_get_drvdata(pdev);
+
+	sdei_event_disable(adata->sdei_event);
+	sdei_event_unregister(adata->sdei_event);
+
+	return 0;
+}
+
+static struct platform_driver agdi_driver = {
+	.driver = {
+		.name = "agdi",
+	},
+	.probe = agdi_probe,
+	.remove = agdi_remove,
+};
+
+static int __init agdi_init(void)
+{
+	int ret;
+	acpi_status status;
+	struct acpi_table_agdi *agdi_table;
+	struct agdi_data pdata;
+	struct platform_device *pdev;
+
+	if (acpi_disabled)
+		return 0;
+
+	status = acpi_get_table(ACPI_SIG_AGDI, 0,
+				(struct acpi_table_header **) &agdi_table);
+	if (ACPI_FAILURE(status))
+		return -ENODEV;
+
+	if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
+		pr_warn("Interrupt signaling is not supported");
+		ret = -ENODEV;
+		goto err_put_table;
+	}
+
+	pdata.sdei_event = agdi_table->sdei_event;
+
+	pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
+	if (IS_ERR(pdev)) {
+		ret = PTR_ERR(pdev);
+		goto err_put_table;
+	}
+
+	ret = platform_driver_register(&agdi_driver);
+	if (ret)
+		goto err_device_unregister;
+
+	acpi_put_table((struct acpi_table_header *)agdi_table);
+	return 0;
+
+err_device_unregister:
+	platform_device_unregister(pdev);
+err_put_table:
+	acpi_put_table((struct acpi_table_header *)agdi_table);
+	return ret;
+}
+device_initcall(agdi_init);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device
  2021-12-31  3:37 [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
  2021-12-31  3:37 ` [PATCH v3 1/2] ACPI: tables: Add AGDI to the list of known table signatures Ilkka Koskinen
  2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
@ 2021-12-31 10:25 ` Russell King (Oracle)
  2 siblings, 0 replies; 13+ messages in thread
From: Russell King (Oracle) @ 2021-12-31 10:25 UTC (permalink / raw)
  To: Ilkka Koskinen
  Cc: lorenzo.pieralisi, guohanjun, sudeep.holla, rafael, lenb,
	robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren

On Thu, Dec 30, 2021 at 07:37:23PM -0800, Ilkka Koskinen wrote:
> Arm Generic Diagnostic Dump and Reset device enables a maintainer to
> request OS to perform a diagnostic dump and reset a system via SDEI
> event or an interrupt. This patchset adds support for the SDEI path.
> 
> I do have a patch to enable the interrupt path as well but I'm holding
> it back since AGDI table is missing interrupt configuration fields
> (trigger type etc.).
> 
> The recently published specification is available at
> https://developer.arm.com/documentation/den0093/latest
> 
> The patchset was tested on Ampere Altra/Mt. Jade.
> 
> The patchset applies on top of
>   git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm bleeding-edge (642439a44411)

LGTM, thanks!

Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
@ 2022-01-04 14:28   ` Rafael J. Wysocki
  2022-01-05  7:05     ` Ilkka Koskinen
  2022-01-05  1:34   ` Hanjun Guo
  2022-01-05 10:46   ` Lorenzo Pieralisi
  2 siblings, 1 reply; 13+ messages in thread
From: Rafael J. Wysocki @ 2022-01-04 14:28 UTC (permalink / raw)
  To: Ilkka Koskinen
  Cc: Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla, Rafael J. Wysocki,
	Russell King - ARM Linux, Len Brown, Robert Moore,
	ACPI Devel Maling List, Linux ARM, Linux Kernel Mailing List,
	patches, scott, darren

On Fri, Dec 31, 2021 at 4:37 AM Ilkka Koskinen
<ilkka@os.amperecomputing.com> wrote:
>
> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
> issue diagnostic dump and reset via an SDEI event or an interrupt.
> This patch implements SDEI path.
>
> [0] https://developer.arm.com/documentation/den0093/latest/
>
> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>

This requires an ACK from the arm64 side if you want me to take it.

However, I can apply patch 1 from this series if that helps.

> ---
>  drivers/acpi/arm64/Kconfig  |   8 +++
>  drivers/acpi/arm64/Makefile |   1 +
>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 134 insertions(+)
>  create mode 100644 drivers/acpi/arm64/agdi.c
>
> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
> index 6dba187f4f2e..24869ba5b365 100644
> --- a/drivers/acpi/arm64/Kconfig
> +++ b/drivers/acpi/arm64/Kconfig
> @@ -8,3 +8,11 @@ config ACPI_IORT
>
>  config ACPI_GTDT
>         bool
> +
> +config ACPI_AGDI
> +       bool "Arm Generic Diagnostic Dump and Reset Device Interface"
> +       depends on ARM_SDE_INTERFACE
> +       help
> +         Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
> +         a standard that enables issuing a non-maskable diagnostic dump and
> +         reset command.
> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
> index 66acbe77f46e..7b9e4045659d 100644
> --- a/drivers/acpi/arm64/Makefile
> +++ b/drivers/acpi/arm64/Makefile
> @@ -1,4 +1,5 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> +obj-$(CONFIG_ACPI_AGDI)        += agdi.o
>  obj-$(CONFIG_ACPI_IORT)        += iort.o
>  obj-$(CONFIG_ACPI_GTDT)        += gtdt.o
>  obj-y                          += dma.o
> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
> new file mode 100644
> index 000000000000..6525ccbae5c1
> --- /dev/null
> +++ b/drivers/acpi/arm64/agdi.c
> @@ -0,0 +1,125 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * This file implements handling of
> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
> + *
> + * Copyright (c) 2021, Ampere Computing LLC
> + */
> +
> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
> +
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/acpi.h>
> +#include <linux/arm_sdei.h>
> +#include <linux/io.h>
> +
> +struct agdi_data {
> +       int sdei_event;
> +};
> +
> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
> +{
> +       nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
> +       return 0;
> +}
> +
> +static int agdi_sdei_probe(struct platform_device *pdev,
> +                          struct agdi_data *adata)
> +{
> +       int err;
> +
> +       err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
> +       if (err) {
> +               dev_err(&pdev->dev, "Failed to register for SDEI event %d",
> +                       adata->sdei_event);
> +               return err;
> +       }
> +
> +       err = sdei_event_enable(adata->sdei_event);
> +       if (err)  {
> +               sdei_event_unregister(adata->sdei_event);
> +               dev_err(&pdev->dev, "Failed to enable event %d\n",
> +                       adata->sdei_event);
> +               return err;
> +       }
> +
> +       return 0;
> +}
> +
> +static int agdi_probe(struct platform_device *pdev)
> +{
> +       struct agdi_data *adata;
> +
> +       adata = dev_get_platdata(&pdev->dev);
> +       if (!adata)
> +               return -EINVAL;
> +
> +       return agdi_sdei_probe(pdev, adata);
> +}
> +
> +static int agdi_remove(struct platform_device *pdev)
> +{
> +       struct agdi_data *adata = platform_get_drvdata(pdev);
> +
> +       sdei_event_disable(adata->sdei_event);
> +       sdei_event_unregister(adata->sdei_event);
> +
> +       return 0;
> +}
> +
> +static struct platform_driver agdi_driver = {
> +       .driver = {
> +               .name = "agdi",
> +       },
> +       .probe = agdi_probe,
> +       .remove = agdi_remove,
> +};
> +
> +static int __init agdi_init(void)
> +{
> +       int ret;
> +       acpi_status status;
> +       struct acpi_table_agdi *agdi_table;
> +       struct agdi_data pdata;
> +       struct platform_device *pdev;
> +
> +       if (acpi_disabled)
> +               return 0;
> +
> +       status = acpi_get_table(ACPI_SIG_AGDI, 0,
> +                               (struct acpi_table_header **) &agdi_table);
> +       if (ACPI_FAILURE(status))
> +               return -ENODEV;
> +
> +       if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
> +               pr_warn("Interrupt signaling is not supported");
> +               ret = -ENODEV;
> +               goto err_put_table;
> +       }
> +
> +       pdata.sdei_event = agdi_table->sdei_event;
> +
> +       pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
> +       if (IS_ERR(pdev)) {
> +               ret = PTR_ERR(pdev);
> +               goto err_put_table;
> +       }
> +
> +       ret = platform_driver_register(&agdi_driver);
> +       if (ret)
> +               goto err_device_unregister;
> +
> +       acpi_put_table((struct acpi_table_header *)agdi_table);
> +       return 0;
> +
> +err_device_unregister:
> +       platform_device_unregister(pdev);
> +err_put_table:
> +       acpi_put_table((struct acpi_table_header *)agdi_table);
> +       return ret;
> +}
> +device_initcall(agdi_init);
> --
> 2.17.1
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
  2022-01-04 14:28   ` Rafael J. Wysocki
@ 2022-01-05  1:34   ` Hanjun Guo
  2022-01-05  7:10     ` Ilkka Koskinen
  2022-01-05 10:46   ` Lorenzo Pieralisi
  2 siblings, 1 reply; 13+ messages in thread
From: Hanjun Guo @ 2022-01-05  1:34 UTC (permalink / raw)
  To: Ilkka Koskinen, lorenzo.pieralisi, sudeep.holla, rafael, linux
  Cc: lenb, robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren

Hi Ilkka,

On 2021/12/31 11:37, Ilkka Koskinen wrote:
> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
> issue diagnostic dump and reset via an SDEI event or an interrupt.
> This patch implements SDEI path.
> 
> [0] https://developer.arm.com/documentation/den0093/latest/
> 
> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
> ---
>   drivers/acpi/arm64/Kconfig  |   8 +++
>   drivers/acpi/arm64/Makefile |   1 +
>   drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>   3 files changed, 134 insertions(+)
>   create mode 100644 drivers/acpi/arm64/agdi.c
> 
> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
> index 6dba187f4f2e..24869ba5b365 100644
> --- a/drivers/acpi/arm64/Kconfig
> +++ b/drivers/acpi/arm64/Kconfig
> @@ -8,3 +8,11 @@ config ACPI_IORT
>   
>   config ACPI_GTDT
>   	bool
> +
> +config ACPI_AGDI
> +	bool "Arm Generic Diagnostic Dump and Reset Device Interface"
> +	depends on ARM_SDE_INTERFACE
> +	help
> +	  Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
> +	  a standard that enables issuing a non-maskable diagnostic dump and
> +	  reset command.
> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
> index 66acbe77f46e..7b9e4045659d 100644
> --- a/drivers/acpi/arm64/Makefile
> +++ b/drivers/acpi/arm64/Makefile
> @@ -1,4 +1,5 @@
>   # SPDX-License-Identifier: GPL-2.0-only
> +obj-$(CONFIG_ACPI_AGDI) 	+= agdi.o
>   obj-$(CONFIG_ACPI_IORT) 	+= iort.o
>   obj-$(CONFIG_ACPI_GTDT) 	+= gtdt.o
>   obj-y				+= dma.o
> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
> new file mode 100644
> index 000000000000..6525ccbae5c1
> --- /dev/null
> +++ b/drivers/acpi/arm64/agdi.c
> @@ -0,0 +1,125 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * This file implements handling of
> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
> + *
> + * Copyright (c) 2021, Ampere Computing LLC
> + */
> +
> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
> +
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/acpi.h>
> +#include <linux/arm_sdei.h>
> +#include <linux/io.h>

Please keep the head files in alphabetical order.

> +
> +struct agdi_data {
> +	int sdei_event;
> +};
> +
> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
> +{
> +	nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
> +	return 0;
> +}
> +
> +static int agdi_sdei_probe(struct platform_device *pdev,
> +			   struct agdi_data *adata)
> +{
> +	int err;
> +
> +	err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
> +	if (err) {
> +		dev_err(&pdev->dev, "Failed to register for SDEI event %d",
> +			adata->sdei_event);
> +		return err;
> +	}
> +
> +	err = sdei_event_enable(adata->sdei_event);
> +	if (err)  {
> +		sdei_event_unregister(adata->sdei_event);
> +		dev_err(&pdev->dev, "Failed to enable event %d\n",
> +			adata->sdei_event);
> +		return err;
> +	}
> +
> +	return 0;
> +}
> +
> +static int agdi_probe(struct platform_device *pdev)
> +{
> +	struct agdi_data *adata;
> +
> +	adata = dev_get_platdata(&pdev->dev);
> +	if (!adata)
> +		return -EINVAL;
> +
> +	return agdi_sdei_probe(pdev, adata);
> +}
> +
> +static int agdi_remove(struct platform_device *pdev)
> +{
> +	struct agdi_data *adata = platform_get_drvdata(pdev);
> +
> +	sdei_event_disable(adata->sdei_event);
> +	sdei_event_unregister(adata->sdei_event);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver agdi_driver = {
> +	.driver = {
> +		.name = "agdi",
> +	},
> +	.probe = agdi_probe,
> +	.remove = agdi_remove,
> +};
> +
> +static int __init agdi_init(void)
> +{
> +	int ret;
> +	acpi_status status;
> +	struct acpi_table_agdi *agdi_table;
> +	struct agdi_data pdata;
> +	struct platform_device *pdev;
> +
> +	if (acpi_disabled)
> +		return 0;
> +
> +	status = acpi_get_table(ACPI_SIG_AGDI, 0,
> +				(struct acpi_table_header **) &agdi_table);
> +	if (ACPI_FAILURE(status))
> +		return -ENODEV;
> +
> +	if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
> +		pr_warn("Interrupt signaling is not supported");
> +		ret = -ENODEV;
> +		goto err_put_table;
> +	}
> +
> +	pdata.sdei_event = agdi_table->sdei_event;
> +
> +	pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
> +	if (IS_ERR(pdev)) {
> +		ret = PTR_ERR(pdev);
> +		goto err_put_table;
> +	}
> +
> +	ret = platform_driver_register(&agdi_driver);
> +	if (ret)
> +		goto err_device_unregister;
> +
> +	acpi_put_table((struct acpi_table_header *)agdi_table);
> +	return 0;
> +
> +err_device_unregister:
> +	platform_device_unregister(pdev);
> +err_put_table:
> +	acpi_put_table((struct acpi_table_header *)agdi_table);
> +	return ret;
> +}
> +device_initcall(agdi_init);

The rest are looking good to me.

Thanks
Hanjun

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-04 14:28   ` Rafael J. Wysocki
@ 2022-01-05  7:05     ` Ilkka Koskinen
  0 siblings, 0 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2022-01-05  7:05 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Ilkka Koskinen, Lorenzo Pieralisi, Hanjun Guo, Sudeep Holla,
	Russell King - ARM Linux, Len Brown, Robert Moore,
	ACPI Devel Maling List, Linux ARM, Linux Kernel Mailing List,
	patches, scott, darren


Hi Rafael,

On Tue, 4 Jan 2022, Rafael J. Wysocki wrote:
> On Fri, Dec 31, 2021 at 4:37 AM Ilkka Koskinen
> <ilkka@os.amperecomputing.com> wrote:
>>
>> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
>> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
>> issue diagnostic dump and reset via an SDEI event or an interrupt.
>> This patch implements SDEI path.
>>
>> [0] https://developer.arm.com/documentation/den0093/latest/
>>
>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
>
> This requires an ACK from the arm64 side if you want me to take it.

That's my understanding too.

> However, I can apply patch 1 from this series if that helps.

I'm not sure, if it makes sense to pick the first patch now since there 
aren't other users for it. I'd probably keep them together although I 
don't have strong feelings about it.

Cheers, Ilkka

>
>> ---
>>  drivers/acpi/arm64/Kconfig  |   8 +++
>>  drivers/acpi/arm64/Makefile |   1 +
>>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>>  3 files changed, 134 insertions(+)
>>  create mode 100644 drivers/acpi/arm64/agdi.c
>>
>> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
>> index 6dba187f4f2e..24869ba5b365 100644
>> --- a/drivers/acpi/arm64/Kconfig
>> +++ b/drivers/acpi/arm64/Kconfig
>> @@ -8,3 +8,11 @@ config ACPI_IORT
>>
>>  config ACPI_GTDT
>>         bool
>> +
>> +config ACPI_AGDI
>> +       bool "Arm Generic Diagnostic Dump and Reset Device Interface"
>> +       depends on ARM_SDE_INTERFACE
>> +       help
>> +         Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
>> +         a standard that enables issuing a non-maskable diagnostic dump and
>> +         reset command.
>> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
>> index 66acbe77f46e..7b9e4045659d 100644
>> --- a/drivers/acpi/arm64/Makefile
>> +++ b/drivers/acpi/arm64/Makefile
>> @@ -1,4 +1,5 @@
>>  # SPDX-License-Identifier: GPL-2.0-only
>> +obj-$(CONFIG_ACPI_AGDI)        += agdi.o
>>  obj-$(CONFIG_ACPI_IORT)        += iort.o
>>  obj-$(CONFIG_ACPI_GTDT)        += gtdt.o
>>  obj-y                          += dma.o
>> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
>> new file mode 100644
>> index 000000000000..6525ccbae5c1
>> --- /dev/null
>> +++ b/drivers/acpi/arm64/agdi.c
>> @@ -0,0 +1,125 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * This file implements handling of
>> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
>> + *
>> + * Copyright (c) 2021, Ampere Computing LLC
>> + */
>> +
>> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/slab.h>
>> +#include <linux/module.h>
>> +#include <linux/kernel.h>
>> +#include <linux/acpi.h>
>> +#include <linux/arm_sdei.h>
>> +#include <linux/io.h>
>> +
>> +struct agdi_data {
>> +       int sdei_event;
>> +};
>> +
>> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
>> +{
>> +       nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
>> +       return 0;
>> +}
>> +
>> +static int agdi_sdei_probe(struct platform_device *pdev,
>> +                          struct agdi_data *adata)
>> +{
>> +       int err;
>> +
>> +       err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
>> +       if (err) {
>> +               dev_err(&pdev->dev, "Failed to register for SDEI event %d",
>> +                       adata->sdei_event);
>> +               return err;
>> +       }
>> +
>> +       err = sdei_event_enable(adata->sdei_event);
>> +       if (err)  {
>> +               sdei_event_unregister(adata->sdei_event);
>> +               dev_err(&pdev->dev, "Failed to enable event %d\n",
>> +                       adata->sdei_event);
>> +               return err;
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>> +static int agdi_probe(struct platform_device *pdev)
>> +{
>> +       struct agdi_data *adata;
>> +
>> +       adata = dev_get_platdata(&pdev->dev);
>> +       if (!adata)
>> +               return -EINVAL;
>> +
>> +       return agdi_sdei_probe(pdev, adata);
>> +}
>> +
>> +static int agdi_remove(struct platform_device *pdev)
>> +{
>> +       struct agdi_data *adata = platform_get_drvdata(pdev);
>> +
>> +       sdei_event_disable(adata->sdei_event);
>> +       sdei_event_unregister(adata->sdei_event);
>> +
>> +       return 0;
>> +}
>> +
>> +static struct platform_driver agdi_driver = {
>> +       .driver = {
>> +               .name = "agdi",
>> +       },
>> +       .probe = agdi_probe,
>> +       .remove = agdi_remove,
>> +};
>> +
>> +static int __init agdi_init(void)
>> +{
>> +       int ret;
>> +       acpi_status status;
>> +       struct acpi_table_agdi *agdi_table;
>> +       struct agdi_data pdata;
>> +       struct platform_device *pdev;
>> +
>> +       if (acpi_disabled)
>> +               return 0;
>> +
>> +       status = acpi_get_table(ACPI_SIG_AGDI, 0,
>> +                               (struct acpi_table_header **) &agdi_table);
>> +       if (ACPI_FAILURE(status))
>> +               return -ENODEV;
>> +
>> +       if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
>> +               pr_warn("Interrupt signaling is not supported");
>> +               ret = -ENODEV;
>> +               goto err_put_table;
>> +       }
>> +
>> +       pdata.sdei_event = agdi_table->sdei_event;
>> +
>> +       pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
>> +       if (IS_ERR(pdev)) {
>> +               ret = PTR_ERR(pdev);
>> +               goto err_put_table;
>> +       }
>> +
>> +       ret = platform_driver_register(&agdi_driver);
>> +       if (ret)
>> +               goto err_device_unregister;
>> +
>> +       acpi_put_table((struct acpi_table_header *)agdi_table);
>> +       return 0;
>> +
>> +err_device_unregister:
>> +       platform_device_unregister(pdev);
>> +err_put_table:
>> +       acpi_put_table((struct acpi_table_header *)agdi_table);
>> +       return ret;
>> +}
>> +device_initcall(agdi_init);
>> --
>> 2.17.1
>>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-05  1:34   ` Hanjun Guo
@ 2022-01-05  7:10     ` Ilkka Koskinen
  0 siblings, 0 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2022-01-05  7:10 UTC (permalink / raw)
  To: Hanjun Guo
  Cc: Ilkka Koskinen, lorenzo.pieralisi, sudeep.holla, rafael, linux,
	lenb, robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren


Hi Hanjun,

On Wed, 5 Jan 2022, Hanjun Guo wrote:
> Hi Ilkka,
>
> On 2021/12/31 11:37, Ilkka Koskinen wrote:
>> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
>> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
>> issue diagnostic dump and reset via an SDEI event or an interrupt.
>> This patch implements SDEI path.
>> 
>> [0] https://developer.arm.com/documentation/den0093/latest/
>> 
>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
>> ---
>>   drivers/acpi/arm64/Kconfig  |   8 +++
>>   drivers/acpi/arm64/Makefile |   1 +
>>   drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>>   3 files changed, 134 insertions(+)
>>   create mode 100644 drivers/acpi/arm64/agdi.c
>> 
>> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
>> index 6dba187f4f2e..24869ba5b365 100644
>> --- a/drivers/acpi/arm64/Kconfig
>> +++ b/drivers/acpi/arm64/Kconfig
>> @@ -8,3 +8,11 @@ config ACPI_IORT
>>     config ACPI_GTDT
>>   	bool
>> +
>> +config ACPI_AGDI
>> +	bool "Arm Generic Diagnostic Dump and Reset Device Interface"
>> +	depends on ARM_SDE_INTERFACE
>> +	help
>> +	  Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
>> +	  a standard that enables issuing a non-maskable diagnostic dump and
>> +	  reset command.
>> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
>> index 66acbe77f46e..7b9e4045659d 100644
>> --- a/drivers/acpi/arm64/Makefile
>> +++ b/drivers/acpi/arm64/Makefile
>> @@ -1,4 +1,5 @@
>>   # SPDX-License-Identifier: GPL-2.0-only
>> +obj-$(CONFIG_ACPI_AGDI) 	+= agdi.o
>>   obj-$(CONFIG_ACPI_IORT) 	+= iort.o
>>   obj-$(CONFIG_ACPI_GTDT) 	+= gtdt.o
>>   obj-y				+= dma.o
>> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
>> new file mode 100644
>> index 000000000000..6525ccbae5c1
>> --- /dev/null
>> +++ b/drivers/acpi/arm64/agdi.c
>> @@ -0,0 +1,125 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * This file implements handling of
>> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
>> + *
>> + * Copyright (c) 2021, Ampere Computing LLC
>> + */
>> +
>> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/slab.h>
>> +#include <linux/module.h>
>> +#include <linux/kernel.h>
>> +#include <linux/acpi.h>
>> +#include <linux/arm_sdei.h>
>> +#include <linux/io.h>
>
> Please keep the head files in alphabetical order.

I'll fix the include lines

>
>> +
>> +struct agdi_data {
>> +	int sdei_event;
>> +};
>> +
>> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void 
>> *arg)
>> +{
>> +	nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event 
>> issued");
>> +	return 0;
>> +}
>> +
>> +static int agdi_sdei_probe(struct platform_device *pdev,
>> +			   struct agdi_data *adata)
>> +{
>> +	int err;
>> +
>> +	err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, 
>> pdev);
>> +	if (err) {
>> +		dev_err(&pdev->dev, "Failed to register for SDEI event %d",
>> +			adata->sdei_event);
>> +		return err;
>> +	}
>> +
>> +	err = sdei_event_enable(adata->sdei_event);
>> +	if (err)  {
>> +		sdei_event_unregister(adata->sdei_event);
>> +		dev_err(&pdev->dev, "Failed to enable event %d\n",
>> +			adata->sdei_event);
>> +		return err;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +static int agdi_probe(struct platform_device *pdev)
>> +{
>> +	struct agdi_data *adata;
>> +
>> +	adata = dev_get_platdata(&pdev->dev);
>> +	if (!adata)
>> +		return -EINVAL;
>> +
>> +	return agdi_sdei_probe(pdev, adata);
>> +}
>> +
>> +static int agdi_remove(struct platform_device *pdev)
>> +{
>> +	struct agdi_data *adata = platform_get_drvdata(pdev);
>> +
>> +	sdei_event_disable(adata->sdei_event);
>> +	sdei_event_unregister(adata->sdei_event);
>> +
>> +	return 0;
>> +}
>> +
>> +static struct platform_driver agdi_driver = {
>> +	.driver = {
>> +		.name = "agdi",
>> +	},
>> +	.probe = agdi_probe,
>> +	.remove = agdi_remove,
>> +};
>> +
>> +static int __init agdi_init(void)
>> +{
>> +	int ret;
>> +	acpi_status status;
>> +	struct acpi_table_agdi *agdi_table;
>> +	struct agdi_data pdata;
>> +	struct platform_device *pdev;
>> +
>> +	if (acpi_disabled)
>> +		return 0;
>> +
>> +	status = acpi_get_table(ACPI_SIG_AGDI, 0,
>> +				(struct acpi_table_header **) &agdi_table);
>> +	if (ACPI_FAILURE(status))
>> +		return -ENODEV;
>> +
>> +	if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
>> +		pr_warn("Interrupt signaling is not supported");
>> +		ret = -ENODEV;
>> +		goto err_put_table;
>> +	}
>> +
>> +	pdata.sdei_event = agdi_table->sdei_event;
>> +
>> +	pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, 
>> sizeof(pdata));
>> +	if (IS_ERR(pdev)) {
>> +		ret = PTR_ERR(pdev);
>> +		goto err_put_table;
>> +	}
>> +
>> +	ret = platform_driver_register(&agdi_driver);
>> +	if (ret)
>> +		goto err_device_unregister;
>> +
>> +	acpi_put_table((struct acpi_table_header *)agdi_table);
>> +	return 0;
>> +
>> +err_device_unregister:
>> +	platform_device_unregister(pdev);
>> +err_put_table:
>> +	acpi_put_table((struct acpi_table_header *)agdi_table);
>> +	return ret;
>> +}
>> +device_initcall(agdi_init);
>
> The rest are looking good to me.

I'm glad to hear that

> Thanks
> Hanjun
>

Cheers, Ilkka

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
  2022-01-04 14:28   ` Rafael J. Wysocki
  2022-01-05  1:34   ` Hanjun Guo
@ 2022-01-05 10:46   ` Lorenzo Pieralisi
  2022-01-05 23:46     ` Ilkka Koskinen
  2 siblings, 1 reply; 13+ messages in thread
From: Lorenzo Pieralisi @ 2022-01-05 10:46 UTC (permalink / raw)
  To: Ilkka Koskinen
  Cc: guohanjun, sudeep.holla, rafael, linux, lenb, robert.moore,
	linux-acpi, linux-arm-kernel, linux-kernel, patches, scott,
	darren, james.morse

[+James, for SDEI bits]

On Thu, Dec 30, 2021 at 07:37:25PM -0800, Ilkka Koskinen wrote:
> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
> issue diagnostic dump and reset via an SDEI event or an interrupt.
> This patch implements SDEI path.
> 
> [0] https://developer.arm.com/documentation/den0093/latest/
> 
> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
> ---
>  drivers/acpi/arm64/Kconfig  |   8 +++
>  drivers/acpi/arm64/Makefile |   1 +
>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 134 insertions(+)
>  create mode 100644 drivers/acpi/arm64/agdi.c
> 
> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
> index 6dba187f4f2e..24869ba5b365 100644
> --- a/drivers/acpi/arm64/Kconfig
> +++ b/drivers/acpi/arm64/Kconfig
> @@ -8,3 +8,11 @@ config ACPI_IORT
>  
>  config ACPI_GTDT
>  	bool
> +
> +config ACPI_AGDI
> +	bool "Arm Generic Diagnostic Dump and Reset Device Interface"
> +	depends on ARM_SDE_INTERFACE
> +	help
> +	  Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
> +	  a standard that enables issuing a non-maskable diagnostic dump and
> +	  reset command.
> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
> index 66acbe77f46e..7b9e4045659d 100644
> --- a/drivers/acpi/arm64/Makefile
> +++ b/drivers/acpi/arm64/Makefile
> @@ -1,4 +1,5 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> +obj-$(CONFIG_ACPI_AGDI) 	+= agdi.o
>  obj-$(CONFIG_ACPI_IORT) 	+= iort.o
>  obj-$(CONFIG_ACPI_GTDT) 	+= gtdt.o
>  obj-y				+= dma.o
> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
> new file mode 100644
> index 000000000000..6525ccbae5c1
> --- /dev/null
> +++ b/drivers/acpi/arm64/agdi.c
> @@ -0,0 +1,125 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * This file implements handling of
> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
> + *
> + * Copyright (c) 2021, Ampere Computing LLC
> + */
> +
> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
> +
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/acpi.h>
> +#include <linux/arm_sdei.h>
> +#include <linux/io.h>

Nit: alphabetical order.

> +
> +struct agdi_data {
> +	int sdei_event;
> +};
> +
> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
> +{
> +	nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
> +	return 0;
> +}
> +
> +static int agdi_sdei_probe(struct platform_device *pdev,
> +			   struct agdi_data *adata)
> +{
> +	int err;
> +
> +	err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
> +	if (err) {
> +		dev_err(&pdev->dev, "Failed to register for SDEI event %d",
> +			adata->sdei_event);
> +		return err;
> +	}
> +
> +	err = sdei_event_enable(adata->sdei_event);
> +	if (err)  {
> +		sdei_event_unregister(adata->sdei_event);
> +		dev_err(&pdev->dev, "Failed to enable event %d\n",
> +			adata->sdei_event);
> +		return err;
> +	}
> +
> +	return 0;
> +}
> +
> +static int agdi_probe(struct platform_device *pdev)
> +{
> +	struct agdi_data *adata;
> +
> +	adata = dev_get_platdata(&pdev->dev);
> +	if (!adata)
> +		return -EINVAL;
> +
> +	return agdi_sdei_probe(pdev, adata);
> +}
> +
> +static int agdi_remove(struct platform_device *pdev)
> +{
> +	struct agdi_data *adata = platform_get_drvdata(pdev);
> +
> +	sdei_event_disable(adata->sdei_event);
> +	sdei_event_unregister(adata->sdei_event);
> +
> +	return 0;
> +}
> +
> +static struct platform_driver agdi_driver = {
> +	.driver = {
> +		.name = "agdi",
> +	},
> +	.probe = agdi_probe,
> +	.remove = agdi_remove,
> +};

May I ask why we need a platform device (and driver) to register
an SDEI event ?

> +static int __init agdi_init(void)
> +{
> +	int ret;
> +	acpi_status status;
> +	struct acpi_table_agdi *agdi_table;
> +	struct agdi_data pdata;
> +	struct platform_device *pdev;
> +
> +	if (acpi_disabled)
> +		return 0;

Why don't we call agdi_init() from acpi_init() as we do for IORT/VIOT ?

I don't think it is necessary to add a device_initcall(), with related
ordering dependencies.

> +
> +	status = acpi_get_table(ACPI_SIG_AGDI, 0,
> +				(struct acpi_table_header **) &agdi_table);
> +	if (ACPI_FAILURE(status))
> +		return -ENODEV;
> +
> +	if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {

Is this because specs need updating ?

> +		pr_warn("Interrupt signaling is not supported");
> +		ret = -ENODEV;
> +		goto err_put_table;
> +	}
> +
> +	pdata.sdei_event = agdi_table->sdei_event;
> +
> +	pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
> +	if (IS_ERR(pdev)) {
> +		ret = PTR_ERR(pdev);
> +		goto err_put_table;
> +	}
> +
> +	ret = platform_driver_register(&agdi_driver);
> +	if (ret)
> +		goto err_device_unregister;
> +
> +	acpi_put_table((struct acpi_table_header *)agdi_table);
> +	return 0;
> +
> +err_device_unregister:
> +	platform_device_unregister(pdev);
> +err_put_table:
> +	acpi_put_table((struct acpi_table_header *)agdi_table);
> +	return ret;
> +}
> +device_initcall(agdi_init);

See above.

Thanks,
Lorenzo

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-05 10:46   ` Lorenzo Pieralisi
@ 2022-01-05 23:46     ` Ilkka Koskinen
  2022-01-14  2:17       ` Ilkka Koskinen
  0 siblings, 1 reply; 13+ messages in thread
From: Ilkka Koskinen @ 2022-01-05 23:46 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Ilkka Koskinen, guohanjun, sudeep.holla, rafael, linux, lenb,
	robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren, james.morse


Hi Lorenzo,

On Wed, 5 Jan 2022, Lorenzo Pieralisi wrote:
> [+James, for SDEI bits]
>
> On Thu, Dec 30, 2021 at 07:37:25PM -0800, Ilkka Koskinen wrote:
>> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
>> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
>> issue diagnostic dump and reset via an SDEI event or an interrupt.
>> This patch implements SDEI path.
>>
>> [0] https://developer.arm.com/documentation/den0093/latest/
>>
>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
>> ---
>>  drivers/acpi/arm64/Kconfig  |   8 +++
>>  drivers/acpi/arm64/Makefile |   1 +
>>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>>  3 files changed, 134 insertions(+)
>>  create mode 100644 drivers/acpi/arm64/agdi.c
>>
>> diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
>> index 6dba187f4f2e..24869ba5b365 100644
>> --- a/drivers/acpi/arm64/Kconfig
>> +++ b/drivers/acpi/arm64/Kconfig
>> @@ -8,3 +8,11 @@ config ACPI_IORT
>>
>>  config ACPI_GTDT
>>  	bool
>> +
>> +config ACPI_AGDI
>> +	bool "Arm Generic Diagnostic Dump and Reset Device Interface"
>> +	depends on ARM_SDE_INTERFACE
>> +	help
>> +	  Arm Generic Diagnostic Dump and Reset Device Interface (AGDI) is
>> +	  a standard that enables issuing a non-maskable diagnostic dump and
>> +	  reset command.
>> diff --git a/drivers/acpi/arm64/Makefile b/drivers/acpi/arm64/Makefile
>> index 66acbe77f46e..7b9e4045659d 100644
>> --- a/drivers/acpi/arm64/Makefile
>> +++ b/drivers/acpi/arm64/Makefile
>> @@ -1,4 +1,5 @@
>>  # SPDX-License-Identifier: GPL-2.0-only
>> +obj-$(CONFIG_ACPI_AGDI) 	+= agdi.o
>>  obj-$(CONFIG_ACPI_IORT) 	+= iort.o
>>  obj-$(CONFIG_ACPI_GTDT) 	+= gtdt.o
>>  obj-y				+= dma.o
>> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
>> new file mode 100644
>> index 000000000000..6525ccbae5c1
>> --- /dev/null
>> +++ b/drivers/acpi/arm64/agdi.c
>> @@ -0,0 +1,125 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * This file implements handling of
>> + * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
>> + *
>> + * Copyright (c) 2021, Ampere Computing LLC
>> + */
>> +
>> +#define pr_fmt(fmt) "ACPI: AGDI: " fmt
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/slab.h>
>> +#include <linux/module.h>
>> +#include <linux/kernel.h>
>> +#include <linux/acpi.h>
>> +#include <linux/arm_sdei.h>
>> +#include <linux/io.h>
>
> Nit: alphabetical order.

I clean them

>
>> +
>> +struct agdi_data {
>> +	int sdei_event;
>> +};
>> +
>> +static int agdi_sdei_handler(u32 sdei_event, struct pt_regs *regs, void *arg)
>> +{
>> +	nmi_panic(regs, "Arm Generic Diagnostic Dump and Reset SDEI event issued");
>> +	return 0;
>> +}
>> +
>> +static int agdi_sdei_probe(struct platform_device *pdev,
>> +			   struct agdi_data *adata)
>> +{
>> +	int err;
>> +
>> +	err = sdei_event_register(adata->sdei_event, agdi_sdei_handler, pdev);
>> +	if (err) {
>> +		dev_err(&pdev->dev, "Failed to register for SDEI event %d",
>> +			adata->sdei_event);
>> +		return err;
>> +	}
>> +
>> +	err = sdei_event_enable(adata->sdei_event);
>> +	if (err)  {
>> +		sdei_event_unregister(adata->sdei_event);
>> +		dev_err(&pdev->dev, "Failed to enable event %d\n",
>> +			adata->sdei_event);
>> +		return err;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +static int agdi_probe(struct platform_device *pdev)
>> +{
>> +	struct agdi_data *adata;
>> +
>> +	adata = dev_get_platdata(&pdev->dev);
>> +	if (!adata)
>> +		return -EINVAL;
>> +
>> +	return agdi_sdei_probe(pdev, adata);
>> +}
>> +
>> +static int agdi_remove(struct platform_device *pdev)
>> +{
>> +	struct agdi_data *adata = platform_get_drvdata(pdev);
>> +
>> +	sdei_event_disable(adata->sdei_event);
>> +	sdei_event_unregister(adata->sdei_event);
>> +
>> +	return 0;
>> +}
>> +
>> +static struct platform_driver agdi_driver = {
>> +	.driver = {
>> +		.name = "agdi",
>> +	},
>> +	.probe = agdi_probe,
>> +	.remove = agdi_remove,
>> +};
>
> May I ask why we need a platform device (and driver) to register
> an SDEI event ?

Well, I guess I thought to have a device/driver to handle SDEI events and 
interrupts since the spec calls it a device. I can certainly remove those, 
if that's preferred.

>
>> +static int __init agdi_init(void)
>> +{
>> +	int ret;
>> +	acpi_status status;
>> +	struct acpi_table_agdi *agdi_table;
>> +	struct agdi_data pdata;
>> +	struct platform_device *pdev;
>> +
>> +	if (acpi_disabled)
>> +		return 0;
>
> Why don't we call agdi_init() from acpi_init() as we do for IORT/VIOT ?
>
> I don't think it is necessary to add a device_initcall(), with related
> ordering dependencies.

That's a good point. I change it.

>
>> +
>> +	status = acpi_get_table(ACPI_SIG_AGDI, 0,
>> +				(struct acpi_table_header **) &agdi_table);
>> +	if (ACPI_FAILURE(status))
>> +		return -ENODEV;
>> +
>> +	if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
>
> Is this because specs need updating ?

Yes, that's the reason. AGDI table is missing flags that would define 
trigger type and polarity.

>
>> +		pr_warn("Interrupt signaling is not supported");
>> +		ret = -ENODEV;
>> +		goto err_put_table;
>> +	}
>> +
>> +	pdata.sdei_event = agdi_table->sdei_event;
>> +
>> +	pdev = platform_device_register_data(NULL, "agdi", 0, &pdata, sizeof(pdata));
>> +	if (IS_ERR(pdev)) {
>> +		ret = PTR_ERR(pdev);
>> +		goto err_put_table;
>> +	}
>> +
>> +	ret = platform_driver_register(&agdi_driver);
>> +	if (ret)
>> +		goto err_device_unregister;
>> +
>> +	acpi_put_table((struct acpi_table_header *)agdi_table);
>> +	return 0;
>> +
>> +err_device_unregister:
>> +	platform_device_unregister(pdev);
>> +err_put_table:
>> +	acpi_put_table((struct acpi_table_header *)agdi_table);
>> +	return ret;
>> +}
>> +device_initcall(agdi_init);
>
> See above.
>
> Thanks,
> Lorenzo
>

Cheers, Ilkka


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-05 23:46     ` Ilkka Koskinen
@ 2022-01-14  2:17       ` Ilkka Koskinen
  2022-01-20 16:38         ` Lorenzo Pieralisi
  0 siblings, 1 reply; 13+ messages in thread
From: Ilkka Koskinen @ 2022-01-14  2:17 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: guohanjun, sudeep.holla, rafael, linux, lenb, robert.moore,
	linux-acpi, linux-arm-kernel, linux-kernel, patches, scott,
	darren, james.morse, Ilkka Koskinen


Hi Lorenzo,

On Wed, 5 Jan 2022, Ilkka Koskinen wrote:
>
> Hi Lorenzo,
>
> On Wed, 5 Jan 2022, Lorenzo Pieralisi wrote:
>> [+James, for SDEI bits]
>> 
>> On Thu, Dec 30, 2021 at 07:37:25PM -0800, Ilkka Koskinen wrote:
>>> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
>>> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
>>> issue diagnostic dump and reset via an SDEI event or an interrupt.
>>> This patch implements SDEI path.
>>> 
>>> [0] https://developer.arm.com/documentation/den0093/latest/
>>> 
>>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
>>> ---
>>>  drivers/acpi/arm64/Kconfig  |   8 +++
>>>  drivers/acpi/arm64/Makefile |   1 +
>>>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>>>  3 files changed, 134 insertions(+)
>>>  create mode 100644 drivers/acpi/arm64/agdi.c

<snip>

>>> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
>>> new file mode 100644
>>> index 000000000000..6525ccbae5c1
>>> --- /dev/null
>>> +++ b/drivers/acpi/arm64/agdi.c

<snip>

>>>
>>> +static int __init agdi_init(void)
>>> +{
>>> +	int ret;
>>> +	acpi_status status;
>>> +	struct acpi_table_agdi *agdi_table;
>>> +	struct agdi_data pdata;
>>> +	struct platform_device *pdev;
>>> +
>>> +	if (acpi_disabled)
>>> +		return 0;
>> 
>> Why don't we call agdi_init() from acpi_init() as we do for IORT/VIOT ?
>> 
>> I don't think it is necessary to add a device_initcall(), with related
>> ordering dependencies.
>
> That's a good point. I change it.

Actually, I looked at this more carefully. acpi_init() is called in 
subsys_initcall() while sdei_init() is called in subsys_initcall_sync(). 
That is, if I call this function in acpi_init(), SDEI driver won't be 
ready and this driver fails to register the event.

Cheers, Ilkka

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-14  2:17       ` Ilkka Koskinen
@ 2022-01-20 16:38         ` Lorenzo Pieralisi
  2022-01-25 23:04           ` Ilkka Koskinen
  0 siblings, 1 reply; 13+ messages in thread
From: Lorenzo Pieralisi @ 2022-01-20 16:38 UTC (permalink / raw)
  To: Ilkka Koskinen
  Cc: guohanjun, sudeep.holla, rafael, linux, lenb, robert.moore,
	linux-acpi, linux-arm-kernel, linux-kernel, patches, scott,
	darren, james.morse

On Thu, Jan 13, 2022 at 06:17:13PM -0800, Ilkka Koskinen wrote:
> 
> Hi Lorenzo,
> 
> On Wed, 5 Jan 2022, Ilkka Koskinen wrote:
> > 
> > Hi Lorenzo,
> > 
> > On Wed, 5 Jan 2022, Lorenzo Pieralisi wrote:
> > > [+James, for SDEI bits]
> > > 
> > > On Thu, Dec 30, 2021 at 07:37:25PM -0800, Ilkka Koskinen wrote:
> > > > ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
> > > > Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
> > > > issue diagnostic dump and reset via an SDEI event or an interrupt.
> > > > This patch implements SDEI path.
> > > > 
> > > > [0] https://developer.arm.com/documentation/den0093/latest/
> > > > 
> > > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
> > > > ---
> > > >  drivers/acpi/arm64/Kconfig  |   8 +++
> > > >  drivers/acpi/arm64/Makefile |   1 +
> > > >  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
> > > >  3 files changed, 134 insertions(+)
> > > >  create mode 100644 drivers/acpi/arm64/agdi.c
> 
> <snip>
> 
> > > > diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
> > > > new file mode 100644
> > > > index 000000000000..6525ccbae5c1
> > > > --- /dev/null
> > > > +++ b/drivers/acpi/arm64/agdi.c
> 
> <snip>
> 
> > > > 
> > > > +static int __init agdi_init(void)
> > > > +{
> > > > +	int ret;
> > > > +	acpi_status status;
> > > > +	struct acpi_table_agdi *agdi_table;
> > > > +	struct agdi_data pdata;
> > > > +	struct platform_device *pdev;
> > > > +
> > > > +	if (acpi_disabled)
> > > > +		return 0;
> > > 
> > > Why don't we call agdi_init() from acpi_init() as we do for IORT/VIOT ?
> > > 
> > > I don't think it is necessary to add a device_initcall(), with related
> > > ordering dependencies.
> > 
> > That's a good point. I change it.
> 
> Actually, I looked at this more carefully. acpi_init() is called in
> subsys_initcall() while sdei_init() is called in subsys_initcall_sync().
> That is, if I call this function in acpi_init(), SDEI driver won't be ready
> and this driver fails to register the event.

Maybe this will help:

https://lore.kernel.org/linux-arm-kernel/20220120050522.23689-1-xueshuai@linux.alibaba.com/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device
  2022-01-20 16:38         ` Lorenzo Pieralisi
@ 2022-01-25 23:04           ` Ilkka Koskinen
  0 siblings, 0 replies; 13+ messages in thread
From: Ilkka Koskinen @ 2022-01-25 23:04 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: Ilkka Koskinen, guohanjun, sudeep.holla, rafael, linux, lenb,
	robert.moore, linux-acpi, linux-arm-kernel, linux-kernel,
	patches, scott, darren, james.morse



On Thu, 20 Jan 2022, Lorenzo Pieralisi wrote:

> On Thu, Jan 13, 2022 at 06:17:13PM -0800, Ilkka Koskinen wrote:
>>
>> Hi Lorenzo,
>>
>> On Wed, 5 Jan 2022, Ilkka Koskinen wrote:
>>>
>>> Hi Lorenzo,
>>>
>>> On Wed, 5 Jan 2022, Lorenzo Pieralisi wrote:
>>>> [+James, for SDEI bits]
>>>>
>>>> On Thu, Dec 30, 2021 at 07:37:25PM -0800, Ilkka Koskinen wrote:
>>>>> ACPI for Arm Components 1.1 Platform Design Document v1.1 [0] specifices
>>>>> Arm Generic Diagnostic Device Interface (AGDI). It allows an admin to
>>>>> issue diagnostic dump and reset via an SDEI event or an interrupt.
>>>>> This patch implements SDEI path.
>>>>>
>>>>> [0] https://developer.arm.com/documentation/den0093/latest/
>>>>>
>>>>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
>>>>> ---
>>>>>  drivers/acpi/arm64/Kconfig  |   8 +++
>>>>>  drivers/acpi/arm64/Makefile |   1 +
>>>>>  drivers/acpi/arm64/agdi.c   | 125 ++++++++++++++++++++++++++++++++++++
>>>>>  3 files changed, 134 insertions(+)
>>>>>  create mode 100644 drivers/acpi/arm64/agdi.c
>>
>> <snip>
>>
>>>>> diff --git a/drivers/acpi/arm64/agdi.c b/drivers/acpi/arm64/agdi.c
>>>>> new file mode 100644
>>>>> index 000000000000..6525ccbae5c1
>>>>> --- /dev/null
>>>>> +++ b/drivers/acpi/arm64/agdi.c
>>
>> <snip>
>>
>>>>>
>>>>> +static int __init agdi_init(void)
>>>>> +{
>>>>> +	int ret;
>>>>> +	acpi_status status;
>>>>> +	struct acpi_table_agdi *agdi_table;
>>>>> +	struct agdi_data pdata;
>>>>> +	struct platform_device *pdev;
>>>>> +
>>>>> +	if (acpi_disabled)
>>>>> +		return 0;
>>>>
>>>> Why don't we call agdi_init() from acpi_init() as we do for IORT/VIOT ?
>>>>
>>>> I don't think it is necessary to add a device_initcall(), with related
>>>> ordering dependencies.
>>>
>>> That's a good point. I change it.
>>
>> Actually, I looked at this more carefully. acpi_init() is called in
>> subsys_initcall() while sdei_init() is called in subsys_initcall_sync().
>> That is, if I call this function in acpi_init(), SDEI driver won't be ready
>> and this driver fails to register the event.
>
> Maybe this will help:
>
> https://lore.kernel.org/linux-arm-kernel/20220120050522.23689-1-xueshuai@linux.alibaba.com/

Yep, that should work. I'll wait for his patch to get approved and make 
the needed changes to mine before submitting the v5.

Cheers, Ilkka

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-01-25 23:05 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-31  3:37 [PATCH v3 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
2021-12-31  3:37 ` [PATCH v3 1/2] ACPI: tables: Add AGDI to the list of known table signatures Ilkka Koskinen
2021-12-31  3:37 ` [PATCH v3 2/2] ACPI: AGDI: Add driver for Arm Generic Diagnostic Dump and Reset device Ilkka Koskinen
2022-01-04 14:28   ` Rafael J. Wysocki
2022-01-05  7:05     ` Ilkka Koskinen
2022-01-05  1:34   ` Hanjun Guo
2022-01-05  7:10     ` Ilkka Koskinen
2022-01-05 10:46   ` Lorenzo Pieralisi
2022-01-05 23:46     ` Ilkka Koskinen
2022-01-14  2:17       ` Ilkka Koskinen
2022-01-20 16:38         ` Lorenzo Pieralisi
2022-01-25 23:04           ` Ilkka Koskinen
2021-12-31 10:25 ` [PATCH v3 0/2] ACPI: " Russell King (Oracle)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).