diff mbox

[U-Boot,v2] SPL: add support to boot from a partition type

Message ID 1485659596-5453-1-git-send-email-dwesterg@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Dalon Westergreen Jan. 29, 2017, 3:13 a.m. UTC
From: Dalon Westergreen <dalon.westergreen@intel.com>

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.

Signed-off-by: Dalon Westergreen <dalon.westergreen@intel.com>
---
 common/spl/Kconfig   | 17 +++++++++++++++++
 common/spl/spl_mmc.c | 13 +++++++++++++
 disk/part_dos.c      |  1 +
 include/part.h       |  1 +
 4 files changed, 32 insertions(+)

Comments

Alexander Graf Jan. 30, 2017, 2:37 p.m. UTC | #1
On 01/29/2017 04:13 AM, Dalon Westergreen wrote:
> From: Dalon Westergreen <dalon.westergreen@intel.com>
>
> 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.
>
> Signed-off-by: Dalon Westergreen <dalon.westergreen@intel.com>
> ---
>   common/spl/Kconfig   | 17 +++++++++++++++++
>   common/spl/spl_mmc.c | 13 +++++++++++++
>   disk/part_dos.c      |  1 +
>   include/part.h       |  1 +
>   4 files changed, 32 insertions(+)
>
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index b1aa148..a0430ec 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -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.

> +	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.

> +	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
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index 0cd355c..cce9584 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -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
> diff --git a/disk/part_dos.c b/disk/part_dos.c
> index ed78334..f485f11 100644
> --- a/disk/part_dos.c
> +++ b/disk/part_dos.c
> @@ -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;
>   		}
>   
> diff --git a/include/part.h b/include/part.h
> index 0979005..a58b687 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -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
diff mbox

Patch

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index b1aa148..a0430ec 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -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
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 0cd355c..cce9584 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -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
diff --git a/disk/part_dos.c b/disk/part_dos.c
index ed78334..f485f11 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -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;
 		}
 
diff --git a/include/part.h b/include/part.h
index 0979005..a58b687 100644
--- a/include/part.h
+++ b/include/part.h
@@ -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 */