SPL: add support to boot from a partition type
PATCH v2 1/1 SPL: add support to boot from a partition type
From: Dalon Westergreen <[email protected]>
the socfpga bootrom supports mmc booting from either a raw image starting at 0x0, or from a partition of type 0xa2. This patch adds support for locating the boot image in the first type 0xa2 partition found.
--- common/spl/Kconfig | 17 +++++++++++++++++ common/spl/spl_mmc.c | 13 +++++++++++++ disk/part_dos.c | 1 + include/part.h | 1 + 4 files changed, 32 insertions(+)
common/spl/Kconfig +17 -0
@@ -97,6 +97,23 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR Address on the MMC to load U-Boot from, when the MMC is being used in raw mode. Units: MMC sectors (1 sector = 512 bytes). +config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE + bool "MMC raw mode: by partition type" + depends on SPL + default y if ARCH_SOCFPGA + help + Use 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" + depends on SPL && SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE + default 0xa2 if ARCH_SOCFPGA + help + Partition Type on the MMC to load U-Boot from, when the MMC is being + used in raw mode. + config TPL bool depends on SPL && SUPPORT_TPL
common/spl/spl_mmc.c +13 -0
@@ -157,6 +157,19 @@ static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,disk_partition_t info;int err; +#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE +if ( partition ==-1 ) { +/* Only support MBR so DOS_ENTRY_NUMBERS */ +for (partition =1 ; partition <=DOS_ENTRY_NUMBERS ; partition++) { + err =part_get_info (mmc_get_blk_desc (mmc), partition, &info); +if (err) +continue ; +if (info.sys_ind ==CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE ) +break ; + } + } +#endif + err =part_get_info (mmc_get_blk_desc (mmc), partition, &info);if (err) {#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
disk/part_dos.c +1 -0
@@ -217,6 +217,7 @@ static int part_get_info_extended(struct blk_desc *dev_desc,#ifdef CONFIG_PARTITION_UUIDS sprintf (info->uuid,"%08x-%02x" , disksig, part_num);#endif + info->sys_ind = pt->sys_ind;return 0 ; }
include/part.h +1 -0
@@ -59,6 +59,7 @@ typedef struct disk_partition {#ifdef CONFIG_PARTITION_TYPE_GUID char type_guid[37 ];/* type GUID as string, if exists */ #endif +uchar sys_ind;/* partition type */ } disk_partition_t;/* Misc _get_dev functions */
Signature · 1 line
2.7.4
PATCH v2 1/1 SPL: add support to boot from a partition type
Quoted 20 lines · Dalon Westergreen
From: Dalon Westergreen <[email protected]>
the socfpga bootrom supports mmc booting from either a raw image starting at
0x0, or from a partition of type0xa2. This patch adds support for locating the boot image in the first type0xa2partition found.Signed-off-by Dalon Westergreen <[email protected]>--- common/spl/Kconfig | 17 +++++++++++++++++ common/spl/spl_mmc.c | 13 +++++++++++++ disk/part_dos.c | 1 + include/part.h | 1 + 4 files changed, 32 insertions(+)common/spl/Kconfig +0
-0
common/spl/Kconfig config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR · line 102
Quoted 6 lines
common/spl/Kconfig +3
-0@@ -97,6 +97,23 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR Address on the MMC to load U-Boot from, when the MMC is being used in raw mode. Units: MMC sectors (1 sector = 512 bytes). +config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE + bool "MMC raw mode: by partition type" + depends on SPL
This also depends on CONFIG_DOS_PARTITION, right? IIRC Tom just merged a patch set that moved it to kconfig, so you can depend on it here now.
common/spl/Kconfig config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR · line 112
Quoted 10 lines
common/spl/Kconfig +10
-0+ default y if ARCH_SOCFPGA + help + Use 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" + depends on SPL && SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE + default 0xa2 if ARCH_SOCFPGA
What's the default for others platforms? In fact, why would any other platform care?
IMHO the best thing to do for now is to instead of "default y" to set it as "depends on ARCH_SOCFPGA". That way we don't accidentally add support for booting 0x00 type partitions to other systems ;).
Alternatively if you think it's nicer to allow non-Altera implementations to boot from partition with a simple kconfig switch, just always default to 0xa2 ragardless of arch.
Quoted 48 lines
common/spl/Kconfig +4
-0+ help + Partition Type on the MMC to load U-Boot from, when the MMC is being + used in raw mode. + config TPL bool depends on SPL && SUPPORT_TPLcommon/spl/spl_mmc.c +13
-0@@ -157,6 +157,19 @@ static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,disk_partition_t info;int err; +#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE +if ( partition ==-1 ) { +/* Only support MBR so DOS_ENTRY_NUMBERS */ +for (partition =1 ; partition <=DOS_ENTRY_NUMBERS ; partition++) { + err =part_get_info (mmc_get_blk_desc (mmc), partition, &info); +if (err) +continue ; +if (info.sys_ind ==CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE ) +break ; + } + } +#endif + err =part_get_info (mmc_get_blk_desc (mmc), partition, &info);if (err) {#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT disk/part_dos.c +1
-0@@ -217,6 +217,7 @@ static int part_get_info_extended(struct blk_desc *dev_desc,#ifdef CONFIG_PARTITION_UUIDS sprintf (info->uuid,"%08x-%02x" , disksig, part_num);#endif + info->sys_ind = pt->sys_ind;return 0 ; }include/part.h +0
-0
include/part.h typedef struct disk_partition { · line 62
Quoted 4 lines
include/part.h +1
-0@@ -59,6 +59,7 @@ typedef struct disk_partition {#ifdef CONFIG_PARTITION_TYPE_GUID char type_guid[37 ];/* type GUID as string, if exists */ #endif +uchar sys_ind;/* partition type */
Shouldn't that also be #ifdef'ed to CONFIG_DOS_PARTITION? At least the field semantic would be obvious then.
Alex