2018-05-06 21:58:06 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
2014-05-05 10:52:26 +00:00
|
|
|
/*
|
2015-09-17 16:52:50 +00:00
|
|
|
* (C) Copyright 2007-2011
|
|
|
|
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
|
|
|
* Tom Cubie <tangliang@allwinnertech.com>
|
2014-05-05 10:52:26 +00:00
|
|
|
*/
|
|
|
|
#ifndef _ASM_ARCH_SPL_H_
|
2014-06-11 20:01:48 +00:00
|
|
|
#define _ASM_ARCH_SPL_H_
|
2014-05-05 10:52:26 +00:00
|
|
|
|
2015-09-17 16:52:50 +00:00
|
|
|
#define BOOT0_MAGIC "eGON.BT0"
|
2015-09-17 16:52:51 +00:00
|
|
|
#define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */
|
2018-10-25 09:23:03 +00:00
|
|
|
#define SPL_MAJOR_BITS 3
|
|
|
|
#define SPL_MINOR_BITS 5
|
|
|
|
#define SPL_VERSION(maj, min) \
|
|
|
|
((((maj) & ((1U << SPL_MAJOR_BITS) - 1)) << SPL_MINOR_BITS) | \
|
|
|
|
((min) & ((1U << SPL_MINOR_BITS) - 1)))
|
|
|
|
|
|
|
|
#define SPL_HEADER_VERSION SPL_VERSION(0, 2)
|
|
|
|
|
|
|
|
#define SPL_ENV_HEADER_VERSION SPL_VERSION(0, 1)
|
|
|
|
#define SPL_DT_HEADER_VERSION SPL_VERSION(0, 2)
|
sunxi: store DRAM size in SPL header
At the moment we rely on the infamous get_ram_size() function to learn
the actual DRAM size in U-Boot proper. This function has two issues:
1) It only works if the DRAM size is a power of two. We start to see
boards which have 3GB of (usable) DRAM, so this does not fit anymore.
2) As U-Boot has no notion of reserved memory so far, it will happily
ride through the DRAM, possibly stepping on secure-only memory. This
could be a region of DRAM reserved for OP-TEE or some other secure
payload, for instance. It will most likely crash in that case.
As the SPL DRAM init routine has very accurate knowledge of the actual
DRAM size, lets propagate this wisdom to U-Boot proper.
We re-purpose a currently reserved word in our SPL header for that.
The SPL itself stores the detected DRAM size there, and bumps the SPL
header version number in that case. U-Boot proper checks for a valid
SPL header and a high enough version number, then uses the DRAM size
from there. If the SPL header field is not sufficient, we fall back to
the old DRAM scanning routine.
Part of the DRAM might be present and probed by SPL, but not accessible
by the CPU. They're restricted in the main U-Boot binary, when accessing
the DRAM size from SPL header.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
2018-10-25 09:23:07 +00:00
|
|
|
#define SPL_DRAM_HEADER_VERSION SPL_VERSION(0, 3)
|
2015-09-17 16:52:50 +00:00
|
|
|
|
2018-07-21 08:20:20 +00:00
|
|
|
#define SPL_ADDR CONFIG_SUNXI_SRAM_ADDRESS
|
2015-09-17 16:52:52 +00:00
|
|
|
|
sunxi: Increase SPL header size to 64 bytes to avoid code corruption
The current SPL header, created by the 'mksunxiboot' tool, has size
32 bytes. But the code in the boot ROM stores the information about
the boot media at the offset 0x28 before passing control to the SPL.
For example, when booting from the SD card, the magic number written
by the boot ROM is 0. And when booting from the SPI flash, the magic
number is 3. NAND and eMMC probably have their own special magic
numbers too.
Currently the corrupted byte is a part of one of the instructions in
the reset vectors table:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt <- Corruption happens here
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
In practice this does not cause any visible problems, but it's still
better to fix it. As a bonus, the reported boot media type can be
later used in the 'spl_boot_device' function, but this is out of
the scope of this patch.
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2016-05-14 01:13:26 +00:00
|
|
|
/* The low 8-bits of the 'boot_media' field in the SPL header */
|
|
|
|
#define SUNXI_BOOTED_FROM_MMC0 0
|
2016-06-13 16:13:07 +00:00
|
|
|
#define SUNXI_BOOTED_FROM_NAND 1
|
|
|
|
#define SUNXI_BOOTED_FROM_MMC2 2
|
sunxi: Increase SPL header size to 64 bytes to avoid code corruption
The current SPL header, created by the 'mksunxiboot' tool, has size
32 bytes. But the code in the boot ROM stores the information about
the boot media at the offset 0x28 before passing control to the SPL.
For example, when booting from the SD card, the magic number written
by the boot ROM is 0. And when booting from the SPI flash, the magic
number is 3. NAND and eMMC probably have their own special magic
numbers too.
Currently the corrupted byte is a part of one of the instructions in
the reset vectors table:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt <- Corruption happens here
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
In practice this does not cause any visible problems, but it's still
better to fix it. As a bonus, the reported boot media type can be
later used in the 'spl_boot_device' function, but this is out of
the scope of this patch.
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2016-05-14 01:13:26 +00:00
|
|
|
#define SUNXI_BOOTED_FROM_SPI 3
|
2018-12-16 02:04:58 +00:00
|
|
|
#define SUNXI_BOOTED_FROM_MMC0_HIGH 0x10
|
|
|
|
#define SUNXI_BOOTED_FROM_MMC2_HIGH 0x12
|
sunxi: Increase SPL header size to 64 bytes to avoid code corruption
The current SPL header, created by the 'mksunxiboot' tool, has size
32 bytes. But the code in the boot ROM stores the information about
the boot media at the offset 0x28 before passing control to the SPL.
For example, when booting from the SD card, the magic number written
by the boot ROM is 0. And when booting from the SPI flash, the magic
number is 3. NAND and eMMC probably have their own special magic
numbers too.
Currently the corrupted byte is a part of one of the instructions in
the reset vectors table:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt <- Corruption happens here
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
In practice this does not cause any visible problems, but it's still
better to fix it. As a bonus, the reported boot media type can be
later used in the 'spl_boot_device' function, but this is out of
the scope of this patch.
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2016-05-14 01:13:26 +00:00
|
|
|
|
2015-09-17 16:52:50 +00:00
|
|
|
/* 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.
|
2015-09-17 16:52:51 +00:00
|
|
|
*
|
|
|
|
* 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.)
|
2015-09-17 16:52:50 +00:00
|
|
|
*/
|
2015-09-17 16:52:51 +00:00
|
|
|
union {
|
|
|
|
uint32_t pub_head_size;
|
|
|
|
uint8_t spl_signature[4];
|
|
|
|
};
|
2018-10-25 09:23:03 +00:00
|
|
|
uint32_t fel_script_address; /* since v0.1, set by sunxi-fel */
|
2016-06-09 05:37:35 +00:00
|
|
|
/*
|
|
|
|
* 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".
|
|
|
|
*/
|
2018-10-25 09:23:03 +00:00
|
|
|
uint32_t fel_uEnv_length; /* since v0.1, set by sunxi-fel */
|
2017-04-26 00:32:49 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2018-10-25 09:23:03 +00:00
|
|
|
uint32_t dt_name_offset; /* since v0.2, set by mksunxiboot */
|
sunxi: store DRAM size in SPL header
At the moment we rely on the infamous get_ram_size() function to learn
the actual DRAM size in U-Boot proper. This function has two issues:
1) It only works if the DRAM size is a power of two. We start to see
boards which have 3GB of (usable) DRAM, so this does not fit anymore.
2) As U-Boot has no notion of reserved memory so far, it will happily
ride through the DRAM, possibly stepping on secure-only memory. This
could be a region of DRAM reserved for OP-TEE or some other secure
payload, for instance. It will most likely crash in that case.
As the SPL DRAM init routine has very accurate knowledge of the actual
DRAM size, lets propagate this wisdom to U-Boot proper.
We re-purpose a currently reserved word in our SPL header for that.
The SPL itself stores the detected DRAM size there, and bumps the SPL
header version number in that case. U-Boot proper checks for a valid
SPL header and a high enough version number, then uses the DRAM size
from there. If the SPL header field is not sufficient, we fall back to
the old DRAM scanning routine.
Part of the DRAM might be present and probed by SPL, but not accessible
by the CPU. They're restricted in the main U-Boot binary, when accessing
the DRAM size from SPL header.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Jagan Teki <jagan@openedev.com>
2018-10-25 09:23:07 +00:00
|
|
|
uint32_t dram_size; /* in MiB, since v0.3, set by SPL */
|
sunxi: Increase SPL header size to 64 bytes to avoid code corruption
The current SPL header, created by the 'mksunxiboot' tool, has size
32 bytes. But the code in the boot ROM stores the information about
the boot media at the offset 0x28 before passing control to the SPL.
For example, when booting from the SD card, the magic number written
by the boot ROM is 0. And when booting from the SPI flash, the magic
number is 3. NAND and eMMC probably have their own special magic
numbers too.
Currently the corrupted byte is a part of one of the instructions in
the reset vectors table:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt <- Corruption happens here
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
In practice this does not cause any visible problems, but it's still
better to fix it. As a bonus, the reported boot media type can be
later used in the 'spl_boot_device' function, but this is out of
the scope of this patch.
Signed-off-by: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2016-05-14 01:13:26 +00:00
|
|
|
uint32_t boot_media; /* written here by the boot ROM */
|
2017-04-26 00:32:49 +00:00
|
|
|
/* A padding area (may be used for storing text strings) */
|
2018-10-25 09:23:03 +00:00
|
|
|
uint32_t string_pool[13]; /* since v0.2, filled by mksunxiboot */
|
2017-04-26 00:32:49 +00:00
|
|
|
/* The header must be a multiple of 32 bytes (for VBAR alignment) */
|
2015-09-17 16:52:50 +00:00
|
|
|
};
|
|
|
|
|
2017-04-26 00:32:49 +00:00
|
|
|
/* 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)];
|
|
|
|
|
2015-09-17 16:52:52 +00:00
|
|
|
#define is_boot0_magic(addr) (memcmp((void *)addr, BOOT0_MAGIC, 8) == 0)
|
|
|
|
|
2017-08-23 08:06:30 +00:00
|
|
|
uint32_t sunxi_get_boot_device(void);
|
|
|
|
|
2014-05-05 10:52:26 +00:00
|
|
|
#endif
|