aboutsummaryrefslogtreecommitdiff
path: root/drivers/of/fdt.c
diff options
context:
space:
mode:
authorJon Medhurst <tixy@linaro.org>2015-01-05 16:01:05 +0000
committerAndrey Konovalov <andrey.konovalov@linaro.org>2015-03-11 23:28:10 +0300
commitd59a53a5f1f37c9c021138d778df0b4bc9374641 (patch)
tree71148f86ff4131c9ca4fbc5c4e222caaa04850a7 /drivers/of/fdt.c
parenta477ddf264e96522bb5ceedf901a52fc8c195ff4 (diff)
HACK: of: Limit FDT size for CRC check on arm64
There is a bug in the UEFI implementation used on Juno and 64-bit FVPs which corrupts the reported size of the FDT. Work around this by limiting the size for CRC checks to 2MB. See http://lists.infradead.org/pipermail/linux-arm-kernel/2014-December/310106.html Signed-off-by: Jon Medhurst <tixy@linaro.org>
Diffstat (limited to 'drivers/of/fdt.c')
-rw-r--r--drivers/of/fdt.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 3a896c9aeb74..21544b9ec8cb 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -28,6 +28,12 @@
#include <asm/setup.h> /* for COMMAND_LINE_SIZE */
#include <asm/page.h>
+#ifdef CONFIG_ARM64
+#define fdt_crc_size_hack(_s) min(fdt_totalsize(_s),(unsigned)0x200000)
+#else
+#define fdt_crc_size_hack(_s) fdt_totalsize(_s)
+#endif
+
/*
* of_fdt_limit_memory - limit the number of regions in the /memory node
* @limit: maximum entries
@@ -1018,7 +1024,7 @@ bool __init early_init_dt_verify(void *params)
/* Setup flat device-tree pointer */
initial_boot_params = params;
of_fdt_crc32 = crc32_be(~0, initial_boot_params,
- fdt_totalsize(initial_boot_params));
+ fdt_crc_size_hack(initial_boot_params));
return true;
}
@@ -1114,7 +1120,7 @@ static int __init of_fdt_raw_init(void)
return 0;
if (of_fdt_crc32 != crc32_be(~0, initial_boot_params,
- fdt_totalsize(initial_boot_params))) {
+ fdt_crc_size_hack(initial_boot_params))) {
pr_warn("fdt: not creating '/sys/firmware/fdt': CRC check failed\n");
return 0;
}