* [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS
@ 2026-07-20 8:19 Umang Chheda
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Umang Chheda @ 2026-07-20 8:19 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
Umang Chheda
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
This series adds Device Tree support for the ARM64 RAS driver
introduced by Ruidong Tian [1]. The existing driver supports ACPI-based
platforms via the AEST table, this series extends it to DT-based
platforms without any changes to the core driver.
How to test with QEMU
--------------------------
Tian Ruidong's QEMU fork [2] emulates AEST MMIO error records on the
virt machine. To test the DT frontend:
1. Build QEMU:
git clone https://github.com/winterddd/qemu.git
cd qemu
git checkout c5e2d5dec9fd62ba622314c40bff0fbecb4dfb34
./configure --target-list=aarch64-softmmu
make -j$(nproc)
2. Build the kernel with:
CONFIG_ARM64_RAS_EXTN=y
CONFIG_RAS=y
CONFIG_ACPI_AEST=y
CONFIG_ARM64_RAS_DRIVER=y
CONFIG_ARM64_RAS_DT=y
3. Add the following DT node to your virt machine DTB. The QEMU
fork maps GIC error source at 0x017a00000 (SPI 0x0d).
ras-gic-dist@17a00000 {
compatible = "arm,ras-gic";
reg = <0x0 0x17a00000 0x0 0x10000>;
reg-names = "err-group";
arm,group-format = <ARM_RAS_GROUP_4K>;
arm,num-records = <1>;
arm,record-impl = /bits/ 64 <0x1>;
arm,status-reporting = /bits/ 64 <0x0>;
arm,gic-ref = <&gic>;
interrupts = <GIC_SPI 0x0d 0x04>;
interrupt-names = "fhi";
};
4. Boot QEMU with acpi=off:
./qemu-system-aarch64 \
-machine virt,accel=tcg,gic-version=3 \
-cpu cortex-a57 -m 2G -smp 4 \
-kernel Image -dtb virt-aest.dtb \
-append "console=ttyAMA0 acpi=off earlycon" \
-nographic
5. Verify probe:
dmesg | grep "DT RAS"
# Expected: DT RAS: registered 1 RAS error source(s) from DT
ls /sys/kernel/debug/aest/
6. Inject a CE error via the QEMU MMIO fault injection registers.
The QEMU device accepts 64-bit accesses only (use devmem with
the 64-bit width flag):
devmem 0x090e0808 64 0x40000001
This triggers QEMU's error_record_inj_write() which sets
ERR<n>STATUS.V=1 and asserts the IRQ. The kernel driver's
aest_irq_func() fires, reads the status, and logs:
arm64_ras: {2}[Hardware Error]: Hardware error from AEST gic.90e0000
arm64_ras: {2}[Hardware Error]: Error from GIC type 0x0 instance 0x8005
arm64_ras: {2}[Hardware Error]: ERR0FR: 0x48a5
arm64_ras: {2}[Hardware Error]: ERR0CTRL: 0x108
arm64_ras: {2}[Hardware Error]: ERR0STATUS: 0x40000001
Testing
-------
- Validated Processor error nodes/sources for L1-L2 and L3 caches error
on Qualcomm's lemans-evk and monaco-evk boards with DT boot.
- Validated CE and UE injection via debugfs soft_inject.
- Validated GIC and SMMU error sources on QEMU.
[1] https://lore.kernel.org/lkml/20260122094656.73399-1-tianruidong@linux.alibaba.com/
[2] https://github.com/winterddd/qemu/tree/error_record
---
Changes in v2:
- Rebased on top of Ruidong Tian's v7 RAS driver series and reworked
the DT frontend to match the new driver architecture.
- Moved RAS error source nodes to the DT root, removed the arm,aest
container node as suggested by Rob Herring.
- Dropped arm,processor-flags and arm,resource-type properties, these
are now inferred from the interrupt type and cache phandle
respectively.
- Renamed compatible strings from arm,aest-* to arm,ras-* and the
dt-bindings header from aest.h to arm-ras.h to avoid ACPI terminology
in DT bindings.
---
Umang Chheda (4):
dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
arm64: ras: Add Device Tree frontend
arm64: dts: qcom: monaco: add RAS error source nodes
arm64: dts: qcom: lemans: add RAS error source nodes
.../bindings/arm/arm,ras-error-source.yaml | 330 +++++++++++++++
arch/arm64/boot/dts/qcom/lemans.dtsi | 30 ++
arch/arm64/boot/dts/qcom/monaco.dtsi | 30 ++
drivers/ras/arm64/Kconfig | 25 +-
drivers/ras/arm64/Makefile | 2 +
drivers/ras/arm64/ras-of.c | 383 ++++++++++++++++++
include/dt-bindings/arm/arm-ras.h | 11 +
7 files changed, 806 insertions(+), 5 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
create mode 100644 drivers/ras/arm64/ras-of.c
create mode 100644 include/dt-bindings/arm/arm-ras.h
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
2026-07-20 8:19 [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS Umang Chheda
@ 2026-07-20 8:19 ` Umang Chheda
2026-07-27 20:51 ` Trilok Soni
` (2 more replies)
2026-07-20 8:19 ` [PATCH v2 2/4] arm64: ras: Add Device Tree frontend Umang Chheda
` (2 subsequent siblings)
3 siblings, 3 replies; 9+ messages in thread
From: Umang Chheda @ 2026-07-20 8:19 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
Umang Chheda
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
ARMv8 and later processors implement the RAS (Reliability,
Availability and Serviceability) extensions, exposing hardware
error records through a standardised register interface.
Add Device Tree bindings to describe RAS error sources.
Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
---
.../bindings/arm/arm,ras-error-source.yaml | 330 ++++++++++++++++++
include/dt-bindings/arm/arm-ras.h | 11 +
2 files changed, 341 insertions(+)
create mode 100644 Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
create mode 100644 include/dt-bindings/arm/arm-ras.h
diff --git a/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
new file mode 100644
index 000000000000..add7063a1a62
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
@@ -0,0 +1,330 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/arm,ras-error-source.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ARM RAS error source
+
+maintainers:
+ - Umang Chheda <umang.chheda@oss.qualcomm.com>
+
+description: |
+ ARMv8 and later processors implement the Reliability, Availability and
+ Serviceability (RAS) extensions. Hardware blocks that support RAS expose
+ one or more error records through a standardised register interface. Each
+ error record captures information about a detected hardware error (cache
+ ECC fault, TLB parity error, interconnect error, etc.) and can optionally
+ signal the OS via an interrupt.
+
+ Each DT node described by this binding represents one RAS error source —
+ a hardware block that exposes a set of error records. Error records are
+ accessed either through system registers (for processor-local resources
+ such as L1/L2 caches and TLBs) or through a memory-mapped register window
+ (for shared or off-core resources such as L3 caches, SMMUs and GICs).
+
+properties:
+ compatible:
+ description:
+ Identifies the class of hardware block this error source belongs to.
+ arm,ras-processor covers processor error sources (cache, TLB, etc.).
+ arm,ras-smmu covers SMMU error sources.
+ arm,ras-gic covers GIC error sources.
+ enum:
+ - arm,ras-processor
+ - arm,ras-smmu
+ - arm,ras-gic
+
+ reg:
+ description:
+ Register windows for this error source. When absent the error records
+ are accessed through system registers (ERRSELR_EL1 + ERX*_EL1).
+ When present, the first range is the primary error-record window;
+ additional named ranges are identified by reg-names.
+ minItems: 1
+ maxItems: 4
+
+ reg-names:
+ description:
+ Names for the optional additional register windows beyond the primary
+ error-record window. err-group is the error group status register
+ window (ERRGSR). fault-inject is the fault injection register window
+ (ERXPFG*). irq-config is the interrupt routing configuration window.
+ minItems: 1
+ maxItems: 3
+ items:
+ enum:
+ - err-group
+ - fault-inject
+ - irq-config
+
+ interrupts:
+ description:
+ Interrupts signalled by this error source. The first interrupt is the
+ Fault Handling Interrupt (FHI), fired when a corrected error counter
+ overflows or a deferred error is detected. The optional second
+ interrupt is the Error Recovery Interrupt (ERI), fired when an
+ uncorrected recoverable error is detected.
+ minItems: 1
+ maxItems: 2
+
+ interrupt-names:
+ description:
+ Names identifying the interrupts. "fhi" is the Fault Handling
+ Interrupt; "eri" is the optional Error Recovery Interrupt.
+ minItems: 1
+ maxItems: 2
+ items:
+ enum:
+ - fhi
+ - eri
+
+ arm,group-format:
+ description:
+ Page granularity of the memory-mapped error record group register
+ window. Determines the ioremap size and the number of error group
+ status registers (ERRGSR) available. Required when reg is present.
+ Use the ARM_RAS_GROUP_* constants from <dt-bindings/arm/arm-ras.h>.
+ 0 (ARM_RAS_GROUP_4K) is a 4 KiB window with 1 ERRGSR supporting up
+ to 64 records. 1 (ARM_RAS_GROUP_16K) is 16 KiB with 4 ERRGSRs and
+ up to 256 records. 2 (ARM_RAS_GROUP_64K) is 64 KiB with 14 ERRGSRs
+ and up to 896 records.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ enum: [0, 1, 2]
+
+ arm,num-records:
+ description:
+ Total number of error records in this error source, including both
+ implemented and unimplemented slots.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 1
+
+ arm,record-impl:
+ description:
+ Bitmap of implemented error records. Bit N set to 1 means error
+ record N is present and active in this error source. Bit N set to 0
+ means record N is not implemented and must be skipped. The array
+ length must equal the number of ERRGSRs implied by arm,group-format
+ (1 element for 4K, 4 for 16K, 14 for 64K). For system-register
+ nodes (no reg property) a single u64 element is used.
+ $ref: /schemas/types.yaml#/definitions/uint64-array
+ minItems: 1
+ maxItems: 14
+
+ arm,status-reporting:
+ description:
+ Bitmap indicating which implemented error records must be polled
+ directly by the OS. Bit N set to 1 means record N does not report
+ through the ERRGSR and must be polled by reading its ERX_STATUS
+ register directly in the interrupt handler. Bit N set to 0 means
+ record N reports its status through the ERRGSR and will be discovered
+ via the ERRGSR scan path. For system-register nodes (no reg property)
+ there is no ERRGSR, so every implemented record must be polled
+ directly; arm,status-reporting must equal arm,record-impl for all
+ system-register nodes. Array length as for arm,record-impl.
+ $ref: /schemas/types.yaml#/definitions/uint64-array
+ minItems: 1
+ maxItems: 14
+
+ arm,addressing-mode:
+ description:
+ Bitmap indicating the type of address reported in the error address
+ register (ERX_ADDR) for each error record. Bit N set to 0 means
+ record N reports a System Physical Address (SPA) that the OS can use
+ directly. Bit N set to 1 means record N reports a node-specific
+ Logical Address (LA) that requires platform-specific translation to
+ obtain a SPA. Array length as for arm,record-impl.
+ $ref: /schemas/types.yaml#/definitions/uint64-array
+ minItems: 1
+ maxItems: 14
+
+ # Processor error source properties (arm,ras-processor only)
+
+ cache:
+ description:
+ Phandle to the cache node (L1, L2, or L3) that this processor error
+ source monitors. The referenced node must have compatible = "cache"
+ and a cache-level property identifying the level in the hierarchy.
+ $ref: /schemas/types.yaml#/definitions/phandle
+
+ # SMMU error source properties (arm,ras-smmu only)
+
+ iommus:
+ description:
+ Phandle to the SMMU node that this error source monitors.
+ maxItems: 1
+
+ # GIC error source properties (arm,ras-gic only)
+
+ arm,gic-ref:
+ description:
+ Phandle to the GIC node that this error source monitors.
+ $ref: /schemas/types.yaml#/definitions/phandle
+
+required:
+ - compatible
+ - arm,num-records
+ - arm,record-impl
+ - arm,status-reporting
+
+allOf:
+ - if:
+ required:
+ - reg
+ then:
+ required:
+ - arm,group-format
+
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: arm,ras-processor
+ then:
+ required:
+ - cache
+ properties:
+ cache: {}
+ else:
+ properties:
+ cache: false
+
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: arm,ras-smmu
+ then:
+ required:
+ - iommus
+ properties:
+ iommus: {}
+ else:
+ properties:
+ iommus: false
+
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: arm,ras-gic
+ then:
+ required:
+ - arm,gic-ref
+ properties:
+ arm,gic-ref: {}
+ else:
+ properties:
+ arm,gic-ref: false
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/arm/arm-ras.h>
+
+ / {
+ compatible = "qcom,sa8775p-ride", "qcom,sa8775p";
+ model = "Qualcomm Technologies, Inc. SA8775P RAS example";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ interrupt-parent = <&intc>;
+
+ intc: interrupt-controller@17100000 {
+ compatible = "arm,gic-v3";
+ reg = <0x0 0x17100000 0x0 0x10000>,
+ <0x0 0x17180000 0x0 0x100000>;
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ };
+
+ cpus {
+ #address-cells = <2>;
+ #size-cells = <0>;
+
+ cpu0: cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,armv8";
+ reg = <0x0 0x0>;
+ next-level-cache = <&l2_0>;
+
+ l2_0: l2-cache {
+ compatible = "cache";
+ cache-level = <2>;
+ cache-unified;
+ next-level-cache = <&l3_0>;
+
+ l3_0: l3-cache {
+ compatible = "cache";
+ cache-level = <3>;
+ cache-unified;
+ };
+ };
+ };
+ };
+
+ /*
+ * Per-PE L1/L2 cache RAS error source. System-register access,
+ * per-CPU PPI. Record 0 is implemented (arm,record-impl bit 0
+ * set). arm,status-reporting equals arm,record-impl because
+ * system-register nodes have no ERRGSR; record 0 must be polled.
+ */
+ ras-l1l2-0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <1>;
+ arm,record-impl = /bits/ 64 <0x1>;
+ arm,status-reporting = /bits/ 64 <0x1>;
+ cache = <&l2_0>;
+ interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+
+ ras-l3-cluster0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <2>;
+ arm,record-impl = /bits/ 64 <0x2>;
+ arm,status-reporting = /bits/ 64 <0x2>;
+ cache = <&l3_0>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+ };
+
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/arm/arm-ras.h>
+
+ / {
+ compatible = "qcom,sa8775p-ride", "qcom,sa8775p";
+ model = "Qualcomm Technologies, Inc. SA8775P RAS example";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ interrupt-parent = <&gic>;
+
+ /*
+ * GICv3 interrupt controller with RAS support.
+ */
+ gic: interrupt-controller@17b00000 {
+ compatible = "arm,gic-v3";
+ reg = <0x0 0x17b00000 0x0 0x10000>,
+ <0x0 0x17b60000 0x0 0x100000>;
+ interrupt-controller;
+ #interrupt-cells = <3>;
+ };
+
+ ras-gic-dist@17a00000 {
+ compatible = "arm,ras-gic";
+ reg = <0x0 0x17a00000 0x0 0x10000>;
+ reg-names = "err-group";
+ arm,group-format = <ARM_RAS_GROUP_4K>;
+ arm,num-records = <1>;
+ arm,record-impl = /bits/ 64 <0x1>;
+ arm,status-reporting = /bits/ 64 <0x0>;
+ arm,gic-ref = <&gic>;
+ interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+ };
diff --git a/include/dt-bindings/arm/arm-ras.h b/include/dt-bindings/arm/arm-ras.h
new file mode 100644
index 000000000000..c2f4e1f8243e
--- /dev/null
+++ b/include/dt-bindings/arm/arm-ras.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+
+#ifndef _DT_BINDINGS_ARM_RAS_H
+#define _DT_BINDINGS_ARM_RAS_H
+
+/* arm,group-format - error record group register window page size */
+#define ARM_RAS_GROUP_4K 0 /* 4 KiB, 1 ERRGSR */
+#define ARM_RAS_GROUP_16K 1 /* 16 KiB, 4 ERRGSRs */
+#define ARM_RAS_GROUP_64K 2 /* 64 KiB, 14 ERRGSRs */
+
+#endif /* _DT_BINDINGS_ARM_RAS_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/4] arm64: ras: Add Device Tree frontend
2026-07-20 8:19 [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS Umang Chheda
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
@ 2026-07-20 8:19 ` Umang Chheda
2026-07-20 8:19 ` [PATCH v2 3/4] arm64: dts: qcom: monaco: add RAS error source nodes Umang Chheda
2026-07-20 8:19 ` [PATCH v2 4/4] arm64: dts: qcom: lemans: " Umang Chheda
3 siblings, 0 replies; 9+ messages in thread
From: Umang Chheda @ 2026-07-20 8:19 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
Umang Chheda
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
Add a Device Tree frontend for the ARM64 RAS driver, allowing it
to be used on platforms without ACPI firmware.
The error sources defined in DT are registered as arm64_ras platform
devices at boot. The frontend produces the same software fwnode properties
as the ACPI path, so the core driver probes DT and ACPI nodes identically
without any firmware-specific knowledge.
Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
---
drivers/ras/arm64/Kconfig | 25 ++-
drivers/ras/arm64/Makefile | 2 +
drivers/ras/arm64/ras-of.c | 383 +++++++++++++++++++++++++++++++++++++
3 files changed, 405 insertions(+), 5 deletions(-)
create mode 100644 drivers/ras/arm64/ras-of.c
diff --git a/drivers/ras/arm64/Kconfig b/drivers/ras/arm64/Kconfig
index dcdeaa216d67..8bdb219bc90f 100644
--- a/drivers/ras/arm64/Kconfig
+++ b/drivers/ras/arm64/Kconfig
@@ -1,16 +1,31 @@
# SPDX-License-Identifier: GPL-2.0
#
-# ARM Error Source Table Support
+# ARM RAS driver
#
# Copyright (c) 2025, Alibaba Group.
#
+config ARM64_RAS_DT
+ bool "ARM64 RAS Device Tree support"
+ depends on ARM64_RAS_EXTN && OF
+ help
+ Enable Device Tree support for the ARM64 RAS driver.
+
+ When selected, RAS error sources described in the Device Tree
+ (arm,ras-processor, arm,ras-smmu, arm,ras-gic etc) are registered
+ as platform devices at boot, allowing the driver to be used on
+ platforms without ACPI firmware.
+
config ARM64_RAS_DRIVER
tristate "ARM64 RAS Driver"
- depends on ARM64 && ACPI_AEST && RAS
+ depends on ARM64 && (ACPI_AEST || ARM64_RAS_DT) && RAS
help
- This is the RAS driver for the arm64 architecture. It depends on
- the Arm Error Source Table (AEST) to provide basic register and
- interrupt information.
+ This is the RAS driver for the arm64 architecture. It uses the
+ ARMv8 RAS extension register interface to discover, configure,
+ and handle hardware errors from processor caches, SMMUs, and GICs.
+
+ On ACPI systems the error source topology is provided by the AEST
+ ACPI table (requires ACPI_AEST). On Device Tree systems it is
+ provided by "arm,ras-*" nodes in the DT root (requires ARM64_RAS_DT).
If set, the kernel will report and process hardware errors.
diff --git a/drivers/ras/arm64/Makefile b/drivers/ras/arm64/Makefile
index 6897798f7314..aee2f9de37f6 100644
--- a/drivers/ras/arm64/Makefile
+++ b/drivers/ras/arm64/Makefile
@@ -7,3 +7,5 @@ arm64_ras-y += ras-sysfs.o
arm64_ras-y += ras-inject.o
arm64_ras-y += ras-cmn.o
arm64_ras-y += ras-storm.o
+
+obj-$(CONFIG_ARM64_RAS_DT) += ras-of.o
diff --git a/drivers/ras/arm64/ras-of.c b/drivers/ras/arm64/ras-of.c
new file mode 100644
index 000000000000..e1aa8e13c077
--- /dev/null
+++ b/drivers/ras/arm64/ras-of.c
@@ -0,0 +1,383 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2026 Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <linux/acpi.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+#include <linux/slab.h>
+
+#include <linux/acpi_aest.h>
+
+#undef pr_fmt
+#define pr_fmt(fmt) "DT RAS: " fmt
+
+/* Maximum number of software fwnode properties per RAS node */
+#define RAS_OF_MAX_PROPS 20
+
+static const unsigned long ras_of_type_processor __initconst =
+ ACPI_AEST_PROCESSOR_ERROR_NODE;
+static const unsigned long ras_of_type_smmu __initconst =
+ ACPI_AEST_SMMU_ERROR_NODE;
+static const unsigned long ras_of_type_gic __initconst =
+ ACPI_AEST_GIC_ERROR_NODE;
+
+static const struct of_device_id ras_of_match[] __initconst = {
+ { .compatible = "arm,ras-processor", .data = &ras_of_type_processor },
+ { .compatible = "arm,ras-smmu", .data = &ras_of_type_smmu },
+ { .compatible = "arm,ras-gic", .data = &ras_of_type_gic },
+ { }
+};
+
+static const char * const __initconst ras_of_irq_res_names[] = {
+ [ACPI_AEST_NODE_FAULT_HANDLING] = AEST_FHI_NAME,
+ [ACPI_AEST_NODE_ERROR_RECOVERY] = AEST_ERI_NAME,
+};
+
+static const char * const __initconst ras_of_dt_irq_names[] = {
+ "fhi", "eri"
+};
+
+static int __init ras_of_build_node_data(struct device_node *np,
+ u8 node_type, int index,
+ int fhi_virq,
+ u8 **data_out, u32 *size_out)
+{
+ *data_out = NULL;
+ *size_out = 0;
+
+ switch (node_type) {
+ case ACPI_AEST_PROCESSOR_ERROR_NODE: {
+ /*
+ * Allocate the processor header plus the cache sub-structure.
+ * resource_type is inferred from the presence of the 'cache'
+ * phandle: if present the resource is a cache, otherwise it
+ * is treated as a generic processor resource.
+ * flags (SHARED/GLOBAL) are inferred from the interrupt type:
+ * a PPI is per-PE (global); an SPI is shared across a cluster.
+ */
+ size_t total = sizeof(struct acpi_aest_processor) +
+ sizeof(struct acpi_aest_processor_cache);
+ struct acpi_aest_processor_cache *c;
+ struct acpi_aest_processor *proc;
+ struct device_node *cache_np;
+ u8 pflags;
+
+ proc = kzalloc(total, GFP_KERNEL);
+ if (!proc)
+ return -ENOMEM;
+
+ cache_np = of_parse_phandle(np, "cache", 0);
+ if (cache_np) {
+ proc->resource_type = ACPI_AEST_CACHE_RESOURCE;
+ c = (struct acpi_aest_processor_cache *)(proc + 1);
+ /*
+ * alloc_ras_node_name() reads c->cache_reference as
+ * the name disambiguator for shared/global nodes.
+ */
+ c->cache_reference = cache_np->phandle;
+ of_node_put(cache_np);
+ } else {
+ proc->resource_type = ACPI_AEST_GENERIC_RESOURCE;
+ }
+
+ /*
+ * Infer scope from the FHI interrupt type: a PPI is
+ * per-PE (set GLOBAL); an SPI is cluster-shared (set SHARED).
+ * alloc_ras_node_name() uses flags to choose the name format.
+ */
+ pflags = irq_is_percpu(fhi_virq) ?
+ ACPI_AEST_PROC_FLAG_GLOBAL :
+ ACPI_AEST_PROC_FLAG_SHARED;
+ proc->flags = pflags;
+ proc->processor_id = (u32)index;
+
+ *data_out = (u8 *)proc;
+ *size_out = (u32)total;
+ break;
+ }
+ case ACPI_AEST_SMMU_ERROR_NODE: {
+ struct acpi_aest_smmu *smmu;
+ struct device_node *smmu_np;
+
+ smmu = kzalloc_obj(smmu, GFP_KERNEL);
+ if (!smmu)
+ return -ENOMEM;
+
+ smmu_np = of_parse_phandle(np, "iommus", 0);
+ if (smmu_np) {
+ smmu->iort_node_reference = smmu_np->phandle;
+ of_node_put(smmu_np);
+ }
+
+ *data_out = (u8 *)smmu;
+ *size_out = sizeof(*smmu);
+ break;
+ }
+ case ACPI_AEST_GIC_ERROR_NODE: {
+ struct acpi_aest_gic *gic;
+ struct device_node *gic_np;
+
+ gic = kzalloc_obj(gic, GFP_KERNEL);
+ if (!gic)
+ return -ENOMEM;
+
+ gic_np = of_parse_phandle(np, "arm,gic-ref", 0);
+ if (gic_np) {
+ gic->instance_id = gic_np->phandle;
+ of_node_put(gic_np);
+ }
+ *data_out = (u8 *)gic;
+ *size_out = sizeof(*gic);
+ break;
+ }
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * Determine the register access type from the DT node:
+ * no reg -> system-register access (ERRSELR_EL1 + ERX*_EL1)
+ * 1 range -> memory-mapped access
+ * 2+ ranges -> single-record memory-mapped access
+ */
+static u8 __init ras_of_interface_type(struct device_node *np)
+{
+ int addr_cells, size_cells, reg_len;
+
+ if (!of_property_present(np, "reg"))
+ return ACPI_AEST_NODE_SYSTEM_REGISTER;
+
+ addr_cells = of_n_addr_cells(np);
+ size_cells = of_n_size_cells(np);
+ if (addr_cells <= 0 || size_cells <= 0)
+ return ACPI_AEST_NODE_SYSTEM_REGISTER;
+
+ reg_len = of_property_count_elems_of_size(np, "reg", sizeof(u32));
+ if (reg_len <= 0)
+ return ACPI_AEST_NODE_SYSTEM_REGISTER;
+
+ if (reg_len <= addr_cells + size_cells)
+ return ACPI_AEST_NODE_MEMORY_MAPPED;
+
+ return ACPI_AEST_NODE_SINGLE_RECORD_MEMORY_MAPPED;
+}
+
+static resource_size_t __init ras_of_mem_size(u32 gfmt)
+{
+ switch (gfmt) {
+ case ACPI_AEST_NODE_GROUP_FORMAT_16K:
+ return SZ_16K;
+ case ACPI_AEST_NODE_GROUP_FORMAT_64K:
+ return SZ_64K;
+ default:
+ return SZ_4K;
+ }
+}
+
+static u32 __init ras_of_virq_to_gsiv(int virq)
+{
+ struct irq_data *irqd = irq_get_irq_data(virq);
+
+ return irqd ? (u32)irqd->hwirq : 0;
+}
+
+static int __init ras_of_attach_fwnode(struct device_node *np,
+ struct platform_device *pdev,
+ u8 node_type, u8 itype, u32 gfmt,
+ int index, int fhi_virq,
+ u32 fhi_gsiv, u32 eri_gsiv)
+{
+ u64 rec_impl[14] = { };
+ u64 stat_rep[14] = { };
+ u64 addr_mode[14] = { };
+ u64 err_group_base = 0, fault_inject_base = 0, irq_cfg_base = 0;
+ struct property_entry props[RAS_OF_MAX_PROPS] = { };
+ struct resource res;
+ u8 *node_data = NULL;
+ u32 node_data_size = 0;
+ u32 nrec = 1;
+ int group_len, p = 0, i, ret;
+
+ of_property_read_u32(np, "arm,num-records", &nrec);
+
+ switch (gfmt) {
+ case ACPI_AEST_NODE_GROUP_FORMAT_16K:
+ group_len = 4;
+ break;
+ case ACPI_AEST_NODE_GROUP_FORMAT_64K:
+ group_len = 14;
+ break;
+ default:
+ group_len = 1;
+ break;
+ }
+
+ of_property_read_u64_array(np, "arm,record-impl", rec_impl, group_len);
+ of_property_read_u64_array(np, "arm,status-reporting", stat_rep, group_len);
+ of_property_read_u64_array(np, "arm,addressing-mode", addr_mode, group_len);
+
+ /*
+ * DT binding: bit=1 means record IS implemented.
+ * ras-core.c uses for_each_clear_bit() on record_implemented, so
+ * bit=0 means implemented internally. Invert before storing.
+ */
+ for (i = 0; i < group_len; i++)
+ rec_impl[i] = ~rec_impl[i];
+
+ /* Named MMIO windows — only present on memory-mapped nodes */
+ if (itype != ACPI_AEST_NODE_SYSTEM_REGISTER) {
+ int idx;
+
+ idx = of_property_match_string(np, "reg-names", "err-group");
+ if (idx >= 0 && !of_address_to_resource(np, idx, &res))
+ err_group_base = res.start;
+
+ idx = of_property_match_string(np, "reg-names", "fault-inject");
+ if (idx >= 0 && !of_address_to_resource(np, idx, &res))
+ fault_inject_base = res.start;
+
+ idx = of_property_match_string(np, "reg-names", "irq-config");
+ if (idx >= 0 && !of_address_to_resource(np, idx, &res))
+ irq_cfg_base = res.start;
+ }
+
+ ret = ras_of_build_node_data(np, node_type, index, fhi_virq,
+ &node_data, &node_data_size);
+ if (ret)
+ return ret;
+
+ props[p++] = PROPERTY_ENTRY_U8("arm,node-type", node_type);
+ props[p++] = PROPERTY_ENTRY_U8("arm,interface-type", itype);
+ props[p++] = PROPERTY_ENTRY_U8("arm,group-format", (u8)gfmt);
+ props[p++] = PROPERTY_ENTRY_U32("arm,error-records-count", nrec);
+ props[p++] = PROPERTY_ENTRY_U32("arm,error-records-index", 0);
+ props[p++] = PROPERTY_ENTRY_U32("arm,interface-flags", 0);
+ props[p++] = PROPERTY_ENTRY_U64_ARRAY_LEN("arm,record-implemented",
+ rec_impl, group_len);
+ props[p++] = PROPERTY_ENTRY_U64_ARRAY_LEN("arm,status-reporting",
+ stat_rep, group_len);
+ props[p++] = PROPERTY_ENTRY_U64_ARRAY_LEN("arm,addressing-mode",
+ addr_mode, group_len);
+ props[p++] = PROPERTY_ENTRY_U64("arm,error-group-base", err_group_base);
+ props[p++] = PROPERTY_ENTRY_U64("arm,fault-inject-base", fault_inject_base);
+ props[p++] = PROPERTY_ENTRY_U64("arm,interrupt-config-base", irq_cfg_base);
+ props[p++] = PROPERTY_ENTRY_U32("arm,fhi-gsiv", fhi_gsiv);
+ props[p++] = PROPERTY_ENTRY_U32("arm,eri-gsiv", eri_gsiv);
+
+ if (node_data && node_data_size)
+ props[p++] = PROPERTY_ENTRY_U8_ARRAY_LEN("arm,node-specific-data",
+ node_data, node_data_size);
+
+ ret = device_create_managed_software_node(&pdev->dev, props, NULL);
+
+ kfree(node_data);
+ return ret;
+}
+
+static int __init ras_of_init_one_node(struct device_node *np, u8 node_type,
+ int index)
+{
+ struct resource res[AEST_MAX_INTERRUPT_PER_NODE + 1] = { };
+ struct platform_device *pdev;
+ u32 gfmt = ACPI_AEST_NODE_GROUP_FORMAT_4K;
+ u32 gsiv[AEST_MAX_INTERRUPT_PER_NODE] = { };
+ int virq[AEST_MAX_INTERRUPT_PER_NODE] = { };
+ int nres = 0, ret, i;
+ u8 itype;
+
+ itype = ras_of_interface_type(np);
+ of_property_read_u32(np, "arm,group-format", &gfmt);
+
+ pdev = platform_device_alloc("arm64_ras", PLATFORM_DEVID_AUTO);
+ if (!pdev)
+ return -ENOMEM;
+
+ if (itype != ACPI_AEST_NODE_SYSTEM_REGISTER) {
+ struct resource mmio_res;
+
+ ret = of_address_to_resource(np, 0, &mmio_res);
+ if (ret) {
+ pr_err("node %pOF: missing 'reg' for MMIO interface\n", np);
+ goto err_put;
+ }
+ res[nres].name = AEST_NODE_NAME;
+ res[nres].start = mmio_res.start;
+ res[nres].end = mmio_res.start + ras_of_mem_size(gfmt) - 1;
+ res[nres].flags = IORESOURCE_MEM;
+ nres++;
+ }
+
+ for (i = 0; i < AEST_MAX_INTERRUPT_PER_NODE; i++) {
+ int irq_num = of_irq_get_byname(np, ras_of_dt_irq_names[i]);
+
+ if (irq_num <= 0)
+ continue;
+
+ gsiv[i] = ras_of_virq_to_gsiv(irq_num);
+ virq[i] = irq_num;
+
+ res[nres].name = ras_of_irq_res_names[i];
+ res[nres].start = irq_num;
+ res[nres].end = irq_num;
+ res[nres].flags = IORESOURCE_IRQ;
+ nres++;
+ }
+
+ ret = platform_device_add_resources(pdev, res, nres);
+ if (ret)
+ goto err_put;
+
+ ret = ras_of_attach_fwnode(np, pdev, node_type, itype, gfmt, index,
+ virq[ACPI_AEST_NODE_FAULT_HANDLING],
+ gsiv[ACPI_AEST_NODE_FAULT_HANDLING],
+ gsiv[ACPI_AEST_NODE_ERROR_RECOVERY]);
+ if (ret)
+ goto err_put;
+
+ ret = platform_device_add(pdev);
+ if (ret)
+ goto err_put;
+
+ pr_debug("registered RAS node %pOF as arm64_ras.%d\n", np, pdev->id);
+ return 0;
+
+err_put:
+ platform_device_put(pdev);
+ return ret;
+}
+
+static int __init ras_of_init(void)
+{
+ const struct of_device_id *match;
+ struct device_node *np;
+ int index = 0, ret;
+
+ if (!acpi_disabled)
+ return 0;
+
+ for_each_matching_node_and_match(np, ras_of_match, &match) {
+ u8 node_type = *(const unsigned long *)match->data;
+
+ ret = ras_of_init_one_node(np, node_type, index++);
+ if (ret) {
+ pr_err("failed to register RAS node %pOF: %d\n",
+ np, ret);
+ of_node_put(np);
+ return ret;
+ }
+ }
+
+ if (index)
+ pr_info("registered %d RAS error source(s) from DT\n", index);
+
+ return 0;
+}
+subsys_initcall_sync(ras_of_init);
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/4] arm64: dts: qcom: monaco: add RAS error source nodes
2026-07-20 8:19 [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS Umang Chheda
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
2026-07-20 8:19 ` [PATCH v2 2/4] arm64: ras: Add Device Tree frontend Umang Chheda
@ 2026-07-20 8:19 ` Umang Chheda
2026-07-20 8:19 ` [PATCH v2 4/4] arm64: dts: qcom: lemans: " Umang Chheda
3 siblings, 0 replies; 9+ messages in thread
From: Umang Chheda @ 2026-07-20 8:19 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
Umang Chheda
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
Add RAS error source nodes for the Monaco SoC.
Two processor error sources are described: a per-PE node covering the
L1/L2 cache hierarchy using a PPI, and two shared L3 cache nodes for
the two CPU clusters using SPIs.
Co-developed-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
Signed-off-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/monaco.dtsi | 30 ++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/monaco.dtsi b/arch/arm64/boot/dts/qcom/monaco.dtsi
index 64fc0d592282..4fbd1dc9a147 100644
--- a/arch/arm64/boot/dts/qcom/monaco.dtsi
+++ b/arch/arm64/boot/dts/qcom/monaco.dtsi
@@ -724,6 +724,36 @@ system_pd: power-domain-system {
};
};
+ ras-l1l2-0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <1>;
+ arm,record-impl = /bits/ 64 <0x1>;
+ arm,status-reporting = /bits/ 64 <0x1>;
+ cache = <&l2_0>;
+ interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_LOW>;
+ interrupt-names = "fhi";
+ };
+
+ ras-l3-cluster0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <2>;
+ arm,record-impl = /bits/ 64 <0x2>;
+ arm,status-reporting = /bits/ 64 <0x2>;
+ cache = <&l3_0>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+
+ ras-l3-cluster1 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <2>;
+ arm,record-impl = /bits/ 64 <0x2>;
+ arm,status-reporting = /bits/ 64 <0x2>;
+ cache = <&l3_1>;
+ interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] arm64: dts: qcom: lemans: add RAS error source nodes
2026-07-20 8:19 [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS Umang Chheda
` (2 preceding siblings ...)
2026-07-20 8:19 ` [PATCH v2 3/4] arm64: dts: qcom: monaco: add RAS error source nodes Umang Chheda
@ 2026-07-20 8:19 ` Umang Chheda
3 siblings, 0 replies; 9+ messages in thread
From: Umang Chheda @ 2026-07-20 8:19 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
Umang Chheda
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
Add RAS error source nodes for the Lemans SoC.
Two processor error sources are described: a per-PE node covering
the L1/L2 cache hierarchy using a PPI, and two shared L3 cache
nodes for the two CPU clusters using SPIs.
Co-developed-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
Signed-off-by: Faruque Ansari <faruque.ansari@oss.qualcomm.com>
Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
---
arch/arm64/boot/dts/qcom/lemans.dtsi | 30 ++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/lemans.dtsi b/arch/arm64/boot/dts/qcom/lemans.dtsi
index 3b0539e27b51..64d3370cba82 100644
--- a/arch/arm64/boot/dts/qcom/lemans.dtsi
+++ b/arch/arm64/boot/dts/qcom/lemans.dtsi
@@ -619,6 +619,36 @@ system_pd: power-domain-system {
};
};
+ ras-l1l2-0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <1>;
+ arm,record-impl = /bits/ 64 <0x1>;
+ arm,status-reporting = /bits/ 64 <0x1>;
+ cache = <&l2_0>;
+ interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_LOW>;
+ interrupt-names = "fhi";
+ };
+
+ ras-l3-cluster0 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <2>;
+ arm,record-impl = /bits/ 64 <0x2>;
+ arm,status-reporting = /bits/ 64 <0x2>;
+ cache = <&l3_0>;
+ interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+
+ ras-l3-cluster1 {
+ compatible = "arm,ras-processor";
+ arm,num-records = <2>;
+ arm,record-impl = /bits/ 64 <0x2>;
+ arm,status-reporting = /bits/ 64 <0x2>;
+ cache = <&l3_1>;
+ interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "fhi";
+ };
+
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
@ 2026-07-27 20:51 ` Trilok Soni
2026-07-28 8:47 ` Krzysztof Kozlowski
2026-07-28 8:53 ` Krzysztof Kozlowski
2026-07-31 20:35 ` Rob Herring
2 siblings, 1 reply; 9+ messages in thread
From: Trilok Soni @ 2026-07-27 20:51 UTC (permalink / raw)
To: Umang Chheda, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, Ruidong Tian, Tony Luck,
Borislav Petkov
Cc: devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
On 7/20/2026 1:19 AM, Umang Chheda wrote:
> ARMv8 and later processors implement the RAS (Reliability,
> Availability and Serviceability) extensions, exposing hardware
> error records through a standardised register interface.
>
> Add Device Tree bindings to describe RAS error sources.
>
> Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
...
\> diff --git a/include/dt-bindings/arm/arm-ras.h b/include/dt-bindings/arm/arm-ras.h
> new file mode 100644
> index 000000000000..c2f4e1f8243e
> --- /dev/null
> +++ b/include/dt-bindings/arm/arm-ras.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
> +
> +#ifndef _DT_BINDINGS_ARM_RAS_H
> +#define _DT_BINDINGS_ARM_RAS_H
> +
> +/* arm,group-format - error record group register window page size */
> +#define ARM_RAS_GROUP_4K 0 /* 4 KiB, 1 ERRGSR */
> +#define ARM_RAS_GROUP_16K 1 /* 16 KiB, 4 ERRGSRs */
> +#define ARM_RAS_GROUP_64K 2 /* 64 KiB, 14 ERRGSRs */
Do you want me to have different DT for 4k and 16k and 64k? This is not a right approach.
> +
> +#endif /* _DT_BINDINGS_ARM_RAS_H */
> --
> 2.34.1
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
2026-07-27 20:51 ` Trilok Soni
@ 2026-07-28 8:47 ` Krzysztof Kozlowski
0 siblings, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-28 8:47 UTC (permalink / raw)
To: Trilok Soni
Cc: Umang Chheda, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, Ruidong Tian, Tony Luck,
Borislav Petkov, devicetree, linux-kernel, linux-arm-msm,
linux-acpi, linux-arm-kernel, linux-edac, faruque.ansari,
avaneesh.dwivedi
On Mon, Jul 27, 2026 at 01:51:08PM -0700, Trilok Soni wrote:
> On 7/20/2026 1:19 AM, Umang Chheda wrote:
> > new file mode 100644
> > index 000000000000..c2f4e1f8243e
> > --- /dev/null
> > +++ b/include/dt-bindings/arm/arm-ras.h
> > @@ -0,0 +1,11 @@
> > +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
> > +
> > +#ifndef _DT_BINDINGS_ARM_RAS_H
> > +#define _DT_BINDINGS_ARM_RAS_H
> > +
> > +/* arm,group-format - error record group register window page size */
> > +#define ARM_RAS_GROUP_4K 0 /* 4 KiB, 1 ERRGSR */
> > +#define ARM_RAS_GROUP_16K 1 /* 16 KiB, 4 ERRGSRs */
> > +#define ARM_RAS_GROUP_64K 2 /* 64 KiB, 14 ERRGSRs */
>
> Do you want me to have different DT for 4k and 16k and 64k? This is not a right approach.
>
Is this page size or register window page size? If the latter, why would
device registers be a binding?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
2026-07-27 20:51 ` Trilok Soni
@ 2026-07-28 8:53 ` Krzysztof Kozlowski
2026-07-31 20:35 ` Rob Herring
2 siblings, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-28 8:53 UTC (permalink / raw)
To: Umang Chheda
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
Konrad Dybcio, Ruidong Tian, Tony Luck, Borislav Petkov,
devicetree, linux-kernel, linux-arm-msm, linux-acpi,
linux-arm-kernel, linux-edac, faruque.ansari, avaneesh.dwivedi
On Mon, Jul 20, 2026 at 01:49:51PM +0530, Umang Chheda wrote:
> ARMv8 and later processors implement the RAS (Reliability,
> Availability and Serviceability) extensions, exposing hardware
> error records through a standardised register interface.
>
> Add Device Tree bindings to describe RAS error sources.
>
> Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
A nit, subject: drop second/last, redundant "bindings for". The
"dt-bindings" prefix is already stating that these are bindings.
See also:
https://elixir.bootlin.com/linux/v7.1-rc7/source/Documentation/devicetree/bindings/submitting-patches.rst#L23
> ---
> .../bindings/arm/arm,ras-error-source.yaml | 330 ++++++++++++++++++
> include/dt-bindings/arm/arm-ras.h | 11 +
> 2 files changed, 341 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
> create mode 100644 include/dt-bindings/arm/arm-ras.h
>
> diff --git a/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
> new file mode 100644
> index 000000000000..add7063a1a62
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
Filename should resemble compatible, so "arm,ras.yaml"
> @@ -0,0 +1,330 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/arm/arm,ras-error-source.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ARM RAS error source
> +
> +maintainers:
> + - Umang Chheda <umang.chheda@oss.qualcomm.com>
> +
> +description: |
> + ARMv8 and later processors implement the Reliability, Availability and
> + Serviceability (RAS) extensions. Hardware blocks that support RAS expose
> + one or more error records through a standardised register interface. Each
> + error record captures information about a detected hardware error (cache
> + ECC fault, TLB parity error, interconnect error, etc.) and can optionally
> + signal the OS via an interrupt.
> +
> + Each DT node described by this binding represents one RAS error source —
> + a hardware block that exposes a set of error records. Error records are
> + accessed either through system registers (for processor-local resources
> + such as L1/L2 caches and TLBs) or through a memory-mapped register window
> + (for shared or off-core resources such as L3 caches, SMMUs and GICs).
> +
> +properties:
> + compatible:
> + description:
> + Identifies the class of hardware block this error source belongs to.
> + arm,ras-processor covers processor error sources (cache, TLB, etc.).
> + arm,ras-smmu covers SMMU error sources.
> + arm,ras-gic covers GIC error sources.
> + enum:
> + - arm,ras-processor
> + - arm,ras-smmu
> + - arm,ras-gic
> +
> + reg:
> + description:
> + Register windows for this error source. When absent the error records
> + are accessed through system registers (ERRSELR_EL1 + ERX*_EL1).
> + When present, the first range is the primary error-record window;
> + additional named ranges are identified by reg-names.
> + minItems: 1
> + maxItems: 4
> +
> + reg-names:
> + description:
> + Names for the optional additional register windows beyond the primary
> + error-record window. err-group is the error group status register
> + window (ERRGSR). fault-inject is the fault injection register window
> + (ERXPFG*). irq-config is the interrupt routing configuration window.
> + minItems: 1
> + maxItems: 3
> + items:
> + enum:
> + - err-group
> + - fault-inject
> + - irq-config
> +
> + interrupts:
> + description:
> + Interrupts signalled by this error source. The first interrupt is the
> + Fault Handling Interrupt (FHI), fired when a corrected error counter
> + overflows or a deferred error is detected. The optional second
> + interrupt is the Error Recovery Interrupt (ERI), fired when an
> + uncorrected recoverable error is detected.
> + minItems: 1
> + maxItems: 2
> +
> + interrupt-names:
> + description:
> + Names identifying the interrupts. "fhi" is the Fault Handling
> + Interrupt; "eri" is the optional Error Recovery Interrupt.
> + minItems: 1
> + maxItems: 2
> + items:
> + enum:
> + - fhi
> + - eri
> +
> + arm,group-format:
> + description:
> + Page granularity of the memory-mapped error record group register
> + window. Determines the ioremap size and the number of error group
> + status registers (ERRGSR) available. Required when reg is present.
> + Use the ARM_RAS_GROUP_* constants from <dt-bindings/arm/arm-ras.h>.
> + 0 (ARM_RAS_GROUP_4K) is a 4 KiB window with 1 ERRGSR supporting up
> + to 64 records. 1 (ARM_RAS_GROUP_16K) is 16 KiB with 4 ERRGSRs and
> + up to 256 records. 2 (ARM_RAS_GROUP_64K) is 64 KiB with 14 ERRGSRs
> + and up to 896 records.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + enum: [0, 1, 2]
> +
> + arm,num-records:
> + description:
> + Total number of error records in this error source, including both
> + implemented and unimplemented slots.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 1
> +
> + arm,record-impl:
> + description:
> + Bitmap of implemented error records. Bit N set to 1 means error
> + record N is present and active in this error source. Bit N set to 0
> + means record N is not implemented and must be skipped. The array
> + length must equal the number of ERRGSRs implied by arm,group-format
> + (1 element for 4K, 4 for 16K, 14 for 64K). For system-register
> + nodes (no reg property) a single u64 element is used.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + arm,status-reporting:
> + description:
> + Bitmap indicating which implemented error records must be polled
> + directly by the OS. Bit N set to 1 means record N does not report
> + through the ERRGSR and must be polled by reading its ERX_STATUS
> + register directly in the interrupt handler. Bit N set to 0 means
> + record N reports its status through the ERRGSR and will be discovered
> + via the ERRGSR scan path. For system-register nodes (no reg property)
> + there is no ERRGSR, so every implemented record must be polled
> + directly; arm,status-reporting must equal arm,record-impl for all
> + system-register nodes. Array length as for arm,record-impl.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + arm,addressing-mode:
> + description:
> + Bitmap indicating the type of address reported in the error address
> + register (ERX_ADDR) for each error record. Bit N set to 0 means
> + record N reports a System Physical Address (SPA) that the OS can use
> + directly. Bit N set to 1 means record N reports a node-specific
> + Logical Address (LA) that requires platform-specific translation to
> + obtain a SPA. Array length as for arm,record-impl.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + # Processor error source properties (arm,ras-processor only)
> +
> + cache:
> + description:
> + Phandle to the cache node (L1, L2, or L3) that this processor error
> + source monitors. The referenced node must have compatible = "cache"
> + and a cache-level property identifying the level in the hierarchy.
> + $ref: /schemas/types.yaml#/definitions/phandle
> +
> + # SMMU error source properties (arm,ras-smmu only)
> +
> + iommus:
> + description:
> + Phandle to the SMMU node that this error source monitors.
> + maxItems: 1
> +
> + # GIC error source properties (arm,ras-gic only)
> +
> + arm,gic-ref:
> + description:
> + Phandle to the GIC node that this error source monitors.
> + $ref: /schemas/types.yaml#/definitions/phandle
> +
> +required:
> + - compatible
> + - arm,num-records
> + - arm,record-impl
> + - arm,status-reporting
> +
> +allOf:
> + - if:
> + required:
> + - reg
> + then:
> + required:
> + - arm,group-format
> +
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: arm,ras-processor
> + then:
> + required:
> + - cache
> + properties:
> + cache: {}
> + else:
> + properties:
> + cache: false
> +
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: arm,ras-smmu
> + then:
> + required:
> + - iommus
> + properties:
> + iommus: {}
What is with this syntax. There is no such style, drop.
> + else:
> + properties:
> + iommus: false
> +
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: arm,ras-gic
> + then:
> + required:
> + - arm,gic-ref
> + properties:
> + arm,gic-ref: {}
Drop. This is not an object, but phandle.
> + else:
> + properties:
> + arm,gic-ref: false
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/arm/arm-ras.h>
> +
> + / {
> + compatible = "qcom,sa8775p-ride", "qcom,sa8775p";
> + model = "Qualcomm Technologies, Inc. SA8775P RAS example";
> + #address-cells = <2>;
> + #size-cells = <2>;
> + interrupt-parent = <&intc>;
Drop, irrelevant.
> +
> + intc: interrupt-controller@17100000 {
> + compatible = "arm,gic-v3";
> + reg = <0x0 0x17100000 0x0 0x10000>,
> + <0x0 0x17180000 0x0 0x100000>;
> + interrupt-controller;
> + #interrupt-cells = <3>;
> + #address-cells = <2>;
> + #size-cells = <2>;
> + };
> +
> + cpus {
> + #address-cells = <2>;
> + #size-cells = <0>;
> +
> + cpu0: cpu@0 {
> + device_type = "cpu";
> + compatible = "arm,armv8";
> + reg = <0x0 0x0>;
> + next-level-cache = <&l2_0>;
> +
> + l2_0: l2-cache {
> + compatible = "cache";
> + cache-level = <2>;
> + cache-unified;
> + next-level-cache = <&l3_0>;
> +
> + l3_0: l3-cache {
> + compatible = "cache";
> + cache-level = <3>;
> + cache-unified;
> + };
> + };
> + };
> + };
Drop all the nodes above, irrelevant.
> +
> + /*
> + * Per-PE L1/L2 cache RAS error source. System-register access,
> + * per-CPU PPI. Record 0 is implemented (arm,record-impl bit 0
> + * set). arm,status-reporting equals arm,record-impl because
> + * system-register nodes have no ERRGSR; record 0 must be polled.
> + */
> + ras-l1l2-0 {
Node names should be generic. See also an explanation and list of
examples (not exhaustive) in DT specification:
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
If you cannot find a name matching your device, please check in kernel
sources for similar cases or you can grow the spec (via pull request to
DT spec repo).
Choose some generic name, but l1l2 does not sound like one.
> + compatible = "arm,ras-processor";
> + arm,num-records = <1>;
> + arm,record-impl = /bits/ 64 <0x1>;
> + arm,status-reporting = /bits/ 64 <0x1>;
> + cache = <&l2_0>;
> + interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_HIGH>;
> + interrupt-names = "fhi";
I had impression we agreed all this is part of actual CPU/GIC/cache node
or its subnode.
Keeping it separate does not feel right, if cache is the source of error reporting.
> + };
> +
> + ras-l3-cluster0 {
> + compatible = "arm,ras-processor";
> + arm,num-records = <2>;
> + arm,record-impl = /bits/ 64 <0x2>;
> + arm,status-reporting = /bits/ 64 <0x2>;
> + cache = <&l3_0>;
> + interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
> + interrupt-names = "fhi";
> + };
> + };
> +
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/arm/arm-ras.h>
> +
> + / {
> + compatible = "qcom,sa8775p-ride", "qcom,sa8775p";
> + model = "Qualcomm Technologies, Inc. SA8775P RAS example";
> + #address-cells = <2>;
> + #size-cells = <2>;
> + interrupt-parent = <&gic>;
> +
> + /*
> + * GICv3 interrupt controller with RAS support.
> + */
> + gic: interrupt-controller@17b00000 {
> + compatible = "arm,gic-v3";
> + reg = <0x0 0x17b00000 0x0 0x10000>,
> + <0x0 0x17b60000 0x0 0x100000>;
> + interrupt-controller;
> + #interrupt-cells = <3>;
> + };
> +
> + ras-gic-dist@17a00000 {
> + compatible = "arm,ras-gic";
> + reg = <0x0 0x17a00000 0x0 0x10000>;
> + reg-names = "err-group";
> + arm,group-format = <ARM_RAS_GROUP_4K>;
> + arm,num-records = <1>;
> + arm,record-impl = /bits/ 64 <0x1>;
> + arm,status-reporting = /bits/ 64 <0x0>;
> + arm,gic-ref = <&gic>;
> + interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>;
> + interrupt-names = "fhi";
> + };
> + };
> diff --git a/include/dt-bindings/arm/arm-ras.h b/include/dt-bindings/arm/arm-ras.h
> new file mode 100644
> index 000000000000..c2f4e1f8243e
> --- /dev/null
> +++ b/include/dt-bindings/arm/arm-ras.h
Filename must match binding or compatible.
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
> +
> +#ifndef _DT_BINDINGS_ARM_RAS_H
> +#define _DT_BINDINGS_ARM_RAS_H
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
2026-07-27 20:51 ` Trilok Soni
2026-07-28 8:53 ` Krzysztof Kozlowski
@ 2026-07-31 20:35 ` Rob Herring
2 siblings, 0 replies; 9+ messages in thread
From: Rob Herring @ 2026-07-31 20:35 UTC (permalink / raw)
To: Umang Chheda
Cc: Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio,
Ruidong Tian, Tony Luck, Borislav Petkov, devicetree,
linux-kernel, linux-arm-msm, linux-acpi, linux-arm-kernel,
linux-edac, faruque.ansari, avaneesh.dwivedi
On Mon, Jul 20, 2026 at 01:49:51PM +0530, Umang Chheda wrote:
> ARMv8 and later processors implement the RAS (Reliability,
> Availability and Serviceability) extensions, exposing hardware
> error records through a standardised register interface.
>
> Add Device Tree bindings to describe RAS error sources.
>
> Signed-off-by: Umang Chheda <umang.chheda@oss.qualcomm.com>
> ---
> .../bindings/arm/arm,ras-error-source.yaml | 330 ++++++++++++++++++
> include/dt-bindings/arm/arm-ras.h | 11 +
> 2 files changed, 341 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
> create mode 100644 include/dt-bindings/arm/arm-ras.h
>
> diff --git a/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
> new file mode 100644
> index 000000000000..add7063a1a62
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/arm,ras-error-source.yaml
> @@ -0,0 +1,330 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/arm/arm,ras-error-source.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ARM RAS error source
> +
> +maintainers:
> + - Umang Chheda <umang.chheda@oss.qualcomm.com>
> +
> +description: |
> + ARMv8 and later processors implement the Reliability, Availability and
> + Serviceability (RAS) extensions. Hardware blocks that support RAS expose
> + one or more error records through a standardised register interface. Each
> + error record captures information about a detected hardware error (cache
> + ECC fault, TLB parity error, interconnect error, etc.) and can optionally
> + signal the OS via an interrupt.
> +
> + Each DT node described by this binding represents one RAS error source —
> + a hardware block that exposes a set of error records. Error records are
> + accessed either through system registers (for processor-local resources
> + such as L1/L2 caches and TLBs) or through a memory-mapped register window
> + (for shared or off-core resources such as L3 caches, SMMUs and GICs).
> +
> +properties:
> + compatible:
> + description:
> + Identifies the class of hardware block this error source belongs to.
> + arm,ras-processor covers processor error sources (cache, TLB, etc.).
> + arm,ras-smmu covers SMMU error sources.
> + arm,ras-gic covers GIC error sources.
> + enum:
> + - arm,ras-processor
> + - arm,ras-smmu
> + - arm,ras-gic
> +
> + reg:
> + description:
> + Register windows for this error source. When absent the error records
> + are accessed through system registers (ERRSELR_EL1 + ERX*_EL1).
> + When present, the first range is the primary error-record window;
> + additional named ranges are identified by reg-names.
> + minItems: 1
> + maxItems: 4
> +
> + reg-names:
> + description:
> + Names for the optional additional register windows beyond the primary
> + error-record window. err-group is the error group status register
> + window (ERRGSR). fault-inject is the fault injection register window
> + (ERXPFG*). irq-config is the interrupt routing configuration window.
> + minItems: 1
> + maxItems: 3
> + items:
> + enum:
> + - err-group
> + - fault-inject
> + - irq-config
reg and reg-names must be the same number of entries.
> +
> + interrupts:
> + description:
> + Interrupts signalled by this error source. The first interrupt is the
> + Fault Handling Interrupt (FHI), fired when a corrected error counter
> + overflows or a deferred error is detected. The optional second
> + interrupt is the Error Recovery Interrupt (ERI), fired when an
> + uncorrected recoverable error is detected.
> + minItems: 1
> + maxItems: 2
Replace description with:
minItems: 1
items:
- description:
Fault Handling Interrupt (FHI), fired when a corrected error
counter overflows or a deferred error is detected.
- description:
Error Recovery Interrupt (ERI), fired when an uncorrected
recoverable error is detected.
Seems backwards to me that corrected errors is required and uncorrected
errors is optional. Should be fine to not care about corrected errors,
but uncorrected errors can't really be ignored.
> +
> + interrupt-names:
> + description:
> + Names identifying the interrupts. "fhi" is the Fault Handling
> + Interrupt; "eri" is the optional Error Recovery Interrupt.
> + minItems: 1
> + maxItems: 2
> + items:
> + enum:
> + - fhi
> + - eri
Define the order.
> +
> + arm,group-format:
> + description:
> + Page granularity of the memory-mapped error record group register
> + window. Determines the ioremap size and the number of error group
> + status registers (ERRGSR) available. Required when reg is present.
Don't state constraints which are expressed as schemas.
> + Use the ARM_RAS_GROUP_* constants from <dt-bindings/arm/arm-ras.h>.
> + 0 (ARM_RAS_GROUP_4K) is a 4 KiB window with 1 ERRGSR supporting up
> + to 64 records. 1 (ARM_RAS_GROUP_16K) is 16 KiB with 4 ERRGSRs and
> + up to 256 records. 2 (ARM_RAS_GROUP_64K) is 64 KiB with 14 ERRGSRs
> + and up to 896 records.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + enum: [0, 1, 2]
> +
> + arm,num-records:
> + description:
> + Total number of error records in this error source, including both
> + implemented and unimplemented slots.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 1
> +
> + arm,record-impl:
> + description:
> + Bitmap of implemented error records. Bit N set to 1 means error
> + record N is present and active in this error source. Bit N set to 0
> + means record N is not implemented and must be skipped. The array
> + length must equal the number of ERRGSRs implied by arm,group-format
> + (1 element for 4K, 4 for 16K, 14 for 64K). For system-register
> + nodes (no reg property) a single u64 element is used.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + arm,status-reporting:
> + description:
> + Bitmap indicating which implemented error records must be polled
> + directly by the OS. Bit N set to 1 means record N does not report
> + through the ERRGSR and must be polled by reading its ERX_STATUS
> + register directly in the interrupt handler. Bit N set to 0 means
> + record N reports its status through the ERRGSR and will be discovered
> + via the ERRGSR scan path. For system-register nodes (no reg property)
> + there is no ERRGSR, so every implemented record must be polled
> + directly; arm,status-reporting must equal arm,record-impl for all
> + system-register nodes. Array length as for arm,record-impl.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + arm,addressing-mode:
> + description:
> + Bitmap indicating the type of address reported in the error address
> + register (ERX_ADDR) for each error record. Bit N set to 0 means
> + record N reports a System Physical Address (SPA) that the OS can use
> + directly. Bit N set to 1 means record N reports a node-specific
> + Logical Address (LA) that requires platform-specific translation to
> + obtain a SPA. Array length as for arm,record-impl.
> + $ref: /schemas/types.yaml#/definitions/uint64-array
> + minItems: 1
> + maxItems: 14
> +
> + # Processor error source properties (arm,ras-processor only)
> +
> + cache:
> + description:
> + Phandle to the cache node (L1, L2, or L3) that this processor error
> + source monitors. The referenced node must have compatible = "cache"
> + and a cache-level property identifying the level in the hierarchy.
> + $ref: /schemas/types.yaml#/definitions/phandle
> +
> + # SMMU error source properties (arm,ras-smmu only)
> +
> + iommus:
> + description:
> + Phandle to the SMMU node that this error source monitors.
If the iommu has #iommu-cells >0, then this property must match the cell
size. You can't have your own definition of 'iommus'.
> + maxItems: 1
> +
> + # GIC error source properties (arm,ras-gic only)
> +
> + arm,gic-ref:
> + description:
> + Phandle to the GIC node that this error source monitors.
> + $ref: /schemas/types.yaml#/definitions/phandle
> +
> +required:
> + - compatible
> + - arm,num-records
> + - arm,record-impl
> + - arm,status-reporting
> +
> +allOf:
> + - if:
> + required:
> + - reg
> + then:
> + required:
> + - arm,group-format
Better expressed as:
dependentRequired:
reg: [ 'arm,group-format' ]
Rob
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-31 20:35 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-20 8:19 [PATCH v2 0/4] arm: ras: Add DT frontend support for ARM RAS Umang Chheda
2026-07-20 8:19 ` [PATCH v2 1/4] dt-bindings: arm: ras: Introduce bindings for ARM RAS error sources Umang Chheda
2026-07-27 20:51 ` Trilok Soni
2026-07-28 8:47 ` Krzysztof Kozlowski
2026-07-28 8:53 ` Krzysztof Kozlowski
2026-07-31 20:35 ` Rob Herring
2026-07-20 8:19 ` [PATCH v2 2/4] arm64: ras: Add Device Tree frontend Umang Chheda
2026-07-20 8:19 ` [PATCH v2 3/4] arm64: dts: qcom: monaco: add RAS error source nodes Umang Chheda
2026-07-20 8:19 ` [PATCH v2 4/4] arm64: dts: qcom: lemans: " Umang Chheda
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox