sunxi: Kconfig: introduce SUNXI_MINIMUM_DRAM_MB

Traditionally we assumed that every Allwinner board would come with at
least 256 MB of DRAM, and set our DRAM layout accordingly. This affected
both the default load addresses, but also U-Boot's own address
expectations (like being loaded at 160 MB).

Some SoCs come with co-packaged DRAM, but only provide 32 or 64MB. So
far we special-cased those *chips*, as there was only one chip per DRAM
size. However new chips force us to take a more general approach.

Introduce a Kconfig symbol, which provides the minimum DRAM size of the
board. If nothing else is specified, we use 256 MB, and default to
smaller values for those co-packaged SoCs.
Then select the different DRAM maps according to this new symbol, so
that different SoCs with the same DRAM size can share those definitions.

Inspired by an idea from Icenowy.

This is just refactoring: compiled for all boards before and after this
patch: the binaries were identical.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
This commit is contained in:
Andre Przywara 2022-07-03 00:47:20 +01:00
parent 14b3c6d72a
commit 1bf98bd4e2
4 changed files with 34 additions and 19 deletions

View file

@ -312,9 +312,9 @@ config SYS_MALLOC_LEN
default 0x4000000 if SANDBOX default 0x4000000 if SANDBOX
default 0x2000000 if ARCH_ROCKCHIP || ARCH_OMAP2PLUS || ARCH_MESON default 0x2000000 if ARCH_ROCKCHIP || ARCH_OMAP2PLUS || ARCH_MESON
default 0x200000 if ARCH_BMIPS || X86 default 0x200000 if ARCH_BMIPS || X86
default 0x120000 if MACH_SUNIV default 0x4020000 if SUNXI_MINIMUM_DRAM_MB >= 256
default 0x220000 if MACH_SUN8I_V3S default 0x220000 if SUNXI_MINIMUM_DRAM_MB >= 64
default 0x4020000 if ARCH_SUNXI default 0x120000 if SUNXI_MINIMUM_DRAM_MB >= 32
default 0x400000 default 0x400000
help help
This defines memory to be allocated for Dynamic allocation This defines memory to be allocated for Dynamic allocation

View file

@ -615,6 +615,18 @@ config SYS_BOARD
config SYS_SOC config SYS_SOC
default "sunxi" default "sunxi"
config SUNXI_MINIMUM_DRAM_MB
int "minimum DRAM size"
default 32 if MACH_SUNIV
default 64 if MACH_SUN8I_V3S
default 256
---help---
Minimum DRAM size expected on the board. Traditionally we assumed
256 MB, so that U-Boot would load at 160MB. With co-packaged DRAM
we have smaller sizes, though, so that U-Boot's own load address and
the default payload addresses must be shifted down.
This is expected to be fixed by the SoC selection.
config UART0_PORT_F config UART0_PORT_F
bool "UART0 on MicroSD breakout board" bool "UART0 on MicroSD breakout board"
---help--- ---help---

View file

@ -499,8 +499,8 @@ config SYS_TEXT_BASE
default 0x80800000 if ARCH_OMAP2PLUS || ARCH_K3 default 0x80800000 if ARCH_OMAP2PLUS || ARCH_K3
default 0x81700000 if MACH_SUNIV default 0x81700000 if MACH_SUNIV
default 0x2a000000 if MACH_SUN9I default 0x2a000000 if MACH_SUN9I
default 0x42e00000 if MACH_SUN8I_V3S default 0x4a000000 if SUNXI_MINIMUM_DRAM_MB >= 256
default 0x4a000000 if ARCH_SUNXI default 0x42e00000 if SUNXI_MINIMUM_DRAM_MB >= 64
hex "Text Base" hex "Text Base"
help help
The address in memory that U-Boot will be running from, initially. The address in memory that U-Boot will be running from, initially.

View file

@ -135,7 +135,21 @@
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(FE00000)) #define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(FE00000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(FF00000)) #define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(FF00000))
#elif defined(CONFIG_MACH_SUN8I_V3S) #elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 256)
/*
* 160M RAM (256M minimum minus 64MB heap + 32MB for u-boot, stack, fb, etc.
* 32M uncompressed kernel, 16M compressed kernel, 1M fdt,
* 1M script, 1M pxe, 1M dt overlay and the ramdisk at the end.
*/
#define BOOTM_SIZE __stringify(0xa000000)
#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(2000000))
#define FDT_ADDR_R __stringify(SDRAM_OFFSET(3000000))
#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(3100000))
#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(3200000))
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(3300000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(3400000))
#elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 64)
/* /*
* 64M RAM minus 2MB heap + 16MB for u-boot, stack, fb, etc. * 64M RAM minus 2MB heap + 16MB for u-boot, stack, fb, etc.
* 16M uncompressed kernel, 8M compressed kernel, 1M fdt, * 16M uncompressed kernel, 8M compressed kernel, 1M fdt,
@ -149,7 +163,7 @@
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(1B00000)) #define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(1B00000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1C00000)) #define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1C00000))
#elif defined(CONFIG_MACH_SUNIV) #elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 32)
/* /*
* 32M RAM minus 1MB heap + 8MB for u-boot, stack, fb, etc. * 32M RAM minus 1MB heap + 8MB for u-boot, stack, fb, etc.
* 8M uncompressed kernel, 4M compressed kernel, 512K fdt, * 8M uncompressed kernel, 4M compressed kernel, 512K fdt,
@ -164,18 +178,7 @@
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(0D60000)) #define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(0D60000))
#else #else
/* #error Need at least 32MB of DRAM. Please adjust load addresses.
* 160M RAM (256M minimum minus 64MB heap + 32MB for u-boot, stack, fb, etc.
* 32M uncompressed kernel, 16M compressed kernel, 1M fdt,
* 1M script, 1M pxe, 1M dt overlay and the ramdisk at the end.
*/
#define BOOTM_SIZE __stringify(0xa000000)
#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(2000000))
#define FDT_ADDR_R __stringify(SDRAM_OFFSET(3000000))
#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(3100000))
#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(3200000))
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(3300000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(3400000))
#endif #endif
#define MEM_LAYOUT_ENV_SETTINGS \ #define MEM_LAYOUT_ENV_SETTINGS \