Module Name:    src
Committed By:   riastradh
Date:           Thu May 14 19:24:35 UTC 2020

Modified Files:
        src/sys/arch/evbarm/fdt: fdt_machdep.c

Log Message:
Deduplicate address-range querying/mapping logic.


To generate a diff of this commit:
cvs rdiff -u -r1.69 -r1.70 src/sys/arch/evbarm/fdt/fdt_machdep.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/arch/evbarm/fdt/fdt_machdep.c
diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.69 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.70
--- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.69	Thu May 14 19:21:06 2020
+++ src/sys/arch/evbarm/fdt/fdt_machdep.c	Thu May 14 19:24:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.69 2020/05/14 19:21:06 riastradh Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.70 2020/05/14 19:24:35 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.69 2020/05/14 19:21:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.70 2020/05/14 19:24:35 riastradh Exp $");
 
 #include "opt_machdep.h"
 #include "opt_bootconfig.h"
@@ -334,20 +334,20 @@ fdt_build_bootconfig(uint64_t mem_start,
 }
 
 static void
-fdt_probe_initrd(uint64_t *pstart, uint64_t *pend)
+fdt_probe_range(const char *startname, const char *endname,
+    uint64_t *pstart, uint64_t *pend)
 {
+	int chosen, len;
+	const void *start_data, *end_data;
+
 	*pstart = *pend = 0;
 
-#ifdef MEMORY_DISK_DYNAMIC
-	const int chosen = OF_finddevice("/chosen");
+	chosen = OF_finddevice("/chosen");
 	if (chosen < 0)
 		return;
 
-	int len;
-	const void *start_data = fdtbus_get_prop(chosen,
-	    "linux,initrd-start", &len);
-	const void *end_data = fdtbus_get_prop(chosen,
-	    "linux,initrd-end", NULL);
+	start_data = fdtbus_get_prop(chosen, startname, &len);
+	end_data = fdtbus_get_prop(chosen, endname, NULL);
 	if (start_data == NULL || end_data == NULL)
 		return;
 
@@ -361,131 +361,92 @@ fdt_probe_initrd(uint64_t *pstart, uint6
 		*pend = be64dec(end_data);
 		break;
 	default:
-		printf("Unsupported len %d for /chosen/initrd-start\n", len);
+		printf("Unsupported len %d for /chosen `%s'\n",
+		    len, startname);
 		return;
 	}
-#endif
 }
 
-static void
-fdt_setup_initrd(void)
+static void *
+fdt_map_range(uint64_t start, uint64_t end, uint64_t *psize,
+    const char *purpose)
 {
-#ifdef MEMORY_DISK_DYNAMIC
-	const uint64_t initrd_size = initrd_end - initrd_start;
-	paddr_t startpa = trunc_page(initrd_start);
-	paddr_t endpa = round_page(initrd_end);
+	const paddr_t startpa = trunc_page(start);
+	const paddr_t endpa = round_page(end);
 	paddr_t pa;
 	vaddr_t va;
-	void *md_start;
+	void *ptr;
 
-	if (initrd_size == 0)
-		return;
+	*psize = end - start;
+	if (*psize == 0)
+		return NULL;
 
-	va = uvm_km_alloc(kernel_map, initrd_size, 0,
-	    UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
+	va = uvm_km_alloc(kernel_map, *psize, 0, UVM_KMF_VAONLY|UVM_KMF_NOWAIT);
 	if (va == 0) {
-		printf("Failed to allocate VA for initrd\n");
-		return;
+		printf("Failed to allocate VA for %s\n", purpose);
+		return NULL;
 	}
-
-	md_start = (void *)va;
+	ptr = (void *)(va + (start & (PAGE_SIZE-1)));
 
 	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
 		pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
 	pmap_update(pmap_kernel());
 
-	md_root_setconf(md_start, initrd_size);
+	return ptr;
+}
+
+static void
+fdt_probe_initrd(uint64_t *pstart, uint64_t *pend)
+{
+	*pstart = *pend = 0;
+
+#ifdef MEMORY_DISK_DYNAMIC
+	fdt_probe_range("linux,initrd-start", "linux,initrd-end", pstart, pend);
 #endif
 }
 
 static void
-fdt_probe_rndseed(uint64_t *pstart, uint64_t *pend)
+fdt_setup_initrd(void)
 {
-	int chosen, len;
-	const void *start_data, *end_data;
+#ifdef MEMORY_DISK_DYNAMIC
+	void *md_start;
+	uint64_t initrd_size;
 
-	*pstart = *pend = 0;
-	chosen = OF_finddevice("/chosen");
-	if (chosen < 0)
+	md_start = fdt_map_range(initrd_start, initrd_end, &initrd_size,
+	    "initrd");
+	if (md_start == NULL)
 		return;
+	md_root_setconf(md_start, initrd_size);
+#endif
+}
 
-	start_data = fdtbus_get_prop(chosen, "netbsd,rndseed-start", &len);
-	end_data = fdtbus_get_prop(chosen, "netbsd,rndseed-end", NULL);
-	if (start_data == NULL || end_data == NULL)
-		return;
+static void
+fdt_probe_rndseed(uint64_t *pstart, uint64_t *pend)
+{
 
-	switch (len) {
-	case 4:
-		*pstart = be32dec(start_data);
-		*pend = be32dec(end_data);
-		break;
-	case 8:
-		*pstart = be64dec(start_data);
-		*pend = be64dec(end_data);
-		break;
-	default:
-		printf("Unsupported len %d for /chosen/rndseed-start\n", len);
-		return;
-	}
+	fdt_probe_range("netbsd,rndseed-start", "netbsd,rndseed-end",
+	    pstart, pend);
 }
 
 static void
 fdt_setup_rndseed(void)
 {
-	const uint64_t rndseed_size = rndseed_end - rndseed_start;
-	const paddr_t startpa = trunc_page(rndseed_start);
-	const paddr_t endpa = round_page(rndseed_end);
-	paddr_t pa;
-	vaddr_t va;
+	uint64_t rndseed_size;
 	void *rndseed;
 
-	if (rndseed_size == 0)
-		return;
-
-	va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
-	    UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
-	if (va == 0) {
-		printf("Failed to allocate VA for rndseed\n");
+	rndseed = fdt_map_range(rndseed_start, rndseed_end, &rndseed_size,
+	    "rndseed");
+	if (rndseed == NULL)
 		return;
-	}
-	rndseed = (void *)va;
-
-	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
-		pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
-	pmap_update(pmap_kernel());
-
 	rnd_seed(rndseed, rndseed_size);
 }
 
 static void
 fdt_probe_efirng(uint64_t *pstart, uint64_t *pend)
 {
-	int chosen, len;
-	const void *start_data, *end_data;
-
-	*pstart = *pend = 0;
-	chosen = OF_finddevice("/chosen");
-	if (chosen < 0)
-		return;
-
-	start_data = fdtbus_get_prop(chosen, "netbsd,efirng-start", &len);
-	end_data = fdtbus_get_prop(chosen, "netbsd,efirng-end", NULL);
-	if (start_data == NULL || end_data == NULL)
-		return;
 
-	switch (len) {
-	case 4:
-		*pstart = be32dec(start_data);
-		*pend = be32dec(end_data);
-		break;
-	case 8:
-		*pstart = be64dec(start_data);
-		*pend = be64dec(end_data);
-		break;
-	default:
-		printf("Unsupported len %d for /chosen/efirng-start\n", len);
-		return;
-	}
+	fdt_probe_range("netbsd,efirng-start", "netbsd,efirng-end",
+	    pstart, pend);
 }
 
 static struct krndsource efirng_source;
@@ -493,27 +454,13 @@ static struct krndsource efirng_source;
 static void
 fdt_setup_efirng(void)
 {
-	const uint64_t efirng_size = efirng_end - efirng_start;
-	const paddr_t startpa = trunc_page(efirng_start);
-	const paddr_t endpa = round_page(efirng_end);
-	paddr_t pa;
-	vaddr_t va;
+	uint64_t efirng_size;
 	void *efirng;
 
-	if (efirng_size == 0)
-		return;
-
-	va = uvm_km_alloc(kernel_map, endpa - startpa, 0,
-	    UVM_KMF_VAONLY | UVM_KMF_NOWAIT);
-	if (va == 0) {
-		printf("Failed to allocate VA for efirng\n");
+	efirng = fdt_map_range(efirng_start, efirng_end, &efirng_size,
+	    "efirng");
+	if (efirng == NULL)
 		return;
-	}
-	efirng = (void *)va;
-
-	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
-		pmap_kenter_pa(va, pa, VM_PROT_READ|VM_PROT_WRITE, 0);
-	pmap_update(pmap_kernel());
 
 	rnd_attach_source(&efirng_source, "efirng", RND_TYPE_RNG,
 	    RND_FLAG_DEFAULT);

Reply via email to