From: Sam Day <[email protected]> The main change here is to make is_addr_accessible() portable, by using gd->bd->bi_ram rather than the ARMv8 memory map. AFAICT, at the point that this is running, these two things are 1:1 anyway (see qcom_configure_bi_dram).
Once that's out of the way, we add ARM32 support by looking at r2 rather than r0 and using portable pointer types. Signed-off-by: Sam Day <[email protected]> --- arch/arm/lib/save_prev_bl_data.c | 49 ++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/arch/arm/lib/save_prev_bl_data.c b/arch/arm/lib/save_prev_bl_data.c index 4357acaef6c..83670541c50 100644 --- a/arch/arm/lib/save_prev_bl_data.c +++ b/arch/arm/lib/save_prev_bl_data.c @@ -12,33 +12,41 @@ #include <fdt.h> #include <linux/errno.h> #include <asm/system.h> -#include <asm/armv8/mmu.h> -static ulong reg0 __section(".data"); +#include <asm/global_data.h> + +DECLARE_GLOBAL_DATA_PTR; + +static phys_addr_t prev_bl_fdt_addr __section(".data"); /** - * Save x0 register value, assuming previous bootloader set it to - * point on loaded fdt or (for older linux kernels)atags. + * Save the register value used by Linux boot ABI to pass the FDT or ATAGS. */ -void save_boot_params(ulong r0) +void save_boot_params(ulong r0, ulong __always_unused r1, ulong r2) { - reg0 = r0; + if (IS_ENABLED(CONFIG_ARM64)) + prev_bl_fdt_addr = r0; + else + prev_bl_fdt_addr = r2; + save_boot_params_ret(); } bool is_addr_accessible(phys_addr_t addr) { - struct mm_region *mem = mem_map; phys_addr_t bank_start; phys_addr_t bank_end; - while (mem->size) { - bank_start = mem->phys; - bank_end = bank_start + mem->size; - debug("check if block %pap - %pap includes %pap\n", &bank_start, &bank_end, &addr); - if (addr > bank_start && addr < bank_end) + for (int i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + if (!gd->bd->bi_dram[i].size) + continue; + + bank_start = gd->bd->bi_dram[i].start; + bank_end = bank_start + gd->bd->bi_dram[i].size; + debug("check if block %pap - %pap includes %pap\n", + &bank_start, &bank_end, &addr); + if (addr >= bank_start && addr < bank_end) return true; - mem++; } return false; @@ -46,33 +54,34 @@ bool is_addr_accessible(phys_addr_t addr) phys_addr_t get_prev_bl_fdt_addr(void) { - return reg0; + return prev_bl_fdt_addr; } int save_prev_bl_data(void) { struct fdt_header *fdt_blob; int node; - u64 initrd_start_prop; + phys_addr_t initrd_start_prop; - if (!is_addr_accessible((phys_addr_t)reg0)) + if (!is_addr_accessible(prev_bl_fdt_addr)) return -ENODATA; - fdt_blob = (struct fdt_header *)reg0; + fdt_blob = (struct fdt_header *)prev_bl_fdt_addr; if (!fdt_valid(&fdt_blob)) { - pr_warn("%s: address 0x%lx is not a valid fdt\n", __func__, reg0); + pr_warn("%s: address 0x%lx is not a valid fdt\n", + __func__, prev_bl_fdt_addr); return -ENODATA; } if (IS_ENABLED(CONFIG_SAVE_PREV_BL_FDT_ADDR)) - env_set_addr("prevbl_fdt_addr", (void *)reg0); + env_set_addr("prevbl_fdt_addr", (const void *)prev_bl_fdt_addr); if (!IS_ENABLED(CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR)) return 0; node = fdt_path_offset(fdt_blob, "/chosen"); if (!node) { pr_warn("%s: chosen node not found in device tree at addr: 0x%lx\n", - __func__, reg0); + __func__, prev_bl_fdt_addr); return -ENODATA; } /* -- 2.54.0

