1cba69eeeSIan Campbell /* 2e954eb80SBernhard Nortmann * (C) Copyright 2007-2011 3e954eb80SBernhard Nortmann * Allwinner Technology Co., Ltd. <www.allwinnertech.com> 4e954eb80SBernhard Nortmann * Tom Cubie <tangliang@allwinnertech.com> 5cba69eeeSIan Campbell * 6cba69eeeSIan Campbell * SPDX-License-Identifier: GPL-2.0+ 7cba69eeeSIan Campbell */ 8cba69eeeSIan Campbell #ifndef _ASM_ARCH_SPL_H_ 9ed6c7f7fSJeroen Hofstee #define _ASM_ARCH_SPL_H_ 10cba69eeeSIan Campbell 11e954eb80SBernhard Nortmann #define BOOT0_MAGIC "eGON.BT0" 12a1884381SBernhard Nortmann #define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */ 13*7f0ef5a9SSiarhei Siamashka #define SPL_HEADER_VERSION 2 14e954eb80SBernhard Nortmann 15bc613d85SAndre Przywara #ifdef CONFIG_SUNXI_HIGH_SRAM 16d96ebc46SSiarhei Siamashka #define SPL_ADDR 0x10000 17d96ebc46SSiarhei Siamashka #else 18af654d14SBernhard Nortmann #define SPL_ADDR 0x0 19d96ebc46SSiarhei Siamashka #endif 20af654d14SBernhard Nortmann 21b19236fdSSiarhei Siamashka /* The low 8-bits of the 'boot_media' field in the SPL header */ 22b19236fdSSiarhei Siamashka #define SUNXI_BOOTED_FROM_MMC0 0 239acebe8aSOlliver Schinagl #define SUNXI_BOOTED_FROM_NAND 1 249acebe8aSOlliver Schinagl #define SUNXI_BOOTED_FROM_MMC2 2 25b19236fdSSiarhei Siamashka #define SUNXI_BOOTED_FROM_SPI 3 26b19236fdSSiarhei Siamashka 27e954eb80SBernhard Nortmann /* boot head definition from sun4i boot code */ 28e954eb80SBernhard Nortmann struct boot_file_head { 29e954eb80SBernhard Nortmann uint32_t b_instruction; /* one intruction jumping to real code */ 30e954eb80SBernhard Nortmann uint8_t magic[8]; /* ="eGON.BT0" or "eGON.BT1", not C-style str */ 31e954eb80SBernhard Nortmann uint32_t check_sum; /* generated by PC */ 32e954eb80SBernhard Nortmann uint32_t length; /* generated by PC */ 33e954eb80SBernhard Nortmann /* 34e954eb80SBernhard Nortmann * We use a simplified header, only filling in what is needed 35e954eb80SBernhard Nortmann * by the boot ROM. To be compatible with Allwinner tools we 36e954eb80SBernhard Nortmann * would need to implement the proper fields here instead of 37e954eb80SBernhard Nortmann * padding. 38a1884381SBernhard Nortmann * 39a1884381SBernhard Nortmann * Actually we want the ability to recognize our "sunxi" variant 40a1884381SBernhard Nortmann * of the SPL. To do so, let's place a special signature into the 41a1884381SBernhard Nortmann * "pub_head_size" field. We can reasonably expect Allwinner's 42a1884381SBernhard Nortmann * boot0 to always have the upper 16 bits of this set to 0 (after 43a1884381SBernhard Nortmann * all the value shouldn't be larger than the limit imposed by 44a1884381SBernhard Nortmann * SRAM size). 45a1884381SBernhard Nortmann * If the signature is present (at 0x14), then we know it's safe 46a1884381SBernhard Nortmann * to use the remaining 8 bytes (at 0x18) for our own purposes. 47a1884381SBernhard Nortmann * (E.g. sunxi-tools "fel" utility can pass information there.) 48e954eb80SBernhard Nortmann */ 49a1884381SBernhard Nortmann union { 50a1884381SBernhard Nortmann uint32_t pub_head_size; 51a1884381SBernhard Nortmann uint8_t spl_signature[4]; 52a1884381SBernhard Nortmann }; 53a1884381SBernhard Nortmann uint32_t fel_script_address; 54320e0570SBernhard Nortmann /* 55320e0570SBernhard Nortmann * If the fel_uEnv_length member below is set to a non-zero value, 56320e0570SBernhard Nortmann * it specifies the size (byte count) of data at fel_script_address. 57320e0570SBernhard Nortmann * At the same time this indicates that the data is in uEnv.txt 58320e0570SBernhard Nortmann * compatible format, ready to be imported via "env import -t". 59320e0570SBernhard Nortmann */ 60320e0570SBernhard Nortmann uint32_t fel_uEnv_length; 61*7f0ef5a9SSiarhei Siamashka /* 62*7f0ef5a9SSiarhei Siamashka * Offset of an ASCIIZ string (relative to the SPL header), which 63*7f0ef5a9SSiarhei Siamashka * contains the default device tree name (CONFIG_DEFAULT_DEVICE_TREE). 64*7f0ef5a9SSiarhei Siamashka * This is optional and may be set to NULL. Is intended to be used 65*7f0ef5a9SSiarhei Siamashka * by flash programming tools for providing nice informative messages 66*7f0ef5a9SSiarhei Siamashka * to the users. 67*7f0ef5a9SSiarhei Siamashka */ 68*7f0ef5a9SSiarhei Siamashka uint32_t dt_name_offset; 69*7f0ef5a9SSiarhei Siamashka uint32_t reserved1; 70b19236fdSSiarhei Siamashka uint32_t boot_media; /* written here by the boot ROM */ 71*7f0ef5a9SSiarhei Siamashka /* A padding area (may be used for storing text strings) */ 72*7f0ef5a9SSiarhei Siamashka uint32_t string_pool[13]; 73*7f0ef5a9SSiarhei Siamashka /* The header must be a multiple of 32 bytes (for VBAR alignment) */ 74e954eb80SBernhard Nortmann }; 75e954eb80SBernhard Nortmann 76*7f0ef5a9SSiarhei Siamashka /* Compile time check to assure proper alignment of structure */ 77*7f0ef5a9SSiarhei Siamashka typedef char boot_file_head_not_multiple_of_32[1 - 2*(sizeof(struct boot_file_head) % 32)]; 78*7f0ef5a9SSiarhei Siamashka 79af654d14SBernhard Nortmann #define is_boot0_magic(addr) (memcmp((void *)addr, BOOT0_MAGIC, 8) == 0) 80af654d14SBernhard Nortmann 81cba69eeeSIan Campbell #endif 82