summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-05-31 23:28:17 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-06-04 08:54:47 +0200
commitbf8b6d46db9274c364947a22163b16e05f74211c (patch)
tree38a18947ce78b1ad824d0e972ca8aa621ec3157a
parentb086bf35dc8b1fc02bca67979e1a3420d21768c6 (diff)
downloadbarebox-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.c11
-rw-r--r--common/filetype.c22
-rw-r--r--include/filetype.h1
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,