diff mbox series

[v1] qemu-arm: round down memory to multiple of 2MB

Message ID 20210211120426.159999-1-igor.opaniuk@gmail.com
State Deferred
Delegated to: Tom Rini
Headers show
Series [v1] qemu-arm: round down memory to multiple of 2MB | expand

Commit Message

Igor Opaniuk Feb. 11, 2021, 12:04 p.m. UTC
From: Igor Opaniuk <igor.opaniuk@foundries.io>

When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
In case amount of memory provided to QEMU is not multiple
of 2 MB, round down the amount of available memory to avoid hang
during MMU initialization.

How to reproduce:
qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs

DRAM:  1 GiB
initcall: 60011df8
initcall: 60011904
New Stack Pointer is: 80fffe90
initcall: 60011a20
initcall: 60011bcc
initcall: 60011bd4
initcall: 600119b4
Relocation Offset is: 22042000
Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
initcall: 60011b8c
initcall: 82053ea0
initcall: 82053ea8
initcall: 60012040 (relocated to 82054040)
dram_bank_mmu_setup: bank: 0
--- hang here during mmu init ---

Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>

---

 board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Heinrich Schuchardt Feb. 11, 2021, 2:18 p.m. UTC | #1
On 11.02.21 13:04, Igor Opaniuk wrote:
> From: Igor Opaniuk <igor.opaniuk@foundries.io>
>
> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
> In case amount of memory provided to QEMU is not multiple
> of 2 MB, round down the amount of available memory to avoid hang
> during MMU initialization.
>
> How to reproduce:
> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
>
> DRAM:  1 GiB
> initcall: 60011df8
> initcall: 60011904
> New Stack Pointer is: 80fffe90
> initcall: 60011a20
> initcall: 60011bcc
> initcall: 60011bd4
> initcall: 600119b4
> Relocation Offset is: 22042000
> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
> initcall: 60011b8c
> initcall: 82053ea0
> initcall: 82053ea8
> initcall: 60012040 (relocated to 82054040)
> dram_bank_mmu_setup: bank: 0
> --- hang here during mmu init ---
>
> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
> Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
>
> ---
>
>  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> index aa68bef469..841dd7af0e 100644
> --- a/board/emulation/qemu-arm/qemu-arm.c
> +++ b/board/emulation/qemu-arm/qemu-arm.c
> @@ -84,6 +84,18 @@ int dram_init(void)
>  	if (fdtdec_setup_mem_size_base() != 0)
>  		return -EINVAL;
>
> +	/*
> +	 * When LPAE is enabled (ARMv7),
> +	 * 1:1 mapping is created using 2 MB blocks.
> +	 *
> +	 * In case amount of memory provided to QEMU
> +	 * is not multiple of 2 MB, round down the amount
> +	 * of available memory to avoid hang during MMU
> +	 * initialization.
> +	 */
> +	if (CONFIG_IS_ENABLED(ARMV7_LPAE))
> +		gd->ram_size -= (gd->ram_size % 0x200000);

Is the problem LPAE specific?
Couldn't you provoke same problem using an odd memory size without LPAE,
e.g qemu-system-arm -m 536870908 (512 MiB - 4)?

Best regards

Heinrich

> +
>  	return 0;
>  }
>
>
Ard Biesheuvel Feb. 11, 2021, 2:56 p.m. UTC | #2
On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 11.02.21 13:04, Igor Opaniuk wrote:
> > From: Igor Opaniuk <igor.opaniuk@foundries.io>
> >
> > When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
> > In case amount of memory provided to QEMU is not multiple
> > of 2 MB, round down the amount of available memory to avoid hang
> > during MMU initialization.
> >
> > How to reproduce:
> > qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
> > qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
> >
> > DRAM:  1 GiB
> > initcall: 60011df8
> > initcall: 60011904
> > New Stack Pointer is: 80fffe90
> > initcall: 60011a20
> > initcall: 60011bcc
> > initcall: 60011bd4
> > initcall: 600119b4
> > Relocation Offset is: 22042000
> > Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
> > initcall: 60011b8c
> > initcall: 82053ea0
> > initcall: 82053ea8
> > initcall: 60012040 (relocated to 82054040)
> > dram_bank_mmu_setup: bank: 0
> > --- hang here during mmu init ---
> >
> > Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
> > Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
> >
> > ---
> >
> >  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> >
> > diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > index aa68bef469..841dd7af0e 100644
> > --- a/board/emulation/qemu-arm/qemu-arm.c
> > +++ b/board/emulation/qemu-arm/qemu-arm.c
> > @@ -84,6 +84,18 @@ int dram_init(void)
> >       if (fdtdec_setup_mem_size_base() != 0)
> >               return -EINVAL;
> >
> > +     /*
> > +      * When LPAE is enabled (ARMv7),
> > +      * 1:1 mapping is created using 2 MB blocks.
> > +      *
> > +      * In case amount of memory provided to QEMU
> > +      * is not multiple of 2 MB, round down the amount
> > +      * of available memory to avoid hang during MMU
> > +      * initialization.
> > +      */
> > +     if (CONFIG_IS_ENABLED(ARMV7_LPAE))
> > +             gd->ram_size -= (gd->ram_size % 0x200000);
>
> Is the problem LPAE specific?
> Couldn't you provoke same problem using an odd memory size without LPAE,
> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
>

The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
I don't think QEMU's -m option takes fractional megabyte values.
Heinrich Schuchardt Feb. 11, 2021, 3:34 p.m. UTC | #3
On 11.02.21 15:56, Ard Biesheuvel wrote:
> On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>>
>> On 11.02.21 13:04, Igor Opaniuk wrote:
>>> From: Igor Opaniuk <igor.opaniuk@foundries.io>
>>>
>>> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
>>> In case amount of memory provided to QEMU is not multiple
>>> of 2 MB, round down the amount of available memory to avoid hang
>>> during MMU initialization.
>>>
>>> How to reproduce:
>>> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
>>> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
>>>
>>> DRAM:  1 GiB
>>> initcall: 60011df8
>>> initcall: 60011904
>>> New Stack Pointer is: 80fffe90
>>> initcall: 60011a20
>>> initcall: 60011bcc
>>> initcall: 60011bd4
>>> initcall: 600119b4
>>> Relocation Offset is: 22042000
>>> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
>>> initcall: 60011b8c
>>> initcall: 82053ea0
>>> initcall: 82053ea8
>>> initcall: 60012040 (relocated to 82054040)
>>> dram_bank_mmu_setup: bank: 0
>>> --- hang here during mmu init ---
>>>
>>> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
>>> Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
>>>
>>> ---
>>>
>>>  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
>>>  1 file changed, 12 insertions(+)
>>>
>>> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
>>> index aa68bef469..841dd7af0e 100644
>>> --- a/board/emulation/qemu-arm/qemu-arm.c
>>> +++ b/board/emulation/qemu-arm/qemu-arm.c
>>> @@ -84,6 +84,18 @@ int dram_init(void)
>>>       if (fdtdec_setup_mem_size_base() != 0)
>>>               return -EINVAL;
>>>
>>> +     /*
>>> +      * When LPAE is enabled (ARMv7),
>>> +      * 1:1 mapping is created using 2 MB blocks.
>>> +      *
>>> +      * In case amount of memory provided to QEMU
>>> +      * is not multiple of 2 MB, round down the amount
>>> +      * of available memory to avoid hang during MMU
>>> +      * initialization.
>>> +      */
>>> +     if (CONFIG_IS_ENABLED(ARMV7_LPAE))
>>> +             gd->ram_size -= (gd->ram_size % 0x200000);
>>
>> Is the problem LPAE specific?
>> Couldn't you provoke same problem using an odd memory size without LPAE,
>> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
>>
>
> The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
> I don't think QEMU's -m option takes fractional megabyte values.
>

$ qemu-system-arm -machine virt -cpu cortex-a15 -m 100005k \
-bios denx/u-boot.bin -nographic

=> fdt addr $fdt_addr
=> fdt print /memory@40000000
memory@40000000 {
        reg = <0x00000000 0x40000000 0x00000000 0x061aa000>;
        device_type = "memory";
};

Granularity seems to be 0x2000 = 8 KiB.

Best regards

Heinrich
Ard Biesheuvel Feb. 11, 2021, 3:35 p.m. UTC | #4
On Thu, 11 Feb 2021 at 16:34, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 11.02.21 15:56, Ard Biesheuvel wrote:
> > On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> >>
> >> On 11.02.21 13:04, Igor Opaniuk wrote:
> >>> From: Igor Opaniuk <igor.opaniuk@foundries.io>
> >>>
> >>> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
> >>> In case amount of memory provided to QEMU is not multiple
> >>> of 2 MB, round down the amount of available memory to avoid hang
> >>> during MMU initialization.
> >>>
> >>> How to reproduce:
> >>> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
> >>> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
> >>>
> >>> DRAM:  1 GiB
> >>> initcall: 60011df8
> >>> initcall: 60011904
> >>> New Stack Pointer is: 80fffe90
> >>> initcall: 60011a20
> >>> initcall: 60011bcc
> >>> initcall: 60011bd4
> >>> initcall: 600119b4
> >>> Relocation Offset is: 22042000
> >>> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
> >>> initcall: 60011b8c
> >>> initcall: 82053ea0
> >>> initcall: 82053ea8
> >>> initcall: 60012040 (relocated to 82054040)
> >>> dram_bank_mmu_setup: bank: 0
> >>> --- hang here during mmu init ---
> >>>
> >>> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
> >>> Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
> >>>
> >>> ---
> >>>
> >>>  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
> >>>  1 file changed, 12 insertions(+)
> >>>
> >>> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> >>> index aa68bef469..841dd7af0e 100644
> >>> --- a/board/emulation/qemu-arm/qemu-arm.c
> >>> +++ b/board/emulation/qemu-arm/qemu-arm.c
> >>> @@ -84,6 +84,18 @@ int dram_init(void)
> >>>       if (fdtdec_setup_mem_size_base() != 0)
> >>>               return -EINVAL;
> >>>
> >>> +     /*
> >>> +      * When LPAE is enabled (ARMv7),
> >>> +      * 1:1 mapping is created using 2 MB blocks.
> >>> +      *
> >>> +      * In case amount of memory provided to QEMU
> >>> +      * is not multiple of 2 MB, round down the amount
> >>> +      * of available memory to avoid hang during MMU
> >>> +      * initialization.
> >>> +      */
> >>> +     if (CONFIG_IS_ENABLED(ARMV7_LPAE))
> >>> +             gd->ram_size -= (gd->ram_size % 0x200000);
> >>
> >> Is the problem LPAE specific?
> >> Couldn't you provoke same problem using an odd memory size without LPAE,
> >> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
> >>
> >
> > The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
> > I don't think QEMU's -m option takes fractional megabyte values.
> >
>
> $ qemu-system-arm -machine virt -cpu cortex-a15 -m 100005k \
> -bios denx/u-boot.bin -nographic
>
> => fdt addr $fdt_addr
> => fdt print /memory@40000000
> memory@40000000 {
>         reg = <0x00000000 0x40000000 0x00000000 0x061aa000>;
>         device_type = "memory";
> };
>
> Granularity seems to be 0x2000 = 8 KiB.
>

In that case, it seems easiest to me to always round down to the
nearest multiple of 2MB
Igor Opaniuk Feb. 11, 2021, 3:39 p.m. UTC | #5
Hi Heinrich,

On Thu, Feb 11, 2021 at 5:34 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 11.02.21 15:56, Ard Biesheuvel wrote:
> > On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> >>
> >> On 11.02.21 13:04, Igor Opaniuk wrote:
> >>> From: Igor Opaniuk <igor.opaniuk@foundries.io>
> >>>
> >>> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
> >>> In case amount of memory provided to QEMU is not multiple
> >>> of 2 MB, round down the amount of available memory to avoid hang
> >>> during MMU initialization.
> >>>
> >>> How to reproduce:
> >>> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
> >>> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
> >>>
> >>> DRAM:  1 GiB
> >>> initcall: 60011df8
> >>> initcall: 60011904
> >>> New Stack Pointer is: 80fffe90
> >>> initcall: 60011a20
> >>> initcall: 60011bcc
> >>> initcall: 60011bd4
> >>> initcall: 600119b4
> >>> Relocation Offset is: 22042000
> >>> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
> >>> initcall: 60011b8c
> >>> initcall: 82053ea0
> >>> initcall: 82053ea8
> >>> initcall: 60012040 (relocated to 82054040)
> >>> dram_bank_mmu_setup: bank: 0
> >>> --- hang here during mmu init ---
> >>>
> >>> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
> >>> Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
> >>>
> >>> ---
> >>>
> >>>  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
> >>>  1 file changed, 12 insertions(+)
> >>>
> >>> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> >>> index aa68bef469..841dd7af0e 100644
> >>> --- a/board/emulation/qemu-arm/qemu-arm.c
> >>> +++ b/board/emulation/qemu-arm/qemu-arm.c
> >>> @@ -84,6 +84,18 @@ int dram_init(void)
> >>>       if (fdtdec_setup_mem_size_base() != 0)
> >>>               return -EINVAL;
> >>>
> >>> +     /*
> >>> +      * When LPAE is enabled (ARMv7),
> >>> +      * 1:1 mapping is created using 2 MB blocks.
> >>> +      *
> >>> +      * In case amount of memory provided to QEMU
> >>> +      * is not multiple of 2 MB, round down the amount
> >>> +      * of available memory to avoid hang during MMU
> >>> +      * initialization.
> >>> +      */
> >>> +     if (CONFIG_IS_ENABLED(ARMV7_LPAE))
> >>> +             gd->ram_size -= (gd->ram_size % 0x200000);
> >>
> >> Is the problem LPAE specific?
> >> Couldn't you provoke same problem using an odd memory size without LPAE,
> >> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
> >>
> >
> > The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
> > I don't think QEMU's -m option takes fractional megabyte values.
> >
>
> $ qemu-system-arm -machine virt -cpu cortex-a15 -m 100005k \
> -bios denx/u-boot.bin -nographic
>
> => fdt addr $fdt_addr
> => fdt print /memory@40000000
> memory@40000000 {
>         reg = <0x00000000 0x40000000 0x00000000 0x061aa000>;
>         device_type = "memory";
> };
>
> Granularity seems to be 0x2000 = 8 KiB.
I've just run some tests (including the mem=100005k ) with LPAE disabled
and haven't faced any issues:

$ cat .config | grep LPAE
# CONFIG_ARMV7_LPAE is not set

$ qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin
U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)

DRAM:  1 GiB
Flash: 128 MiB
...
=>

$ qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin

U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)

DRAM:  1 GiB
Flash: 128 MiB
...
=>

$ qemu-system-arm -machine virt -m 100005k -nographic -bios u-boot.bin

U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)
DRAM:  97.7 MiB
Flash: 128 MiB
...
=>

>
> Best regards
>
> Heinrich

Regards,
Igor
Igor Opaniuk Jan. 31, 2024, 4:25 p.m. UTC | #6
Hello Ard,

Just a quick follow-up for this old thread,

I've again stumbled upon the same issue recently and it turned out
that I've already sent a fix for that here :)

Considering Heinrich's comment about memory granularity, does it still make
sense to land this patch? If not, what objections/suggestions do you
have in mind?

Thanks!

Regards,
Igor

On Thu, Feb 11, 2021 at 4:39 PM Igor Opaniuk <igor.opaniuk@foundries.io> wrote:
>
> Hi Heinrich,
>
> On Thu, Feb 11, 2021 at 5:34 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> >
> > On 11.02.21 15:56, Ard Biesheuvel wrote:
> > > On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
> > >>
> > >> On 11.02.21 13:04, Igor Opaniuk wrote:
> > >>> From: Igor Opaniuk <igor.opaniuk@foundries.io>
> > >>>
> > >>> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
> > >>> In case amount of memory provided to QEMU is not multiple
> > >>> of 2 MB, round down the amount of available memory to avoid hang
> > >>> during MMU initialization.
> > >>>
> > >>> How to reproduce:
> > >>> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
> > >>> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
> > >>>
> > >>> DRAM:  1 GiB
> > >>> initcall: 60011df8
> > >>> initcall: 60011904
> > >>> New Stack Pointer is: 80fffe90
> > >>> initcall: 60011a20
> > >>> initcall: 60011bcc
> > >>> initcall: 60011bd4
> > >>> initcall: 600119b4
> > >>> Relocation Offset is: 22042000
> > >>> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
> > >>> initcall: 60011b8c
> > >>> initcall: 82053ea0
> > >>> initcall: 82053ea8
> > >>> initcall: 60012040 (relocated to 82054040)
> > >>> dram_bank_mmu_setup: bank: 0
> > >>> --- hang here during mmu init ---
> > >>>
> > >>> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
> > >>> Signed-off-by: Igor Opaniuk <igor.opaniuk@foundries.io>
> > >>>
> > >>> ---
> > >>>
> > >>>  board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
> > >>>  1 file changed, 12 insertions(+)
> > >>>
> > >>> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> > >>> index aa68bef469..841dd7af0e 100644
> > >>> --- a/board/emulation/qemu-arm/qemu-arm.c
> > >>> +++ b/board/emulation/qemu-arm/qemu-arm.c
> > >>> @@ -84,6 +84,18 @@ int dram_init(void)
> > >>>       if (fdtdec_setup_mem_size_base() != 0)
> > >>>               return -EINVAL;
> > >>>
> > >>> +     /*
> > >>> +      * When LPAE is enabled (ARMv7),
> > >>> +      * 1:1 mapping is created using 2 MB blocks.
> > >>> +      *
> > >>> +      * In case amount of memory provided to QEMU
> > >>> +      * is not multiple of 2 MB, round down the amount
> > >>> +      * of available memory to avoid hang during MMU
> > >>> +      * initialization.
> > >>> +      */
> > >>> +     if (CONFIG_IS_ENABLED(ARMV7_LPAE))
> > >>> +             gd->ram_size -= (gd->ram_size % 0x200000);
> > >>
> > >> Is the problem LPAE specific?
> > >> Couldn't you provoke same problem using an odd memory size without LPAE,
> > >> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
> > >>
> > >
> > > The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
> > > I don't think QEMU's -m option takes fractional megabyte values.
> > >
> >
> > $ qemu-system-arm -machine virt -cpu cortex-a15 -m 100005k \
> > -bios denx/u-boot.bin -nographic
> >
> > => fdt addr $fdt_addr
> > => fdt print /memory@40000000
> > memory@40000000 {
> >         reg = <0x00000000 0x40000000 0x00000000 0x061aa000>;
> >         device_type = "memory";
> > };
> >
> > Granularity seems to be 0x2000 = 8 KiB.
> I've just run some tests (including the mem=100005k ) with LPAE disabled
> and haven't faced any issues:
>
> $ cat .config | grep LPAE
> # CONFIG_ARMV7_LPAE is not set
>
> $ qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin
> U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)
>
> DRAM:  1 GiB
> Flash: 128 MiB
> ...
> =>
>
> $ qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin
>
> U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)
>
> DRAM:  1 GiB
> Flash: 128 MiB
> ...
> =>
>
> $ qemu-system-arm -machine virt -m 100005k -nographic -bios u-boot.bin
>
> U-Boot 2021.04-rc1-01218-g85e959f09c-dirty (Feb 11 2021 - 17:31:31 +0200)
> DRAM:  97.7 MiB
> Flash: 128 MiB
> ...
> =>
>
> >
> > Best regards
> >
> > Heinrich
>
> Regards,
> Igor
>
> --
> Best regards - Freundliche Grüsse - Meilleures salutations
>
> Igor Opaniuk
> Embedded Software Engineer
> T:  +380 938364067
> E: igor.opaniuk@foundries.io
> W: www.foundries.io
diff mbox series

Patch

diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
index aa68bef469..841dd7af0e 100644
--- a/board/emulation/qemu-arm/qemu-arm.c
+++ b/board/emulation/qemu-arm/qemu-arm.c
@@ -84,6 +84,18 @@  int dram_init(void)
 	if (fdtdec_setup_mem_size_base() != 0)
 		return -EINVAL;
 
+	/*
+	 * When LPAE is enabled (ARMv7),
+	 * 1:1 mapping is created using 2 MB blocks.
+	 *
+	 * In case amount of memory provided to QEMU
+	 * is not multiple of 2 MB, round down the amount
+	 * of available memory to avoid hang during MMU
+	 * initialization.
+	 */
+	if (CONFIG_IS_ENABLED(ARMV7_LPAE))
+		gd->ram_size -= (gd->ram_size % 0x200000);
+
 	return 0;
 }