[PATCH v6 08/11] mach-snapdragon: spl: Update SMEM with boot details

Balaji Selvanathan balaji.selvanathan at oss.qualcomm.com
Sun Jun 28 15:11:16 CEST 2026


Hi Varada,

On 6/23/2026 12:18 PM, Varadarajan Narayanan wrote:
> Update SMEM with the storage medium from which the system booted.
>
> Signed-off-by: Varadarajan Narayanan <varadarajan.narayanan at oss.qualcomm.com>

Reviewed-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>

Regards,

Balaji

> ---
> v4: Handle Boot medium not specified case properly
>      Minor cosmetic changes
>
> v3: Move SMEM init from previous patch to this new patch
> ---
>   arch/arm/mach-snapdragon/spl.c | 73 +++++++++++++++++++++++++++++++++-
>   include/smem.h                 |  3 ++
>   2 files changed, 75 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mach-snapdragon/spl.c b/arch/arm/mach-snapdragon/spl.c
> index 9b8a640256a..aef9bf206c2 100644
> --- a/arch/arm/mach-snapdragon/spl.c
> +++ b/arch/arm/mach-snapdragon/spl.c
> @@ -11,6 +11,7 @@
>   #include <asm/io.h>
>   #include <asm/system.h>
>   #include <asm/sections.h>
> +#include <smem.h>
>   #include <atf_common.h>
>   #include <linux/err.h>
>   #include <dm/device-internal.h>
> @@ -167,6 +168,52 @@ static int qcom_spl_get_fit_img_entry_point(void *fit, int node,
>   	return ret;
>   }
>   
> +#if IS_ENABLED(CONFIG_SPL_SMEM)
> +/**
> + * qcom_spl_populate_smem() - Populate shared memory (SMEM) information.
> + * @ctx:	Pointer to the global SPL context.
> + *
> + * This function initializes and populates various SMEM items with boot-related
> + * information, such as flash type, try-mode status, and ATF enable status.
> + * Return: 0 on success, or a negative error code on failure.
> + */
> +static int qcom_spl_populate_smem(void *ctx)
> +{
> +	int ret;
> +	size_t size;
> +	struct udevice *smem;
> +	u32 *fltype;
> +
> +	ret = uclass_get_device(UCLASS_SMEM, 0, &smem);
> +	if (ret) {
> +		pr_err("Failed to find SMEM node (%d)\n", ret);
> +		return ret;
> +	}
> +
> +	size = sizeof(u32);
> +	ret = smem_alloc(smem, -1, SMEM_BOOT_FLASH_TYPE, size);
> +	if (ret) {
> +		pr_err("Failed to alloc item: SMEM_BOOT_FLASH_TYPE (%d)\n", ret);
> +		return ret;
> +	}
> +
> +	fltype = (u32 *)smem_get(smem, -1, SMEM_BOOT_FLASH_TYPE, &size);
> +	if (!fltype) {
> +		pr_err("Failed to get item: SMEM_BOOT_FLASH_TYPE\n");
> +		return -ENOENT;
> +	}
> +
> +	if (IS_ENABLED(CONFIG_SPL_MMC)) {
> +		*fltype = SMEM_BOOT_MMC_FLASH;
> +		return 0;
> +	}
> +
> +	pr_err("Boot medium not specified\n");
> +
> +	return -ENOENT;
> +}
> +#endif /* IS_ENABLED(CONFIG_SPL_SMEM) */
> +
>   /**
>    * qcom_spl_get_iftbl_entry_by_name() - Get an interface table entry by name.
>    * @if_tbl:	Pointer to the QCLIB interface table.
> @@ -328,6 +375,30 @@ int qclib_post_process_from_spl(void)
>   	return 0;
>   }
>   
> +#if IS_ENABLED(CONFIG_SPL_SMEM)
> +/**
> + * spl_board_prepare_for_boot() - Prepare board for boot
> + *
> + * This function is called by SPL before jumping to the next stage.
> + * It populates SMEM during coldboot.
> + */
> +void spl_board_prepare_for_boot(void)
> +{
> +	int ret;
> +
> +	/*
> +	 * Populate SMEM in coldboot (Dload bit not set)
> +	 */
> +	if (!QCOM_SPL_IS_DLOAD_BIT_SET) {
> +		ret = qcom_spl_populate_smem(NULL);
> +		if (ret) {
> +			pr_err("Failed to populate SMEM (%d)\n", ret);
> +			qcom_spl_error_handler(NULL);
> +		}
> +	}
> +}
> +#endif /* IS_ENABLED(CONFIG_SPL_SMEM) */
> +
>   /**
>    * spl_get_load_buffer() - Allocate a cache-aligned buffer for image loading.
>    * @offset:	Offset (unused, typically 0 for SPL).
> @@ -396,7 +467,7 @@ struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
>   
>   /**
>    * qcom_spl_loader_pre_ddr() - SPL loader for pre-DDR stage.
> - * @boot_device:Type of boot device.
> + * @boot_device: Type of boot device.
>    *
>    * Return: 0 on success, or a negative error code on failure.
>    */
> diff --git a/include/smem.h b/include/smem.h
> index b19c534ebc4..f16ba7d63dc 100644
> --- a/include/smem.h
> +++ b/include/smem.h
> @@ -87,4 +87,7 @@ void *smem_get(struct udevice *dev, unsigned int host, unsigned int item, size_t
>    */
>   int smem_get_free_space(struct udevice *dev, unsigned int host);
>   
> +#define SMEM_BOOT_FLASH_TYPE			498
> +#define SMEM_BOOT_MMC_FLASH			5
> +
>   #endif /* _smem_h_ */


More information about the U-Boot mailing list