[PATCH] arm: mvebu: Espressobin: Set environment variable fdtfile

Marek Behun marek.behun at nic.cz
Sun Sep 6 18:12:01 CEST 2020


On Sun, 6 Sep 2020 11:32:47 +0200
Pali Rohár <pali at kernel.org> wrote:

> Adding Marek to loop.
> 
> On Saturday 05 September 2020 14:07:44 Andre Heider wrote:
> > Required for the generic distro mechanism.
> > 
> > Linux ships with 4 variants:
> > marvell/armada-3720-espressobin-v7-emmc.dtb
> > marvell/armada-3720-espressobin-v7.dtb
> > marvell/armada-3720-espressobin-emmc.dtb
> > marvell/armada-3720-espressobin.dtb
> > 
> > Use available information to determine the appropriate filename.
> > 
> > Tested on a v5 board without eMMC.
> > 
> > Signed-off-by: Andre Heider <a.heider at gmail.com>
> > ---
> >  arch/arm/mach-mvebu/Kconfig             |  1 +
> >  board/Marvell/mvebu_armada-37xx/board.c | 42 +++++++++++++++++++++++++
> >  2 files changed, 43 insertions(+)
> > 
> > diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
> > index 0d8e0922a2..31f5d26dc2 100644
> > --- a/arch/arm/mach-mvebu/Kconfig
> > +++ b/arch/arm/mach-mvebu/Kconfig
> > @@ -100,6 +100,7 @@ config TARGET_HELIOS4
> >  config TARGET_MVEBU_ARMADA_37XX
> >  	bool "Support Armada 37xx platforms"
> >  	select ARMADA_3700
> > +	select BOARD_LATE_INIT  
> 
> This should go into espressobin defconfig file. Other Armada 37xx board
> do not need to have this option enabled.

I agree with this.

> >  	imply SCSI
> >  
> >  config TARGET_DB_88F6720
> > diff --git a/board/Marvell/mvebu_armada-37xx/board.c b/board/Marvell/mvebu_armada-37xx/board.c
> > index 90bfc139aa..3bf0a08897 100644
> > --- a/board/Marvell/mvebu_armada-37xx/board.c
> > +++ b/board/Marvell/mvebu_armada-37xx/board.c
> > @@ -5,6 +5,7 @@
> >  
> >  #include <common.h>
> >  #include <dm.h>
> > +#include <env.h>
> >  #include <i2c.h>
> >  #include <init.h>
> >  #include <phy.h>
> > @@ -50,6 +51,22 @@ DECLARE_GLOBAL_DATA_PTR;
> >  #define MVEBU_G2_SMI_PHY_CMD_REG	(24)
> >  #define MVEBU_G2_SMI_PHY_DATA_REG	(25)
> >  
> > +/*
> > + * Memory Controller Registers
> > + *
> > + * Assembled based on public information:
> > + * https://gitlab.nic.cz/turris/mox-boot-builder/-/blob/master/wtmi/main.c#L332-336
> > + * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-18.12/drivers/mv_ddr_mc6.h#L309-L332
> > + *
> > + * And checked against the written register values for the various topologies:
> > + * https://github.com/MarvellEmbeddedProcessors/mv-ddr-marvell/blob/mv_ddr-armada-atf-mainline/a3700/mv_ddr_tim.h
> > + */
> > +#define A3700_CH0_MC_CTRL2_REG		MVEBU_REGISTER(0x002c4)
> > +#define A3700_MC_CTRL2_SDRAM_TYPE_MASK	0xf
> > +#define A3700_MC_CTRL2_SDRAM_TYPE_OFFS	4
> > +#define A3700_MC_CTRL2_SDRAM_TYPE_DDR3	2
> > +#define A3700_MC_CTRL2_SDRAM_TYPE_DDR4	3
> > +
> >  int board_early_init_f(void)
> >  {
> >  	return 0;
> > @@ -63,6 +80,31 @@ int board_init(void)
> >  	return 0;
> >  }
> >  
> > +int board_late_init(void)
> > +{
> > +	bool ddr4, emmc;
> > +
> > +	if (!of_machine_is_compatible("globalscale,espressobin"))
> > +		return 0;
> > +
> > +	/* If the memory controller has been configured for DDR4, we're running on v7 */
> > +	ddr4 = ((readl(A3700_CH0_MC_CTRL2_REG) >> A3700_MC_CTRL2_SDRAM_TYPE_OFFS)
> > +		& A3700_MC_CTRL2_SDRAM_TYPE_MASK) == A3700_MC_CTRL2_SDRAM_TYPE_DDR4;  
> 
> Marek, is this correct way to determining V5 vs V7?

If for all ESPRESSObin board versions it is true that
  "all v7 boards are DDR4 only and all v5 boards are DDR3 only"
then yes, you can differentiate with this code. This register is set
early in boot process, by the code in TIM image, and if it was set
incorrectly, the board would not boot into U-Boot.

> > +
> > +	emmc = of_machine_is_compatible("globalscale,espressobin-emmc");
> > +
> > +	if (ddr4 && emmc)
> > +		env_set("fdtfile", "marvell/armada-3720-espressobin-v7-emmc.dtb");
> > +	else if (ddr4)
> > +		env_set("fdtfile", "marvell/armada-3720-espressobin-v7.dtb");
> > +	else if (emmc)
> > +		env_set("fdtfile", "marvell/armada-3720-espressobin-emmc.dtb");
> > +	else
> > +		env_set("fdtfile", "marvell/armada-3720-espressobin.dtb");  
> 
> This code would overwrite user's value of fdtfile variable. And any
> change done by saveenv for fdtfile would be lost. I do not think this is
> correct way as it would break booting other distributions/forks (e.g.
> Marvell one) which DTB file has different name.
> 
> Also user would not be able to adjust usage of its own DTB file if this
> code would overwrite it at every boot.
> 
> Cannot be put value of this variable only to default set? Like all other
> variables? So value would be restored/overwritten only by 'env default'
> call.

There are special U-Boot variables $soc, $board, and $boardver.
In include/config_distro_bootcmd.h look at line
  "setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; "
I think you should be setting $boardver env variable in your code, and
have default bootscript somehow build fdtfile name from this.

Marek


More information about the U-Boot mailing list