[PATCH v4 2/6] rockchip: puma-rk3399: do not hardcode MMC controller paths

Kever Yang kever.yang at rock-chips.com
Thu Jan 18 04:11:44 CET 2024


On 2024/1/18 01:59, Quentin Schulz wrote:
> From: Quentin Schulz <quentin.schulz at theobroma-systems.com>
>
> To prepare to put the similar logic around storage medium selection for
> Ringneck PX30 and Puma RK3399 in common, let's not use hardcoded paths
> but use uclass functions instead to find udevice based on their DT node
> full path.
>
> Cc: Quentin Schulz <foss+uboot at 0leil.net>
> Signed-off-by: Quentin Schulz <quentin.schulz at theobroma-systems.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>   board/theobroma-systems/puma_rk3399/puma-rk3399.c | 81 +++++++++++++----------
>   1 file changed, 46 insertions(+), 35 deletions(-)
>
> diff --git a/board/theobroma-systems/puma_rk3399/puma-rk3399.c b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> index 614a60ee8f9..b8b718da243 100644
> --- a/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> +++ b/board/theobroma-systems/puma_rk3399/puma-rk3399.c
> @@ -82,33 +82,36 @@ static int setup_boottargets(void)
>   	 * was used to load U-Boot proper. If SPI-NOR flash was used, keep
>   	 * original default order.
>   	 */
> -	if (strcmp(boot_device, "/spi at ff1d0000/flash at 0")) {
> -		bool sd_booted = !strcmp(boot_device, "/mmc at fe320000");
> -		char *mmc0, *mmc1;
> -
> -		debug("%s: booted from %s\n", __func__,
> -		      sd_booted ? "SD-Card" : "eMMC");
> -		mmc0 = strstr(env, "mmc0");
> -		mmc1 = strstr(env, "mmc1");
> -
> -		if (!mmc0 || !mmc1) {
> -			debug("%s: only one mmc boot_target found\n", __func__);
> -			return -1;
> -		}
> -
> -		/*
> -		 * If mmc0 comes first in the boot order and U-Boot proper was
> -		 * loaded from mmc1, swap mmc0 and mmc1 in the list.
> -		 * If mmc1 comes first in the boot order and U-Boot proper was
> -		 * loaded from mmc0, swap mmc0 and mmc1 in the list.
> -		 */
> -		if ((mmc0 < mmc1 && sd_booted) ||
> -		    (mmc0 > mmc1 && !sd_booted)) {
> -			mmc0[3] = '1';
> -			mmc1[3] = '0';
> -			debug("%s: set boot_targets to: %s\n", __func__, env);
> -			env_set("boot_targets", env);
> -		}
> +	struct udevice *devp;
> +
> +	if (uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &devp)) {
> +		debug("%s: not reordering boot_targets, bootdev %s != MMC\n",
> +		      __func__, boot_device);
> +		return 0;
> +	}
> +
> +	char *mmc0, *mmc1;
> +
> +	mmc0 = strstr(env, "mmc0");
> +	mmc1 = strstr(env, "mmc1");
> +
> +	if (!mmc0 || !mmc1) {
> +		debug("%s: only one mmc boot_target found\n", __func__);
> +		return -1;
> +	}
> +
> +	/*
> +	 * If mmc0 comes first in the boot order and U-Boot proper was
> +	 * loaded from mmc1, swap mmc0 and mmc1 in the list.
> +	 * If mmc1 comes first in the boot order and U-Boot proper was
> +	 * loaded from mmc0, swap mmc0 and mmc1 in the list.
> +	 */
> +	if ((mmc0 < mmc1 && devp->seq_ == 1) ||
> +	    (mmc0 > mmc1 && devp->seq_ == 0)) {
> +		mmc0[3] = '1';
> +		mmc1[3] = '0';
> +		debug("%s: set boot_targets to: %s\n", __func__, env);
> +		env_set("boot_targets", env);
>   	}
>   
>   	return 0;
> @@ -118,28 +121,37 @@ int mmc_get_env_dev(void)
>   {
>   	const char *boot_device =
>   		ofnode_read_chosen_string("u-boot,spl-boot-device");
> +	struct udevice *devp;
>   
>   	if (!boot_device) {
>   		debug("%s: /chosen/u-boot,spl-boot-device not set\n",
>   		      __func__);
> +#ifdef CONFIG_SYS_MMC_ENV_DEV
>   		return CONFIG_SYS_MMC_ENV_DEV;
> +#else
> +		return 0;
> +#endif
>   	}
>   
>   	debug("%s: booted from %s\n", __func__, boot_device);
>   
> -	if (!strcmp(boot_device, "/mmc at fe320000"))
> -		return 1;
> -
> -	if (!strcmp(boot_device, "/mmc at fe330000"))
> +	if (uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &devp))
> +#ifdef CONFIG_SYS_MMC_ENV_DEV
> +		return CONFIG_SYS_MMC_ENV_DEV;
> +#else
>   		return 0;
> +#endif
> +
> +	debug("%s: get MMC ENV from mmc%d\n", __func__, devp->seq_);
>   
> -	return CONFIG_SYS_MMC_ENV_DEV;
> +	return devp->seq_;
>   }
>   
>   enum env_location arch_env_get_location(enum env_operation op, int prio)
>   {
>   	const char *boot_device =
>   		ofnode_read_chosen_string("u-boot,spl-boot-device");
> +	struct udevice *devp;
>   
>   	if (prio > 0)
>   		return ENVL_UNKNOWN;
> @@ -153,12 +165,11 @@ enum env_location arch_env_get_location(enum env_operation op, int prio)
>   	debug("%s: booted from %s\n", __func__, boot_device);
>   
>   	if (IS_ENABLED(CONFIG_ENV_IS_IN_SPI_FLASH) &&
> -	    !strcmp(boot_device, "/spi at ff1d0000/flash at 0"))
> +	    !uclass_find_device_by_ofnode(UCLASS_SPI_FLASH, ofnode_path(boot_device), &devp))
>   		return ENVL_SPI_FLASH;
>   
>   	if (IS_ENABLED(CONFIG_ENV_IS_IN_MMC) &&
> -	    (!strcmp(boot_device, "/mmc at fe320000") ||
> -	     !strcmp(boot_device, "/mmc at fe330000")))
> +	    !uclass_find_device_by_ofnode(UCLASS_MMC, ofnode_path(boot_device), &devp))
>   		return ENVL_MMC;
>   
>   	printf("%s: No environment available: booted from %s but U-Boot "
>


More information about the U-Boot mailing list