Compare commits

...

8 Commits
exti ... std2

Author SHA1 Message Date
Simon Glass
802f8d87f3 sunxi: Move to text environment
Convert these boards to use a text environment.

For the boards check, the only differences are extra spaces after the
semicolons in 'dfu_alt_info_ram' and 'partitions', both of which are
permitted.

Add in the special boot command for old kernels, dropping the
unnecessary and confusing hex prefixes.

Series-changes: 2
- Keep bootcmd_sunxi_compat if OLD_SUNXI_KERNEL_COMPAT is enabled

Series-to: u-boot
Series-cc: sunxi, trini
Series-version: 2
Series-links: 418453
Cover-letter:
bootstd: sunxi: Migrate to standard boot
This series attempts to migrate all sunxi boards to use standard boot,
along with a text environment.
END
2024-08-22 11:25:14 -06:00
Simon Glass
1e6da4a507 env: Provide a work-around for unquoting fdtfile
Some boards use a CONFIG option to specify the value of this variable.
This is normally handled by efi_get_distro_fdt_name() but in the case
of sunxi this does not work, since 'soc' is sunxi, but the files are
in the allwinner directory.

Provide a work-around for this particular case.

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-22 11:25:14 -06:00
Simon Glass
6cf6875075 sunxi: Drop old distro boot variables
These are not needed as bootstd handles the boot now. Drop them.

Keep BOOTCMD_SUNXI_COMPAT for now since it does not relate to
distro boot.

Series-changes: 2
- Keep BOOTCMD_SUNXI_COMPAT

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-22 11:25:14 -06:00
Simon Glass
79732a01e3 sunxi: Move to bootstd
Drop support for distroboot and move to using bootstd instead.

Series-changes: 2
- Convert the other DISTRO_DEFAULTS in the Kconfig too

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-22 11:25:14 -06:00
Simon Glass
00c709200b sunxi: Add a bootmeth for FEL
Add support for booting from a script loaded over FEL. This mirrors the
bootcmd_fel provided by distro boot.

Series-changes: 2
- Put the FEL bootmeth before all other global bootmeths

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
2024-08-22 11:25:14 -06:00
Simon Glass
0418227594 bootstd: Avoid depending on BLK
In principle bootstd can work without block devices, even if it does
require driver model to be enabled in that case.

The use of a 'depends on BLK' for BOOTSTD conflicts with the way 'BLK'
is now defined, producing recursive errors through multiple different
paths, one of which is this (with Linksprite_pcDuino3 and
BOOTSTD_DEFAULTS enabled):

  arch/arm/Kconfig:7:error: recursive dependency detected!
  arch/arm/Kconfig:7: symbol ARM64 is selected by ARCH_UNIPHIER_V8_MULTI
  arch/arm/mach-uniphier/Kconfig:17: symbol ARCH_UNIPHIER_V8_MULTI is
     part of choice <choice>
  arch/arm/mach-uniphier/Kconfig:6: choice <choice> contains symbol
     ARCH_UNIPHIER_V8_MULTI
  arch/arm/mach-uniphier/Kconfig:17: symbol ARCH_UNIPHIER_V8_MULTI is
     part of choice SPL
  arch/arm/mach-stm32mp/Kconfig:3: symbol SPL depends on SUPPORT_SPL
  common/spl/Kconfig:1: symbol SUPPORT_SPL is selected by ASPEED_AST2600
  arch/arm/mach-aspeed/Kconfig:26: symbol ASPEED_AST2600 is part of
     choice <choice>
  arch/arm/mach-aspeed/Kconfig:12: choice <choice> contains symbol
     ASPEED_AST2500
  arch/arm/mach-aspeed/Kconfig:17: symbol ASPEED_AST2500 is part of
     choice DM_RESET
  arch/arm/mach-renesas/Kconfig.rcar3:197: symbol DM_RESET is selected
     by CLK_RCAR_GEN3
  drivers/clk/renesas/Kconfig:53: symbol CLK_RCAR_GEN3 depends on
     CLK_RENESAS
  drivers/clk/renesas/Kconfig:1: symbol CLK_RENESAS depends on CLK
  drivers/clk/Kconfig:3: symbol CLK is selected by IMX8M_POWER_DOMAIN
  drivers/power/domain/Kconfig:35: symbol IMX8M_POWER_DOMAIN depends on
     POWER_DOMAIN
  drivers/power/domain/Kconfig:3: symbol POWER_DOMAIN is selected by
     BCM6318_USBH_PHY
  drivers/phy/Kconfig:83: symbol BCM6318_USBH_PHY depends on PHY
  drivers/phy/Kconfig:4: symbol PHY is selected by USB_EHCI_MX7
  drivers/usb/host/Kconfig:211: symbol USB_EHCI_MX7 depends on USB
  drivers/usb/Kconfig:1: symbol USB is selected by BOOTSTD_DEFAULTS
  boot/Kconfig:455: symbol BOOTSTD_DEFAULTS depends on BOOTSTD
  boot/Kconfig:398: symbol BOOTSTD depends on BLK
  drivers/block/Kconfig:1: symbol BLK is selected by PVBLOCK
  drivers/xen/Kconfig:1: symbol PVBLOCK depends on XEN
  Kconfig:176: symbol XEN depends on ARM64

We don't want to revert the change to BLK, which has been in place for
a year now. We don't want to select BLK in BOOTSTD since it should
support booting without block devices. The only realistic option is to
remove BOOTSTD's dependency on BLK.

Disable standard boot on the one board which fails.

Series-changes: 2
- Add new patch to resolve BOOTSTD->BLK recursion with Kconfig

Signed-off-by: Simon Glass <sjg@chromium.org>

wip
2024-08-22 11:24:48 -06:00
Simon Glass
7dd41ebddb bootstd: Avoid calling unavailable block functions
When BLK is not enabled but BOOTSTD is, some features of standard boot
become unavailable. Add a check for this in the only site that is
currently apparent.

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-22 11:19:45 -06:00
Simon Glass
e6acc59e62 blk: Make functions available unconditionally
Some boards still don't enable BLK but we want to be able to at least
compile the code which relies on this. For example, bootstd includes
calls to blk_...() functions, albeit with a check for BLK so that the
code is eliminated by the compiler.

Reduce the scope of the BLK #ifdef to help with this.

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-22 11:19:45 -06:00
11 changed files with 278 additions and 246 deletions

View File

@@ -1844,6 +1844,7 @@ quiet_cmd_gen_envp = ENVP $@
$(CPP) -P $(cpp_flags) -x assembler-with-cpp -undef \
-D__ASSEMBLY__ \
-D__UBOOT_CONFIG__ \
-DDEFAULT_DEVICE_TREE=$(subst ",,$(CONFIG_DEFAULT_DEVICE_TREE)) \
-I . -I include -I $(srctree)/include \
-include linux/kconfig.h -include include/config.h \
-I$(srctree)/arch/$(ARCH)/include \

View File

@@ -1147,7 +1147,7 @@ config ARCH_SUNXI
select BINMAN
select CMD_GPIO
select CMD_MMC if MMC
select CMD_USB if DISTRO_DEFAULTS && USB_HOST
select CMD_USB if BOOTSTD_DEFAULTS && USB_HOST
select CLK
select DM
select DM_GPIO
@@ -1169,9 +1169,9 @@ config ARCH_SUNXI
select SUNXI_GPIO
select SYS_NS16550
select SYS_THUMB_BUILD if !ARM64
select USB if DISTRO_DEFAULTS
select USB_KEYBOARD if DISTRO_DEFAULTS && USB_HOST
select USB_STORAGE if DISTRO_DEFAULTS && USB_HOST
select USB if BOOTSTD_DEFAULTS
select USB_KEYBOARD if BOOTSTD_DEFAULTS && USB_HOST
select USB_STORAGE if BOOTSTD_DEFAULTS && USB_HOST
select SPL_USE_TINY_PRINTF if SPL
select USE_PREBOOT
select SYS_RELOC_GD_ENV_ADDR
@@ -1179,7 +1179,7 @@ config ARCH_SUNXI
imply CMD_DM
imply CMD_GPT
imply CMD_UBI if MTD_RAW_NAND
imply DISTRO_DEFAULTS
imply BOOTSTD_DEFAULTS
imply DM_REGULATOR
imply DM_REGULATOR_FIXED
imply FAT_WRITE

152
board/sunxi/sunxi.env Normal file
View File

@@ -0,0 +1,152 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Common sunxi environment
*
* Copyright 2024 Google LLC
* Written by Simon Glass <sjg@chromium.org>
/
/****************************************************************************
* environment variables holding default load addresses *
****************************************************************************/
/*
* We cannot use expressions here, because expressions won't be evaluated in
* autoconf.mk.
*/
#ifdef CONFIG_ARM64
/*
* Boards seem to come with at least 512MB of DRAM.
* The kernel should go at 512K, which is the default text offset (that will
* be adjusted at runtime if needed).
* There is no compression for arm64 kernels (yet), so leave some space
* for really big kernels, say 256MB for now.
* Scripts, PXE and DTBs should go afterwards, leaving the rest for the initrd.
*/
#define BOOTM_SIZE 0xa000000
#define KERNEL_ADDR_R SDRAM_OFFSET(0080000)
#define KERNEL_COMP_ADDR_R SDRAM_OFFSET(4000000)
#define KERNEL_COMP_SIZE 0xb000000
#define FDT_ADDR_R SDRAM_OFFSET(FA00000)
#define SCRIPT_ADDR_R SDRAM_OFFSET(FC00000)
#define PXEFILE_ADDR_R SDRAM_OFFSET(FD00000)
#define FDTOVERLAY_ADDR_R SDRAM_OFFSET(FE00000)
#define RAMDISK_ADDR_R SDRAM_OFFSET(FF00000)
#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 0xa000000
#define KERNEL_ADDR_R SDRAM_OFFSET(2000000)
#define FDT_ADDR_R SDRAM_OFFSET(3000000)
#define SCRIPT_ADDR_R SDRAM_OFFSET(3100000)
#define PXEFILE_ADDR_R SDRAM_OFFSET(3200000)
#define FDTOVERLAY_ADDR_R SDRAM_OFFSET(3300000)
#define RAMDISK_ADDR_R SDRAM_OFFSET(3400000)
#elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 64)
/*
* 64M RAM minus 2MB heap + 16MB for u-boot, stack, fb, etc.
* 16M uncompressed kernel, 8M compressed kernel, 1M fdt,
* 1M script, 1M pxe, 1M dt overlay and the ramdisk at the end.
*/
#define BOOTM_SIZE 0x2e00000
#define KERNEL_ADDR_R SDRAM_OFFSET(1000000)
#define FDT_ADDR_R SDRAM_OFFSET(1800000)
#define SCRIPT_ADDR_R SDRAM_OFFSET(1900000)
#define PXEFILE_ADDR_R SDRAM_OFFSET(1A00000)
#define FDTOVERLAY_ADDR_R SDRAM_OFFSET(1B00000)
#define RAMDISK_ADDR_R SDRAM_OFFSET(1C00000)
#elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 32)
/*
* 32M RAM minus 2.5MB for u-boot, heap, stack, etc.
* 16M uncompressed kernel, 7M compressed kernel, 128K fdt, 64K script,
* 128K DT overlay, 128K PXE and the ramdisk in the rest (max. 5MB)
*/
#define BOOTM_SIZE 0x1700000
#define KERNEL_ADDR_R SDRAM_OFFSET(1000000)
#define FDT_ADDR_R SDRAM_OFFSET(1d50000)
#define SCRIPT_ADDR_R SDRAM_OFFSET(1d40000)
#define PXEFILE_ADDR_R SDRAM_OFFSET(1d00000)
#define FDTOVERLAY_ADDR_R SDRAM_OFFSET(1d20000)
#define RAMDISK_ADDR_R SDRAM_OFFSET(1800000)
#else
#error Need at least 32MB of DRAM. Please adjust load addresses.
#endif
#define UUID_GPT_ESP ""
#ifdef CONFIG_ARM64
#define UUID_GPT_SYSTEM b921b045-1df0-41c3-af44-4c6f280d3fae
#else
#define UUID_GPT_SYSTEM 69dad710-2ce4-4e3c-b16c-21a1d49abed3
#endif
stdin=serial
#ifdef CONFIG_USB_KEYBOARD
stdin+=,usbkbd
#endif
stdout=serial
stderr=serial
#ifdef CONFIG_VIDEO
stdout+=,vidconsole
stderr+=,vidconsole
#endif
bootm_size=BOOTM_SIZE
kernel_addr_r=KERNEL_ADDR_R
fdt_addr_r=FDT_ADDR_R
scriptaddr=SCRIPT_ADDR_R
pxefile_addr_r=PXEFILE_ADDR_R
fdtoverlay_addr_r=FDTOVERLAY_ADDR_R
ramdisk_addr_r=RAMDISK_ADDR_R
#ifdef CONFIG_ARM64
kernel_comp_addr_r=KERNEL_COMP_ADDR_R
kernel_comp_size=KERNEL_COMP_SIZE
#endif
dfu_alt_info_ram=
kernel ram KERNEL_ADDR_R 0x1000000;
fdt ram FDT_ADDR_R 0x100000;
ramdisk ram RAMDISK_ADDR_R 0x4000000
#ifdef CONFIG_ARM64
fdtfile=allwinner/DEFAULT_DEVICE_TREE.dtb
#else
fdtfile=DEFAULT_DEVICE_TREE.dtb
#endif
console=ttyS0,115200
uuid_gpt_esp=c12a7328-f81f-11d2-ba4b-00a0c93ec93b
#ifdef CONFIG_ARM64
uuid_gpt_system=b921b045-1df0-41c3-af44-4c6f280d3fae
#else
uuid_gpt_system=69dad710-2ce4-4e3c-b16c-21a1d49abed3
#endif
partitions=
name=loader1,start=8k,size=32k,uuid=${uuid_gpt_loader1};
name=loader2,size=984k,uuid=${uuid_gpt_loader2};
name=esp,size=128M,bootable,uuid=${uuid_gpt_esp};
name=system,size=-,uuid=${uuid_gpt_system};
/* support booting a very old kernel */
#ifdef CONFIG_OLD_SUNXI_KERNEL_COMPAT
bootcmd_sunxi_compat=
setenv root /dev/mmcblk0p3 rootwait;
if ext2load mmc 0 44000000 uEnv.txt; then
"echo Loaded environment from uEnv.txt;
"env import -t 44000000 ${filesize};
fi;
setenv bootargs console=${console} root=${root} ${extraargs};
ext2load mmc 0 43000000 script.bin &&
ext2load mmc 0 48000000 uImage &&
bootm 48000000
#endif

View File

@@ -398,7 +398,7 @@ config BOOT_DEFAULTS
menuconfig BOOTSTD
bool "Standard boot"
default y
depends on DM && OF_CONTROL && BLK
depends on DM && OF_CONTROL
help
U-Boot supports a standard way of locating something to boot,
typically an Operating System such as Linux, provided by a distro such
@@ -585,6 +585,20 @@ config BOOTMETH_EFI_BOOTMGR
the EFI binary to be launched is determined. To set the EFI variables
use the eficonfig command.
config BOOTMETH_FEL
bool "Bootdev support for Sunxi FEL"
depends on ARCH_SUNXI
default y
help
Enables support for booting over USB on a Sunxi device. This uses
the FEL protocol and obtains the script address from the
'fel_scriptaddr' environment variable.
This method is only available if booting from FEL, i.e. the
'fel_booted' environment variable is set.
See https://linux-sunxi.org/FEL/Protocol for more information.
config BOOTMETH_QFW
bool "Boot method using QEMU parameters"
depends on QFW

View File

@@ -30,6 +30,7 @@ obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_EXTLINUX) += bootmeth_extlinux.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_EXTLINUX_PXE) += bootmeth_pxe.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_EFILOADER) += bootmeth_efi.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_CROS) += bootm.o bootm_os.o bootmeth_cros.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_FEL) += bootmeth_fel.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_QFW) += bootmeth_qfw.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_SANDBOX) += bootmeth_sandbox.o
obj-$(CONFIG_$(SPL_TPL_)BOOTMETH_SCRIPT) += bootmeth_script.o

View File

@@ -434,6 +434,9 @@ int bootdev_find_by_label(const char *label, struct udevice **devp,
struct uclass *uc;
enum uclass_id id;
if (!CONFIG_IS_ENABLED(BLK))
return -ENOSYS;
ret = label_to_uclass(label, &seq, &method_flags);
if (ret < 0)
return log_msg_ret("uc", ret);

81
boot/bootmeth_fel.c Normal file
View File

@@ -0,0 +1,81 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Bootmethod for sunxi FEL loading
*
* Copyright 2024 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#define LOG_CATEGORY UCLASS_BOOTSTD
#include <bootdev.h>
#include <bootflow.h>
#include <bootmeth.h>
#include <command.h>
#include <dm.h>
#include <env.h>
static int fel_check(struct udevice *dev, struct bootflow_iter *iter)
{
return 0;
}
static int fel_read_bootflow(struct udevice *dev, struct bootflow *bflow)
{
if (!env_get("fel_booted") || !env_get("fel_scriptaddr"))
return -ENOENT;
bflow->state = BOOTFLOWST_READY;
return 0;
}
static int fel_read_file(struct udevice *dev, struct bootflow *bflow,
const char *file_path, ulong addr, ulong *sizep)
{
return -ENOSYS;
}
static int fel_boot(struct udevice *dev, struct bootflow *bflow)
{
ulong addr;
int ret;
addr = env_get_hex("fel_scriptaddr", 0);
ret = cmd_source_script(addr, NULL, NULL);
if (ret)
return log_msg_ret("boot", ret);
return 0;
}
static int fel_bootmeth_bind(struct udevice *dev)
{
struct bootmeth_uc_plat *plat = dev_get_uclass_plat(dev);
plat->desc = IS_ENABLED(CONFIG_BOOTSTD_FULL) ?
"Sunxi FEL boot over USB" : "FEL";
plat->flags = BOOTMETHF_GLOBAL;
return 0;
}
static struct bootmeth_ops fel_bootmeth_ops = {
.check = fel_check,
.read_bootflow = fel_read_bootflow,
.read_file = fel_read_file,
.boot = fel_boot,
};
static const struct udevice_id fel_bootmeth_ids[] = {
{ .compatible = "u-boot,fel-bootmeth" },
{ }
};
U_BOOT_DRIVER(bootmeth_2fel) = {
.name = "bootmeth_fel",
.id = UCLASS_BOOTMETH,
.of_match = fel_bootmeth_ids,
.ops = &fel_bootmeth_ops,
.bind = fel_bootmeth_bind,
};

View File

@@ -30,6 +30,7 @@ CONFIG_HAS_BOARD_SIZE_LIMIT=y
CONFIG_BOARD_SIZE_LIMIT=655360
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
# CONFIG_BOOTSTD is not set
CONFIG_LEGACY_IMAGE_FORMAT=y
CONFIG_AUTOBOOT_KEYED=y
CONFIG_AUTOBOOT_STOP_STR="x"

View File

@@ -87,6 +87,18 @@ settings. For example::
#include <env/ti/mmc.env>
Quotes are not supressed, for example::
fdtfile=CONFIG_DEFAULT_DEVICE_TREE.dtb
# produces: fdtfile="sun7i-a20-pcduino3.dtb"
For this particular issue you can use DEFAULT_DEVICE_TREE instead::
fdtfile=DEFAULT_DEVICE_TREE.dtb
# produces: fdtfile=sun7i-a20-pcduino3.dtb
There is no general way to remove quotes.
If CONFIG_ENV_SOURCE_FILE is empty and the default filename is not present, then
the old-style C environment is used instead. See below.

View File

@@ -197,7 +197,6 @@ static inline void blkcache_free(void) {}
#endif
#if CONFIG_IS_ENABLED(BLK)
struct udevice;
/* Operations on block devices */
@@ -278,6 +277,8 @@ struct blk_ops {
#endif /* CONFIG_BOUNCE_BUFFER */
};
#if CONFIG_IS_ENABLED(BLK)
/*
* These functions should take struct udevice instead of struct blk_desc,
* but this is convenient for migration to driver model. Add a 'd' prefix
@@ -291,6 +292,8 @@ unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
lbaint_t blkcnt);
#endif /* BLK */
/**
* blk_read() - Read from a block device
*
@@ -528,8 +531,10 @@ struct blk_desc *blk_get_by_device(struct udevice *dev);
*/
int blk_get_desc(enum uclass_id uclass_id, int devnum, struct blk_desc **descp);
#else
#if !CONFIG_IS_ENABLED(BLK)
#include <errno.h>
/*
* These functions should take struct udevice instead of struct blk_desc,
* but this is convenient for migration to driver model. Add a 'd' prefix

View File

@@ -61,242 +61,4 @@
#define PHYS_SDRAM_0 CFG_SYS_SDRAM_BASE
#define PHYS_SDRAM_0_SIZE 0x80000000 /* 2 GiB */
/****************************************************************************
* environment variables holding default load addresses *
****************************************************************************/
/*
* We cannot use expressions here, because expressions won't be evaluated in
* autoconf.mk.
*/
#ifdef CONFIG_ARM64
/*
* Boards seem to come with at least 512MB of DRAM.
* The kernel should go at 512K, which is the default text offset (that will
* be adjusted at runtime if needed).
* There is no compression for arm64 kernels (yet), so leave some space
* for really big kernels, say 256MB for now.
* Scripts, PXE and DTBs should go afterwards, leaving the rest for the initrd.
*/
#define BOOTM_SIZE __stringify(0xa000000)
#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(0080000))
#define KERNEL_COMP_ADDR_R __stringify(SDRAM_OFFSET(4000000))
#define KERNEL_COMP_SIZE __stringify(0xb000000)
#define FDT_ADDR_R __stringify(SDRAM_OFFSET(FA00000))
#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(FC00000))
#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(FD00000))
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(FE00000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(FF00000))
#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.
* 16M uncompressed kernel, 8M compressed kernel, 1M fdt,
* 1M script, 1M pxe, 1M dt overlay and the ramdisk at the end.
*/
#define BOOTM_SIZE __stringify(0x2e00000)
#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(1000000))
#define FDT_ADDR_R __stringify(SDRAM_OFFSET(1800000))
#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(1900000))
#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(1A00000))
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(1B00000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1C00000))
#elif (CONFIG_SUNXI_MINIMUM_DRAM_MB >= 32)
/*
* 32M RAM minus 2.5MB for u-boot, heap, stack, etc.
* 16M uncompressed kernel, 7M compressed kernel, 128K fdt, 64K script,
* 128K DT overlay, 128K PXE and the ramdisk in the rest (max. 5MB)
*/
#define BOOTM_SIZE __stringify(0x1700000)
#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(1000000))
#define FDT_ADDR_R __stringify(SDRAM_OFFSET(1d50000))
#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(1d40000))
#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(1d00000))
#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(1d20000))
#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1800000))
#else
#error Need at least 32MB of DRAM. Please adjust load addresses.
#endif
#define MEM_LAYOUT_ENV_SETTINGS \
"bootm_size=" BOOTM_SIZE "\0" \
"kernel_addr_r=" KERNEL_ADDR_R "\0" \
"fdt_addr_r=" FDT_ADDR_R "\0" \
"scriptaddr=" SCRIPT_ADDR_R "\0" \
"pxefile_addr_r=" PXEFILE_ADDR_R "\0" \
"fdtoverlay_addr_r=" FDTOVERLAY_ADDR_R "\0" \
"ramdisk_addr_r=" RAMDISK_ADDR_R "\0"
#ifdef CONFIG_ARM64
#define MEM_LAYOUT_ENV_EXTRA_SETTINGS \
"kernel_comp_addr_r=" KERNEL_COMP_ADDR_R "\0" \
"kernel_comp_size=" KERNEL_COMP_SIZE "\0"
#else
#define MEM_LAYOUT_ENV_EXTRA_SETTINGS ""
#endif
#define DFU_ALT_INFO_RAM \
"dfu_alt_info_ram=" \
"kernel ram " KERNEL_ADDR_R " 0x1000000;" \
"fdt ram " FDT_ADDR_R " 0x100000;" \
"ramdisk ram " RAMDISK_ADDR_R " 0x4000000\0"
/****************************************************************************
* definitions for the distro boot system *
****************************************************************************/
#ifdef CONFIG_MMC
#if CONFIG_MMC_SUNXI_SLOT_EXTRA != -1
#define BOOTENV_DEV_MMC_AUTO(devtypeu, devtypel, instance) \
BOOTENV_DEV_MMC(MMC, mmc, 0) \
BOOTENV_DEV_MMC(MMC, mmc, 1) \
"bootcmd_mmc_auto=" \
"if test ${mmc_bootdev} -eq 1; then " \
"run bootcmd_mmc1; " \
"run bootcmd_mmc0; " \
"elif test ${mmc_bootdev} -eq 0; then " \
"run bootcmd_mmc0; " \
"run bootcmd_mmc1; " \
"fi\0"
#define BOOTENV_DEV_NAME_MMC_AUTO(devtypeu, devtypel, instance) \
"mmc_auto "
#define BOOT_TARGET_DEVICES_MMC(func) func(MMC_AUTO, mmc_auto, na)
#else
#define BOOT_TARGET_DEVICES_MMC(func) func(MMC, mmc, 0)
#endif
#else
#define BOOT_TARGET_DEVICES_MMC(func)
#endif
#ifdef CONFIG_AHCI
#define BOOT_TARGET_DEVICES_SCSI(func) func(SCSI, scsi, 0)
#else
#define BOOT_TARGET_DEVICES_SCSI(func)
#endif
#ifdef CONFIG_USB_STORAGE
#define BOOT_TARGET_DEVICES_USB(func) func(USB, usb, 0)
#else
#define BOOT_TARGET_DEVICES_USB(func)
#endif
#ifdef CONFIG_CMD_PXE
#define BOOT_TARGET_DEVICES_PXE(func) func(PXE, pxe, na)
#else
#define BOOT_TARGET_DEVICES_PXE(func)
#endif
#ifdef CONFIG_CMD_DHCP
#define BOOT_TARGET_DEVICES_DHCP(func) func(DHCP, dhcp, na)
#else
#define BOOT_TARGET_DEVICES_DHCP(func)
#endif
/* FEL boot support, auto-execute boot.scr if a script address was provided */
#define BOOTENV_DEV_FEL(devtypeu, devtypel, instance) \
"bootcmd_fel=" \
"if test -n ${fel_booted} && test -n ${fel_scriptaddr}; then " \
"echo '(FEL boot)'; " \
"source ${fel_scriptaddr}; " \
"fi\0"
#define BOOTENV_DEV_NAME_FEL(devtypeu, devtypel, instance) \
"fel "
#define BOOT_TARGET_DEVICES(func) \
func(FEL, fel, na) \
BOOT_TARGET_DEVICES_MMC(func) \
BOOT_TARGET_DEVICES_SCSI(func) \
BOOT_TARGET_DEVICES_USB(func) \
BOOT_TARGET_DEVICES_PXE(func) \
BOOT_TARGET_DEVICES_DHCP(func)
#ifdef CONFIG_OLD_SUNXI_KERNEL_COMPAT
#define BOOTCMD_SUNXI_COMPAT \
"bootcmd_sunxi_compat=" \
"setenv root /dev/mmcblk0p3 rootwait; " \
"if ext2load mmc 0 0x44000000 uEnv.txt; then " \
"echo Loaded environment from uEnv.txt; " \
"env import -t 0x44000000 ${filesize}; " \
"fi; " \
"setenv bootargs console=${console} root=${root} ${extraargs}; " \
"ext2load mmc 0 0x43000000 script.bin && " \
"ext2load mmc 0 0x48000000 uImage && " \
"bootm 0x48000000\0"
#else
#define BOOTCMD_SUNXI_COMPAT
#endif
#include <config_distro_bootcmd.h>
#ifdef CONFIG_USB_KEYBOARD
#define CONSOLE_STDIN_SETTINGS \
"stdin=serial,usbkbd\0"
#else
#define CONSOLE_STDIN_SETTINGS \
"stdin=serial\0"
#endif
#ifdef CONFIG_VIDEO
#define CONSOLE_STDOUT_SETTINGS \
"stdout=serial,vidconsole\0" \
"stderr=serial,vidconsole\0"
#else
#define CONSOLE_STDOUT_SETTINGS \
"stdout=serial\0" \
"stderr=serial\0"
#endif
#define PARTS_DEFAULT \
"name=loader1,start=8k,size=32k,uuid=${uuid_gpt_loader1};" \
"name=loader2,size=984k,uuid=${uuid_gpt_loader2};" \
"name=esp,size=128M,bootable,uuid=${uuid_gpt_esp};" \
"name=system,size=-,uuid=${uuid_gpt_system};"
#define UUID_GPT_ESP "c12a7328-f81f-11d2-ba4b-00a0c93ec93b"
#ifdef CONFIG_ARM64
#define UUID_GPT_SYSTEM "b921b045-1df0-41c3-af44-4c6f280d3fae"
#else
#define UUID_GPT_SYSTEM "69dad710-2ce4-4e3c-b16c-21a1d49abed3"
#endif
#define CONSOLE_ENV_SETTINGS \
CONSOLE_STDIN_SETTINGS \
CONSOLE_STDOUT_SETTINGS
#ifdef CONFIG_ARM64
#define FDTFILE "allwinner/" CONFIG_DEFAULT_DEVICE_TREE ".dtb"
#else
#define FDTFILE CONFIG_DEFAULT_DEVICE_TREE ".dtb"
#endif
#define CFG_EXTRA_ENV_SETTINGS \
CONSOLE_ENV_SETTINGS \
MEM_LAYOUT_ENV_SETTINGS \
MEM_LAYOUT_ENV_EXTRA_SETTINGS \
DFU_ALT_INFO_RAM \
"fdtfile=" FDTFILE "\0" \
"console=ttyS0,115200\0" \
"uuid_gpt_esp=" UUID_GPT_ESP "\0" \
"uuid_gpt_system=" UUID_GPT_SYSTEM "\0" \
"partitions=" PARTS_DEFAULT "\0" \
BOOTCMD_SUNXI_COMPAT \
BOOTENV
#endif /* _SUNXI_COMMON_CONFIG_H */