Page MenuHomeFreeBSD

D24152.id69833.diff
No OneTemporary

D24152.id69833.diff

Index: sys/riscv/include/machdep.h
===================================================================
--- sys/riscv/include/machdep.h
+++ sys/riscv/include/machdep.h
@@ -42,7 +42,6 @@
vm_offset_t kern_phys; /* Kernel base (physical) addr */
vm_offset_t kern_stack;
vm_offset_t dtbp_virt; /* Device tree blob virtual addr */
- vm_offset_t dtbp_phys; /* Device tree blob physical addr */
};
extern vm_paddr_t physmap[];
Index: sys/riscv/riscv/genassym.c
===================================================================
--- sys/riscv/riscv/genassym.c
+++ sys/riscv/riscv/genassym.c
@@ -104,4 +104,3 @@
ASSYM(RISCV_BOOTPARAMS_KERN_STACK, offsetof(struct riscv_bootparams,
kern_stack));
ASSYM(RISCV_BOOTPARAMS_DTBP_VIRT, offsetof(struct riscv_bootparams, dtbp_virt));
-ASSYM(RISCV_BOOTPARAMS_DTBP_PHYS, offsetof(struct riscv_bootparams, dtbp_phys));
Index: sys/riscv/riscv/locore.S
===================================================================
--- sys/riscv/riscv/locore.S
+++ sys/riscv/riscv/locore.S
@@ -219,7 +219,6 @@
li t0, (VM_MAX_KERNEL_ADDRESS - 2 * L2_SIZE)
sd t0, RISCV_BOOTPARAMS_DTBP_VIRT(sp)
- sd a1, RISCV_BOOTPARAMS_DTBP_PHYS(sp)
mv a0, sp
call _C_LABEL(initriscv) /* Off we go */
Index: sys/riscv/riscv/machdep.c
===================================================================
--- sys/riscv/riscv/machdep.c
+++ sys/riscv/riscv/machdep.c
@@ -81,6 +81,7 @@
#include <machine/intr.h>
#include <machine/kdb.h>
#include <machine/machdep.h>
+#include <machine/metadata.h>
#include <machine/pcb.h>
#include <machine/reg.h>
#include <machine/riscvreg.h>
@@ -93,6 +94,7 @@
#endif
#ifdef FDT
+#include <contrib/libfdt/libfdt.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/openfirm.h>
#endif
@@ -741,11 +743,19 @@
#ifdef FDT
static void
-try_load_dtb(caddr_t kmdp, vm_offset_t dtbp)
+try_load_dtb(caddr_t kmdp)
{
+ vm_offset_t dtbp;
+
+ dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
#if defined(FDT_DTB_STATIC)
- dtbp = (vm_offset_t)&fdt_static_dtb;
+ /*
+ * In case the device tree blob was not retrieved (from metadata) try
+ * to use the statically embedded one.
+ */
+ if (dtbp == (vm_offset_t)NULL)
+ dtbp = (vm_offset_t)&fdt_static_dtb;
#endif
if (dtbp == (vm_offset_t)NULL) {
@@ -777,13 +787,14 @@
* RISCVTODO: This needs to be done via loader (when it's available).
*/
vm_offset_t
-fake_preload_metadata(struct riscv_bootparams *rvbp __unused)
+fake_preload_metadata(struct riscv_bootparams *rvbp)
{
static uint32_t fake_preload[35];
#ifdef DDB
vm_offset_t zstart = 0, zend = 0;
#endif
vm_offset_t lastaddr;
+ size_t dtb_size;
int i;
i = 0;
@@ -824,10 +835,23 @@
#endif
#endif
lastaddr = (vm_offset_t)&end;
+
+ /* Copy the DTB to KVA space. */
+ lastaddr = roundup(lastaddr, sizeof(int));
+ fake_preload[i++] = MODINFO_METADATA | MODINFOMD_DTBP;
+ fake_preload[i++] = sizeof(vm_offset_t);
+ *(vm_offset_t *)&fake_preload[i] = (vm_offset_t)lastaddr;
+ i += sizeof(vm_offset_t) / sizeof(uint32_t);
+ dtb_size = fdt_totalsize(rvbp->dtbp_virt);
+ memmove((void *)lastaddr, (const void *)rvbp->dtbp_virt, dtb_size);
+ lastaddr = roundup(lastaddr + dtb_size, sizeof(int));
+
fake_preload[i++] = 0;
fake_preload[i] = 0;
preload_metadata = (void *)fake_preload;
+ KASSERT(i < nitems(fake_preload), ("Too many fake_preload items"));
+
return (lastaddr);
}
@@ -836,8 +860,6 @@
{
struct mem_region mem_regions[FDT_MEM_REGIONS];
struct pcpu *pcpup;
- vm_offset_t rstart, rend;
- vm_offset_t s, e;
int mem_regions_sz;
vm_offset_t lastaddr;
vm_size_t kernlen;
@@ -873,7 +895,7 @@
kern_envp = NULL;
#ifdef FDT
- try_load_dtb(kmdp, rvbp->dtbp_virt);
+ try_load_dtb(kmdp);
#endif
/* Load the physical memory ranges */
@@ -884,21 +906,9 @@
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, NULL) != 0)
panic("Cannot get physical memory regions");
- s = rvbp->dtbp_phys;
- e = s + DTB_SIZE_MAX;
-
for (i = 0; i < mem_regions_sz; i++) {
- rstart = mem_regions[i].mr_start;
- rend = (mem_regions[i].mr_start + mem_regions[i].mr_size);
-
- if ((rstart < s) && (rend > e)) {
- /* Exclude DTB region. */
- add_physmap_entry(rstart, (s - rstart), physmap, &physmap_idx);
- add_physmap_entry(e, (rend - e), physmap, &physmap_idx);
- } else {
- add_physmap_entry(mem_regions[i].mr_start,
- mem_regions[i].mr_size, physmap, &physmap_idx);
- }
+ add_physmap_entry(mem_regions[i].mr_start,
+ mem_regions[i].mr_size, physmap, &physmap_idx);
}
#endif

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 1, 11:55 AM (9 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27435820
Default Alt Text
D24152.id69833.diff (4 KB)

Event Timeline