[PATCH v2] arm: dts: qcom: Add reserved memory regions and EFI memory mapping
neil.armstrong at linaro.org
neil.armstrong at linaro.org
Tue Jan 13 10:13:04 CET 2026
Hi,
On 1/13/26 10:06, Balaji Selvanathan wrote:
> 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.
So, please explain why those are not in the Linux upstream DT which is
synced at every U-Boot release, and why the reserved-memory is totally
different from the Linux upstream arch/arm64/boot/dts/qcom/talos.dtsi ?
>
> 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.
> */
More information about the U-Boot
mailing list