mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-12 14:23:00 +00:00
7f0ef5a945
This patch updates the mksunxiboot tool to optionally add the default device tree name string to the SPL header. This information can be used by the firmware upgrade tools to protect users from harming themselves by trying to upgrade to an incompatible bootloader. The primary use case here is a non-removable bootable media (such as NAND, eMMC or SPI flash), which already may have a properly working, but a little bit outdated bootloader installed. For example, the user may download or build a new U-Boot image for "Cubieboard", and then attemept to install it on a "Cubieboard2" hardware by mistake as a replacement for the already existing bootloader. If this happens, the flash programming tool can identify this problem and warn the user. The size of the SPL header is also increased from 64 bytes to 96 bytes to provide enough space for the device tree name string. [Andre: split patch to remove OF_LIST hash feature] Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
81 lines
2.8 KiB
C
81 lines
2.8 KiB
C
/*
|
|
* (C) Copyright 2007-2011
|
|
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
|
* Tom Cubie <tangliang@allwinnertech.com>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
#ifndef _ASM_ARCH_SPL_H_
|
|
#define _ASM_ARCH_SPL_H_
|
|
|
|
#define BOOT0_MAGIC "eGON.BT0"
|
|
#define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */
|
|
#define SPL_HEADER_VERSION 2
|
|
|
|
#ifdef CONFIG_SUNXI_HIGH_SRAM
|
|
#define SPL_ADDR 0x10000
|
|
#else
|
|
#define SPL_ADDR 0x0
|
|
#endif
|
|
|
|
/* The low 8-bits of the 'boot_media' field in the SPL header */
|
|
#define SUNXI_BOOTED_FROM_MMC0 0
|
|
#define SUNXI_BOOTED_FROM_NAND 1
|
|
#define SUNXI_BOOTED_FROM_MMC2 2
|
|
#define SUNXI_BOOTED_FROM_SPI 3
|
|
|
|
/* boot head definition from sun4i boot code */
|
|
struct boot_file_head {
|
|
uint32_t b_instruction; /* one intruction jumping to real code */
|
|
uint8_t magic[8]; /* ="eGON.BT0" or "eGON.BT1", not C-style str */
|
|
uint32_t check_sum; /* generated by PC */
|
|
uint32_t length; /* generated by PC */
|
|
/*
|
|
* We use a simplified header, only filling in what is needed
|
|
* by the boot ROM. To be compatible with Allwinner tools we
|
|
* would need to implement the proper fields here instead of
|
|
* padding.
|
|
*
|
|
* Actually we want the ability to recognize our "sunxi" variant
|
|
* of the SPL. To do so, let's place a special signature into the
|
|
* "pub_head_size" field. We can reasonably expect Allwinner's
|
|
* boot0 to always have the upper 16 bits of this set to 0 (after
|
|
* all the value shouldn't be larger than the limit imposed by
|
|
* SRAM size).
|
|
* If the signature is present (at 0x14), then we know it's safe
|
|
* to use the remaining 8 bytes (at 0x18) for our own purposes.
|
|
* (E.g. sunxi-tools "fel" utility can pass information there.)
|
|
*/
|
|
union {
|
|
uint32_t pub_head_size;
|
|
uint8_t spl_signature[4];
|
|
};
|
|
uint32_t fel_script_address;
|
|
/*
|
|
* If the fel_uEnv_length member below is set to a non-zero value,
|
|
* it specifies the size (byte count) of data at fel_script_address.
|
|
* At the same time this indicates that the data is in uEnv.txt
|
|
* compatible format, ready to be imported via "env import -t".
|
|
*/
|
|
uint32_t fel_uEnv_length;
|
|
/*
|
|
* Offset of an ASCIIZ string (relative to the SPL header), which
|
|
* contains the default device tree name (CONFIG_DEFAULT_DEVICE_TREE).
|
|
* This is optional and may be set to NULL. Is intended to be used
|
|
* by flash programming tools for providing nice informative messages
|
|
* to the users.
|
|
*/
|
|
uint32_t dt_name_offset;
|
|
uint32_t reserved1;
|
|
uint32_t boot_media; /* written here by the boot ROM */
|
|
/* A padding area (may be used for storing text strings) */
|
|
uint32_t string_pool[13];
|
|
/* The header must be a multiple of 32 bytes (for VBAR alignment) */
|
|
};
|
|
|
|
/* Compile time check to assure proper alignment of structure */
|
|
typedef char boot_file_head_not_multiple_of_32[1 - 2*(sizeof(struct boot_file_head) % 32)];
|
|
|
|
#define is_boot0_magic(addr) (memcmp((void *)addr, BOOT0_MAGIC, 8) == 0)
|
|
|
|
#endif
|