All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI
@ 2020-04-18 19:32 Atish Patra
  2020-04-18 19:32 ` [PATCH v6 1/6] riscv: Add boot hartid to device tree Atish Patra
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

This series adds few DT related fixes required for Linux EFI stub to work
on RISC-V.

Patch 1 adds the boot hartid property under /chosen node. The related
discussion can be found here.

https://patchwork.ozlabs.org/patch/1233664/
https://lists.denx.de/pipermail/u-boot/2020-March/402085.html

Patch 2 fixes a generic issue in fdtdec related to reserved memory node.

Patch 3,4,5 provide one of the option to update reserved-memory node for next
stage. It depends on master OpenSBI branch.

The other options are SBI extension and trap/emulate on PMP csr access.
The detaild discussion can be found here.
https://github.com/riscv/riscv-sbi-doc/pull/37

Patch 1 & 2 can be applied independently from 3 and 4. I want to keep all
the patches together to provide a holistic view of changes required for
RISC-V UEFI.

Changes from v5->v6:
1. Fixed typos in commit message and added reviewed-by tags.

Changes from v4->v5:
1. Added comments for new functions.

Changes from v3->v4:
1. Dropped generic efi fix patch as it is already merged.
2. Moved all the fdt fixups to a common file.
3. Addressed few nit comments.

Changes from v2->v3:
1. Update the DT meant for OS if it is different from the one used by U-Boot
2. Use different FDT api to obtain "reg" address & size to honor the cell count.

Changes from v1->v2:
1. Fix the issue if chosen node is not present.

Changes from previous version:
1. Renamed the DT node property to "boot-hartid" from "efi-boot-hartid".
2. Changed the property type to u32 instead of u64 for RV32 compatibility.

Atish Patra (6):
riscv: Add boot hartid to device tree
fdtdec: Fix boundary check
riscv: Provide a mechanism to fix DT for reserved memory
riscv: Setup reserved-memory node for FU540
riscv: Copy the reserved-memory nodes to final DT
riscv: Move all fdt fixups together

arch/riscv/cpu/start.S                |   1 +
arch/riscv/include/asm/global_data.h  |   1 +
arch/riscv/include/asm/u-boot-riscv.h |   2 +
arch/riscv/lib/Makefile               |   1 +
arch/riscv/lib/asm-offsets.c          |   1 +
arch/riscv/lib/bootm.c                |   5 -
arch/riscv/lib/fdt_fixup.c            | 150 ++++++++++++++++++++++++++
configs/sifive_fu540_defconfig        |   1 +
lib/fdtdec.c                          |   3 +-
9 files changed, 159 insertions(+), 6 deletions(-)
create mode 100644 arch/riscv/lib/fdt_fixup.c

--
2.25.1

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 1/6] riscv: Add boot hartid to device tree
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  2020-04-20  5:29   ` Bin Meng
  2020-04-18 19:32 ` [PATCH v6 2/6] fdtdec: Fix boundary check Atish Patra
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

Linux booting protocol mandates that register "a0" contains the hartid.
However, U-Boot can not pass the hartid via a0 during via standard UEFI
protocol. DT nodes are commonly used to pass such information to the OS.

Add a DT node under chosen node to indicate the boot hartid. EFI stub
in Linux kernel will parse this node and pass it to the real kernel
in "a0" before jumping to it.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Rick Chen <rick@andestech.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 arch/riscv/lib/bootm.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
index fad16901c5f2..87cadad5016d 100644
--- a/arch/riscv/lib/bootm.c
+++ b/arch/riscv/lib/bootm.c
@@ -28,6 +28,28 @@ __weak void board_quiesce_devices(void)
 
 int arch_fixup_fdt(void *blob)
 {
+#ifdef CONFIG_EFI_LOADER
+	int err;
+	u32 size;
+	int chosen_offset;
+
+	size = fdt_totalsize(blob);
+	err  = fdt_open_into(blob, blob, size + 32);
+	if (err < 0) {
+		printf("Device Tree can't be expanded to accommodate new node");
+		return err;
+	}
+	chosen_offset = fdt_path_offset(blob, "/chosen");
+	if (chosen_offset < 0) {
+		err = fdt_add_subnode(blob, 0, "chosen");
+		if (err < 0) {
+			printf("chosen node can not be added\n");
+			return err;
+		}
+	}
+	/* Overwrite the boot-hartid as U-Boot is the last stage BL */
+	fdt_setprop_u32(blob, chosen_offset, "boot-hartid", gd->arch.boot_hart);
+#endif
 	return 0;
 }
 
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 2/6] fdtdec: Fix boundary check
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
  2020-04-18 19:32 ` [PATCH v6 1/6] riscv: Add boot hartid to device tree Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  2020-04-20  5:29   ` Bin Meng
  2020-04-18 19:32 ` [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory Atish Patra
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

In U-Boot, the reserved memory end address is considered as a inclusive
address. This notion is followed while adding a reserved memory node to
the DT.

For example:
end_address = start_address + size - 1

Follow the same notion and fix the end address computation while checking
for existing nodes.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 lib/fdtdec.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index eb11fc898e30..07ba9f5c97e9 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -1311,7 +1311,8 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
 			continue;
 		}
 
-		if (addr == carveout->start && (addr + size) == carveout->end) {
+		if (addr == carveout->start && (addr + size - 1) ==
+						carveout->end) {
 			if (phandlep)
 				*phandlep = fdt_get_phandle(blob, node);
 			return 0;
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
  2020-04-18 19:32 ` [PATCH v6 1/6] riscv: Add boot hartid to device tree Atish Patra
  2020-04-18 19:32 ` [PATCH v6 2/6] fdtdec: Fix boundary check Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  2020-04-20  5:29   ` Bin Meng
       [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA46F87F4@ATCPCS16.andestech.com>
  2020-04-18 19:32 ` [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540 Atish Patra
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

In RISC-V, M-mode software can reserve physical memory regions
by setting appropriate physical memory protection (PMP) csr. As the
PMP csr are accessible only in M-mode, S-mode U-Boot can not read
this configuration directly. However, M-mode software can pass this
information via reserved-memory node in device tree so that S-mode
software can access this information.

This patch provides a framework to copy to the reserved-memory node
from one DT to another. This will be used to update the DT used by
U-Boot and the DT passed to the next stage OS.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 arch/riscv/cpu/start.S                |   1 +
 arch/riscv/include/asm/global_data.h  |   1 +
 arch/riscv/include/asm/u-boot-riscv.h |   2 +
 arch/riscv/lib/Makefile               |   1 +
 arch/riscv/lib/asm-offsets.c          |   1 +
 arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
 6 files changed, 108 insertions(+)
 create mode 100644 arch/riscv/lib/fdt_fixup.c

diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S
index 6b3ff99c3882..0282685c2906 100644
--- a/arch/riscv/cpu/start.S
+++ b/arch/riscv/cpu/start.S
@@ -121,6 +121,7 @@ call_board_init_f_0:
 
 	jal	board_init_f_init_reserve
 
+	SREG	s1, GD_FIRMWARE_FDT_ADDR(gp)
 	/* save the boot hart id to global_data */
 	SREG	tp, GD_BOOT_HART(gp)
 
diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
index b74bd7e738bb..51ac8d1c98e2 100644
--- a/arch/riscv/include/asm/global_data.h
+++ b/arch/riscv/include/asm/global_data.h
@@ -15,6 +15,7 @@
 /* Architecture-specific global data */
 struct arch_global_data {
 	long boot_hart;		/* boot hart id */
+	phys_addr_t firmware_fdt_addr;
 #ifdef CONFIG_SIFIVE_CLINT
 	void __iomem *clint;	/* clint base address */
 #endif
diff --git a/arch/riscv/include/asm/u-boot-riscv.h b/arch/riscv/include/asm/u-boot-riscv.h
index 49febd588102..543a1688db8f 100644
--- a/arch/riscv/include/asm/u-boot-riscv.h
+++ b/arch/riscv/include/asm/u-boot-riscv.h
@@ -17,5 +17,7 @@ int cleanup_before_linux(void);
 /* board/.../... */
 int board_init(void);
 void board_quiesce_devices(void);
+int riscv_board_reserved_mem_fixup(void *fdt);
+int riscv_fdt_copy_resv_mem_node(const void *src_fdt, void *dest_fdt);
 
 #endif	/* _U_BOOT_RISCV_H_ */
diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile
index adadbf4bcbef..d132b59ce32c 100644
--- a/arch/riscv/lib/Makefile
+++ b/arch/riscv/lib/Makefile
@@ -24,6 +24,7 @@ obj-y	+= reset.o
 obj-y   += setjmp.o
 obj-$(CONFIG_SMP) += smp.o
 obj-$(CONFIG_SPL_BUILD)	+= spl.o
+obj-y   += fdt_fixup.o
 
 # For building EFI apps
 CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
diff --git a/arch/riscv/lib/asm-offsets.c b/arch/riscv/lib/asm-offsets.c
index 4fa4fd371473..7301c1b98e23 100644
--- a/arch/riscv/lib/asm-offsets.c
+++ b/arch/riscv/lib/asm-offsets.c
@@ -14,6 +14,7 @@
 int main(void)
 {
 	DEFINE(GD_BOOT_HART, offsetof(gd_t, arch.boot_hart));
+	DEFINE(GD_FIRMWARE_FDT_ADDR, offsetof(gd_t, arch.firmware_fdt_addr));
 #ifndef CONFIG_XIP
 	DEFINE(GD_AVAILABLE_HARTS, offsetof(gd_t, arch.available_harts));
 #endif
diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c
new file mode 100644
index 000000000000..1fce41490973
--- /dev/null
+++ b/arch/riscv/lib/fdt_fixup.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2020 Western Digital Corporation or its affiliates
+ *
+ */
+
+#include <common.h>
+#include <fdt_support.h>
+#include <mapmem.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * riscv_fdt_copy_resv_mem_node() - Copy reserve memory node entry
+ * @src: Pointer to the source device tree from which reserved memory node
+ *	 needs to be copied.
+ * @dst: Pointer to the destination device tree to which reserved memory node
+ *	 needs to be copied.
+ *
+ * Return: 0 on success or if source doesn't have reserved memory node.
+ *	   Error if copy process failed.
+ */
+int riscv_fdt_copy_resv_mem_node(const void *src, void *dst)
+{
+	u32 phandle;
+	struct fdt_memory pmp_mem;
+	fdt_addr_t addr;
+	fdt_size_t size;
+	int offset, node, err, rmem_offset;
+	bool nomap = true;
+	char basename[32] = {0};
+	int bname_len;
+	int max_len = sizeof(basename);
+	const char *name;
+	char *temp;
+
+	offset = fdt_path_offset(src, "/reserved-memory");
+	if (offset < 0) {
+		printf("No reserved memory region found in source FDT\n");
+		return 0;
+	}
+
+	fdt_for_each_subnode(node, src, offset) {
+		name = fdt_get_name(src, node, NULL);
+
+		addr = fdtdec_get_addr_size_auto_noparent(src, node,
+							  "reg", 0, &size,
+							  false);
+		if (addr == FDT_ADDR_T_NONE) {
+			debug("failed to read address/size for %s\n", name);
+			continue;
+		}
+		strncpy(basename, name, max_len);
+		temp = strchr(basename, '@');
+		if (temp) {
+			bname_len = strnlen(basename, max_len) - strnlen(temp,
+								       max_len);
+			*(basename + bname_len) = '\0';
+		}
+		pmp_mem.start = addr;
+		pmp_mem.end = addr + size - 1;
+		err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
+						 &phandle);
+		if (err < 0) {
+			printf("failed to add reserved memory: %d\n", err);
+			return err;
+		}
+		if (!fdt_getprop(src, node, "no-map", NULL))
+			nomap = false;
+		if (nomap) {
+			rmem_offset = fdt_node_offset_by_phandle(dst, phandle);
+			fdt_setprop_empty(dst, rmem_offset, "no-map");
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * riscv_board_reserved_mem_fixup() - Fix up reserved memory node for a board
+ * @fdt: Pointer to the device tree in which reserved memory node needs to be
+ *	 added.
+ *
+ * In RISC-V, any board compiled with OF_SEPARATE needs to copy the reserved
+ * memory node from the device tree provided by the firmware to the device tree
+ * used by U-Boot. This is a common function that individual board fixup
+ * functions can invoke.
+ *
+ * Return: 0 on success or error otherwise.
+ */
+int riscv_board_reserved_mem_fixup(void *fdt)
+{
+	int err;
+	void *src_fdt_addr;
+
+	src_fdt_addr = map_sysmem(gd->arch.firmware_fdt_addr, 0);
+	err = riscv_fdt_copy_resv_mem_node(src_fdt_addr, fdt);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
                   ` (2 preceding siblings ...)
  2020-04-18 19:32 ` [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  2020-04-20  5:29   ` Bin Meng
  2020-04-18 19:32 ` [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT Atish Patra
  2020-04-18 19:32 ` [PATCH v6 6/6] riscv: Move all fdt fixups together Atish Patra
  5 siblings, 1 reply; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

FU540 uses OF_SEPARATE instead of OF_PRIOR_STAGE.

Enable OF_BOARD_FIXUP to update the DT with reserved-memory node.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 arch/riscv/lib/fdt_fixup.c     | 15 +++++++++++++++
 configs/sifive_fu540_defconfig |  1 +
 2 files changed, 16 insertions(+)

diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c
index 1fce41490973..af12e484db9b 100644
--- a/arch/riscv/lib/fdt_fixup.c
+++ b/arch/riscv/lib/fdt_fixup.c
@@ -100,3 +100,18 @@ int riscv_board_reserved_mem_fixup(void *fdt)
 
 	return 0;
 }
+
+#ifdef CONFIG_OF_BOARD_FIXUP
+int board_fix_fdt(void *fdt)
+{
+	int err;
+
+	err = riscv_board_reserved_mem_fixup(fdt);
+	if (err < 0) {
+		printf("failed to fixup DT for reserved memory: %d\n", err);
+		return err;
+	}
+
+	return 0;
+}
+#endif
diff --git a/configs/sifive_fu540_defconfig b/configs/sifive_fu540_defconfig
index 6d61e6c960ee..f805aacc7afd 100644
--- a/configs/sifive_fu540_defconfig
+++ b/configs/sifive_fu540_defconfig
@@ -9,6 +9,7 @@ CONFIG_FIT=y
 CONFIG_MISC_INIT_R=y
 CONFIG_DISPLAY_CPUINFO=y
 CONFIG_DISPLAY_BOARDINFO=y
+CONFIG_OF_BOARD_FIXUP=y
 CONFIG_DEFAULT_DEVICE_TREE="hifive-unleashed-a00"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_MTD=y
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
                   ` (3 preceding siblings ...)
  2020-04-18 19:32 ` [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540 Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  2020-04-20  5:29   ` Bin Meng
  2020-04-18 19:32 ` [PATCH v6 6/6] riscv: Move all fdt fixups together Atish Patra
  5 siblings, 1 reply; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

The DT used by U-Boot may be different from the DT being passed to
the OS if the DT is loaded from external media such as network or
mmc. In that case, the reserved-memory node needs to be copied to
the DT passed to the OS.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 arch/riscv/lib/bootm.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
index 87cadad5016d..8ff8db6bf533 100644
--- a/arch/riscv/lib/bootm.c
+++ b/arch/riscv/lib/bootm.c
@@ -28,8 +28,8 @@ __weak void board_quiesce_devices(void)
 
 int arch_fixup_fdt(void *blob)
 {
-#ifdef CONFIG_EFI_LOADER
 	int err;
+#ifdef CONFIG_EFI_LOADER
 	u32 size;
 	int chosen_offset;
 
@@ -50,6 +50,12 @@ int arch_fixup_fdt(void *blob)
 	/* Overwrite the boot-hartid as U-Boot is the last stage BL */
 	fdt_setprop_u32(blob, chosen_offset, "boot-hartid", gd->arch.boot_hart);
 #endif
+
+	/* Copy the reserved-memory node to the DT used by OS */
+	err = riscv_fdt_copy_resv_mem_node(gd->fdt_blob, blob);
+	if (err < 0)
+		return err;
+
 	return 0;
 }
 
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 6/6] riscv: Move all fdt fixups together
  2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
                   ` (4 preceding siblings ...)
  2020-04-18 19:32 ` [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT Atish Patra
@ 2020-04-18 19:32 ` Atish Patra
  5 siblings, 0 replies; 16+ messages in thread
From: Atish Patra @ 2020-04-18 19:32 UTC (permalink / raw)
  To: u-boot

Keep all the fdt fixups together for better code management.

Signed-off-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
---
 arch/riscv/lib/bootm.c     | 33 ---------------------------------
 arch/riscv/lib/fdt_fixup.c | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
index 8ff8db6bf533..0d06095da11a 100644
--- a/arch/riscv/lib/bootm.c
+++ b/arch/riscv/lib/bootm.c
@@ -26,39 +26,6 @@ __weak void board_quiesce_devices(void)
 {
 }
 
-int arch_fixup_fdt(void *blob)
-{
-	int err;
-#ifdef CONFIG_EFI_LOADER
-	u32 size;
-	int chosen_offset;
-
-	size = fdt_totalsize(blob);
-	err  = fdt_open_into(blob, blob, size + 32);
-	if (err < 0) {
-		printf("Device Tree can't be expanded to accommodate new node");
-		return err;
-	}
-	chosen_offset = fdt_path_offset(blob, "/chosen");
-	if (chosen_offset < 0) {
-		err = fdt_add_subnode(blob, 0, "chosen");
-		if (err < 0) {
-			printf("chosen node can not be added\n");
-			return err;
-		}
-	}
-	/* Overwrite the boot-hartid as U-Boot is the last stage BL */
-	fdt_setprop_u32(blob, chosen_offset, "boot-hartid", gd->arch.boot_hart);
-#endif
-
-	/* Copy the reserved-memory node to the DT used by OS */
-	err = riscv_fdt_copy_resv_mem_node(gd->fdt_blob, blob);
-	if (err < 0)
-		return err;
-
-	return 0;
-}
-
 /**
  * announce_and_cleanup() - Print message and prepare for kernel boot
  *
diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c
index af12e484db9b..20e0759f135b 100644
--- a/arch/riscv/lib/fdt_fixup.c
+++ b/arch/riscv/lib/fdt_fixup.c
@@ -115,3 +115,36 @@ int board_fix_fdt(void *fdt)
 	return 0;
 }
 #endif
+
+int arch_fixup_fdt(void *blob)
+{
+	int err;
+#ifdef CONFIG_EFI_LOADER
+	u32 size;
+	int chosen_offset;
+
+	size = fdt_totalsize(blob);
+	err  = fdt_open_into(blob, blob, size + 32);
+	if (err < 0) {
+		printf("Device Tree can't be expanded to accommodate new node");
+		return err;
+	}
+	chosen_offset = fdt_path_offset(blob, "/chosen");
+	if (chosen_offset < 0) {
+		err = fdt_add_subnode(blob, 0, "chosen");
+		if (err < 0) {
+			printf("chosen node can not be added\n");
+			return err;
+		}
+	}
+	/* Overwrite the boot-hartid as U-Boot is the last stage BL */
+	fdt_setprop_u32(blob, chosen_offset, "boot-hartid", gd->arch.boot_hart);
+#endif
+
+	/* Copy the reserved-memory node to the DT used by OS */
+	err = riscv_fdt_copy_resv_mem_node(gd->fdt_blob, blob);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH v6 1/6] riscv: Add boot hartid to device tree
  2020-04-18 19:32 ` [PATCH v6 1/6] riscv: Add boot hartid to device tree Atish Patra
@ 2020-04-20  5:29   ` Bin Meng
  0 siblings, 0 replies; 16+ messages in thread
From: Bin Meng @ 2020-04-20  5:29 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 3:32 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> Linux booting protocol mandates that register "a0" contains the hartid.
> However, U-Boot can not pass the hartid via a0 during via standard UEFI
> protocol. DT nodes are commonly used to pass such information to the OS.
>
> Add a DT node under chosen node to indicate the boot hartid. EFI stub
> in Linux kernel will parse this node and pass it to the real kernel
> in "a0" before jumping to it.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Rick Chen <rick@andestech.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  arch/riscv/lib/bootm.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
>

Verified on booting OS, and dump DTB /chosen node

Tested-by: Bin Meng <bmeng.cn@gmail.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 2/6] fdtdec: Fix boundary check
  2020-04-18 19:32 ` [PATCH v6 2/6] fdtdec: Fix boundary check Atish Patra
@ 2020-04-20  5:29   ` Bin Meng
  0 siblings, 0 replies; 16+ messages in thread
From: Bin Meng @ 2020-04-20  5:29 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 3:32 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> In U-Boot, the reserved memory end address is considered as a inclusive
> address. This notion is followed while adding a reserved memory node to
> the DT.
>
> For example:
> end_address = start_address + size - 1
>
> Follow the same notion and fix the end address computation while checking
> for existing nodes.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> ---
>  lib/fdtdec.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>

Tested-by: Bin Meng <bmeng.cn@gmail.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
  2020-04-18 19:32 ` [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory Atish Patra
@ 2020-04-20  5:29   ` Bin Meng
       [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA46F87F4@ATCPCS16.andestech.com>
  1 sibling, 0 replies; 16+ messages in thread
From: Bin Meng @ 2020-04-20  5:29 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 3:32 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> In RISC-V, M-mode software can reserve physical memory regions
> by setting appropriate physical memory protection (PMP) csr. As the
> PMP csr are accessible only in M-mode, S-mode U-Boot can not read
> this configuration directly. However, M-mode software can pass this
> information via reserved-memory node in device tree so that S-mode
> software can access this information.
>
> This patch provides a framework to copy to the reserved-memory node
> from one DT to another. This will be used to update the DT used by
> U-Boot and the DT passed to the next stage OS.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> ---
>  arch/riscv/cpu/start.S                |   1 +
>  arch/riscv/include/asm/global_data.h  |   1 +
>  arch/riscv/include/asm/u-boot-riscv.h |   2 +
>  arch/riscv/lib/Makefile               |   1 +
>  arch/riscv/lib/asm-offsets.c          |   1 +
>  arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
>  6 files changed, 108 insertions(+)
>  create mode 100644 arch/riscv/lib/fdt_fixup.c
>

Tested-by: Bin Meng <bmeng.cn@gmail.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540
  2020-04-18 19:32 ` [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540 Atish Patra
@ 2020-04-20  5:29   ` Bin Meng
  0 siblings, 0 replies; 16+ messages in thread
From: Bin Meng @ 2020-04-20  5:29 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 3:32 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> FU540 uses OF_SEPARATE instead of OF_PRIOR_STAGE.
>
> Enable OF_BOARD_FIXUP to update the DT with reserved-memory node.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> ---
>  arch/riscv/lib/fdt_fixup.c     | 15 +++++++++++++++
>  configs/sifive_fu540_defconfig |  1 +
>  2 files changed, 16 insertions(+)
>

Tested-by: Bin Meng <bmeng.cn@gmail.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT
  2020-04-18 19:32 ` [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT Atish Patra
@ 2020-04-20  5:29   ` Bin Meng
  0 siblings, 0 replies; 16+ messages in thread
From: Bin Meng @ 2020-04-20  5:29 UTC (permalink / raw)
  To: u-boot

On Sun, Apr 19, 2020 at 3:32 AM Atish Patra <atish.patra@wdc.com> wrote:
>
> The DT used by U-Boot may be different from the DT being passed to
> the OS if the DT is loaded from external media such as network or
> mmc. In that case, the reserved-memory node needs to be copied to
> the DT passed to the OS.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> ---
>  arch/riscv/lib/bootm.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>

Tested-by: Bin Meng <bmeng.cn@gmail.com>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
       [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA46F87F4@ATCPCS16.andestech.com>
@ 2020-04-20  8:40     ` Rick Chen
  2020-04-21  3:34       ` Atish Patra
  0 siblings, 1 reply; 16+ messages in thread
From: Rick Chen @ 2020-04-20  8:40 UTC (permalink / raw)
  To: u-boot

Hi Atish

> From: Atish Patra [mailto:atish.patra at wdc.com]
> Sent: Sunday, April 19, 2020 3:32 AM
> To: u-boot at lists.denx.de
> Cc: Atish Patra; Bin Meng; Anup Patel; Lukas Auer; Heinrich Schuchardt; agraf at csgraf.de; ard.biesheuvel at linaro.org; Marcus Comstedt; Paul Walmsley; Rick Jian-Zhi Chen(???); palmer at dabbelt.com
> Subject: [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
>
> In RISC-V, M-mode software can reserve physical memory regions by setting appropriate physical memory protection (PMP) csr. As the PMP csr are accessible only in M-mode, S-mode U-Boot can not read this configuration directly. However, M-mode software can pass this information via reserved-memory node in device tree so that S-mode software can access this information.
>
> This patch provides a framework to copy to the reserved-memory node from one DT to another. This will be used to update the DT used by U-Boot and the DT passed to the next stage OS.
>
> Signed-off-by: Atish Patra <atish.patra@wdc.com>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> ---
>  arch/riscv/cpu/start.S                |   1 +
>  arch/riscv/include/asm/global_data.h  |   1 +
>  arch/riscv/include/asm/u-boot-riscv.h |   2 +
>  arch/riscv/lib/Makefile               |   1 +
>  arch/riscv/lib/asm-offsets.c          |   1 +
>  arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
>  6 files changed, 108 insertions(+)
>  create mode 100644 arch/riscv/lib/fdt_fixup.c
>

I am trying to applied Bin and your patch.
The sequence of apply is according to submit date.
This patch seem conflict with [PATCH v2 2/6] riscv: Merge unnecessary
SMP ifdefs in start.S of Bin
Can you rebase it and send again ?

Thanks
Rick

> diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S index 6b3ff99c3882..0282685c2906 100644
> --- a/arch/riscv/cpu/start.S
> +++ b/arch/riscv/cpu/start.S
> @@ -121,6 +121,7 @@ call_board_init_f_0:
>
>         jal     board_init_f_init_reserve
>
> +       SREG    s1, GD_FIRMWARE_FDT_ADDR(gp)
>         /* save the boot hart id to global_data */
>         SREG    tp, GD_BOOT_HART(gp)
>
> diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
> index b74bd7e738bb..51ac8d1c98e2 100644
> --- a/arch/riscv/include/asm/global_data.h
> +++ b/arch/riscv/include/asm/global_data.h
> @@ -15,6 +15,7 @@
>  /* Architecture-specific global data */  struct arch_global_data {
>         long boot_hart;         /* boot hart id */
> +       phys_addr_t firmware_fdt_addr;
>  #ifdef CONFIG_SIFIVE_CLINT
>         void __iomem *clint;    /* clint base address */
>  #endif
> diff --git a/arch/riscv/include/asm/u-boot-riscv.h b/arch/riscv/include/asm/u-boot-riscv.h
> index 49febd588102..543a1688db8f 100644
> --- a/arch/riscv/include/asm/u-boot-riscv.h
> +++ b/arch/riscv/include/asm/u-boot-riscv.h
> @@ -17,5 +17,7 @@ int cleanup_before_linux(void);
>  /* board/.../... */
>  int board_init(void);
>  void board_quiesce_devices(void);
> +int riscv_board_reserved_mem_fixup(void *fdt); int
> +riscv_fdt_copy_resv_mem_node(const void *src_fdt, void *dest_fdt);
>
>  #endif /* _U_BOOT_RISCV_H_ */
> diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index adadbf4bcbef..d132b59ce32c 100644
> --- a/arch/riscv/lib/Makefile
> +++ b/arch/riscv/lib/Makefile
> @@ -24,6 +24,7 @@ obj-y += reset.o
>  obj-y   += setjmp.o
>  obj-$(CONFIG_SMP) += smp.o
>  obj-$(CONFIG_SPL_BUILD)        += spl.o
> +obj-y   += fdt_fixup.o
>
>  # For building EFI apps
>  CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
> diff --git a/arch/riscv/lib/asm-offsets.c b/arch/riscv/lib/asm-offsets.c index 4fa4fd371473..7301c1b98e23 100644
> --- a/arch/riscv/lib/asm-offsets.c
> +++ b/arch/riscv/lib/asm-offsets.c
> @@ -14,6 +14,7 @@
>  int main(void)
>  {
>         DEFINE(GD_BOOT_HART, offsetof(gd_t, arch.boot_hart));
> +       DEFINE(GD_FIRMWARE_FDT_ADDR, offsetof(gd_t, arch.firmware_fdt_addr));
>  #ifndef CONFIG_XIP
>         DEFINE(GD_AVAILABLE_HARTS, offsetof(gd_t, arch.available_harts));  #endif diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c new file mode 100644 index 000000000000..1fce41490973
> --- /dev/null
> +++ b/arch/riscv/lib/fdt_fixup.c
> @@ -0,0 +1,102 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2020 Western Digital Corporation or its affiliates
> + *
> + */
> +
> +#include <common.h>
> +#include <fdt_support.h>
> +#include <mapmem.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/**
> + * riscv_fdt_copy_resv_mem_node() - Copy reserve memory node entry
> + * @src: Pointer to the source device tree from which reserved memory node
> + *      needs to be copied.
> + * @dst: Pointer to the destination device tree to which reserved memory node
> + *      needs to be copied.
> + *
> + * Return: 0 on success or if source doesn't have reserved memory node.
> + *        Error if copy process failed.
> + */
> +int riscv_fdt_copy_resv_mem_node(const void *src, void *dst) {
> +       u32 phandle;
> +       struct fdt_memory pmp_mem;
> +       fdt_addr_t addr;
> +       fdt_size_t size;
> +       int offset, node, err, rmem_offset;
> +       bool nomap = true;
> +       char basename[32] = {0};
> +       int bname_len;
> +       int max_len = sizeof(basename);
> +       const char *name;
> +       char *temp;
> +
> +       offset = fdt_path_offset(src, "/reserved-memory");
> +       if (offset < 0) {
> +               printf("No reserved memory region found in source FDT\n");
> +               return 0;
> +       }
> +
> +       fdt_for_each_subnode(node, src, offset) {
> +               name = fdt_get_name(src, node, NULL);
> +
> +               addr = fdtdec_get_addr_size_auto_noparent(src, node,
> +                                                         "reg", 0, &size,
> +                                                         false);
> +               if (addr == FDT_ADDR_T_NONE) {
> +                       debug("failed to read address/size for %s\n", name);
> +                       continue;
> +               }
> +               strncpy(basename, name, max_len);
> +               temp = strchr(basename, '@');
> +               if (temp) {
> +                       bname_len = strnlen(basename, max_len) - strnlen(temp,
> +                                                                      max_len);
> +                       *(basename + bname_len) = '\0';
> +               }
> +               pmp_mem.start = addr;
> +               pmp_mem.end = addr + size - 1;
> +               err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
> +                                                &phandle);
> +               if (err < 0) {
> +                       printf("failed to add reserved memory: %d\n", err);
> +                       return err;
> +               }
> +               if (!fdt_getprop(src, node, "no-map", NULL))
> +                       nomap = false;
> +               if (nomap) {
> +                       rmem_offset = fdt_node_offset_by_phandle(dst, phandle);
> +                       fdt_setprop_empty(dst, rmem_offset, "no-map");
> +               }
> +       }
> +
> +       return 0;
> +}
> +
> +/**
> + * riscv_board_reserved_mem_fixup() - Fix up reserved memory node for a
> +board
> + * @fdt: Pointer to the device tree in which reserved memory node needs to be
> + *      added.
> + *
> + * In RISC-V, any board compiled with OF_SEPARATE needs to copy the
> +reserved
> + * memory node from the device tree provided by the firmware to the
> +device tree
> + * used by U-Boot. This is a common function that individual board
> +fixup
> + * functions can invoke.
> + *
> + * Return: 0 on success or error otherwise.
> + */
> +int riscv_board_reserved_mem_fixup(void *fdt) {
> +       int err;
> +       void *src_fdt_addr;
> +
> +       src_fdt_addr = map_sysmem(gd->arch.firmware_fdt_addr, 0);
> +       err = riscv_fdt_copy_resv_mem_node(src_fdt_addr, fdt);
> +       if (err < 0)
> +               return err;
> +
> +       return 0;
> +}
> --
> 2.25.1
>
> CONFIDENTIALITY NOTICE:
>
> This e-mail (and its attachments) may contain confidential and legally privileged information or information protected from disclosure. If you are not the intended recipient, you are hereby notified that any disclosure, copying, distribution, or use of the information contained herein is strictly prohibited. In this case, please immediately notify the sender by return e-mail, delete the message (and any accompanying documents) and destroy all printed hard copies. Thank you for your cooperation.
>
> Copyright ANDES TECHNOLOGY CORPORATION - All Rights Reserved.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
  2020-04-20  8:40     ` Rick Chen
@ 2020-04-21  3:34       ` Atish Patra
  2020-04-21  8:25         ` Rick Chen
  0 siblings, 1 reply; 16+ messages in thread
From: Atish Patra @ 2020-04-21  3:34 UTC (permalink / raw)
  To: u-boot

On Mon, Apr 20, 2020 at 1:41 AM Rick Chen <rickchen36@gmail.com> wrote:
>
> Hi Atish
>
> > From: Atish Patra [mailto:atish.patra at wdc.com]
> > Sent: Sunday, April 19, 2020 3:32 AM
> > To: u-boot at lists.denx.de
> > Cc: Atish Patra; Bin Meng; Anup Patel; Lukas Auer; Heinrich Schuchardt; agraf at csgraf.de; ard.biesheuvel at linaro.org; Marcus Comstedt; Paul Walmsley; Rick Jian-Zhi Chen(???); palmer at dabbelt.com
> > Subject: [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
> >
> > In RISC-V, M-mode software can reserve physical memory regions by setting appropriate physical memory protection (PMP) csr. As the PMP csr are accessible only in M-mode, S-mode U-Boot can not read this configuration directly. However, M-mode software can pass this information via reserved-memory node in device tree so that S-mode software can access this information.
> >
> > This patch provides a framework to copy to the reserved-memory node from one DT to another. This will be used to update the DT used by U-Boot and the DT passed to the next stage OS.
> >
> > Signed-off-by: Atish Patra <atish.patra@wdc.com>
> > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> > ---
> >  arch/riscv/cpu/start.S                |   1 +
> >  arch/riscv/include/asm/global_data.h  |   1 +
> >  arch/riscv/include/asm/u-boot-riscv.h |   2 +
> >  arch/riscv/lib/Makefile               |   1 +
> >  arch/riscv/lib/asm-offsets.c          |   1 +
> >  arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
> >  6 files changed, 108 insertions(+)
> >  create mode 100644 arch/riscv/lib/fdt_fixup.c
> >
>
> I am trying to applied Bin and your patch.
> The sequence of apply is according to submit date.
> This patch seem conflict with [PATCH v2 2/6] riscv: Merge unnecessary
> SMP ifdefs in start.S of Bin
> Can you rebase it and send again ?
>

Ok. I will rebase on top of Bin's series and resend.

> Thanks
> Rick
>
> > diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S index 6b3ff99c3882..0282685c2906 100644
> > --- a/arch/riscv/cpu/start.S
> > +++ b/arch/riscv/cpu/start.S
> > @@ -121,6 +121,7 @@ call_board_init_f_0:
> >
> >         jal     board_init_f_init_reserve
> >
> > +       SREG    s1, GD_FIRMWARE_FDT_ADDR(gp)
> >         /* save the boot hart id to global_data */
> >         SREG    tp, GD_BOOT_HART(gp)
> >
> > diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
> > index b74bd7e738bb..51ac8d1c98e2 100644
> > --- a/arch/riscv/include/asm/global_data.h
> > +++ b/arch/riscv/include/asm/global_data.h
> > @@ -15,6 +15,7 @@
> >  /* Architecture-specific global data */  struct arch_global_data {
> >         long boot_hart;         /* boot hart id */
> > +       phys_addr_t firmware_fdt_addr;
> >  #ifdef CONFIG_SIFIVE_CLINT
> >         void __iomem *clint;    /* clint base address */
> >  #endif
> > diff --git a/arch/riscv/include/asm/u-boot-riscv.h b/arch/riscv/include/asm/u-boot-riscv.h
> > index 49febd588102..543a1688db8f 100644
> > --- a/arch/riscv/include/asm/u-boot-riscv.h
> > +++ b/arch/riscv/include/asm/u-boot-riscv.h
> > @@ -17,5 +17,7 @@ int cleanup_before_linux(void);
> >  /* board/.../... */
> >  int board_init(void);
> >  void board_quiesce_devices(void);
> > +int riscv_board_reserved_mem_fixup(void *fdt); int
> > +riscv_fdt_copy_resv_mem_node(const void *src_fdt, void *dest_fdt);
> >
> >  #endif /* _U_BOOT_RISCV_H_ */
> > diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index adadbf4bcbef..d132b59ce32c 100644
> > --- a/arch/riscv/lib/Makefile
> > +++ b/arch/riscv/lib/Makefile
> > @@ -24,6 +24,7 @@ obj-y += reset.o
> >  obj-y   += setjmp.o
> >  obj-$(CONFIG_SMP) += smp.o
> >  obj-$(CONFIG_SPL_BUILD)        += spl.o
> > +obj-y   += fdt_fixup.o
> >
> >  # For building EFI apps
> >  CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
> > diff --git a/arch/riscv/lib/asm-offsets.c b/arch/riscv/lib/asm-offsets.c index 4fa4fd371473..7301c1b98e23 100644
> > --- a/arch/riscv/lib/asm-offsets.c
> > +++ b/arch/riscv/lib/asm-offsets.c
> > @@ -14,6 +14,7 @@
> >  int main(void)
> >  {
> >         DEFINE(GD_BOOT_HART, offsetof(gd_t, arch.boot_hart));
> > +       DEFINE(GD_FIRMWARE_FDT_ADDR, offsetof(gd_t, arch.firmware_fdt_addr));
> >  #ifndef CONFIG_XIP
> >         DEFINE(GD_AVAILABLE_HARTS, offsetof(gd_t, arch.available_harts));  #endif diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c new file mode 100644 index 000000000000..1fce41490973
> > --- /dev/null
> > +++ b/arch/riscv/lib/fdt_fixup.c
> > @@ -0,0 +1,102 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Copyright (c) 2020 Western Digital Corporation or its affiliates
> > + *
> > + */
> > +
> > +#include <common.h>
> > +#include <fdt_support.h>
> > +#include <mapmem.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +/**
> > + * riscv_fdt_copy_resv_mem_node() - Copy reserve memory node entry
> > + * @src: Pointer to the source device tree from which reserved memory node
> > + *      needs to be copied.
> > + * @dst: Pointer to the destination device tree to which reserved memory node
> > + *      needs to be copied.
> > + *
> > + * Return: 0 on success or if source doesn't have reserved memory node.
> > + *        Error if copy process failed.
> > + */
> > +int riscv_fdt_copy_resv_mem_node(const void *src, void *dst) {
> > +       u32 phandle;
> > +       struct fdt_memory pmp_mem;
> > +       fdt_addr_t addr;
> > +       fdt_size_t size;
> > +       int offset, node, err, rmem_offset;
> > +       bool nomap = true;
> > +       char basename[32] = {0};
> > +       int bname_len;
> > +       int max_len = sizeof(basename);
> > +       const char *name;
> > +       char *temp;
> > +
> > +       offset = fdt_path_offset(src, "/reserved-memory");
> > +       if (offset < 0) {
> > +               printf("No reserved memory region found in source FDT\n");
> > +               return 0;
> > +       }
> > +
> > +       fdt_for_each_subnode(node, src, offset) {
> > +               name = fdt_get_name(src, node, NULL);
> > +
> > +               addr = fdtdec_get_addr_size_auto_noparent(src, node,
> > +                                                         "reg", 0, &size,
> > +                                                         false);
> > +               if (addr == FDT_ADDR_T_NONE) {
> > +                       debug("failed to read address/size for %s\n", name);
> > +                       continue;
> > +               }
> > +               strncpy(basename, name, max_len);
> > +               temp = strchr(basename, '@');
> > +               if (temp) {
> > +                       bname_len = strnlen(basename, max_len) - strnlen(temp,
> > +                                                                      max_len);
> > +                       *(basename + bname_len) = '\0';
> > +               }
> > +               pmp_mem.start = addr;
> > +               pmp_mem.end = addr + size - 1;
> > +               err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
> > +                                                &phandle);
> > +               if (err < 0) {
> > +                       printf("failed to add reserved memory: %d\n", err);
> > +                       return err;
> > +               }
> > +               if (!fdt_getprop(src, node, "no-map", NULL))
> > +                       nomap = false;
> > +               if (nomap) {
> > +                       rmem_offset = fdt_node_offset_by_phandle(dst, phandle);
> > +                       fdt_setprop_empty(dst, rmem_offset, "no-map");
> > +               }
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +/**
> > + * riscv_board_reserved_mem_fixup() - Fix up reserved memory node for a
> > +board
> > + * @fdt: Pointer to the device tree in which reserved memory node needs to be
> > + *      added.
> > + *
> > + * In RISC-V, any board compiled with OF_SEPARATE needs to copy the
> > +reserved
> > + * memory node from the device tree provided by the firmware to the
> > +device tree
> > + * used by U-Boot. This is a common function that individual board
> > +fixup
> > + * functions can invoke.
> > + *
> > + * Return: 0 on success or error otherwise.
> > + */
> > +int riscv_board_reserved_mem_fixup(void *fdt) {
> > +       int err;
> > +       void *src_fdt_addr;
> > +
> > +       src_fdt_addr = map_sysmem(gd->arch.firmware_fdt_addr, 0);
> > +       err = riscv_fdt_copy_resv_mem_node(src_fdt_addr, fdt);
> > +       if (err < 0)
> > +               return err;
> > +
> > +       return 0;
> > +}
> > --
> > 2.25.1
> >
> > CONFIDENTIALITY NOTICE:
> >
> > This e-mail (and its attachments) may contain confidential and legally privileged information or information protected from disclosure. If you are not the intended recipient, you are hereby notified that any disclosure, copying, distribution, or use of the information contained herein is strictly prohibited. In this case, please immediately notify the sender by return e-mail, delete the message (and any accompanying documents) and destroy all printed hard copies. Thank you for your cooperation.
> >
> > Copyright ANDES TECHNOLOGY CORPORATION - All Rights Reserved.



-- 
Regards,
Atish

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
  2020-04-21  3:34       ` Atish Patra
@ 2020-04-21  8:25         ` Rick Chen
  2020-04-21 18:15           ` Atish Patra
  0 siblings, 1 reply; 16+ messages in thread
From: Rick Chen @ 2020-04-21  8:25 UTC (permalink / raw)
  To: u-boot

Hi Atish

> On Mon, Apr 20, 2020 at 1:41 AM Rick Chen <rickchen36@gmail.com> wrote:
> >
> > Hi Atish
> >
> > > From: Atish Patra [mailto:atish.patra at wdc.com]
> > > Sent: Sunday, April 19, 2020 3:32 AM
> > > To: u-boot at lists.denx.de
> > > Cc: Atish Patra; Bin Meng; Anup Patel; Lukas Auer; Heinrich Schuchardt; agraf at csgraf.de; ard.biesheuvel at linaro.org; Marcus Comstedt; Paul Walmsley; Rick Jian-Zhi Chen(???); palmer at dabbelt.com
> > > Subject: [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
> > >
> > > In RISC-V, M-mode software can reserve physical memory regions by setting appropriate physical memory protection (PMP) csr. As the PMP csr are accessible only in M-mode, S-mode U-Boot can not read this configuration directly. However, M-mode software can pass this information via reserved-memory node in device tree so that S-mode software can access this information.
> > >
> > > This patch provides a framework to copy to the reserved-memory node from one DT to another. This will be used to update the DT used by U-Boot and the DT passed to the next stage OS.
> > >
> > > Signed-off-by: Atish Patra <atish.patra@wdc.com>
> > > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> > > ---
> > >  arch/riscv/cpu/start.S                |   1 +
> > >  arch/riscv/include/asm/global_data.h  |   1 +
> > >  arch/riscv/include/asm/u-boot-riscv.h |   2 +
> > >  arch/riscv/lib/Makefile               |   1 +
> > >  arch/riscv/lib/asm-offsets.c          |   1 +
> > >  arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
> > >  6 files changed, 108 insertions(+)
> > >  create mode 100644 arch/riscv/lib/fdt_fixup.c
> > >
> >
> > I am trying to applied Bin and your patch.
> > The sequence of apply is according to submit date.
> > This patch seem conflict with [PATCH v2 2/6] riscv: Merge unnecessary
> > SMP ifdefs in start.S of Bin
> > Can you rebase it and send again ?
> >
>
> Ok. I will rebase on top of Bin's series and resend.
>

Please rebase on u-boot-riscv/master.
I also applied Sean's patch today.

Thanks,
Rick

> > > diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S index 6b3ff99c3882..0282685c2906 100644
> > > --- a/arch/riscv/cpu/start.S
> > > +++ b/arch/riscv/cpu/start.S
> > > @@ -121,6 +121,7 @@ call_board_init_f_0:
> > >
> > >         jal     board_init_f_init_reserve
> > >
> > > +       SREG    s1, GD_FIRMWARE_FDT_ADDR(gp)
> > >         /* save the boot hart id to global_data */
> > >         SREG    tp, GD_BOOT_HART(gp)
> > >
> > > diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
> > > index b74bd7e738bb..51ac8d1c98e2 100644
> > > --- a/arch/riscv/include/asm/global_data.h
> > > +++ b/arch/riscv/include/asm/global_data.h
> > > @@ -15,6 +15,7 @@
> > >  /* Architecture-specific global data */  struct arch_global_data {
> > >         long boot_hart;         /* boot hart id */
> > > +       phys_addr_t firmware_fdt_addr;
> > >  #ifdef CONFIG_SIFIVE_CLINT
> > >         void __iomem *clint;    /* clint base address */
> > >  #endif
> > > diff --git a/arch/riscv/include/asm/u-boot-riscv.h b/arch/riscv/include/asm/u-boot-riscv.h
> > > index 49febd588102..543a1688db8f 100644
> > > --- a/arch/riscv/include/asm/u-boot-riscv.h
> > > +++ b/arch/riscv/include/asm/u-boot-riscv.h
> > > @@ -17,5 +17,7 @@ int cleanup_before_linux(void);
> > >  /* board/.../... */
> > >  int board_init(void);
> > >  void board_quiesce_devices(void);
> > > +int riscv_board_reserved_mem_fixup(void *fdt); int
> > > +riscv_fdt_copy_resv_mem_node(const void *src_fdt, void *dest_fdt);
> > >
> > >  #endif /* _U_BOOT_RISCV_H_ */
> > > diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index adadbf4bcbef..d132b59ce32c 100644
> > > --- a/arch/riscv/lib/Makefile
> > > +++ b/arch/riscv/lib/Makefile
> > > @@ -24,6 +24,7 @@ obj-y += reset.o
> > >  obj-y   += setjmp.o
> > >  obj-$(CONFIG_SMP) += smp.o
> > >  obj-$(CONFIG_SPL_BUILD)        += spl.o
> > > +obj-y   += fdt_fixup.o
> > >
> > >  # For building EFI apps
> > >  CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
> > > diff --git a/arch/riscv/lib/asm-offsets.c b/arch/riscv/lib/asm-offsets.c index 4fa4fd371473..7301c1b98e23 100644
> > > --- a/arch/riscv/lib/asm-offsets.c
> > > +++ b/arch/riscv/lib/asm-offsets.c
> > > @@ -14,6 +14,7 @@
> > >  int main(void)
> > >  {
> > >         DEFINE(GD_BOOT_HART, offsetof(gd_t, arch.boot_hart));
> > > +       DEFINE(GD_FIRMWARE_FDT_ADDR, offsetof(gd_t, arch.firmware_fdt_addr));
> > >  #ifndef CONFIG_XIP
> > >         DEFINE(GD_AVAILABLE_HARTS, offsetof(gd_t, arch.available_harts));  #endif diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c new file mode 100644 index 000000000000..1fce41490973
> > > --- /dev/null
> > > +++ b/arch/riscv/lib/fdt_fixup.c
> > > @@ -0,0 +1,102 @@
> > > +// SPDX-License-Identifier: GPL-2.0+
> > > +/*
> > > + * Copyright (c) 2020 Western Digital Corporation or its affiliates
> > > + *
> > > + */
> > > +
> > > +#include <common.h>
> > > +#include <fdt_support.h>
> > > +#include <mapmem.h>
> > > +
> > > +DECLARE_GLOBAL_DATA_PTR;
> > > +
> > > +/**
> > > + * riscv_fdt_copy_resv_mem_node() - Copy reserve memory node entry
> > > + * @src: Pointer to the source device tree from which reserved memory node
> > > + *      needs to be copied.
> > > + * @dst: Pointer to the destination device tree to which reserved memory node
> > > + *      needs to be copied.
> > > + *
> > > + * Return: 0 on success or if source doesn't have reserved memory node.
> > > + *        Error if copy process failed.
> > > + */
> > > +int riscv_fdt_copy_resv_mem_node(const void *src, void *dst) {
> > > +       u32 phandle;
> > > +       struct fdt_memory pmp_mem;
> > > +       fdt_addr_t addr;
> > > +       fdt_size_t size;
> > > +       int offset, node, err, rmem_offset;
> > > +       bool nomap = true;
> > > +       char basename[32] = {0};
> > > +       int bname_len;
> > > +       int max_len = sizeof(basename);
> > > +       const char *name;
> > > +       char *temp;
> > > +
> > > +       offset = fdt_path_offset(src, "/reserved-memory");
> > > +       if (offset < 0) {
> > > +               printf("No reserved memory region found in source FDT\n");
> > > +               return 0;
> > > +       }
> > > +
> > > +       fdt_for_each_subnode(node, src, offset) {
> > > +               name = fdt_get_name(src, node, NULL);
> > > +
> > > +               addr = fdtdec_get_addr_size_auto_noparent(src, node,
> > > +                                                         "reg", 0, &size,
> > > +                                                         false);
> > > +               if (addr == FDT_ADDR_T_NONE) {
> > > +                       debug("failed to read address/size for %s\n", name);
> > > +                       continue;
> > > +               }
> > > +               strncpy(basename, name, max_len);
> > > +               temp = strchr(basename, '@');
> > > +               if (temp) {
> > > +                       bname_len = strnlen(basename, max_len) - strnlen(temp,
> > > +                                                                      max_len);
> > > +                       *(basename + bname_len) = '\0';
> > > +               }
> > > +               pmp_mem.start = addr;
> > > +               pmp_mem.end = addr + size - 1;
> > > +               err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
> > > +                                                &phandle);
> > > +               if (err < 0) {
> > > +                       printf("failed to add reserved memory: %d\n", err);
> > > +                       return err;
> > > +               }
> > > +               if (!fdt_getprop(src, node, "no-map", NULL))
> > > +                       nomap = false;
> > > +               if (nomap) {
> > > +                       rmem_offset = fdt_node_offset_by_phandle(dst, phandle);
> > > +                       fdt_setprop_empty(dst, rmem_offset, "no-map");
> > > +               }
> > > +       }
> > > +
> > > +       return 0;
> > > +}
> > > +
> > > +/**
> > > + * riscv_board_reserved_mem_fixup() - Fix up reserved memory node for a
> > > +board
> > > + * @fdt: Pointer to the device tree in which reserved memory node needs to be
> > > + *      added.
> > > + *
> > > + * In RISC-V, any board compiled with OF_SEPARATE needs to copy the
> > > +reserved
> > > + * memory node from the device tree provided by the firmware to the
> > > +device tree
> > > + * used by U-Boot. This is a common function that individual board
> > > +fixup
> > > + * functions can invoke.
> > > + *
> > > + * Return: 0 on success or error otherwise.
> > > + */
> > > +int riscv_board_reserved_mem_fixup(void *fdt) {
> > > +       int err;
> > > +       void *src_fdt_addr;
> > > +
> > > +       src_fdt_addr = map_sysmem(gd->arch.firmware_fdt_addr, 0);
> > > +       err = riscv_fdt_copy_resv_mem_node(src_fdt_addr, fdt);
> > > +       if (err < 0)
> > > +               return err;
> > > +
> > > +       return 0;
> > > +}
> > > --
> > > 2.25.1
> > >

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
  2020-04-21  8:25         ` Rick Chen
@ 2020-04-21 18:15           ` Atish Patra
  0 siblings, 0 replies; 16+ messages in thread
From: Atish Patra @ 2020-04-21 18:15 UTC (permalink / raw)
  To: u-boot

On Tue, Apr 21, 2020 at 1:25 AM Rick Chen <rickchen36@gmail.com> wrote:
>
> Hi Atish
>
> > On Mon, Apr 20, 2020 at 1:41 AM Rick Chen <rickchen36@gmail.com> wrote:
> > >
> > > Hi Atish
> > >
> > > > From: Atish Patra [mailto:atish.patra at wdc.com]
> > > > Sent: Sunday, April 19, 2020 3:32 AM
> > > > To: u-boot at lists.denx.de
> > > > Cc: Atish Patra; Bin Meng; Anup Patel; Lukas Auer; Heinrich Schuchardt; agraf at csgraf.de; ard.biesheuvel at linaro.org; Marcus Comstedt; Paul Walmsley; Rick Jian-Zhi Chen(???); palmer at dabbelt.com
> > > > Subject: [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory
> > > >
> > > > In RISC-V, M-mode software can reserve physical memory regions by setting appropriate physical memory protection (PMP) csr. As the PMP csr are accessible only in M-mode, S-mode U-Boot can not read this configuration directly. However, M-mode software can pass this information via reserved-memory node in device tree so that S-mode software can access this information.
> > > >
> > > > This patch provides a framework to copy to the reserved-memory node from one DT to another. This will be used to update the DT used by U-Boot and the DT passed to the next stage OS.
> > > >
> > > > Signed-off-by: Atish Patra <atish.patra@wdc.com>
> > > > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> > > > ---
> > > >  arch/riscv/cpu/start.S                |   1 +
> > > >  arch/riscv/include/asm/global_data.h  |   1 +
> > > >  arch/riscv/include/asm/u-boot-riscv.h |   2 +
> > > >  arch/riscv/lib/Makefile               |   1 +
> > > >  arch/riscv/lib/asm-offsets.c          |   1 +
> > > >  arch/riscv/lib/fdt_fixup.c            | 102 ++++++++++++++++++++++++++
> > > >  6 files changed, 108 insertions(+)
> > > >  create mode 100644 arch/riscv/lib/fdt_fixup.c
> > > >
> > >
> > > I am trying to applied Bin and your patch.
> > > The sequence of apply is according to submit date.
> > > This patch seem conflict with [PATCH v2 2/6] riscv: Merge unnecessary
> > > SMP ifdefs in start.S of Bin
> > > Can you rebase it and send again ?
> > >
> >
> > Ok. I will rebase on top of Bin's series and resend.
> >
>
> Please rebase on u-boot-riscv/master.
> I also applied Sean's patch today.
>

Done. Sent v7.

> Thanks,
> Rick
>
> > > > diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S index 6b3ff99c3882..0282685c2906 100644
> > > > --- a/arch/riscv/cpu/start.S
> > > > +++ b/arch/riscv/cpu/start.S
> > > > @@ -121,6 +121,7 @@ call_board_init_f_0:
> > > >
> > > >         jal     board_init_f_init_reserve
> > > >
> > > > +       SREG    s1, GD_FIRMWARE_FDT_ADDR(gp)
> > > >         /* save the boot hart id to global_data */
> > > >         SREG    tp, GD_BOOT_HART(gp)
> > > >
> > > > diff --git a/arch/riscv/include/asm/global_data.h b/arch/riscv/include/asm/global_data.h
> > > > index b74bd7e738bb..51ac8d1c98e2 100644
> > > > --- a/arch/riscv/include/asm/global_data.h
> > > > +++ b/arch/riscv/include/asm/global_data.h
> > > > @@ -15,6 +15,7 @@
> > > >  /* Architecture-specific global data */  struct arch_global_data {
> > > >         long boot_hart;         /* boot hart id */
> > > > +       phys_addr_t firmware_fdt_addr;
> > > >  #ifdef CONFIG_SIFIVE_CLINT
> > > >         void __iomem *clint;    /* clint base address */
> > > >  #endif
> > > > diff --git a/arch/riscv/include/asm/u-boot-riscv.h b/arch/riscv/include/asm/u-boot-riscv.h
> > > > index 49febd588102..543a1688db8f 100644
> > > > --- a/arch/riscv/include/asm/u-boot-riscv.h
> > > > +++ b/arch/riscv/include/asm/u-boot-riscv.h
> > > > @@ -17,5 +17,7 @@ int cleanup_before_linux(void);
> > > >  /* board/.../... */
> > > >  int board_init(void);
> > > >  void board_quiesce_devices(void);
> > > > +int riscv_board_reserved_mem_fixup(void *fdt); int
> > > > +riscv_fdt_copy_resv_mem_node(const void *src_fdt, void *dest_fdt);
> > > >
> > > >  #endif /* _U_BOOT_RISCV_H_ */
> > > > diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index adadbf4bcbef..d132b59ce32c 100644
> > > > --- a/arch/riscv/lib/Makefile
> > > > +++ b/arch/riscv/lib/Makefile
> > > > @@ -24,6 +24,7 @@ obj-y += reset.o
> > > >  obj-y   += setjmp.o
> > > >  obj-$(CONFIG_SMP) += smp.o
> > > >  obj-$(CONFIG_SPL_BUILD)        += spl.o
> > > > +obj-y   += fdt_fixup.o
> > > >
> > > >  # For building EFI apps
> > > >  CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
> > > > diff --git a/arch/riscv/lib/asm-offsets.c b/arch/riscv/lib/asm-offsets.c index 4fa4fd371473..7301c1b98e23 100644
> > > > --- a/arch/riscv/lib/asm-offsets.c
> > > > +++ b/arch/riscv/lib/asm-offsets.c
> > > > @@ -14,6 +14,7 @@
> > > >  int main(void)
> > > >  {
> > > >         DEFINE(GD_BOOT_HART, offsetof(gd_t, arch.boot_hart));
> > > > +       DEFINE(GD_FIRMWARE_FDT_ADDR, offsetof(gd_t, arch.firmware_fdt_addr));
> > > >  #ifndef CONFIG_XIP
> > > >         DEFINE(GD_AVAILABLE_HARTS, offsetof(gd_t, arch.available_harts));  #endif diff --git a/arch/riscv/lib/fdt_fixup.c b/arch/riscv/lib/fdt_fixup.c new file mode 100644 index 000000000000..1fce41490973
> > > > --- /dev/null
> > > > +++ b/arch/riscv/lib/fdt_fixup.c
> > > > @@ -0,0 +1,102 @@
> > > > +// SPDX-License-Identifier: GPL-2.0+
> > > > +/*
> > > > + * Copyright (c) 2020 Western Digital Corporation or its affiliates
> > > > + *
> > > > + */
> > > > +
> > > > +#include <common.h>
> > > > +#include <fdt_support.h>
> > > > +#include <mapmem.h>
> > > > +
> > > > +DECLARE_GLOBAL_DATA_PTR;
> > > > +
> > > > +/**
> > > > + * riscv_fdt_copy_resv_mem_node() - Copy reserve memory node entry
> > > > + * @src: Pointer to the source device tree from which reserved memory node
> > > > + *      needs to be copied.
> > > > + * @dst: Pointer to the destination device tree to which reserved memory node
> > > > + *      needs to be copied.
> > > > + *
> > > > + * Return: 0 on success or if source doesn't have reserved memory node.
> > > > + *        Error if copy process failed.
> > > > + */
> > > > +int riscv_fdt_copy_resv_mem_node(const void *src, void *dst) {
> > > > +       u32 phandle;
> > > > +       struct fdt_memory pmp_mem;
> > > > +       fdt_addr_t addr;
> > > > +       fdt_size_t size;
> > > > +       int offset, node, err, rmem_offset;
> > > > +       bool nomap = true;
> > > > +       char basename[32] = {0};
> > > > +       int bname_len;
> > > > +       int max_len = sizeof(basename);
> > > > +       const char *name;
> > > > +       char *temp;
> > > > +
> > > > +       offset = fdt_path_offset(src, "/reserved-memory");
> > > > +       if (offset < 0) {
> > > > +               printf("No reserved memory region found in source FDT\n");
> > > > +               return 0;
> > > > +       }
> > > > +
> > > > +       fdt_for_each_subnode(node, src, offset) {
> > > > +               name = fdt_get_name(src, node, NULL);
> > > > +
> > > > +               addr = fdtdec_get_addr_size_auto_noparent(src, node,
> > > > +                                                         "reg", 0, &size,
> > > > +                                                         false);
> > > > +               if (addr == FDT_ADDR_T_NONE) {
> > > > +                       debug("failed to read address/size for %s\n", name);
> > > > +                       continue;
> > > > +               }
> > > > +               strncpy(basename, name, max_len);
> > > > +               temp = strchr(basename, '@');
> > > > +               if (temp) {
> > > > +                       bname_len = strnlen(basename, max_len) - strnlen(temp,
> > > > +                                                                      max_len);
> > > > +                       *(basename + bname_len) = '\0';
> > > > +               }
> > > > +               pmp_mem.start = addr;
> > > > +               pmp_mem.end = addr + size - 1;
> > > > +               err = fdtdec_add_reserved_memory(dst, basename, &pmp_mem,
> > > > +                                                &phandle);
> > > > +               if (err < 0) {
> > > > +                       printf("failed to add reserved memory: %d\n", err);
> > > > +                       return err;
> > > > +               }
> > > > +               if (!fdt_getprop(src, node, "no-map", NULL))
> > > > +                       nomap = false;
> > > > +               if (nomap) {
> > > > +                       rmem_offset = fdt_node_offset_by_phandle(dst, phandle);
> > > > +                       fdt_setprop_empty(dst, rmem_offset, "no-map");
> > > > +               }
> > > > +       }
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +
> > > > +/**
> > > > + * riscv_board_reserved_mem_fixup() - Fix up reserved memory node for a
> > > > +board
> > > > + * @fdt: Pointer to the device tree in which reserved memory node needs to be
> > > > + *      added.
> > > > + *
> > > > + * In RISC-V, any board compiled with OF_SEPARATE needs to copy the
> > > > +reserved
> > > > + * memory node from the device tree provided by the firmware to the
> > > > +device tree
> > > > + * used by U-Boot. This is a common function that individual board
> > > > +fixup
> > > > + * functions can invoke.
> > > > + *
> > > > + * Return: 0 on success or error otherwise.
> > > > + */
> > > > +int riscv_board_reserved_mem_fixup(void *fdt) {
> > > > +       int err;
> > > > +       void *src_fdt_addr;
> > > > +
> > > > +       src_fdt_addr = map_sysmem(gd->arch.firmware_fdt_addr, 0);
> > > > +       err = riscv_fdt_copy_resv_mem_node(src_fdt_addr, fdt);
> > > > +       if (err < 0)
> > > > +               return err;
> > > > +
> > > > +       return 0;
> > > > +}
> > > > --
> > > > 2.25.1
> > > >



-- 
Regards,
Atish

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2020-04-21 18:15 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-18 19:32 [PATCH v6 0/6] RISC-V DT related fixes for reserved memory & UEFI Atish Patra
2020-04-18 19:32 ` [PATCH v6 1/6] riscv: Add boot hartid to device tree Atish Patra
2020-04-20  5:29   ` Bin Meng
2020-04-18 19:32 ` [PATCH v6 2/6] fdtdec: Fix boundary check Atish Patra
2020-04-20  5:29   ` Bin Meng
2020-04-18 19:32 ` [PATCH v6 3/6] riscv: Provide a mechanism to fix DT for reserved memory Atish Patra
2020-04-20  5:29   ` Bin Meng
     [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA46F87F4@ATCPCS16.andestech.com>
2020-04-20  8:40     ` Rick Chen
2020-04-21  3:34       ` Atish Patra
2020-04-21  8:25         ` Rick Chen
2020-04-21 18:15           ` Atish Patra
2020-04-18 19:32 ` [PATCH v6 4/6] riscv: Setup reserved-memory node for FU540 Atish Patra
2020-04-20  5:29   ` Bin Meng
2020-04-18 19:32 ` [PATCH v6 5/6] riscv: Copy the reserved-memory nodes to final DT Atish Patra
2020-04-20  5:29   ` Bin Meng
2020-04-18 19:32 ` [PATCH v6 6/6] riscv: Move all fdt fixups together Atish Patra

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.