diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2018-05-31 23:28:17 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-06-04 08:54:47 +0200 |
commit | bf8b6d46db9274c364947a22163b16e05f74211c (patch) | |
tree | 38a18947ce78b1ad824d0e972ca8aa621ec3157a | |
parent | b086bf35dc8b1fc02bca67979e1a3420d21768c6 (diff) | |
download | barebox-bf8b6d46db9274c364947a22163b16e05f74211c.tar.gz |
kwbimage_v0: add support to detect and boot a mvebu v0 image
The differences between v0 and v1 of the mvebu kwbimage are small enough
that the function to boot such an image can be shared between both
variants.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/mach-mvebu/kwbootimage.c | 11 | ||||
-rw-r--r-- | common/filetype.c | 22 | ||||
-rw-r--r-- | include/filetype.h | 1 |
3 files changed, 27 insertions, 7 deletions
diff --git a/arch/arm/mach-mvebu/kwbootimage.c b/arch/arm/mach-mvebu/kwbootimage.c index 8d364ceb7b..e379d732fe 100644 --- a/arch/arm/mach-mvebu/kwbootimage.c +++ b/arch/arm/mach-mvebu/kwbootimage.c @@ -10,7 +10,7 @@ #include <asm/unaligned.h> #include <mach/common.h> -static int do_bootm_kwbimage_v1(struct image_data *data) +static int do_bootm_kwbimage_v0_v1(struct image_data *data) { int fd, ret; loff_t offset; @@ -69,14 +69,21 @@ out_free: return ret; } +static struct image_handler image_handler_kwbimage_v0_handler = { + .name = "MVEBU kwbimage v0", + .bootm = do_bootm_kwbimage_v0_v1, + .filetype = filetype_kwbimage_v0, +}; + static struct image_handler image_handler_kwbimage_v1_handler = { .name = "MVEBU kwbimage v1", - .bootm = do_bootm_kwbimage_v1, + .bootm = do_bootm_kwbimage_v0_v1, .filetype = filetype_kwbimage_v1, }; static int mvebu_register_kwbimage_image_handler(void) { + register_image_handler(&image_handler_kwbimage_v0_handler); register_image_handler(&image_handler_kwbimage_v1_handler); return 0; diff --git a/common/filetype.c b/common/filetype.c index 444ec14cc4..bb807df721 100644 --- a/common/filetype.c +++ b/common/filetype.c @@ -65,7 +65,8 @@ static const struct filetype_str filetype_str[] = { [filetype_exe] = { "MS-DOS executable", "exe" }, [filetype_mxs_bootstream] = { "Freescale MXS bootstream", "mxsbs" }, [filetype_socfpga_xload] = { "SoCFPGA prebootloader image", "socfpga-xload" }, - [filetype_kwbimage_v1] = { "MVEBU kwbimage (v1)", "kwb" }, + [filetype_kwbimage_v0] = { "MVEBU kwbimage (v0)", "kwb0" }, + [filetype_kwbimage_v1] = { "MVEBU kwbimage (v1)", "kwb1" }, [filetype_android_sparse] = { "Android sparse image", "sparse" }, [filetype_arm64_linux_image] = { "ARM aarch64 Linux image", "aarch64-linux" }, }; @@ -302,10 +303,21 @@ enum filetype file_detect_type(const void *_buf, size_t bufsize) if ((buf8[0] == 0x5a || buf8[0] == 0x69 || buf8[0] == 0x78 || buf8[0] == 0x8b || buf8[0] == 0x9c) && buf8[0x1] == 0 && buf8[0x2] == 0 && buf8[0x3] == 0 && - buf8[0x8] == 1 && buf8[0x18] == 0 && buf8[0x1b] == 0 && - buf8[0x1c] == 0 && buf8[0x1d] == 0 && - (buf8[0x1e] == 0 || buf8[0x1e] == 1)) - return filetype_kwbimage_v1; + buf8[0x18] == 0 && buf8[0x1b] == 0 && buf8[0x1c] == 0) { + unsigned char sum = 0; + int i; + + for (i = 0; i <= 0x1e; ++i) + sum += buf8[i]; + + if (sum == buf8[0x1f] && buf8[0x8] == 0) + return filetype_kwbimage_v0; + + if (sum == buf8[0x1f] && + buf8[0x8] == 1 && buf8[0x1d] == 0 && + (buf8[0x1e] == 0 || buf8[0x1e] == 1)) + return filetype_kwbimage_v1; + } if (is_sparse_image(_buf)) return filetype_android_sparse; diff --git a/include/filetype.h b/include/filetype.h index 9986938ddb..d9963a2449 100644 --- a/include/filetype.h +++ b/include/filetype.h @@ -38,6 +38,7 @@ enum filetype { filetype_xz_compressed, filetype_mxs_bootstream, filetype_socfpga_xload, + filetype_kwbimage_v0, filetype_kwbimage_v1, filetype_android_sparse, filetype_arm64_linux_image, |