[PATCH v2 16/32] mach-snapdragon: dynamic load addresses

Caleb Connolly caleb.connolly at linaro.org
Tue Dec 19 17:22:05 CET 2023



On 19/12/2023 16:04, Caleb Connolly wrote:
> Heavily inspired by Apple board code. Use the LMB allocator to configure
> load addresses at runtime, and implement a lookup table for selecting a
> devicetree.
> 
> As some Qualcomm RBx boards have different RAM capacities and base
> addresses, it isn't possible to hardcode these regions.
> 
> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
>  arch/arm/Kconfig                                 |  1 +
>  arch/arm/mach-snapdragon/board.c                 | 35 ++++++++++++++++++++++++
>  board/qualcomm/dragonboard410c/dragonboard410c.c |  2 +-
>  3 files changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index e814910cb495..5ed9cbf378fa 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1075,6 +1075,7 @@ config ARCH_SNAPDRAGON
>  	select OF_SEPARATE
>  	select SMEM
>  	select SPMI
> +	select BOARD_LATE_INIT
>  	select OF_BOARD
>  	select SAVE_PREV_BL_FDT_ADDR
>  	select LINUX_KERNEL_IMAGE_HEADER
> diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
> index bf9b57682178..b00f536d38b4 100644
> --- a/arch/arm/mach-snapdragon/board.c
> +++ b/arch/arm/mach-snapdragon/board.c
> @@ -20,6 +20,7 @@
>  #include <linux/bug.h>
>  #include <linux/psci.h>
>  #include <linux/sizes.h>
> +#include <lmb.h>
>  #include <malloc.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
> @@ -112,6 +113,40 @@ int board_init(void)
>  	return 0;
>  }
>  
> +void __weak qcom_late_init(void)
> +{
> +}
> +
> +#define KERNEL_COMP_SIZE	SZ_64M
> +#define SZ_96M			(SZ_64M + SZ_32M)

This patch should have been adjusted to use SZ_128M, I already confirmed
this to work on all boards. Somehow the old version crept in.
> +
> +#define addr_alloc(lmb, size) lmb_alloc(lmb, size, SZ_2M)
> +
> +/* Stolen from arch/arm/mach-apple/board.c */
> +int board_late_init(void)
> +{
> +	struct lmb lmb;
> +	u32 status = 0;
> +
> +	lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
> +
> +	/* We need to be fairly conservative here as we support boards with just 1G of TOTAL RAM */
> +	status |= env_set_hex("kernel_addr_r", addr_alloc(&lmb, SZ_128M));
> +	status |= env_set_hex("ramdisk_addr_r", addr_alloc(&lmb, SZ_96M));
> +	status |= env_set_hex("kernel_comp_addr_r", addr_alloc(&lmb, KERNEL_COMP_SIZE));
> +	status |= env_set_hex("kernel_comp_size", KERNEL_COMP_SIZE);
> +	status |= env_set_hex("scriptaddr", addr_alloc(&lmb, SZ_4M));
> +	status |= env_set_hex("pxefile_addr_r", addr_alloc(&lmb, SZ_4M));
> +	status |= env_set_hex("fdt_addr_r", addr_alloc(&lmb, SZ_2M));
> +
> +	if (status)
> +		log_warning("%s: Failed to set run time variables\n", __func__);
> +
> +	qcom_late_init();
> +
> +	return 0;
> +}
> +
>  static void build_mem_map(void)
>  {
>  	int i;
> diff --git a/board/qualcomm/dragonboard410c/dragonboard410c.c b/board/qualcomm/dragonboard410c/dragonboard410c.c
> index e403ecf0ad7c..2a502c7c2841 100644
> --- a/board/qualcomm/dragonboard410c/dragonboard410c.c
> +++ b/board/qualcomm/dragonboard410c/dragonboard410c.c
> @@ -77,7 +77,7 @@ int misc_init_r(void)
>  	return 0;
>  }
>  
> -int board_late_init(void)
> +int qcom_late_init(void)
>  {
>  	char serial[16];
>  
> 

-- 
// Caleb (they/them)


More information about the U-Boot mailing list