[PATCH v2] arm: dts: qcom: Add reserved memory regions and EFI memory mapping

Balaji Selvanathan balaji.selvanathan at oss.qualcomm.com
Tue Jan 13 10:06:21 CET 2026


Add reserved-memory nodes to QCS615 and QCS6490 device trees to
define platform-specific memory regions that should not be used by
the operating system.

Implement efi_add_known_memory() function in board.c code to
parse reserved-memory nodes from device tree and register them with
the EFI memory map. This ensures proper memory protection during EFI
boot and prevents conflicts with firmware-reserved regions.

Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
---
Changes in v2:
- Instead of adding reserved region info in a new
  qcom_reserved_memory.c file, added the regions to reserved memory
  node in override dts.
- Link to v1: https://lore.kernel.org/u-boot/20260107091406.2428132-1-balaji.selvanathan@oss.qualcomm.com/
---
 arch/arm/dts/qcs615-ride-u-boot.dtsi     | 56 +++++++++++++++++++++++
 arch/arm/dts/qcs6490-rb3gen2-u-boot.dtsi | 26 +++++++++++
 arch/arm/mach-snapdragon/board.c         | 58 ++++++++++++++++++++++++
 3 files changed, 140 insertions(+)

diff --git a/arch/arm/dts/qcs615-ride-u-boot.dtsi b/arch/arm/dts/qcs615-ride-u-boot.dtsi
index 68fffc70fcb..ec607061ba0 100644
--- a/arch/arm/dts/qcs615-ride-u-boot.dtsi
+++ b/arch/arm/dts/qcs615-ride-u-boot.dtsi
@@ -11,4 +11,60 @@
 		      <0x0 0xc0000000 0x0 0xc0000000>,
 		      <0x1 0x80000000 0x1 0x00000000>;
 	};
+
+	reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		hyp_mem: hyp at 80000000 {
+			reg = <0x0 0x80000000 0x0 0x600000>;
+			no-map;
+		};
+
+		xbl_boot_mem: xbl-boot at 85d00000 {
+			reg = <0x0 0x85d00000 0x0 0x200000>;
+			no-map;
+		};
+
+		aop_mem: aop at 85f00000 {
+			reg = <0x0 0x85f00000 0x0 0x20000>;
+			no-map;
+		};
+
+		xbl_dt_mem: xbl-dt at 85f40000 {
+			reg = <0x0 0x85f40000 0x0 0x30000>;
+			no-map;
+		};
+
+		tz_stat_mem: tz-stat at 86200000 {
+			reg = <0x0 0x86200000 0x0 0x100000>;
+			no-map;
+		};
+
+		tags_mem: tags at 86300000 {
+			reg = <0x0 0x86300000 0x0 0x1200000>;
+			no-map;
+		};
+
+		tz_mem: tz at 87500000 {
+			reg = <0x0 0x87500000 0x0 0x500000>;
+			no-map;
+		};
+
+		tzapps_mem: tzapps at 87a00000 {
+			reg = <0x0 0x87a00000 0x0 0x1c00000>;
+			no-map;
+		};
+
+		pil_mem: pil at 8ab00000 {
+			reg = <0x0 0x8ab00000 0x0 0xcc17000>;
+			no-map;
+		};
+
+		secure_dsp_mem: secure-dsp at a0000000 {
+			reg = <0x0 0xa0000000 0x0 0x1600000>;
+			no-map;
+		};
+	};
 };
diff --git a/arch/arm/dts/qcs6490-rb3gen2-u-boot.dtsi b/arch/arm/dts/qcs6490-rb3gen2-u-boot.dtsi
index 8d4871135fa..cf6de0036d5 100644
--- a/arch/arm/dts/qcs6490-rb3gen2-u-boot.dtsi
+++ b/arch/arm/dts/qcs6490-rb3gen2-u-boot.dtsi
@@ -15,6 +15,32 @@
 		      <0 0xC3400000 0 0x3CC00000>,
 		      <1 0x00000000 1 0x00000000>;
 	};
+
+	reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		axon_dma_mem: axon-dma at 80600000 {
+			reg = <0x0 0x80600000 0x0 0x100000>;
+			no-map;
+		};
+
+		xbl_dt_mem: xbl-dt at 80894000 {
+			reg = <0x0 0x80894000 0x0 0x40000>;
+			no-map;
+		};
+
+		pil_reserved_mem: pil-reserved at 84300000 {
+			reg = <0x0 0x84300000 0x0 0x16b00000>;
+			no-map;
+		};
+
+		display_mem: display at e1000000 {
+			reg = <0x0 0xe1000000 0x0 0x2400000>;
+			no-map;
+		};
+	};
 };
 
 &usb_1 {
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index 5fb3240acc5..f32d29a9242 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -19,8 +19,10 @@
 #include <dm/uclass-internal.h>
 #include <dm/read.h>
 #include <power/regulator.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <fdt_support.h>
+#include <fdtdec.h>
 #include <init.h>
 #include <linux/arm-smccc.h>
 #include <linux/bug.h>
@@ -709,6 +711,62 @@ static void carve_out_reserved_memory(void)
 	}
 }
 
+/**
+ * efi_add_known_memory() - Add platform-specific reserved memory to EFI map
+ *
+ * This function is called by the EFI memory initialization code to allow
+ * platforms to add their reserved memory regions to the EFI memory map.
+ * For Qualcomm platforms, this parses the reserved-memory nodes from the
+ * device tree and adds them to the EFI memory map.
+ */
+void efi_add_known_memory(void)
+{
+	ofnode parent, node;
+	fdt_addr_t addr;
+	fdt_size_t size;
+	const char *name;
+
+	if (!IS_ENABLED(CONFIG_EFI_LOADER))
+		return;
+
+	/* Parse reserved-memory nodes from device tree */
+	parent = ofnode_path("/reserved-memory");
+	if (!ofnode_valid(parent)) {
+		log_debug("No reserved-memory node found in device tree\n");
+		return;
+	}
+
+	log_debug("Adding reserved-memory regions to EFI memory map\n");
+
+	ofnode_for_each_subnode(node, parent) {
+		if (!ofnode_is_enabled(node))
+			continue;
+
+		addr = ofnode_get_addr_size_index(node, 0, &size);
+		if (addr != FDT_ADDR_T_NONE) {
+			efi_status_t ret;
+
+			name = ofnode_get_name(node);
+			ret = efi_add_memory_map(addr, size,
+						 EFI_RESERVED_MEMORY_TYPE);
+
+			if (ret != EFI_SUCCESS) {
+				log_err("Failed to reserve %s (0x%llx-0x%llx): %lu\n",
+					name ? name : "unknown",
+					(unsigned long long)addr,
+					(unsigned long long)(addr + size),
+					ret & ~EFI_ERROR_MASK);
+			} else {
+				log_debug("Reserved %s: 0x%llx-0x%llx (%llu KB)\n",
+					  name ? name : "unknown",
+					  (unsigned long long)addr,
+					  (unsigned long long)(addr + size),
+					  (unsigned long long)(size / 1024));
+			}
+		}
+	}
+}
+
 /* This function open-codes setup_all_pgtables() so that we can
  * insert additional mappings *before* turning on the MMU.
  */
-- 
2.34.1



More information about the U-Boot mailing list