[PATCH] ARM: dts: rainier,everest: Move reserved memory regions
Andrew Jeffery
andrew at aj.id.au
Fri Sep 16 15:35:40 AEST 2022
Hi Adriana,
On Fri, 16 Sep 2022, at 06:38, Adriana Kobylak wrote:
> From: Adriana Kobylak <anoo at us.ibm.com>
>
> Move the reserved regions to account for a decrease in DRAM when ECC is
> enabled. ECC takes 1/9th of memory, bringing the size down from 1024MiB
> to 912MiB (minus 16MiB for VGA) for a total of 896MiB available DRAM.
The 912MiB mentioned here struck me, so I poked at the numbers:
ECC(1024MiB)
= ECC(1024 * 1024 * 1024)
= 1024 * 1024 * 1024 * 8 / 9
= 954437176.888888889
= 910.222222222MiB
>From there subtracting 16MiB gets us 894.222222222MiB, which isn't a
number we see in practice.
On the other hand:
ECC(1024 - 16)MiB)
= ECC((1024 - 16) * 1024 * 1024)
= (1024 - 16) * 1024 * 1024 * 8 / 9
= 939524096
= 896MiB
We do see 896MiB in practice which implies that MCR54 is configured for
ECC to be bounded at the bottom of a 16MiB VGA memory region. 912MiB
doesn't fall out of the numbers, so I think we need to rework the words
to avoid confusion?
>
> Move the regions by 128MiB since the flash_memory region needs to be
> aligned to 64MiB. This change doesn't affect the host if ECC is not
> enabled.
So I was curious about the 128MiB relocation as well. More on this
below:
>
> Signed-off-by: Adriana Kobylak <anoo at us.ibm.com>
> ---
> arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts | 11 ++++++-----
> arch/arm/boot/dts/aspeed-bmc-ibm-rainier.dts | 12 ++++++++----
> 2 files changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts
> b/arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts
> index 1bba5ad7378e..9a09301dd79e 100644
> --- a/arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts
> +++ b/arch/arm/boot/dts/aspeed-bmc-ibm-everest.dts
> @@ -163,15 +163,16 @@ reserved-memory {
> ranges;
>
> /* LPC FW cycle bridge region requires natural alignment */
> - flash_memory: region at b8000000 {
> + flash_memory: region at b0000000 {
> no-map;
> - reg = <0xb8000000 0x04000000>; /* 64M */
> + reg = <0xb0000000 0x04000000>; /* 64M */
> };
0xb8000000 is an offset 2944MiB into the address space. The RAM base
address is in the middle of the address space, so 2944MiB - 2048MiB,
which means the buffer is offset 896MiB into RAM. This drives the need
for the patch with ECC, as our RAM address space is now only 896MiB in
size and basing the buffer at that offset is obviously invalid. So
change is necessary.
We know that the flash_memory buffer needs to be naturally aligned, so
the fact that it was where it is we know that 896MiB is valid alignment
(as it already works). We also have the ramoops buffer below, which I
initially put after the flash_memory buffer to reduce the "hole" in
between vga_memory and flash_memory. However there's no other reason to
order it this way, and we can shift it as we see fit. Specifically,
we're free to order it before the flash_memory buffer.
Focusing back on the flash_memory buffer, if 896MiB is 64MiB aligned,
then (896-64)MiB is also aligned. This means we can butt the
flash_memory buffer up against the "end" of RAM, and with the
observation that we can put the ramoops buffer before it, we can butt
the ramoops buffer up against the start of flash_memory. This minimises
the address-space fragmentation.
So maybe we can go with this arrangement?
ramoops at b3e00000 {
compatible = "ramoops";
reg = <0xb3e00000 0x200000>;
...
}
flash_memory: region at b4000000 {
no-map;
reg = <0xb4000000 0x04000000>;
...
};
Thoughts?
Andrew
More information about the openbmc
mailing list