[linux-sunxi] [PATCH 07/17] sunxi: support loading with SPL > 32KB

Jernej Škrabec jernej.skrabec at siol.net
Mon Jan 11 19:17:47 CET 2021


Dne ponedeljek, 04. januar 2021 ob 03:02:03 CET je Samuel Holland napisal(a):
> On 1/3/21 3:26 AM, Jernej Skrabec wrote:
> > From: Andre Przywara <andre.przywara at arm.com>
> > 
> > H616 supports and needs bigger SPL than 32 KiB, mostly due to big DRAM
> > driver and need for PMIC configuration, which pull several drivers which
> > are not needed otherwise.
> > 
> > Signed-off-by: Andre Przywara <andre.przywara at arm.com>
> > Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
> > ---
> >  arch/arm/mach-sunxi/board.c | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> > 
> > diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
> > index 7a8b303f233c..296efd615769 100644
> > --- a/arch/arm/mach-sunxi/board.c
> > +++ b/arch/arm/mach-sunxi/board.c
> > @@ -277,6 +277,14 @@ uint32_t sunxi_get_boot_device(void)
> >  }
> >  
> >  #ifdef CONFIG_SPL_BUILD
> > +static u32 sunxi_get_spl_size(void)
> > +{
> > +	if (!is_boot0_magic(SPL_ADDR + 4)) /* eGON.BT0 */
> > +		return 32768;
> In the context of the suggestion below, this case could return 0.
> 
> > +
> > +	return readl(SPL_ADDR + 0x10);
> > +}
> > +
> >  /*
> >   * The eGON SPL image can be located at 8KB or at 128KB into an SD card 
or
> >   * an eMMC device. The boot source has bit 4 set in the latter case.
> > @@ -286,6 +294,7 @@ uint32_t sunxi_get_boot_device(void)
> >  unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc)
> 
> As a side note, the prototype for this function was changed in commit
> cf0082559698 ("spl: mmc: Fix spl_mmc_get_uboot_raw_sector()
> implementation"), but nobody noticed since it is not in a header.
> 
> >  {
> >  	unsigned long sector = CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR;
> > +	u32 spl_size = sunxi_get_spl_size();
> >  
> >  	switch (sunxi_get_boot_source()) {
> >  	case SUNXI_BOOTED_FROM_MMC0_HIGH:
> > @@ -294,6 +303,9 @@ unsigned long spl_mmc_get_uboot_raw_sector(struct mmc 
*mmc)
> >  		break;
> >  	}
> >  
> > +	if (spl_size > 32768)
> > +		sector += (spl_size - 32768) / 512;
> > +
> 
> What I would suggest doing instead of this is setting
> SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x40,
> SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET=0x10, and then before the
> switch statement doing:
> 
>         sector = max(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
>                      spl_size / 512);
> 
> Not only does this get rid of the magic 32768 constant (which is
> meaningless on new platforms), but it also works cleanly for eMMC boot
> partitions (where there's no 0x10 sector offset).

Thanks for the suggestion, this is indeed much cleaner.

Best regards,
Jernej

> 
> >  	return sector;
> >  }
> >  
> > 
> 
> Cheers,
> Samuel
> 




More information about the U-Boot mailing list