diff mbox series

[U-Boot,v2,1/3] spl: mmc: support uboot image offset on main partition

Message ID 660b7a6df3d1bbc198105dde866dc9506511838e.1564384345.git.baruch@tkos.co.il
State Superseded
Delegated to: Stefan Roese
Headers show
Series [U-Boot,v2,1/3] spl: mmc: support uboot image offset on main partition | expand

Commit Message

Baruch Siach July 29, 2019, 7:12 a.m. UTC
On Armada 38x platforms the ROM code loads SPL from offset 0 of eMMC
hardware boot partitions. When there are no boot partitions (i.e. SD
card) the ROM skips the first sector that usually contains the (logical)
partition table. Since the generated .kwb image contains the main U-Boot
image in a fixed location (0x140 sectors by default), we end up with the
main U-Boot image in offset of 1 sector. The current workaround is to
manually set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x141 to
compensate for that.

This patch uses the run-time detected boot partition to determine the
right offset of the main U-Boot partition. The generated .kwb image is
now compatible with both eMMC boot partition, and SD card main data
partition.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
v2: Rebase on top of current master
---
 common/spl/Kconfig   | 12 ++++++++++++
 common/spl/spl_mmc.c | 15 +++++++++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)

Comments

Stefan Roese Aug. 6, 2019, 6:15 a.m. UTC | #1
On 29.07.19 09:12, Baruch Siach wrote:
> On Armada 38x platforms the ROM code loads SPL from offset 0 of eMMC
> hardware boot partitions. When there are no boot partitions (i.e. SD
> card) the ROM skips the first sector that usually contains the (logical)
> partition table. Since the generated .kwb image contains the main U-Boot
> image in a fixed location (0x140 sectors by default), we end up with the
> main U-Boot image in offset of 1 sector. The current workaround is to
> manually set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x141 to
> compensate for that.
> 
> This patch uses the run-time detected boot partition to determine the
> right offset of the main U-Boot partition. The generated .kwb image is
> now compatible with both eMMC boot partition, and SD card main data
> partition.
> 
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
> v2: Rebase on top of current master
> ---
>   common/spl/Kconfig   | 12 ++++++++++++
>   common/spl/spl_mmc.c | 15 +++++++++++++--
>   2 files changed, 25 insertions(+), 2 deletions(-)
> 
> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> index 5d6da5db89bc..e43eefe046bc 100644
> --- a/common/spl/Kconfig
> +++ b/common/spl/Kconfig
> @@ -293,6 +293,18 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
>   	  Address on the MMC to load U-Boot from, when the MMC is being used
>   	  in raw mode. Units: MMC sectors (1 sector = 512 bytes).
>   
> +config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
> +	hex "U-Boot main hardware partition image offset"
> +	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> +	default 0x0
> +	help
> +	  On some platforms SPL location depends on hardware partition. The ROM
> +	  code skips the MBR sector when loading SPL from main hardware data
> +	  partition. This adds offset to the main U-Boot image. Set this symbol
> +	  to the number of skipped sectors.
> +
> +	  If unsure, leave the default.
> +
>   config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
>   	bool "MMC Raw mode: by partition"
>   	help
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index b3619889f794..72439c029f4a 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -49,6 +49,16 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
>   	return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
>   }
>   
> +static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
> +{
> +#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)

Use if (IS_ENABLED()) instead ?

> +	if (part == 0)

Why is this restricted to part == 0 ?

> +		return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET;
> +#endif
> +
> +	return 0;
> +}
> +
>   static __maybe_unused
>   int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
>   			      struct mmc *mmc, unsigned long sector)
> @@ -312,7 +322,7 @@ int spl_mmc_load(struct spl_image_info *spl_image,
>   	static struct mmc *mmc;
>   	u32 boot_mode;
>   	int err = 0;
> -	__maybe_unused int part;
> +	__maybe_unused int part = 0;
>   
>   	/* Perform peripheral init only once */
>   	if (!mmc) {
> @@ -371,7 +381,8 @@ int spl_mmc_load(struct spl_image_info *spl_image,
>   			return err;
>   #endif
>   #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> -		err = mmc_load_image_raw_sector(spl_image, mmc, raw_sect);
> +		err = mmc_load_image_raw_sector(spl_image, mmc,
> +				raw_sect + spl_mmc_raw_uboot_offset(part));
>   		if (!err)
>   			return err;
>   #endif
> 

Thanks,
Stefan
Stefan Roese Aug. 12, 2019, 1:13 p.m. UTC | #2
Hi Baruch,

On 06.08.19 08:15, Stefan Roese wrote:
> On 29.07.19 09:12, Baruch Siach wrote:
>> On Armada 38x platforms the ROM code loads SPL from offset 0 of eMMC
>> hardware boot partitions. When there are no boot partitions (i.e. SD
>> card) the ROM skips the first sector that usually contains the (logical)
>> partition table. Since the generated .kwb image contains the main U-Boot
>> image in a fixed location (0x140 sectors by default), we end up with the
>> main U-Boot image in offset of 1 sector. The current workaround is to
>> manually set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x141 to
>> compensate for that.
>>
>> This patch uses the run-time detected boot partition to determine the
>> right offset of the main U-Boot partition. The generated .kwb image is
>> now compatible with both eMMC boot partition, and SD card main data
>> partition.
>>
>> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
>> ---
>> v2: Rebase on top of current master
>> ---
>>    common/spl/Kconfig   | 12 ++++++++++++
>>    common/spl/spl_mmc.c | 15 +++++++++++++--
>>    2 files changed, 25 insertions(+), 2 deletions(-)
>>
>> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
>> index 5d6da5db89bc..e43eefe046bc 100644
>> --- a/common/spl/Kconfig
>> +++ b/common/spl/Kconfig
>> @@ -293,6 +293,18 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
>>    	  Address on the MMC to load U-Boot from, when the MMC is being used
>>    	  in raw mode. Units: MMC sectors (1 sector = 512 bytes).
>>    
>> +config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
>> +	hex "U-Boot main hardware partition image offset"
>> +	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
>> +	default 0x0
>> +	help
>> +	  On some platforms SPL location depends on hardware partition. The ROM
>> +	  code skips the MBR sector when loading SPL from main hardware data
>> +	  partition. This adds offset to the main U-Boot image. Set this symbol
>> +	  to the number of skipped sectors.
>> +
>> +	  If unsure, leave the default.
>> +
>>    config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
>>    	bool "MMC Raw mode: by partition"
>>    	help
>> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
>> index b3619889f794..72439c029f4a 100644
>> --- a/common/spl/spl_mmc.c
>> +++ b/common/spl/spl_mmc.c
>> @@ -49,6 +49,16 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
>>    	return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
>>    }
>>    
>> +static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
>> +{
>> +#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
> 
> Use if (IS_ENABLED()) instead ?
> 
>> +	if (part == 0)
> 
> Why is this restricted to part == 0 ?

Any updates on this?

Thanks,
Stefan
Baruch Siach Aug. 12, 2019, 2:25 p.m. UTC | #3
Hi Stefan,

On Mon, Aug 12, 2019 at 03:13:58PM +0200, Stefan Roese wrote:
> On 06.08.19 08:15, Stefan Roese wrote:
> > On 29.07.19 09:12, Baruch Siach wrote:
> > > On Armada 38x platforms the ROM code loads SPL from offset 0 of eMMC
> > > hardware boot partitions. When there are no boot partitions (i.e. SD
> > > card) the ROM skips the first sector that usually contains the (logical)
> > > partition table. Since the generated .kwb image contains the main U-Boot
> > > image in a fixed location (0x140 sectors by default), we end up with the
> > > main U-Boot image in offset of 1 sector. The current workaround is to
> > > manually set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x141 to
> > > compensate for that.
> > > 
> > > This patch uses the run-time detected boot partition to determine the
> > > right offset of the main U-Boot partition. The generated .kwb image is
> > > now compatible with both eMMC boot partition, and SD card main data
> > > partition.
> > > 
> > > Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> > > ---
> > > v2: Rebase on top of current master
> > > ---
> > >    common/spl/Kconfig   | 12 ++++++++++++
> > >    common/spl/spl_mmc.c | 15 +++++++++++++--
> > >    2 files changed, 25 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/common/spl/Kconfig b/common/spl/Kconfig
> > > index 5d6da5db89bc..e43eefe046bc 100644
> > > --- a/common/spl/Kconfig
> > > +++ b/common/spl/Kconfig
> > > @@ -293,6 +293,18 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
> > >    	  Address on the MMC to load U-Boot from, when the MMC is being used
> > >    	  in raw mode. Units: MMC sectors (1 sector = 512 bytes).
> > > +config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
> > > +	hex "U-Boot main hardware partition image offset"
> > > +	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
> > > +	default 0x0
> > > +	help
> > > +	  On some platforms SPL location depends on hardware partition. The ROM
> > > +	  code skips the MBR sector when loading SPL from main hardware data
> > > +	  partition. This adds offset to the main U-Boot image. Set this symbol
> > > +	  to the number of skipped sectors.
> > > +
> > > +	  If unsure, leave the default.
> > > +
> > >    config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
> > >    	bool "MMC Raw mode: by partition"
> > >    	help
> > > diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> > > index b3619889f794..72439c029f4a 100644
> > > --- a/common/spl/spl_mmc.c
> > > +++ b/common/spl/spl_mmc.c
> > > @@ -49,6 +49,16 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
> > >    	return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
> > >    }
> > > +static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
> > > +{
> > > +#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
> > 
> > Use if (IS_ENABLED()) instead ?

CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET is not defined when 
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is disabled. Using 'if 
(IS_ENABLED())' would break the build.

> > 
> > > +	if (part == 0)
> > 
> > Why is this restricted to part == 0 ?

As explained in the commit log, the ROM skips the first sector of the main 
data partition (where part == 0). Otherwise (where part != 0), the ROM load 
SPL from sector 0. That is the whole point of this patch set. Detect the SPL 
offset at run-time, instead of hard coding it at build time.

> Any updates on this?

Thanks for the reminder. I somehow missed your previous email.

baruch
Stefan Roese Aug. 13, 2019, 9:24 a.m. UTC | #4
Hi Baruch,

On 12.08.19 16:25, Baruch Siach wrote:
> Hi Stefan,
> 
> On Mon, Aug 12, 2019 at 03:13:58PM +0200, Stefan Roese wrote:
>> On 06.08.19 08:15, Stefan Roese wrote:
>>> On 29.07.19 09:12, Baruch Siach wrote:
>>>> On Armada 38x platforms the ROM code loads SPL from offset 0 of eMMC
>>>> hardware boot partitions. When there are no boot partitions (i.e. SD
>>>> card) the ROM skips the first sector that usually contains the (logical)
>>>> partition table. Since the generated .kwb image contains the main U-Boot
>>>> image in a fixed location (0x140 sectors by default), we end up with the
>>>> main U-Boot image in offset of 1 sector. The current workaround is to
>>>> manually set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR to 0x141 to
>>>> compensate for that.
>>>>
>>>> This patch uses the run-time detected boot partition to determine the
>>>> right offset of the main U-Boot partition. The generated .kwb image is
>>>> now compatible with both eMMC boot partition, and SD card main data
>>>> partition.
>>>>
>>>> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
>>>> ---
>>>> v2: Rebase on top of current master
>>>> ---
>>>>     common/spl/Kconfig   | 12 ++++++++++++
>>>>     common/spl/spl_mmc.c | 15 +++++++++++++--
>>>>     2 files changed, 25 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/common/spl/Kconfig b/common/spl/Kconfig
>>>> index 5d6da5db89bc..e43eefe046bc 100644
>>>> --- a/common/spl/Kconfig
>>>> +++ b/common/spl/Kconfig
>>>> @@ -293,6 +293,18 @@ config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
>>>>     	  Address on the MMC to load U-Boot from, when the MMC is being used
>>>>     	  in raw mode. Units: MMC sectors (1 sector = 512 bytes).
>>>> +config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
>>>> +	hex "U-Boot main hardware partition image offset"
>>>> +	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
>>>> +	default 0x0
>>>> +	help
>>>> +	  On some platforms SPL location depends on hardware partition. The ROM
>>>> +	  code skips the MBR sector when loading SPL from main hardware data
>>>> +	  partition. This adds offset to the main U-Boot image. Set this symbol
>>>> +	  to the number of skipped sectors.
>>>> +
>>>> +	  If unsure, leave the default.
>>>> +
>>>>     config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
>>>>     	bool "MMC Raw mode: by partition"
>>>>     	help
>>>> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
>>>> index b3619889f794..72439c029f4a 100644
>>>> --- a/common/spl/spl_mmc.c
>>>> +++ b/common/spl/spl_mmc.c
>>>> @@ -49,6 +49,16 @@ static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
>>>>     	return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
>>>>     }
>>>> +static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
>>>> +{
>>>> +#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
>>>
>>> Use if (IS_ENABLED()) instead ?
> 
> CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET is not defined when
> CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR is disabled. Using 'if
> (IS_ENABLED())' would break the build.
> 
>>>
>>>> +	if (part == 0)
>>>
>>> Why is this restricted to part == 0 ?
> 
> As explained in the commit log, the ROM skips the first sector of the main
> data partition (where part == 0). Otherwise (where part != 0), the ROM load
> SPL from sector 0. That is the whole point of this patch set. Detect the SPL
> offset at run-time, instead of hard coding it at build time.

I see, thanks. Frankly, I don't really like this SoC specific extension
in the common code. Even though its "configurable" and won't "hurt" the
other users of this code. But I also don't see a better way to implement
this feature. So if nobody else objects, lets move forward with this
patchset.

Thanks,
Stefan
diff mbox series

Patch

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 5d6da5db89bc..e43eefe046bc 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -293,6 +293,18 @@  config SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
 	  Address on the MMC to load U-Boot from, when the MMC is being used
 	  in raw mode. Units: MMC sectors (1 sector = 512 bytes).
 
+config SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET
+	hex "U-Boot main hardware partition image offset"
+	depends on SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+	default 0x0
+	help
+	  On some platforms SPL location depends on hardware partition. The ROM
+	  code skips the MBR sector when loading SPL from main hardware data
+	  partition. This adds offset to the main U-Boot image. Set this symbol
+	  to the number of skipped sectors.
+
+	  If unsure, leave the default.
+
 config SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
 	bool "MMC Raw mode: by partition"
 	help
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index b3619889f794..72439c029f4a 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -49,6 +49,16 @@  static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
 	return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
 }
 
+static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
+{
+#if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
+	if (part == 0)
+		return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET;
+#endif
+
+	return 0;
+}
+
 static __maybe_unused
 int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
 			      struct mmc *mmc, unsigned long sector)
@@ -312,7 +322,7 @@  int spl_mmc_load(struct spl_image_info *spl_image,
 	static struct mmc *mmc;
 	u32 boot_mode;
 	int err = 0;
-	__maybe_unused int part;
+	__maybe_unused int part = 0;
 
 	/* Perform peripheral init only once */
 	if (!mmc) {
@@ -371,7 +381,8 @@  int spl_mmc_load(struct spl_image_info *spl_image,
 			return err;
 #endif
 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
-		err = mmc_load_image_raw_sector(spl_image, mmc, raw_sect);
+		err = mmc_load_image_raw_sector(spl_image, mmc,
+				raw_sect + spl_mmc_raw_uboot_offset(part));
 		if (!err)
 			return err;
 #endif