fdt: refactor fdt resize code

Move the fdt resizing code out of ppc specific boot code and into
common fdt support code.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
diff --git a/common/fdt_support.c b/common/fdt_support.c
index 405b9db..c0ca9e0 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -531,3 +531,42 @@
 		       fdt_strerror(err));
 }
 #endif /* defined(CONFIG_MPC83XX) || defined(CONFIG_MPC85xx) */
+
+/* Resize the fdt to its actual size + a bit of padding */
+int fdt_resize(void *blob)
+{
+	int i;
+	uint64_t addr, size;
+	int total, ret;
+	uint actualsize;
+
+	if (!blob)
+		return 0;
+
+	total = fdt_num_mem_rsv(blob);
+	for (i = 0; i < total; i++) {
+		fdt_get_mem_rsv(blob, i, &addr, &size);
+		if (addr == (uint64_t)(u32)blob) {
+			fdt_del_mem_rsv(blob, i);
+			break;
+		}
+	}
+
+	/* Calculate the actual size of the fdt */
+	actualsize = fdt_off_dt_strings(blob) +
+		fdt_size_dt_strings(blob);
+
+	/* Make it so the fdt ends on a page boundary */
+	actualsize = ALIGN(actualsize, 0x1000);
+	actualsize = actualsize - ((uint)blob & 0xfff);
+
+	/* Change the fdt header to reflect the correct size */
+	fdt_set_totalsize(blob, actualsize);
+
+	/* Add the new reservation */
+	ret = fdt_add_mem_rsv(blob, (uint)blob, actualsize);
+	if (ret < 0)
+		return ret;
+
+	return actualsize;
+}
diff --git a/include/fdt_support.h b/include/fdt_support.h
index f14ab68..aa0fc58 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -69,6 +69,7 @@
 #endif
 
 void set_working_fdt_addr(void *addr);
+int fdt_resize(void *blob);
 
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index b86169a..300e00a 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -162,38 +162,14 @@
 
 	/* Fixup the fdt memreserve now that we know how big it is */
 	if (of_flat_tree) {
-		int j;
-		uint64_t addr, size;
-		int total = fdt_num_mem_rsv(of_flat_tree);
-		uint actualsize;
-
-		for (j = 0; j < total; j++) {
-			fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
-			if (addr == (uint64_t)(u32)of_flat_tree) {
-				fdt_del_mem_rsv(of_flat_tree, j);
-				break;
-			}
-		}
-
 		/* Delete the old LMB reservation */
 		lmb_free(lmb, (phys_addr_t)(u32)of_flat_tree,
 				(phys_size_t)fdt_totalsize(of_flat_tree));
 
-		/* Calculate the actual size of the fdt */
-		actualsize = fdt_off_dt_strings(of_flat_tree) +
-			fdt_size_dt_strings(of_flat_tree);
-
-		/* Make it so the fdt ends on a page boundary */
-		actualsize = ALIGN(actualsize, 0x1000);
-		actualsize = actualsize - ((uint)of_flat_tree & 0xfff);
-
-		/* Change the fdt header to reflect the correct size */
-		fdt_set_totalsize(of_flat_tree, actualsize);
-		of_size = actualsize;
-
-		/* Add the new reservation */
-		ret = fdt_add_mem_rsv(of_flat_tree, (uint)of_flat_tree,
-				of_size);
+		ret = fdt_resize(of_flat_tree);
+		if (ret < 0)
+			goto error;
+		of_size = ret;
 
 		/* Create a new LMB reservation */
 		lmb_reserve(lmb, (ulong)of_flat_tree, of_size);