Module Name: src
Committed By: mlelstv
Date: Sun Jan 14 07:53:38 UTC 2024
Modified Files:
src/sys/dev/fdt: fdt_memory.c
Log Message:
Handle multiple memory nodes by type, but still allow an untyped
(non-standard) node named /memory.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/fdt/fdt_memory.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/fdt/fdt_memory.c
diff -u src/sys/dev/fdt/fdt_memory.c:1.9 src/sys/dev/fdt/fdt_memory.c:1.10
--- src/sys/dev/fdt/fdt_memory.c:1.9 Fri Jan 12 18:06:18 2024
+++ src/sys/dev/fdt/fdt_memory.c Sun Jan 14 07:53:38 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_memory.c,v 1.9 2024/01/12 18:06:18 skrll Exp $ */
+/* $NetBSD: fdt_memory.c,v 1.10 2024/01/14 07:53:38 mlelstv Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include "opt_fdt.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_memory.c,v 1.9 2024/01/12 18:06:18 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_memory.c,v 1.10 2024/01/14 07:53:38 mlelstv Exp $");
#include <sys/param.h>
#include <sys/queue.h>
@@ -77,26 +77,43 @@ fdt_memory_range_free(struct fdt_memory_
void
fdt_memory_get(uint64_t *pstart, uint64_t *pend)
{
- const int memory = OF_finddevice("/memory");
+ const void *fdt_data = fdtbus_get_data();
uint64_t cur_addr, cur_size;
- int index, nadd;
+ int index, nadd = 0, off, memory;
- for (index = 0, nadd = 0;
- fdtbus_get_reg64(memory, index, &cur_addr, &cur_size) == 0;
- index++) {
- if (cur_size == 0)
- continue;
- fdt_memory_add_range(cur_addr, cur_size);
+ off = fdt_node_offset_by_prop_value(fdt_data, -1,
+ "device_type", "memory", sizeof("memory"));
- if (nadd++ == 0) {
- *pstart = cur_addr;
- *pend = cur_addr + cur_size;
- continue;
+ /*
+ * Device Tree Specification 3.2 says that memory
+ * nodes are named "memory" and have device_type
+ * "memory", but if the device_type is missing, try
+ * to find the (then single) node by name.
+ */
+ if (off == -FDT_ERR_NOTFOUND)
+ off = fdt_path_offset(fdt_data, "/memory");
+
+ while (off != -FDT_ERR_NOTFOUND) {
+ memory = fdtbus_offset2phandle(off);
+ for (index = 0;
+ fdtbus_get_reg64(memory, index, &cur_addr, &cur_size) == 0;
+ index++) {
+ if (cur_size == 0)
+ continue;
+ fdt_memory_add_range(cur_addr, cur_size);
+
+ if (nadd++ == 0) {
+ *pstart = cur_addr;
+ *pend = cur_addr + cur_size;
+ continue;
+ }
+ if (cur_addr < *pstart)
+ *pstart = cur_addr;
+ if (cur_addr + cur_size > *pend)
+ *pend = cur_addr + cur_size;
}
- if (cur_addr < *pstart)
- *pstart = cur_addr;
- if (cur_addr + cur_size > *pend)
- *pend = cur_addr + cur_size;
+ off = fdt_node_offset_by_prop_value(fdt_data, off,
+ "device_type", "memory", sizeof("memory"));
}
if (nadd == 0)
panic("Cannot determine memory size");