[PATCH v2 1/1] spl: allow loading via partition type GUID

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Fri Feb 17 07:55:58 CET 2023



On 2/17/23 03:55, Simon Glass wrote:
> " properHi Heinrich,
> 
> On Thu, 16 Feb 2023 at 14:31, Heinrich Schuchardt
> <heinrich.schuchardt at canonical.com> wrote:
>>
>>
>>
>> On 2/16/23 21:17, Simon Glass wrote:
>>> Hi Heinrich,
>>>
>>> On Thu, 16 Feb 2023 at 08:30, Heinrich Schuchardt
>>> <heinrich.schuchardt at canonical.com> wrote:
>>>>
>>>> Some boards provide main U-Boot as a dedicated partition to SPL.
>>>> Currently we can define either a fixed partition number or an MBR
>>>> partition type to define which partition is to be used.
>>>>
>>>> Partition numbers tend to conflict with established partitioning schemes
>>>> of Linux distros. MBR partitioning is more and more replaced by GPT
>>>> partitioning.
>>>>
>>>> Allow defining a partition type GUID identifying the partition to load
>>>> main U-Boot from.
>>>>
>>>> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>>>> ---
>>>> v2:
>>>>           avoid if/endif in Kconfig
>>>> ---
>>>>    common/spl/Kconfig   | 27 ++++++++++++++++++++++-----
>>>>    common/spl/spl_mmc.c | 13 +++++++++++++
>>>>    2 files changed, 35 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
>>>> index 3c2af453ab..9d12b48297 100644
>>>> --- a/common/spl/Kconfig
>>>> +++ b/common/spl/Kconfig
>>>> @@ -514,19 +514,36 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
>>>>             used in raw mode
>>>>
>>>>    config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
>>>> -       bool "MMC raw mode: by partition type"
>>>> +       bool "MMC raw mode: by MBR partition type"
>>>>           depends on DOS_PARTITION && SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
>>>>           help
>>>> -         Use partition type for specifying U-Boot partition on MMC/SD in
>>>> +         Use MBR partition type for specifying U-Boot partition on MMC/SD in
>>>>             raw mode. U-Boot will be loaded from the first partition of this
>>>>             type to be found.
>>>>
>>>>    config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE
>>>> -       hex "Partition Type on the MMC to load U-Boot from"
>>>> +       hex "MBR Partition Type on the MMC to load U-Boot from"
>>>>           depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
>>>>           help
>>>> -         Partition Type on the MMC to load U-Boot from, when the MMC is being
>>>> -         used in raw mode.
>>>> +         MBR Partition Type on the MMC to load U-Boot from, when the MMC is
>>>> +         being used in raw mode.
>>>> +
>>>> +config SYS_MMCSD_RAW_MODE_U_BOOT_USE_GPT_PARTITION_TYPE
>>>> +       bool "MMC raw mode: GPT by partition type"
>>>> +       depends on PARTITION_TYPE_GUID && SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
>>>> +       help
>>>> +         Use GPT partition type for specifying U-Boot partition on MMC/SD in
>>>> +         raw mode. U-Boot will be loaded from the first partition of this
>>>> +         type to be found.
>>>> +
>>>> +config SYS_MMCSD_RAW_MODE_U_BOOT_GPT_PARTITION_TYPE
>>>> +       string "GPT Partition Type on the MMC to load U-Boot from"
>>>> +       depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_GPT_PARTITION_TYPE
>>>> +       default d2f002f8-e4e7-4269-b8ac-3bb6fabeaff6
>>>
>>> What is this? Can we have a register of these hideous things and call
>>> them by name?
> 
> Further, I don't see any documentation on this in U-Boot. Could you at
> least add a list of these things?
> 
>>>
>>>> +       help
>>>> +         GPT Partition Type on the MMC to load U-Boot from, when the MMC is
>>>> +         being used in raw mode. The GUID must be lower case, low endian,
>>>> +         and formatted like d2f002f8-e4e7-4269-b8ac-3bb6fabeaff6.
>>>>
>>>>    config SUPPORT_EMMC_BOOT_OVERRIDE_PART_CONFIG
>>>>           bool "Override eMMC EXT_CSC_PART_CONFIG by user defined partition"
>>>> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
>>>> index e4135b2048..69bf1d6e98 100644
>>>> --- a/common/spl/spl_mmc.c
>>>> +++ b/common/spl/spl_mmc.c
>>>> @@ -191,6 +191,19 @@ static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,
>>>>           struct disk_partition info;
>>>>           int err;
>>>>
>>>> +#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_GPT_PARTITION_TYPE
>>>> +       for (int i = 1; i <= MAX_SEARCH_PARTITIONS; ++i) {
>>>> +               err = part_get_info(mmc_get_blk_desc(mmc), i, &info);
>>>> +               if (err)
>>>> +                       continue;
>>>> +               if (!strncmp(info.type_guid,
>>>> +                            CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_GPT_PARTITION_TYPE,
>>>> +                            UUID_STR_LEN)) {
>>>> +                       partition = i;
>>>> +                       break;
>>>> +               }
>>>> +       }
>>>> +#endif
>>>>    #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
>>>>           int type_part;
>>>>           /* Only support MBR so DOS_ENTRY_NUMBERS */
>>>> --
>>>> 2.38.1
>>>>
>>>
>>> Is it possible to avoid using #ifdef here?
>>
>> Unfortunately not. Field 'type_guid' is restricted by an #ifdef. So
>> unconditional compilation would fail.
> 
> Do you think it is worth adding an accessor as we have done with some
> global_data things?

There are other places like disk/part_efi.c where we could trade #ifdef 
for if with such an accessor. The accessor itself would require an #ifdef.

We should be careful about the value returned for 
CONFIG_PARTITION_TYPE_GUID=n. Returning NULL would probably lead to 
warnings from GCC and Coverity. We would better return a dummy string 
like "00000000-0000-0000-0000-000000000000".

> 
>>
>>>
>>> Longer term, I wonder if we can add a DT schema for all of
>>> this...these CONFIG options for boot selection seem to be getting out
>>> of hand!
>>
>> Tom just moved a lot of constants hard coded in C code to Kconfig with a
>> big effort. Now you want to move Kconfig values to hard coded constants
>> in device-tree.
>>
>> Running in circles does not sound like a winning strategy.
> 
> The values seem to be common across certain boards of the same type, SoC, etc.

As I described above using the same GUID value for different boards only 
makes sense if they are supported by the very same U-Boot binary.

On boards with the same SoC (even from different vendors) I would very 
much prefer a single U-Boot SPL selecting a board specific device-tree 
to having multiple binaries. We should push developers into this direction.

> 
> I'm not sure, but at some point this is all going to get out of hand.
> Already we have these options:
> 
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION
> common/spl/Kconfig:config SYS_MMCSD_FS_BOOT_PARTITION
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_KERNEL_SECTOR
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_ARGS_SECTOR
> common/spl/Kconfig:config SYS_MMCSD_RAW_MODE_ARGS_SECTORS
> 
> That is just for MMC raw mode.
> 
> For environment we have SYS_MMC_ENV_DEV and _PART. If you look around
> you'll see loads of these options.
> 
> I see that rockchip uses u-boot,spl-boot-order as a way to determine
> the boot order. This makes it configurable without rebuilding
> U-Boot...although I don't think we need to make the MMC stuff
> configurable, since I am assuming that the boot ROM determines at
> least some of it...?

This patch is about SPL loading main U-Boot. So the boot ROM is not 
involved.

> 
> It seems that the whole thing is crying out for a bit of organisation
> and a proper schema.

The discussion was about hard-coding the values vs configuration.

OS distributions should have enough flexibility to deliver an 
installation image with U-Boot for multiple boards on the same medium. 
For the build process it is preferable to use different configurations 
instead of patching source code per U-Boot which might be required if 
hard-coded values for partition GUIDs in the device-trees are used.

I think Tom's approach is right. The U-Boot documentation should give 
guidance on how new boards should find U-Boot SPL and main U-Boot.

Best regards

Heinrich


More information about the U-Boot mailing list