summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-20 07:34:22 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-03-20 07:38:39 +0100
commit5d44981c2d8891478423af82316576d00f6352ea (patch)
tree59f5085db3eb721b14e9829faace42314c384597
parentbsp/ss555: Move libcpu content to bsps (diff)
downloadrtems-5d44981c2d8891478423af82316576d00f6352ea.tar.bz2
bsp/qoriq: Fix bsp_restart()
Update #3085.
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/startup/bsprestart.c19
-rw-r--r--c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c27
2 files changed, 23 insertions, 23 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/bsprestart.c b/c/src/lib/libbsp/powerpc/qoriq/startup/bsprestart.c
index ac09971529..36e751e50d 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/startup/bsprestart.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/startup/bsprestart.c
@@ -7,7 +7,7 @@
*/
/*
- * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2016, 2018 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -29,22 +29,21 @@
#include <libcpu/powerpc-utility.h>
+#include <string.h>
+
+static char fdt_copy[BSP_FDT_BLOB_SIZE_MAX];
+
static RTEMS_NO_RETURN void do_restart(void *addr)
{
void (*restart)(uintptr_t);
- uintptr_t fdt;
qoriq_reset_qman_and_bman();
- restart = addr;
+ memcpy(fdt_copy, bsp_fdt_get(), sizeof(fdt_copy));
+ rtems_cache_flush_multiple_data_lines(fdt_copy, sizeof(fdt_copy));
- fdt = (uintptr_t) bsp_fdt_get();
-#ifdef BSP_FDT_BLOB_READ_ONLY
- fdt -= (uintptr_t) bsp_section_rodata_begin;
- fdt += (uintptr_t) bsp_section_rodata_load_begin;
-#endif
-
- (*restart)(fdt);
+ restart = addr;
+ (*restart)((uintptr_t) fdt_copy);
bsp_fatal(QORIQ_FATAL_RESTART_FAILED);
}
diff --git a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c
index 91a6240e10..b59d9c7114 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/startup/mmu-config.c
@@ -258,33 +258,34 @@ static void TEXT config_fdt_adjust(const void *fdt)
if (node >= 0) {
int len;
const void *val;
- uint64_t begin;
- uint64_t size;
+ uint64_t mem_begin;
+ uint64_t mem_size;
val = fdt_getprop(fdt, node, "reg", &len);
if (len == 8) {
- begin = fdt32_to_cpu(((fdt32_t *) val)[0]);
- size = fdt32_to_cpu(((fdt32_t *) val)[1]);
+ mem_begin = fdt32_to_cpu(((fdt32_t *) val)[0]);
+ mem_size = fdt32_to_cpu(((fdt32_t *) val)[1]);
} else if (len == 16) {
- begin = fdt64_to_cpu(((fdt64_t *) val)[0]);
- size = fdt64_to_cpu(((fdt64_t *) val)[1]);
+ mem_begin = fdt64_to_cpu(((fdt64_t *) val)[0]);
+ mem_size = fdt64_to_cpu(((fdt64_t *) val)[1]);
} else {
- begin = 0;
- size = 0;
+ mem_begin = 0;
+ mem_size = 0;
}
#ifndef __powerpc64__
- size = MIN(size, 0x80000000U);
+ mem_size = MIN(mem_size, 0x80000000U);
#endif
if (
- begin == 0
- && size > (uintptr_t) bsp_section_work_end
+ mem_begin == 0
+ && mem_size > (uintptr_t) bsp_section_work_end
&& (uintptr_t) bsp_section_nocache_end
< (uintptr_t) bsp_section_work_end
) {
- config[WORKSPACE_ENTRY_INDEX].size += (uintptr_t) size
- - (uintptr_t) bsp_section_work_end;
+ /* Assign new value to allow a bsp_restart() */
+ config[WORKSPACE_ENTRY_INDEX].size = (uintptr_t) mem_size
+ - (uintptr_t) bsp_section_work_begin;
}
}
}