On 22/07/2026 09:41, Varadarajan Narayanan wrote:
> Add routines to enable U-Boot SPL to be able to proceed with the boot from
> MMC partitions.
>
> Reviewed-by: Balaji Selvanathan <[email protected]>
> Reviewed-by: Simon Glass <[email protected]>
> Signed-off-by: Varadarajan Narayanan <[email protected]>
> ---
> arch/arm/mach-snapdragon/board_spl.c | 107
> +++++++++++++++++++++++++++++++++++
> 1 file changed, 107 insertions(+)
>
> diff --git a/arch/arm/mach-snapdragon/board_spl.c
> b/arch/arm/mach-snapdragon/board_spl.c
> index 69a32e5d8cf..c5e86458616 100644
> --- a/arch/arm/mach-snapdragon/board_spl.c
> +++ b/arch/arm/mach-snapdragon/board_spl.c
> @@ -131,3 +131,110 @@ static int qcom_spl_populate_smem(void *ctx)
> return -ENOENT;
> }
> #endif /* IS_ENABLED(CONFIG_SPL_SMEM) */
> +
> +#if CONFIG_IS_ENABLED(MMC)
> +
> +#define QCOM_SPL_FIT_IMG_PARTITION "0:BOOTLDR"
> +
> +/**
> + * spl_find_partition_info() - Find partition information by name
> + * @uclass_id: Device class ID (UCLASS_MMC)
> + * @device_num: Device number within the class
> + * @part_name: Name of the partition to find
> + * @info: Pointer to store partition information
> + *
> + * This function provides partition lookup logic for MMC.
> + * Return: Partition number on success, negative error code on failure
What's missing in the mmc/part framework for this? This "helper" is
called once and doesn't really seem to justify itself, please elaborate.
> + */
> +static int spl_find_partition_info(enum uclass_id uclass_id, int device_num,
> + const char *part_name,
> + struct disk_partition *info)
> +{
> + int ret;
> + struct blk_desc *desc;
> +
> + if (!part_name || !info) {
> + printf("Invalid parameters for partition lookup\n");
> + return -EINVAL;
> + }
> +
> + /*
> + * Get block device descriptor
> + */
> + desc = blk_get_devnum_by_uclass_id(uclass_id, device_num);
> + if (!desc) {
> + printf("Block device not found for class %d, device %d\n",
> + uclass_id, device_num);
> + return -ENODEV;
> + }
> +
> + /*
> + * Initialize partition table if needed
> + */
> + if (desc->part_type == PART_TYPE_UNKNOWN) {
> + printf("Initializing partition table\n");
Not sure if I even want to know what this is a workaround for, why can't
this be fixed in the proper place?
> + /*
> + * Prefer EFI/GPT
> + */
> + desc->part_type = PART_TYPE_EFI;
> + }
> +
> + /*
> + * Find partition by name
> + */
> + ret = part_get_info_by_name(desc, part_name, info);
> + if (ret < 0) {
> + printf("Partition '%s' not found\n", part_name);
> + return -ENOENT;
> + }
> +
> + printf("Found partition '%s' at partition number %d\n", part_name, ret);
debug()
> + return ret;
> +}
> +
> +/**
> + * spl_mmc_boot_mode() - Determine the boot mode for MMC
> + * @mmc: Pointer to the MMC device
> + * @boot_device: Boot device ID
> + *
> + * Return: MMCSD_MODE_RAW to use raw partition access
> + */
> +u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device)
> +{
> + return MMCSD_MODE_RAW;
> +}
> +
> +/**
> + * spl_mmc_boot_partition() - Determine which partition to boot from
> + * @boot_device: Boot device ID
> + *
> + * Return: Partition number to boot from, or default partition on error
> + */
> +int spl_mmc_boot_partition(const u32 boot_device)
> +{
> + int ret;
this can have a better name than "ret"
> + struct disk_partition info;
> +
> + ret = spl_find_partition_info(UCLASS_MMC, 0,
> QCOM_SPL_FIT_IMG_PARTITION, &info);
> +#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION)
This entire function isn't even called unless this config option is
enabled, so you can drop this. compile time conditional error checking
here is incomprehensible
> + if (ret < 0) {
> + printf("Using default MMC partition %d\n",
> + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION);
> + return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION;
> + }
> +#endif
> + return ret;
> +}
> +
> +/**
> + * spl_mmc_get_uboot_raw_sector() - Find the raw sector offset
> + * @mmc: Pointer to the MMC device
> + * @raw_sect: Sector
> + *
> + * Return: 0 if the image is at the starting of the partition without any
> offset.
this function API is already documented in the header (same for the
others in this file), if you want a comment (definitely nice!) then
write a normal one not a doc comment that just rewords the existing API.
This is noise.
> + */
> +unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc, ulong raw_sect)
> +{
> + return 0;
> +}
> +#endif /* CONFIG_IS_ENABLED(MMC) */
>
--
// Casey (she/her)