rockchip: mkimage: Allow encoding of loader code in spl

A patch from »rk3188 uboot support« in state Mainline for u-boot

From: Heiko Stuebner <heiko@...> Date: Mon, 25 Jul 2016 11:47:54 +0200

Commit-Message

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 <heiko@...> Reviewed-by: Simon Glass <sjg@...> Reviewed-by: Kever Yang <kever.yang@...> Tested-by: Kever Yang <kever.yang@...>

Patch-Comment

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(-)

Statistics

  • 62 lines added
  • 4 lines removed

Changes

------------------------------- tools/rkcommon.c -------------------------------
index 0a072aa83c..ed9b24137a 100644
@@ -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;
+ }
+}
------------------------------- tools/rkcommon.h -------------------------------
index c69540f5f3..b4f6f327dc 100644
@@ -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
------------------------------- tools/rkimage.c --------------------------------
index ef31cb6944..44d098c775 100644
@@ -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)
--------------------------------- tools/rksd.c ---------------------------------
index a2baa74d31..ff2233ff2d 100644
@@ -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)
-------------------------------- tools/rkspi.c ---------------------------------
index a0b0051d38..0271d2e817 100644
@@ -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
 
 

Recent Patches

About Us

Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer.

Read More...