97 lines
2.7 KiB
Diff
97 lines
2.7 KiB
Diff
From f4704146e1af9f6e0a2220db6b39a328c813fac1 Mon Sep 17 00:00:00 2001
|
|
From: Jaxson Han <jaxson.han@arm.com>
|
|
Date: Wed, 19 Jan 2022 16:19:02 +0800
|
|
Subject: [PATCH] common: Add mem usage to /memreserve/
|
|
|
|
Set /memreserve/ to prevent next boot stages from overrding PSCI
|
|
services with libfdt.
|
|
|
|
Issue-Id: SCM-3815
|
|
Upstream-Status: Inappropriate [other]
|
|
Implementation pending further discussion
|
|
Signed-off-by: Jaxson Han <jaxson.han@arm.com>
|
|
Change-Id: I2ea80cdf736a910fa2c3deb622e21d50f04be960
|
|
---
|
|
Makefile.am | 2 +-
|
|
common/boot.c | 1 +
|
|
common/device_tree.c | 34 ++++++++++++++++++++++++++++++++++
|
|
include/boot.h | 1 +
|
|
4 files changed, 37 insertions(+), 1 deletion(-)
|
|
create mode 100644 common/device_tree.c
|
|
|
|
diff --git a/Makefile.am b/Makefile.am
|
|
index ab2c3a9..e905602 100644
|
|
--- a/Makefile.am
|
|
+++ b/Makefile.am
|
|
@@ -34,7 +34,7 @@ endif
|
|
PSCI_CPU_OFF := 0x84000002
|
|
|
|
COMMON_SRC := common/
|
|
-COMMON_OBJ := boot.o bakery_lock.o platform.o lib.o
|
|
+COMMON_OBJ := boot.o bakery_lock.o platform.o lib.o device_tree.o
|
|
|
|
LIBFDT_SRC := common/libfdt/
|
|
LIBFDT_OBJS := fdt.o fdt_ro.o fdt_rw.o
|
|
diff --git a/common/boot.c b/common/boot.c
|
|
index c74d34c..ee2bea0 100644
|
|
--- a/common/boot.c
|
|
+++ b/common/boot.c
|
|
@@ -63,6 +63,7 @@ void __noreturn first_spin(unsigned int cpu, unsigned long *mbox,
|
|
{
|
|
if (cpu == 0) {
|
|
init_platform();
|
|
+ dt_add_memreserve();
|
|
|
|
*mbox = (unsigned long)&entrypoint;
|
|
sevl();
|
|
diff --git a/common/device_tree.c b/common/device_tree.c
|
|
new file mode 100644
|
|
index 0000000..4d0876c
|
|
--- /dev/null
|
|
+++ b/common/device_tree.c
|
|
@@ -0,0 +1,34 @@
|
|
+/*
|
|
+ * device_tree.c - Basic device tree node handler
|
|
+ *
|
|
+ * Copyright (C) 2021 ARM Limited. All rights reserved.
|
|
+ *
|
|
+ * Use of this source code is governed by a BSD-style license that can be
|
|
+ * found in the LICENSE.txt file.
|
|
+ */
|
|
+#include <libfdt.h>
|
|
+
|
|
+extern unsigned long dtb;
|
|
+extern char firmware_start[], firmware_end[];
|
|
+
|
|
+extern void print_string(const char *str);
|
|
+
|
|
+static void *blob;
|
|
+
|
|
+
|
|
+void dt_add_memreserve(void)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ blob = (void*)&dtb;
|
|
+ print_string("Add /memreserve/\n\r");
|
|
+
|
|
+ fdt_open_into(blob, blob, fdt_totalsize(blob) +
|
|
+ sizeof(struct fdt_reserve_entry));
|
|
+ ret = fdt_add_mem_rsv(blob, (uint64_t)firmware_start,
|
|
+ (uint64_t)(firmware_end - firmware_start));
|
|
+
|
|
+ if(ret < 0) {
|
|
+ print_string("reserve mem add err\n\r");
|
|
+ }
|
|
+}
|
|
diff --git a/include/boot.h b/include/boot.h
|
|
index d75e013..c3e2ec1 100644
|
|
--- a/include/boot.h
|
|
+++ b/include/boot.h
|
|
@@ -16,4 +16,5 @@ void __noreturn spin(unsigned long *mbox, unsigned long invalid, int is_entry);
|
|
void __noreturn first_spin(unsigned int cpu, unsigned long *mbox,
|
|
unsigned long invalid_addr);
|
|
|
|
+void dt_add_memreserve(void);
|
|
#endif
|