Skip to content
Snippets Groups Projects
Commit e9e87ec4 authored by Samuel Holland's avatar Samuel Holland Committed by André Przywara
Browse files

tools: mkimage: Add Allwinner TOC0 support


Most Allwinner sunxi SoCs have separate boot ROMs in non-secure and
secure mode. The "non-secure" or "normal" boot ROM (NBROM) uses the
existing sunxi_egon image type. The secure boot ROM (SBROM) uses a
completely different image type, known as TOC0.

A TOC0 image is composed of a header and two or more items. One item
is the firmware binary. The others form a chain linking the firmware
signature to the root-of-trust public key (ROTPK), which has its hash
burned in the SoC's eFuses. Signatures are made using RSA-2048 + SHA256.

The pseudo-ASN.1 structure is manually assembled; this is done to work
around bugs/quirks in the boot ROM, which vary between SoCs. This TOC0
implementation has been verified to work with the A50, A64, H5, H6,
and H616 SBROMs, and it may work with other SoCs.

Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
Acked-by: default avatarAndre Przywara <andre.przywara@arm.com>
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
parent 8c621f4c
No related branches found
No related tags found
No related merge requests found
...@@ -522,6 +522,7 @@ F: drivers/clk/sunxi/ ...@@ -522,6 +522,7 @@ F: drivers/clk/sunxi/
F: drivers/phy/allwinner/ F: drivers/phy/allwinner/
F: drivers/pinctrl/sunxi/ F: drivers/pinctrl/sunxi/
F: drivers/video/sunxi/ F: drivers/video/sunxi/
F: tools/sunxi*
ARM TEGRA ARM TEGRA
M: Tom Warren <twarren@nvidia.com> M: Tom Warren <twarren@nvidia.com>
......
...@@ -178,6 +178,7 @@ static const table_entry_t uimage_type[] = { ...@@ -178,6 +178,7 @@ static const table_entry_t uimage_type[] = {
{ IH_TYPE_MTKIMAGE, "mtk_image", "MediaTek BootROM loadable Image" }, { IH_TYPE_MTKIMAGE, "mtk_image", "MediaTek BootROM loadable Image" },
{ IH_TYPE_COPRO, "copro", "Coprocessor Image"}, { IH_TYPE_COPRO, "copro", "Coprocessor Image"},
{ IH_TYPE_SUNXI_EGON, "sunxi_egon", "Allwinner eGON Boot Image" }, { IH_TYPE_SUNXI_EGON, "sunxi_egon", "Allwinner eGON Boot Image" },
{ IH_TYPE_SUNXI_TOC0, "sunxi_toc0", "Allwinner TOC0 Boot Image" },
{ -1, "", "", }, { -1, "", "", },
}; };
......
...@@ -227,6 +227,7 @@ enum { ...@@ -227,6 +227,7 @@ enum {
IH_TYPE_IMX8IMAGE, /* Freescale IMX8Boot Image */ IH_TYPE_IMX8IMAGE, /* Freescale IMX8Boot Image */
IH_TYPE_COPRO, /* Coprocessor Image for remoteproc*/ IH_TYPE_COPRO, /* Coprocessor Image for remoteproc*/
IH_TYPE_SUNXI_EGON, /* Allwinner eGON Boot Image */ IH_TYPE_SUNXI_EGON, /* Allwinner eGON Boot Image */
IH_TYPE_SUNXI_TOC0, /* Allwinner TOC0 Boot Image */
IH_TYPE_COUNT, /* Number of image types */ IH_TYPE_COUNT, /* Number of image types */
}; };
......
...@@ -9,9 +9,13 @@ ...@@ -9,9 +9,13 @@
* *
* Shared between mkimage and the SPL. * Shared between mkimage and the SPL.
*/ */
#ifndef SUNXI_IMAGE_H #ifndef SUNXI_IMAGE_H
#define SUNXI_IMAGE_H #define SUNXI_IMAGE_H
#include <linux/compiler_attributes.h>
#include <linux/types.h>
#define BOOT0_MAGIC "eGON.BT0" #define BOOT0_MAGIC "eGON.BT0"
#define BROM_STAMP_VALUE 0x5f0a6c39 #define BROM_STAMP_VALUE 0x5f0a6c39
#define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */ #define SPL_SIGNATURE "SPL" /* marks "sunxi" SPL header */
...@@ -79,4 +83,37 @@ struct boot_file_head { ...@@ -79,4 +83,37 @@ struct boot_file_head {
/* Compile time check to assure proper alignment of structure */ /* 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)]; typedef char boot_file_head_not_multiple_of_32[1 - 2*(sizeof(struct boot_file_head) % 32)];
struct __packed toc0_main_info {
uint8_t name[8];
__le32 magic;
__le32 checksum;
__le32 serial;
__le32 status;
__le32 num_items;
__le32 length;
uint8_t platform[4];
uint8_t reserved[8];
uint8_t end[4];
};
#define TOC0_MAIN_INFO_NAME "TOC0.GLH"
#define TOC0_MAIN_INFO_MAGIC 0x89119800
#define TOC0_MAIN_INFO_END "MIE;"
struct __packed toc0_item_info {
__le32 name;
__le32 offset;
__le32 length;
__le32 status;
__le32 type;
__le32 load_addr;
uint8_t reserved[4];
uint8_t end[4];
};
#define TOC0_ITEM_INFO_NAME_CERT 0x00010101
#define TOC0_ITEM_INFO_NAME_FIRMWARE 0x00010202
#define TOC0_ITEM_INFO_NAME_KEY 0x00010303
#define TOC0_ITEM_INFO_END "IIE;"
#endif #endif
...@@ -94,9 +94,10 @@ ECDSA_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := $(addprefix lib/ecdsa/, ecdsa-libcrypto. ...@@ -94,9 +94,10 @@ ECDSA_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := $(addprefix lib/ecdsa/, ecdsa-libcrypto.
AES_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := $(addprefix lib/aes/, \ AES_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := $(addprefix lib/aes/, \
aes-encrypt.o aes-decrypt.o) aes-encrypt.o aes-decrypt.o)
# Cryptographic helpers that depend on openssl/libcrypto # Cryptographic helpers and image types that depend on openssl/libcrypto
LIBCRYPTO_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := $(addprefix lib/, \ LIBCRYPTO_OBJS-$(CONFIG_TOOLS_LIBCRYPTO) := \
fdt-libcrypto.o) lib/fdt-libcrypto.o \
sunxi_toc0.o
ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o ROCKCHIP_OBS = lib/rc4.o rkcommon.o rkimage.o rksd.o rkspi.o
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment