fix(plat/rcar3): generate two memory nodes for larger than 2 GiB channel 0

The DRAM channel 0 memory area in 32bit space is limited to 2 GiB window.
Furthermore, the first 128 MiB of this memory window are reserved and not
accessible by the system software, hence the 32bit area memory node is
limited to range 0x4800_0000..0xbfff_ffff.

In case there are more than 2 GiB of DRAM populated in channel 0, it is
necessary to generate two memory nodes, once covering the 2 GiB - 128 MiB
area in the 32bit space, and another covering the rest of the memory in
64bit space. This patch implements handling of such a case.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Change-Id: I3495241fb938e355352e817afaca8f01d04c81d2
This commit is contained in:
Marek Vasut 2021-04-16 21:39:36 +02:00
parent e624e98dc3
commit 21924f2466
1 changed files with 32 additions and 4 deletions

View File

@ -605,7 +605,7 @@ err:
static void bl2_advertise_dram_entries(uint64_t dram_config[8])
{
uint64_t start, size;
uint64_t start, size, size32;
int chan;
for (chan = 0; chan < 4; chan++) {
@ -634,11 +634,39 @@ static void bl2_advertise_dram_entries(uint64_t dram_config[8])
/*
* Channel 0 is mapped in 32bit space and the first
* 128 MiB are reserved
* 128 MiB are reserved and the maximum size is 2GiB.
*/
if (chan == 0) {
start = 0x48000000;
size -= 0x8000000;
/* Limit the 32bit entry to 2 GiB - 128 MiB */
size32 = size - 0x8000000U;
if (size32 >= 0x78000000U) {
size32 = 0x78000000U;
}
/* Emit 32bit entry, up to 2 GiB - 128 MiB long. */
bl2_add_dram_entry(0x48000000, size32);
/*
* If channel 0 is less than 2 GiB long, the
* entire memory fits into the 32bit space entry,
* so move on to the next channel.
*/
if (size <= 0x80000000U) {
continue;
}
/*
* If channel 0 is more than 2 GiB long, emit
* another entry which covers the rest of the
* memory in channel 0, in the 64bit space.
*
* Start of this new entry is at 2 GiB offset
* from the beginning of the 64bit channel 0
* address, size is 2 GiB shorter than total
* size of the channel.
*/
start += 0x80000000U;
size -= 0x80000000U;
}
bl2_add_dram_entry(start, size);