]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sunxi: H616: Enable full 4GB of DRAM
authorAndre Przywara <andre.przywara@arm.com>
Wed, 28 Apr 2021 20:29:55 +0000 (21:29 +0100)
committerAndre Przywara <andre.przywara@arm.com>
Sat, 10 Jul 2021 00:22:09 +0000 (01:22 +0100)
The H616 is our first supported Allwinner SoC which goes beyond the 4GB
address space "barrier", by having more than 32 address bits.

Lift the preliminary 3GB DRAM limit for the H616, and update the page
table setup on the way, to actually map that last GB as well.

As not all devices are actually capable of dealing with more than 32
bits (the DMA in the EMAC for instance), we also limit U-Boot's own
DRAM usage to 4GB on the way.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/mach-sunxi/Kconfig
arch/arm/mach-sunxi/board.c

index bc8509b72a23a128ba58f5ef3062917d64fe0bee..8e7aa8437dcf4d5b2f1660964767b0e2642cad4f 100644 (file)
@@ -190,10 +190,10 @@ config MACH_SUNXI_H3_H5
        select SUPPORT_SPL
 
 # TODO: try out A80's 8GiB DRAM space
-# TODO: H616 supports 4 GiB DRAM space
 config SUNXI_DRAM_MAX_SIZE
        hex
-       default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6 || MACH_SUN50I_H616
+       default 0x100000000 if MACH_SUN50I_H616
+       default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6
        default 0x80000000
 
 choice
index 9b84132eda665b8859e4dfd3c27e38ce3ac4ceb3..e979e426dd117a7903718c70b389dc293cbff439 100644 (file)
@@ -56,7 +56,7 @@ static struct mm_region sunxi_mem_map[] = {
                /* RAM */
                .virt = 0x40000000UL,
                .phys = 0x40000000UL,
-               .size = 0xC0000000UL,
+               .size = CONFIG_SUNXI_DRAM_MAX_SIZE,
                .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
                         PTE_BLOCK_INNER_SHARE
        }, {
@@ -65,6 +65,15 @@ static struct mm_region sunxi_mem_map[] = {
        }
 };
 struct mm_region *mem_map = sunxi_mem_map;
+
+ulong board_get_usable_ram_top(ulong total_size)
+{
+       /* Some devices (like the EMAC) have a 32-bit DMA limit. */
+       if (gd->ram_top > (1ULL << 32))
+               return 1ULL << 32;
+
+       return gd->ram_top;
+}
 #endif
 
 static int gpio_init(void)