[PATCH v2 2/3] bootwrapper: Factor out parsing of fdt #address-cells and #size-cells

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Jon Medhurst <tixy@xxxxxxxxxx>

A subsequent patch will also need to obtain address-cells and
size-cells, so lets factor out this code into a handy function.

Signed-off-by: Jon Medhurst <tixy@xxxxxxxxxx>
---
 semi_loader.c |   56 ++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 34 insertions(+), 22 deletions(-)

diff --git a/semi_loader.c b/semi_loader.c
index cbe911c..c9750be 100644
--- a/semi_loader.c
+++ b/semi_loader.c
@@ -97,6 +97,39 @@ static int _fdt_make_node(void *fdt, int parentoffset, const char *name)
 	return fdt_add_subnode(fdt, parentoffset, name);
 }
 
+static void _fdt_address_and_size_cells(void *fdt, int* addrcells, int* sizecells)
+{
+	int e;
+	uint32_t const *p;
+
+	if(!(p = fdt_getprop(fdt, 0, "#address-cells", &e)))
+		goto libfdt_error;
+	else if(e != 4)
+		goto size_error;
+	*addrcells = fdt32_to_cpu(*p);
+	if(!(p = fdt_getprop(fdt, 0, "#size-cells", &e)))
+		goto libfdt_error;
+	else if(e != 4)
+		goto size_error;
+	*sizecells = fdt32_to_cpu(*p);
+	
+	/*
+	 * Sanity-check address sizes, since addresses and sizes which do
+	 * not take up exactly 4 or 8 bytes are not supported.
+	 */
+	if ((*addrcells != 1 && *addrcells != 2) ||
+	    (*sizecells != 1 && *sizecells != 2))
+		goto size_error;
+
+	return;
+
+libfdt_error:
+	fatal("libfdt: ", fdt_strerror(e), ", while looking for #address-cells/#size-cells\n");
+
+size_error:
+	fatal("Unexpected/invalid #address-cells/#size-cells in device tree\n");
+}
+
 static void update_fdt(void **dest, struct loader_info *info)
 {
 	int e;
@@ -112,25 +145,7 @@ static void update_fdt(void **dest, struct loader_info *info)
 	if((e = fdt_open_into((void *)info->fdt_start, fdt, FDT_SIZE_MAX)) < 0)
 		goto libfdt_error;
 
-	/*
-	 * Sanity-check address sizes, since addresses and sizes which do
-	 * not take up exactly 4 or 8 bytes are not supported.
-	 */
-	{
-		if(!(p = fdt_getprop(fdt, 0, "#address-cells", &e)))
-			goto libfdt_error;
-		else if(e != 4)
-			goto size_error;
-		addrcells = fdt32_to_cpu(*p);
-		if(!(p = fdt_getprop(fdt, 0, "#size-cells", &e)))
-			goto libfdt_error;
-		else if(e != 4)
-			goto size_error;
-		sizecells = fdt32_to_cpu(*p);
-		if ((addrcells != 1 && addrcells != 2) ||
-		    (sizecells != 1 && sizecells != 2))
-			goto size_error;
-	}
+	_fdt_address_and_size_cells(fdt, &addrcells, &sizecells);
 
 	/*
 	 * Add a memory node, but only if there isn't one already.  If
@@ -225,9 +240,6 @@ no_add_memory:
 		
 libfdt_error:
 	fatal("libfdt: ", fdt_strerror(e), ", while updating device tree\n");
-
-size_error:
-	fatal("Unexpected/invalid #address-cells/#size-cells in device tree\n");
 }
 
 static int is_space(char c)
-- 
1.7.10.4

_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux