2022-02-15 05:35:30

by Ilkka Koskinen

[permalink] [raw]
Subject: [PATCH v5 0/2] ACPI: Arm Generic Diagnostic Dump and Reset device

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 (9db71e8e3027)


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.

From v3:
Fixed:
* Moved header files in alphabetical order and removed unnecessary ones

From v4:
* Platform device/driver stuff removed
* acpi_agdi_init() call moved from device_initcall to acpi_init()
* Slightly modified Kconfig text to keep checkpatch happy

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

drivers/acpi/arm64/Kconfig | 10 +++++++
drivers/acpi/arm64/Makefile | 1 +
drivers/acpi/arm64/agdi.c | 52 +++++++++++++++++++++++++++++++++++++
drivers/acpi/bus.c | 2 ++
drivers/acpi/tables.c | 2 +-
include/linux/acpi_agdi.h | 13 ++++++++++
6 files changed, 79 insertions(+), 1 deletion(-)
create mode 100644 drivers/acpi/arm64/agdi.c
create mode 100644 include/linux/acpi_agdi.h

--
2.17.1


2022-02-15 06:37:01

by Ilkka Koskinen

[permalink] [raw]
Subject: [PATCH v5 1/2] ACPI: tables: Add AGDI to the list of known table signatures

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 <[email protected]>
Reviewed-by: Russell King (Oracle) <[email protected]>
---
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 2d7ed7126faa..ae29b13b8774 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -545,7 +545,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_CEDT };
+ ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI };

#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)

--
2.17.1

2022-02-15 07:56:44

by Ilkka Koskinen

[permalink] [raw]
Subject: [PATCH v5 2/2] ACPI: AGDI: Add support for Arm Generic Diagnostic Dump and Reset device

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 <[email protected]>
---
drivers/acpi/arm64/Kconfig | 10 +++++++
drivers/acpi/arm64/Makefile | 1 +
drivers/acpi/arm64/agdi.c | 52 +++++++++++++++++++++++++++++++++++++
drivers/acpi/bus.c | 2 ++
include/linux/acpi_agdi.h | 13 ++++++++++
5 files changed, 78 insertions(+)
create mode 100644 drivers/acpi/arm64/agdi.c
create mode 100644 include/linux/acpi_agdi.h

diff --git a/drivers/acpi/arm64/Kconfig b/drivers/acpi/arm64/Kconfig
index 6dba187f4f2e..d4a72835f328 100644
--- a/drivers/acpi/arm64/Kconfig
+++ b/drivers/acpi/arm64/Kconfig
@@ -8,3 +8,13 @@ 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.
+
+ If set, the kernel parses AGDI table and listens for the 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..28916650d834
--- /dev/null
+++ b/drivers/acpi/arm64/agdi.c
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * This file implements handling of
+ * Arm Generic Diagnostic Dump and Reset Interface table (AGDI)
+ *
+ * Copyright (c) 2022, Ampere Computing LLC
+ */
+
+#define pr_fmt(fmt) "ACPI: AGDI: " fmt
+
+#include <linux/acpi.h>
+#include <linux/arm_sdei.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+
+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;
+}
+
+void __init acpi_agdi_init(void)
+{
+ struct acpi_table_agdi *agdi_table;
+ acpi_status status;
+ int sdei_event;
+
+ status = acpi_get_table(ACPI_SIG_AGDI, 0,
+ (struct acpi_table_header **) &agdi_table);
+ if (ACPI_FAILURE(status))
+ return;
+
+ if (agdi_table->flags & ACPI_AGDI_SIGNALING_MODE) {
+ pr_warn("Interrupt signaling is not supported");
+ acpi_put_table((struct acpi_table_header *)agdi_table);
+ return;
+ }
+
+ sdei_event = agdi_table->sdei_event;
+ acpi_put_table((struct acpi_table_header *)agdi_table);
+
+ if (sdei_event_register(sdei_event, agdi_sdei_handler, NULL)) {
+ pr_err("Failed to register for SDEI event %d", sdei_event);
+ return;
+ }
+
+ if (sdei_event_enable(sdei_event)) {
+ pr_err("Failed to enable SDEI event %d\n", sdei_event);
+ sdei_event_unregister(sdei_event);
+ return;
+ }
+}
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index cd374210fb9f..747a7f98fc1b 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -26,6 +26,7 @@
#include <asm/mpspec.h>
#include <linux/dmi.h>
#endif
+#include <linux/acpi_agdi.h>
#include <linux/acpi_iort.h>
#include <linux/acpi_viot.h>
#include <linux/pci.h>
@@ -1341,6 +1342,7 @@ static int __init acpi_init(void)
acpi_debugger_init();
acpi_setup_sb_notify_handler();
acpi_viot_init();
+ acpi_agdi_init();
return 0;
}

diff --git a/include/linux/acpi_agdi.h b/include/linux/acpi_agdi.h
new file mode 100644
index 000000000000..f477f0b452fa
--- /dev/null
+++ b/include/linux/acpi_agdi.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ACPI_AGDI_H__
+#define __ACPI_AGDI_H__
+
+#include <linux/acpi.h>
+
+#ifdef CONFIG_ACPI_AGDI
+void __init acpi_agdi_init(void);
+#else
+static inline void acpi_agdi_init(void) {}
+#endif
+#endif /* __ACPI_AGDI_H__ */
--
2.17.1

2022-02-17 20:59:13

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH v5 1/2] ACPI: tables: Add AGDI to the list of known table signatures

On Tue, Feb 15, 2022 at 4:56 AM Ilkka Koskinen
<[email protected]> wrote:
>
> 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 <[email protected]>
> Reviewed-by: Russell King (Oracle) <[email protected]>

This is fine with me and please route the series through arm64. Thanks!

> ---
> 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 2d7ed7126faa..ae29b13b8774 100644
> --- a/drivers/acpi/tables.c
> +++ b/drivers/acpi/tables.c
> @@ -545,7 +545,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_CEDT };
> + ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI };
>
> #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
>
> --
> 2.17.1
>

2022-02-23 12:02:00

by Ilkka Koskinen

[permalink] [raw]
Subject: Re: [PATCH v5 1/2] ACPI: tables: Add AGDI to the list of known table signatures



On Thu, 17 Feb 2022, Rafael J. Wysocki wrote:

> On Tue, Feb 15, 2022 at 4:56 AM Ilkka Koskinen
> <[email protected]> wrote:
>>
>> 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 <[email protected]>
>> Reviewed-by: Russell King (Oracle) <[email protected]>
>
> This is fine with me and please route the series through arm64. Thanks!

Thanks for reviewing! Sounds good to me.

Br, Ilkka


>
>> ---
>> 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 2d7ed7126faa..ae29b13b8774 100644
>> --- a/drivers/acpi/tables.c
>> +++ b/drivers/acpi/tables.c
>> @@ -545,7 +545,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_CEDT };
>> + ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI };
>>
>> #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
>>
>> --
>> 2.17.1
>>
>