diff mbox series

[1/2] spl: socfpga: Getting SPL boot device from DT

Message ID 20220916142336.18907-1-jit.loon.lim@intel.com
State Needs Review / ACK, archived
Delegated to: Marek Vasut
Headers show
Series [1/2] spl: socfpga: Getting SPL boot device from DT | expand

Commit Message

Jit Loon Lim Sept. 16, 2022, 2:23 p.m. UTC
From: Tien Fong Chee <tien.fong.chee@intel.com>

Current SPL boot device is harcoded with MMC1, this implementation
would inhibit the support of other boot device. So, this patch is
created to get the boot device from DT, user should define the boot
device in property "u-boot,boot0". Default MMC1 would be boot device if
no boot device is defined in DT.

Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
Signed-off-by: Jit Loon Lim <jit.loon.lim@intel.com>
---
 arch/arm/dts/socfpga_stratix10_socdk.dts |  1 +
 arch/arm/mach-socfpga/spl_s10.c          | 65 ++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

Comments

Quentin Schulz Sept. 16, 2022, 2:31 p.m. UTC | #1
Hi Jit Loon Lim,

On 9/16/22 16:23, Jit Loon Lim wrote:
> From: Tien Fong Chee <tien.fong.chee@intel.com>
> 
> Current SPL boot device is harcoded with MMC1, this implementation
> would inhibit the support of other boot device. So, this patch is
> created to get the boot device from DT, user should define the boot
> device in property "u-boot,boot0". Default MMC1 would be boot device if

Isn't u-boot,spl-boot-order DT property what you're after? We use this 
property to specify the order in which the listed media will be tried 
for loading U-Boot proper from the SPL. Is this what you're trying to do 
with u-boot,boot0 ? (you'll still need to implement the same logic I'm 
just arguing about the name that was picked for the property).

Cheers,
Quentin

> no boot device is defined in DT.
> 
> Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> Signed-off-by: Jit Loon Lim <jit.loon.lim@intel.com>
> ---
>   arch/arm/dts/socfpga_stratix10_socdk.dts |  1 +
>   arch/arm/mach-socfpga/spl_s10.c          | 65 ++++++++++++++++++++++++
>   2 files changed, 66 insertions(+)
> 
> diff --git a/arch/arm/dts/socfpga_stratix10_socdk.dts b/arch/arm/dts/socfpga_stratix10_socdk.dts
> index 8aa55a60ab..c8e9261f48 100755
> --- a/arch/arm/dts/socfpga_stratix10_socdk.dts
> +++ b/arch/arm/dts/socfpga_stratix10_socdk.dts
> @@ -16,6 +16,7 @@
>   
>   	chosen {
>   		stdout-path = "serial0:115200n8";
> +		u-boot,boot0 = <&mmc>;
>   	};
>   
>   	leds {
> diff --git a/arch/arm/mach-socfpga/spl_s10.c b/arch/arm/mach-socfpga/spl_s10.c
> index dad2ac5d0d..c4b82ebf14 100644
> --- a/arch/arm/mach-socfpga/spl_s10.c
> +++ b/arch/arm/mach-socfpga/spl_s10.c
> @@ -13,6 +13,8 @@
>   #include <asm/utils.h>
>   #include <common.h>
>   #include <debug_uart.h>
> +#include <dm.h>
> +#include <dm/ofnode.h>
>   #include <image.h>
>   #include <spl.h>
>   #include <asm/arch/clock_manager.h>
> @@ -27,6 +29,69 @@
>   
>   DECLARE_GLOBAL_DATA_PTR;
>   
> +u32 spl_boot_device(void)
> +{
> +	int ret, size;
> +	ofnode node;
> +	const fdt32_t *phandle_p;
> +	u32 phandle;
> +	struct udevice *dev;
> +
> +	node = ofnode_path("/chosen");
> +	if (!ofnode_valid(node)) {
> +		debug("%s: /chosen node was not found.\n", __func__);
> +		goto fallback;
> +	}
> +
> +	phandle_p = ofnode_get_property(node, "u-boot,boot0", &size);
> +	if (!phandle_p) {
> +		debug("%s: u-boot,boot0 property was not found.\n",
> +		     __func__);
> +		goto fallback;
> +	}
> +
> +	phandle = fdt32_to_cpu(*phandle_p);
> +
> +	node = ofnode_get_by_phandle(phandle);
> +
> +	ret = device_get_global_by_ofnode(node, &dev);
> +	if (ret) {
> +		debug("%s: Boot device at not found, error: %d\n", __func__,
> +		      ret);
> +		goto fallback;
> +	}
> +
> +	debug("%s: Found boot device %s\n", __func__, dev->name);
> +
> +	switch (device_get_uclass_id(dev)) {
> +	case UCLASS_SPI_FLASH:
> +		return BOOT_DEVICE_SPI;
> +	case UCLASS_MISC:
> +		return BOOT_DEVICE_NAND;
> +	case UCLASS_MMC:
> +		return BOOT_DEVICE_MMC1;
> +	default:
> +		debug("%s: Booting from device uclass '%s' is not "
> +		      "supported\n", __func__,
> +		      dev_get_uclass_name(dev));
> +	}
> +
> +fallback:
> +	/* Return default boot device */
> +	return BOOT_DEVICE_MMC1;
> +}
> +
> +#ifdef CONFIG_SPL_MMC_SUPPORT
> +u32 spl_mmc_boot_mode(const u32 boot_device)
> +{
> +#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
> +	return MMCSD_MODE_FS;
> +#else
> +	return MMCSD_MODE_RAW;
> +#endif
> +}
> +#endif
> +
>   void board_init_f(ulong dummy)
>   {
>   	const struct cm_config *cm_default_cfg = cm_get_default_config();
diff mbox series

Patch

diff --git a/arch/arm/dts/socfpga_stratix10_socdk.dts b/arch/arm/dts/socfpga_stratix10_socdk.dts
index 8aa55a60ab..c8e9261f48 100755
--- a/arch/arm/dts/socfpga_stratix10_socdk.dts
+++ b/arch/arm/dts/socfpga_stratix10_socdk.dts
@@ -16,6 +16,7 @@ 
 
 	chosen {
 		stdout-path = "serial0:115200n8";
+		u-boot,boot0 = <&mmc>;
 	};
 
 	leds {
diff --git a/arch/arm/mach-socfpga/spl_s10.c b/arch/arm/mach-socfpga/spl_s10.c
index dad2ac5d0d..c4b82ebf14 100644
--- a/arch/arm/mach-socfpga/spl_s10.c
+++ b/arch/arm/mach-socfpga/spl_s10.c
@@ -13,6 +13,8 @@ 
 #include <asm/utils.h>
 #include <common.h>
 #include <debug_uart.h>
+#include <dm.h>
+#include <dm/ofnode.h>
 #include <image.h>
 #include <spl.h>
 #include <asm/arch/clock_manager.h>
@@ -27,6 +29,69 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
+u32 spl_boot_device(void)
+{
+	int ret, size;
+	ofnode node;
+	const fdt32_t *phandle_p;
+	u32 phandle;
+	struct udevice *dev;
+
+	node = ofnode_path("/chosen");
+	if (!ofnode_valid(node)) {
+		debug("%s: /chosen node was not found.\n", __func__);
+		goto fallback;
+	}
+
+	phandle_p = ofnode_get_property(node, "u-boot,boot0", &size);
+	if (!phandle_p) {
+		debug("%s: u-boot,boot0 property was not found.\n",
+		     __func__);
+		goto fallback;
+	}
+
+	phandle = fdt32_to_cpu(*phandle_p);
+
+	node = ofnode_get_by_phandle(phandle);
+
+	ret = device_get_global_by_ofnode(node, &dev);
+	if (ret) {
+		debug("%s: Boot device at not found, error: %d\n", __func__,
+		      ret);
+		goto fallback;
+	}
+
+	debug("%s: Found boot device %s\n", __func__, dev->name);
+
+	switch (device_get_uclass_id(dev)) {
+	case UCLASS_SPI_FLASH:
+		return BOOT_DEVICE_SPI;
+	case UCLASS_MISC:
+		return BOOT_DEVICE_NAND;
+	case UCLASS_MMC:
+		return BOOT_DEVICE_MMC1;
+	default:
+		debug("%s: Booting from device uclass '%s' is not "
+		      "supported\n", __func__,
+		      dev_get_uclass_name(dev));
+	}
+
+fallback:
+	/* Return default boot device */
+	return BOOT_DEVICE_MMC1;
+}
+
+#ifdef CONFIG_SPL_MMC_SUPPORT
+u32 spl_mmc_boot_mode(const u32 boot_device)
+{
+#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
+	return MMCSD_MODE_FS;
+#else
+	return MMCSD_MODE_RAW;
+#endif
+}
+#endif
+
 void board_init_f(ulong dummy)
 {
 	const struct cm_config *cm_default_cfg = cm_get_default_config();