|
@@ -21,11 +21,9 @@ Signed-off-by: Daniel Danzberger <[email protected]>
|
|
|
.../arm/boot/compressed/fdt_check_mem_start.c | 48 ++++++++++++++++---
|
|
|
1 file changed, 42 insertions(+), 6 deletions(-)
|
|
|
|
|
|
-diff --git a/arch/arm/boot/compressed/fdt_check_mem_start.c b/arch/arm/boot/compressed/fdt_check_mem_start.c
|
|
|
-index 62450d824c3c..9291a2661bdf 100644
|
|
|
--- a/arch/arm/boot/compressed/fdt_check_mem_start.c
|
|
|
+++ b/arch/arm/boot/compressed/fdt_check_mem_start.c
|
|
|
-@@ -55,16 +55,17 @@ static uint64_t get_val(const fdt32_t *cells, uint32_t ncells)
|
|
|
+@@ -55,16 +55,17 @@ static uint64_t get_val(const fdt32_t *c
|
|
|
* DTB, and, if out-of-range, replace it by the real start address.
|
|
|
* To preserve backwards compatibility (systems reserving a block of memory
|
|
|
* at the start of physical memory, kdump, ...), the traditional method is
|
|
@@ -39,18 +37,18 @@ index 62450d824c3c..9291a2661bdf 100644
|
|
|
{
|
|
|
- uint32_t addr_cells, size_cells, base;
|
|
|
+ uint32_t addr_cells, size_cells, usable_base, base;
|
|
|
- uint32_t fdt_mem_start = 0xffffffff;
|
|
|
+ uint32_t fdt_mem_start = 0xffffffff;
|
|
|
- const fdt32_t *reg, *endp;
|
|
|
- uint64_t size, end;
|
|
|
+ const fdt32_t *usable, *reg, *endp;
|
|
|
+ uint64_t size, usable_end, end;
|
|
|
- const char *type;
|
|
|
- int offset, len;
|
|
|
-
|
|
|
-@@ -80,6 +81,27 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)
|
|
|
- if (addr_cells > 2 || size_cells > 2)
|
|
|
- return mem_start;
|
|
|
-
|
|
|
+ const char *type;
|
|
|
+ int offset, len;
|
|
|
+
|
|
|
+@@ -80,6 +81,27 @@ uint32_t fdt_check_mem_start(uint32_t me
|
|
|
+ if (addr_cells > 2 || size_cells > 2)
|
|
|
+ return mem_start;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Usable memory in case of a crash dump kernel
|
|
|
+ * This property describes a limitation: memory within this range is
|
|
@@ -72,13 +70,13 @@ index 62450d824c3c..9291a2661bdf 100644
|
|
|
+ usable_end = usable_base + size;
|
|
|
+ }
|
|
|
+
|
|
|
- /* Walk all memory nodes and regions */
|
|
|
- for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0;
|
|
|
- offset = fdt_next_node(fdt, offset, NULL)) {
|
|
|
-@@ -107,7 +129,20 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)
|
|
|
-
|
|
|
- base = fdt32_ld(reg + addr_cells - 1);
|
|
|
- end = base + size;
|
|
|
+ /* Walk all memory nodes and regions */
|
|
|
+ for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0;
|
|
|
+ offset = fdt_next_node(fdt, offset, NULL)) {
|
|
|
+@@ -107,7 +129,20 @@ uint32_t fdt_check_mem_start(uint32_t me
|
|
|
+
|
|
|
+ base = fdt32_ld(reg + addr_cells - 1);
|
|
|
+ end = base + size;
|
|
|
- if (mem_start >= base && mem_start < end) {
|
|
|
+ if (usable) {
|
|
|
+ /*
|
|
@@ -94,18 +92,16 @@ index 62450d824c3c..9291a2661bdf 100644
|
|
|
+ if (end <= base)
|
|
|
+ continue;
|
|
|
+ } else if (mem_start >= base && mem_start < end) {
|
|
|
- /* Calculated address is valid, use it */
|
|
|
- return mem_start;
|
|
|
- }
|
|
|
-@@ -123,7 +158,8 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
+ /* Calculated address is valid, use it */
|
|
|
+ return mem_start;
|
|
|
+ }
|
|
|
+@@ -123,7 +158,8 @@ uint32_t fdt_check_mem_start(uint32_t me
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
- * The calculated address is not usable.
|
|
|
+ * The calculated address is not usable, or was overridden by the
|
|
|
+ * "linux,usable-memory-range" property.
|
|
|
- * Use the lowest usable physical memory address from the DTB instead,
|
|
|
- * and make sure this is a multiple of 2 MiB for phys/virt patching.
|
|
|
- */
|
|
|
---
|
|
|
-2.35.1
|
|
|
+ * Use the lowest usable physical memory address from the DTB instead,
|
|
|
+ * and make sure this is a multiple of 2 MiB for phys/virt patching.
|
|
|
+ */
|