From 27326c7ee269ff351bba8c2461e19f29d66b6a3a Mon Sep 17 00:00:00 2001 From: Heiko Stübner Date: Sat, 18 Feb 2017 19:46:21 +0100 Subject: dm: allow limiting pre-reloc markings to spl or tpl Right now the u-boot,dm-pre-reloc flag will make each marked node always appear in both spl and tpl. But systems needing an additional tpl might have special constraints for each, like the spl needing to be very tiny. So introduce two additional flags to mark nodes for only spl or tpl environments and introduce a function dm_fdt_pre_reloc to automate the necessary checks in code instances checking for pre-relocation flags. The behaviour of the original flag stays untouched and still marks a node for both spl and tpl. Signed-off-by: Heiko Stuebner Reviewed-by: Simon Glass Tested-by: Kever Yang --- tools/dtoc/dtoc.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tools') diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py index 6df7b0da13a..bf67ec80ca1 100755 --- a/tools/dtoc/dtoc.py +++ b/tools/dtoc/dtoc.py @@ -30,6 +30,8 @@ PROP_IGNORE_LIST = [ "status", 'phandle', 'u-boot,dm-pre-reloc', + 'u-boot,dm-tpl', + 'u-boot,dm-spl', ] # C type declarations for the tyues we support -- cgit v1.3.1 From cfbcdade763c87c7dde52020b8b98d399540ede2 Mon Sep 17 00:00:00 2001 From: Heiko Stübner Date: Sat, 18 Feb 2017 19:46:27 +0100 Subject: rockchip: mkimage: Allow encoding of loader code in spl images Rockchip SoCs allow the spl code to be rc4-encoded, not only the image header, but only newer SoCs allow this encoding to be disabled. The rk3188 is not part of those and requires its boot code to be rc4-encoded with the regular key. So add the ability to do this encoding via a setting on a per-soc basis when building spl images. Signed-off-by: Heiko Stuebner Reviewed-by: Simon Glass Reviewed-by: Kever Yang Tested-by: Kever Yang --- tools/rkcommon.c | 33 +++++++++++++++++++++++++++++---- tools/rkcommon.h | 22 ++++++++++++++++++++++ tools/rkimage.c | 3 +++ tools/rksd.c | 4 ++++ tools/rkspi.c | 4 ++++ 5 files changed, 62 insertions(+), 4 deletions(-) (limited to 'tools') diff --git a/tools/rkcommon.c b/tools/rkcommon.c index 0a072aa83ce..ed9b24137a0 100644 --- a/tools/rkcommon.c +++ b/tools/rkcommon.c @@ -46,17 +46,19 @@ struct header0_info { * @imagename: Image name(passed by "mkimage -n") * @spl_hdr: Boot ROM requires a 4-bytes spl header * @spl_size: Spl size(include extra 4-bytes spl header) + * @spl_rc4: RC4 encode the SPL binary (same key as header) */ struct spl_info { const char *imagename; const char *spl_hdr; const uint32_t spl_size; + const bool spl_rc4; }; static struct spl_info spl_infos[] = { - { "rk3036", "RK30", 0x1000 }, - { "rk3288", "RK32", 0x8000 }, - { "rk3399", "RK33", 0x20000 }, + { "rk3036", "RK30", 0x1000, false }, + { "rk3288", "RK32", 0x8000, false }, + { "rk3399", "RK33", 0x20000, false }, }; static unsigned char rc4_key[16] = { @@ -113,6 +115,16 @@ int rkcommon_get_spl_size(struct image_tool_params *params) return info->spl_size; } +bool rkcommon_need_rc4_spl(struct image_tool_params *params) +{ + struct spl_info *info = rkcommon_get_spl_info(params->imagename); + + /* + * info would not be NULL, because of we checked params before. + */ + return info->spl_rc4; +} + int rkcommon_set_header(void *buf, uint file_size, struct image_tool_params *params) { @@ -124,7 +136,7 @@ int rkcommon_set_header(void *buf, uint file_size, memset(buf, '\0', RK_INIT_OFFSET * RK_BLK_SIZE); hdr = (struct header0_info *)buf; hdr->signature = RK_SIGNATURE; - hdr->disable_rc4 = 1; + hdr->disable_rc4 = !rkcommon_need_rc4_spl(params); hdr->init_offset = RK_INIT_OFFSET; hdr->init_size = (file_size + RK_BLK_SIZE - 1) / RK_BLK_SIZE; @@ -135,3 +147,16 @@ int rkcommon_set_header(void *buf, uint file_size, return 0; } + +void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size) +{ + unsigned int remaining = size; + + while (remaining > 0) { + int step = (remaining > RK_BLK_SIZE) ? RK_BLK_SIZE : remaining; + + rc4_encode(buf + offset, step, rc4_key); + offset += RK_BLK_SIZE; + remaining -= step; + } +} diff --git a/tools/rkcommon.h b/tools/rkcommon.h index c69540f5f38..b4f6f327dc1 100644 --- a/tools/rkcommon.h +++ b/tools/rkcommon.h @@ -55,4 +55,26 @@ int rkcommon_get_spl_size(struct image_tool_params *params); int rkcommon_set_header(void *buf, uint file_size, struct image_tool_params *params); +/** + * rkcommon_need_rc4_spl() - check if rc4 encoded spl is required + * + * Some socs cannot disable the rc4-encryption of the spl binary. + * rc4 encryption is disabled normally except on socs that cannot + * handle unencrypted binaries. + * @return true or false depending on rc4 being required. + */ +bool rkcommon_need_rc4_spl(struct image_tool_params *params); + +/** + * rkcommon_rc4_encode_spl() - encode the spl binary + * + * Encrypts the SPL binary using the generic rc4 key as required + * by some socs. + * + * @buf: Pointer to the SPL data (header and SPL binary) + * @offset: offset inside buf to start at + * @size: number of bytes to encode + */ +void rkcommon_rc4_encode_spl(void *buf, unsigned int offset, unsigned int size); + #endif diff --git a/tools/rkimage.c b/tools/rkimage.c index ef31cb69444..44d098c7757 100644 --- a/tools/rkimage.c +++ b/tools/rkimage.c @@ -28,6 +28,9 @@ static void rkimage_set_header(void *buf, struct stat *sbuf, int ifd, { memcpy(buf + RK_SPL_HDR_START, rkcommon_get_spl_hdr(params), RK_SPL_HDR_SIZE); + + if (rkcommon_need_rc4_spl(params)) + rkcommon_rc4_encode_spl(buf, 4, params->file_size); } static int rkimage_extract_subimage(void *buf, struct image_tool_params *params) diff --git a/tools/rksd.c b/tools/rksd.c index a2baa74d312..ff2233ff2dc 100644 --- a/tools/rksd.c +++ b/tools/rksd.c @@ -41,6 +41,10 @@ static void rksd_set_header(void *buf, struct stat *sbuf, int ifd, memcpy(buf + RK_SPL_HDR_START, rkcommon_get_spl_hdr(params), RK_SPL_HDR_SIZE); + + if (rkcommon_need_rc4_spl(params)) + rkcommon_rc4_encode_spl(buf, RK_SPL_START - 4, + params->file_size - RK_SPL_START + 4); } static int rksd_extract_subimage(void *buf, struct image_tool_params *params) diff --git a/tools/rkspi.c b/tools/rkspi.c index a0b0051d380..0271d2e817b 100644 --- a/tools/rkspi.c +++ b/tools/rkspi.c @@ -48,6 +48,10 @@ static void rkspi_set_header(void *buf, struct stat *sbuf, int ifd, memcpy(buf + RK_SPL_HDR_START, rkcommon_get_spl_hdr(params), RK_SPL_HDR_SIZE); + if (rkcommon_need_rc4_spl(params)) + rkcommon_rc4_encode_spl(buf, RK_SPL_START - 4, + params->file_size - RK_SPL_START + 4); + /* * Spread the image out so we only use the first 2KB of each 4KB * region. This is a feature of the SPI format required by the Rockchip -- cgit v1.3.1 From 162c46d5ee7135fcc52bb56156ab66a885537b7b Mon Sep 17 00:00:00 2001 From: Heiko Stübner Date: Sat, 18 Feb 2017 19:46:28 +0100 Subject: rockchip: mkimage: Add support rk3188 serial Add the entry for the rk3188 requiring rc4-encryption of the SPL. Signed-off-by: Heiko Stuebner Reviewed-by: Simon Glass Reviewed-by: Kever Yang --- tools/rkcommon.c | 1 + 1 file changed, 1 insertion(+) (limited to 'tools') diff --git a/tools/rkcommon.c b/tools/rkcommon.c index ed9b24137a0..6595e02c1c5 100644 --- a/tools/rkcommon.c +++ b/tools/rkcommon.c @@ -57,6 +57,7 @@ struct spl_info { static struct spl_info spl_infos[] = { { "rk3036", "RK30", 0x1000, false }, + { "rk3188", "RK31", 0x8000 - 0x800, true }, { "rk3288", "RK32", 0x8000, false }, { "rk3399", "RK33", 0x20000, false }, }; -- cgit v1.3.1