[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251222094351.38792-6-tianruidong@linux.alibaba.com>
Date: Mon, 22 Dec 2025 17:43:38 +0800
From: Ruidong Tian <tianruidong@...ux.alibaba.com>
To: catalin.marinas@....com,
will@...nel.org,
lpieralisi@...nel.org,
guohanjun@...wei.com,
sudeep.holla@....com,
xueshuai@...ux.alibaba.com,
linux-kernel@...r.kernel.org,
linux-acpi@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org,
rafael@...nel.org,
lenb@...nel.org,
tony.luck@...el.com,
bp@...en8.de,
yazen.ghannam@....com,
misono.tomohiro@...itsu.com
Cc: tianruidong@...ux.alibaba.com
Subject: [PATCH v4 05/17] ras: AEST: Probe RAS system architecture version
The RAS version of a component can be probed via its ERRDEVARCH register.
In cases where a component (e.g., SMMU) does not implement an ERRDEVARCH
register, the driver falls back to using the RAS version of the Processing
Element (PE).
Signed-off-by: Ruidong Tian <tianruidong@...ux.alibaba.com>
---
arch/arm64/include/asm/ras.h | 3 +++
drivers/ras/aest/aest-core.c | 22 ++++++++++++++++++++++
drivers/ras/aest/aest.h | 3 +++
3 files changed, 28 insertions(+)
diff --git a/arch/arm64/include/asm/ras.h b/arch/arm64/include/asm/ras.h
index b6640b9972bf..da7c441252fe 100644
--- a/arch/arm64/include/asm/ras.h
+++ b/arch/arm64/include/asm/ras.h
@@ -4,6 +4,9 @@
#include <linux/types.h>
+/* ERRDEVARCH */
+#define ERRDEVARCH_REV GENMASK(19, 16)
+
struct ras_ext_regs {
u64 err_fr;
u64 err_ctlr;
diff --git a/drivers/ras/aest/aest-core.c b/drivers/ras/aest/aest-core.c
index f4a5119dc513..84b2fb8127ff 100644
--- a/drivers/ras/aest/aest-core.c
+++ b/drivers/ras/aest/aest-core.c
@@ -16,6 +16,27 @@ DEFINE_PER_CPU(struct aest_device, percpu_adev);
#undef pr_fmt
#define pr_fmt(fmt) "AEST: " fmt
+static int get_aest_node_ver(struct aest_node *node)
+{
+ u64 reg;
+ void *devarch_base;
+
+ if (node->type == ACPI_AEST_GIC_ERROR_NODE) {
+ devarch_base = ioremap(node->info->interface_hdr->address +
+ GIC_ERRDEVARCH,
+ PAGE_SIZE);
+ if (!devarch_base)
+ return 0;
+
+ reg = readl_relaxed(devarch_base);
+ iounmap(devarch_base);
+
+ return FIELD_GET(ERRDEVARCH_REV, reg);
+ }
+
+ return FIELD_GET(ID_AA64PFR0_EL1_RAS_MASK, read_cpuid(ID_AA64PFR0_EL1));
+}
+
static int aest_init_record(struct aest_record *record, int i,
struct aest_node *node)
{
@@ -108,6 +129,7 @@ static int aest_init_node(struct aest_device *adev, struct aest_node *node,
node->adev = adev;
node->info = anode;
node->type = anode->type;
+ node->version = get_aest_node_ver(node);
node->name = alloc_aest_node_name(node);
if (!node->name)
return -ENOMEM;
diff --git a/drivers/ras/aest/aest.h b/drivers/ras/aest/aest.h
index 31131cce9928..bf0b9a49fdaa 100644
--- a/drivers/ras/aest/aest.h
+++ b/drivers/ras/aest/aest.h
@@ -61,6 +61,8 @@
#define ERXMISC2 0x30
#define ERXMISC3 0x38
+#define GIC_ERRDEVARCH 0xFFBC
+
struct aest_access {
u64 (*read)(void *base, u32 offset);
void (*write)(void *base, u32 offset, u64 val);
@@ -141,6 +143,7 @@ struct aest_node {
* error events.
*/
unsigned long *status_reporting;
+ int version;
const struct aest_group *group;
struct aest_device *adev;
--
2.51.2.612.gdc70283dfc
Powered by blists - more mailing lists