sunxi: Extend SPL header versioning
authorAndre Przywara <andre.przywara@arm.com>
Thu, 25 Oct 2018 09:23:03 +0000 (17:23 +0800)
committerJagan Teki <jagan@amarulasolutions.com>
Mon, 29 Oct 2018 15:11:15 +0000 (20:41 +0530)
On Allwinner SoCs we use some free bytes at the beginning of the SPL image
to store various information. We have a version byte to allow updates,
but changing this always requires all tools to be updated as well.

Introduce the concept of semantic versioning [1] to the SPL header:
The major part of the version number only changes on incompatible
updates, a minor number bump indicates backward compatibility.
This patch just documents the major/minor split, adds some comments
to the header file and uses the versioning information for the existing
users.

[1] https://semver.org

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>
Acked-by: Jagan Teki <jagan@openedev.com>
arch/arm/include/asm/arch-sunxi/spl.h
board/sunxi/board.c

index 55f2deb18d105998b2f11a12b05c694c13c77e9c..014184b638b3dc8d42613e744a8f714ada928ed4 100644 (file)
@@ -9,7 +9,16 @@
 
 #define BOOT0_MAGIC            "eGON.BT0"
 #define SPL_SIGNATURE          "SPL" /* marks "sunxi" SPL header */
-#define SPL_HEADER_VERSION     2
+#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)
 
 #define SPL_ADDR               CONFIG_SUNXI_SRAM_ADDRESS
 
@@ -45,14 +54,14 @@ struct boot_file_head {
                uint32_t pub_head_size;
                uint8_t spl_signature[4];
        };
-       uint32_t fel_script_address;
+       uint32_t fel_script_address;    /* since v0.1, set by sunxi-fel */
        /*
         * 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;
+       uint32_t fel_uEnv_length;       /* since v0.1, set by sunxi-fel */
        /*
         * Offset of an ASCIIZ string (relative to the SPL header), which
         * contains the default device tree name (CONFIG_DEFAULT_DEVICE_TREE).
@@ -60,11 +69,11 @@ struct boot_file_head {
         * by flash programming tools for providing nice informative messages
         * to the users.
         */
-       uint32_t dt_name_offset;
+       uint32_t dt_name_offset;        /* since v0.2, set by mksunxiboot */
        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];
+       uint32_t string_pool[13];       /* since v0.2, filled by mksunxiboot */
        /* The header must be a multiple of 32 bytes (for VBAR alignment) */
 };
 
index e075c132397d5f19a5656b5fa1f015731fb3913d..6926504ce5e1678365f1f0dd3698e26b82273a27 100644 (file)
@@ -667,9 +667,9 @@ static void parse_spl_header(const uint32_t spl_addr)
                return; /* signature mismatch, no usable header */
 
        uint8_t spl_header_version = spl->spl_signature[3];
-       if (spl_header_version != SPL_HEADER_VERSION) {
+       if (spl_header_version < SPL_ENV_HEADER_VERSION) {
                printf("sunxi SPL version mismatch: expected %u, got %u\n",
-                      SPL_HEADER_VERSION, spl_header_version);
+                      SPL_ENV_HEADER_VERSION, spl_header_version);
                return;
        }
        if (!spl->fel_script_address)