All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC PATCH 1/2] arm64: zynqmp: Setup the first boot_target at run time
Date: Thu, 26 Apr 2018 08:14:48 +0200	[thread overview]
Message-ID: <b7907eb8-22c0-0762-9aa1-a7c15bda6907@suse.de> (raw)
In-Reply-To: <8fad3265d924092e94aae75d4141a61872a61685.1524659886.git.michal.simek@xilinx.com>



On 25.04.18 14:38, Michal Simek wrote:
> Detect mmc alias at run time for setting up proper boot_targets sequence.
> The first target has to correspond with boot mode.
> 
> The purpose of this patch is to get rid of CONFIG_ZYNQ_SDHCI0/1
> parameters in full U-Boot.
> Unfortunately this patch can't remove it because there is missing
> mmc implementation for SPL_DM_SEQ_ALIAS.
> 
> Also xilinx_zynqmp.h only setup boot commands for mmc0 and mmc1.
> It means using aliases with higher number won't work. But switching
> between mmc0 and mmc1 should work properly.
> 
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
> 
> Not sure how exactly to tune BOOT_TARGET_DEVICES_MMC to have functions
> for different aliases ID. I can simply setup devnum based on dev->seq
> and also generate the whole bootcmd_mmc0
> 
> bootcmd_mmc0=setenv devnum 0; run mmc_boot
> bootcmd_mmc1=setenv devnum 1; run mmc_boot
> 
> The second patch is doing that.
> But still if you setup alias to higher number mmc core is not mmc dev
> command is not able to work with it.

I don't understand this sentence.

> ---
>  board/xilinx/zynqmp/zynqmp.c | 45 ++++++++++++++++++++++++++++--------
>  1 file changed, 35 insertions(+), 10 deletions(-)
> 
> diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> index f7fe1fdfff7b..96ea0f578d30 100644
> --- a/board/xilinx/zynqmp/zynqmp.c
> +++ b/board/xilinx/zynqmp/zynqmp.c
> @@ -16,6 +16,7 @@
>  #include <asm/arch/sys_proto.h>
>  #include <asm/arch/psu_init_gpl.h>
>  #include <asm/io.h>
> +#include <dm/device.h>
>  #include <dm/uclass.h>
>  #include <usb.h>
>  #include <dwc3-uboot.h>
> @@ -454,6 +455,9 @@ int board_late_init(void)
>  {
>  	u32 reg = 0;
>  	u8 bootmode;
> +	struct udevice *dev;
> +	int bootseq = -1;
> +	int bootseq_len = 0;
>  	int env_targets_len = 0;
>  	const char *mode;
>  	char *new_targets;
> @@ -499,7 +503,15 @@ int board_late_init(void)
>  		break;
>  	case SD_MODE:
>  		puts("SD_MODE\n");
> -		mode = "mmc0";
> +		if (uclass_get_device_by_name(UCLASS_MMC,
> +					      "sdhci at ff160000", &dev)) {

I think you need to check whether probing actually succeeded, no?
Otherwise seq is invalid (-1).

So this should be if (uclass...() || (dev && dev->flags &
DM_FLAG_ACTIVATED))

> +			puts("Boot from SD0 but without SD0 enabled!\n");
> +			return -1;
> +		}
> +		debug("mmc0 device found at %p, seq %d\n", dev, dev->seq);
> +
> +		mode = "mmc";
> +		bootseq = dev->seq;
>  		env_set("modeboot", "sdboot");
>  		break;
>  	case SD1_LSHFT_MODE:
> @@ -507,12 +519,15 @@ int board_late_init(void)
>  		/* fall through */
>  	case SD_MODE1:
>  		puts("SD_MODE1\n");
> -#if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
> -		mode = "mmc1";
> -		env_set("sdbootdev", "1");
> -#else
> -		mode = "mmc0";
> -#endif
> +		if (uclass_get_device_by_name(UCLASS_MMC,
> +					      "sdhci at ff170000", &dev)) {
> +			puts("Boot from SD1 but without SD1 enabled!\n");
> +			return -1;
> +		}
> +		debug("mmc1 device found at %p, seq %d\n", dev, dev->seq);
> +
> +		mode = "mmc";
> +		bootseq = dev->seq;
>  		env_set("modeboot", "sdboot");
>  		break;
>  	case NAND_MODE:
> @@ -526,6 +541,11 @@ int board_late_init(void)
>  		break;
>  	}
>  
> +	if (bootseq >= 0) {
> +		bootseq_len = snprintf(NULL, 0, "%i", bootseq);

This seems like quite a heavy way to figure out the number of digits of
an integer ;).


Alex

> +		debug("Bootseq len: %x\n", bootseq_len);
> +	}
> +
>  	/*
>  	 * One terminating char + one byte for space between mode
>  	 * and default boot_targets
> @@ -534,10 +554,15 @@ int board_late_init(void)
>  	if (env_targets)
>  		env_targets_len = strlen(env_targets);
>  
> -	new_targets = calloc(1, strlen(mode) + env_targets_len + 2);
> +	new_targets = calloc(1, strlen(mode) + env_targets_len + 2 +
> +			     bootseq_len);
>  
> -	sprintf(new_targets, "%s %s", mode,
> -		env_targets ? env_targets : "");
> +	if (bootseq >= 0)
> +		sprintf(new_targets, "%s%x %s", mode, bootseq,
> +			env_targets ? env_targets : "");
> +	else
> +		sprintf(new_targets, "%s %s", mode,
> +			env_targets ? env_targets : "");
>  
>  	env_set("boot_targets", new_targets);
>  
> 

  parent reply	other threads:[~2018-04-26  6:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-25 12:38 [U-Boot] [RFC PATCH 1/2] arm64: zynqmp: Setup the first boot_target at run time Michal Simek
2018-04-25 12:38 ` [U-Boot] [RFC PATCH 2/2] arm64: zynqmp: Try to create bootcm_mmcX " Michal Simek
2018-04-26  6:23   ` Alexander Graf
2018-04-26  6:27     ` Michal Simek
2018-04-26  6:14 ` Alexander Graf [this message]
2018-04-26  6:25   ` [U-Boot] [RFC PATCH 1/2] arm64: zynqmp: Setup the first boot_target " Michal Simek
2018-04-26  7:08     ` Alexander Graf
2018-04-26  8:20       ` Michal Simek
2018-04-26  8:46         ` Alexander Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b7907eb8-22c0-0762-9aa1-a7c15bda6907@suse.de \
    --to=agraf@suse.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.