sunxi: Extend SPL header versioning
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>
This commit is contained in:
		
							parent
							
								
									c6c2c85e4b
								
							
						
					
					
						commit
						55d481d201
					
				|  | @ -9,7 +9,16 @@ | ||||||
| 
 | 
 | ||||||
| #define BOOT0_MAGIC		"eGON.BT0" | #define BOOT0_MAGIC		"eGON.BT0" | ||||||
| #define SPL_SIGNATURE		"SPL" /* marks "sunxi" SPL header */ | #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 | #define SPL_ADDR		CONFIG_SUNXI_SRAM_ADDRESS | ||||||
| 
 | 
 | ||||||
|  | @ -45,14 +54,14 @@ struct boot_file_head { | ||||||
| 		uint32_t pub_head_size; | 		uint32_t pub_head_size; | ||||||
| 		uint8_t spl_signature[4]; | 		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, | 	 * 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. | 	 * 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 | 	 * At the same time this indicates that the data is in uEnv.txt | ||||||
| 	 * compatible format, ready to be imported via "env import -t". | 	 * 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 | 	 * Offset of an ASCIIZ string (relative to the SPL header), which | ||||||
| 	 * contains the default device tree name (CONFIG_DEFAULT_DEVICE_TREE). | 	 * 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 | 	 * by flash programming tools for providing nice informative messages | ||||||
| 	 * to the users. | 	 * to the users. | ||||||
| 	 */ | 	 */ | ||||||
| 	uint32_t dt_name_offset; | 	uint32_t dt_name_offset;	/* since v0.2, set by mksunxiboot */ | ||||||
| 	uint32_t reserved1; | 	uint32_t reserved1; | ||||||
| 	uint32_t boot_media;		/* written here by the boot ROM */ | 	uint32_t boot_media;		/* written here by the boot ROM */ | ||||||
| 	/* A padding area (may be used for storing text strings) */ | 	/* 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) */ | 	/* The header must be a multiple of 32 bytes (for VBAR alignment) */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -667,9 +667,9 @@ static void parse_spl_header(const uint32_t spl_addr) | ||||||
| 		return; /* signature mismatch, no usable header */ | 		return; /* signature mismatch, no usable header */ | ||||||
| 
 | 
 | ||||||
| 	uint8_t spl_header_version = spl->spl_signature[3]; | 	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", | 		printf("sunxi SPL version mismatch: expected %u, got %u\n", | ||||||
| 		       SPL_HEADER_VERSION, spl_header_version); | 		       SPL_ENV_HEADER_VERSION, spl_header_version); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 	if (!spl->fel_script_address) | 	if (!spl->fel_script_address) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue