Skip to contentSkip to conversation

fdt: Allow ft_board_setup() to report failure

PATCH New Simon Glass 3 participants 46 messages Oct 24, 2014 – Dec 10, 2014

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/11 fdt: Allow ft_board_setup() to report failure

This function can fail if the device tree runs out of space. Rather than silently booting with an incomplete device tree, allow the failure to be detected.

Unfortunately this involves changing a lot of places in the code. I have not changed behvaiour to return an error where one is not currently returned, to avoid unexpected breakage.

Eventually it would be nice to allow boards to register functions to be called to update the device tree. This would avoid all the many functions to do this. However it's not clear yet if this should be done using driver model or with a linker list. This work is left for later.

---

Changes in v2:
- Fix return codes in board/amcc/sequoia/sequoia.c
- Fix return codes in board/freescale/p1_p2_rdb/p1_p2_rdb.c
- Fix return codes in board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c

 arch/nios2/cpu/fdt.c                        |  8 ++++--
 arch/powerpc/cpu/ppc4xx/fdt.c               |  7 +++--
 board/a3m071/a3m071.c                       |  4 ++-
 board/a4m072/a4m072.c                       |  5 ++--
 board/amcc/canyonlands/canyonlands.c        |  6 +++--
 board/amcc/sequoia/sequoia.c                | 19 ++++++-------
 board/cm5200/cm5200.c                       |  4 ++-
 board/compulab/cm_fx6/cm_fx6.c              |  4 ++-
 board/compulab/cm_t54/cm_t54.c              |  4 ++-
 board/davedenx/aria/aria.c                  |  4 ++-
 board/esd/cpci405/cpci405.c                 |  4 ++-
 board/esd/mecp5123/mecp5123.c               |  4 ++-
 board/esd/pmc405de/pmc405de.c               |  4 ++-
 board/esd/pmc440/pmc440.c                   |  4 ++-
 board/esd/vme8349/vme8349.c                 |  4 ++-
 board/exmeritus/hww1u1a/hww1u1a.c           |  4 ++-
 board/freescale/b4860qds/b4860qds.c         |  4 ++-
 board/freescale/bsc9131rdb/bsc9131rdb.c     |  4 ++-
 board/freescale/bsc9132qds/bsc9132qds.c     |  4 ++-
 board/freescale/c29xpcie/c29xpcie.c         |  4 ++-
 board/freescale/common/cds_pci_ft.c         |  5 ++--
 board/freescale/corenet_ds/corenet_ds.c     |  4 ++-
 board/freescale/ls1021aqds/ls1021aqds.c     |  4 ++-
 board/freescale/ls1021atwr/ls1021atwr.c     |  4 ++-
 board/freescale/ls2085a/ls2085a.c           |  4 ++-
 board/freescale/mpc5121ads/mpc5121ads.c     |  4 ++-
 board/freescale/mpc7448hpc2/mpc7448hpc2.c   |  5 ++--
 board/freescale/mpc8308rdb/mpc8308rdb.c     |  4 ++-
 board/freescale/mpc8313erdb/mpc8313erdb.c   |  4 ++-
 board/freescale/mpc8315erdb/mpc8315erdb.c   |  4 ++-
 board/freescale/mpc8323erdb/mpc8323erdb.c   |  4 ++-
 board/freescale/mpc832xemds/mpc832xemds.c   |  4 ++-
 board/freescale/mpc8349emds/mpc8349emds.c   |  4 ++-
 board/freescale/mpc8349itx/mpc8349itx.c     |  4 ++-
 board/freescale/mpc8360emds/mpc8360emds.c   |  4 ++-
 board/freescale/mpc8360erdk/mpc8360erdk.c   |  4 ++-
 board/freescale/mpc837xemds/mpc837xemds.c   |  4 ++-
 board/freescale/mpc837xerdb/mpc837xerdb.c   |  4 ++-
 board/freescale/mpc8536ds/mpc8536ds.c       |  3 ++-
 board/freescale/mpc8540ads/mpc8540ads.c     |  5 ++--
 board/freescale/mpc8544ds/mpc8544ds.c       |  4 ++-
 board/freescale/mpc8560ads/mpc8560ads.c     |  5 ++--
 board/freescale/mpc8568mds/mpc8568mds.c     |  4 ++-
 board/freescale/mpc8569mds/mpc8569mds.c     |  4 ++-
 board/freescale/mpc8572ds/mpc8572ds.c       |  4 ++-
 board/freescale/mpc8610hpcd/mpc8610hpcd.c   |  5 ++--
 board/freescale/mpc8641hpcn/mpc8641hpcn.c   |  5 ++--
 board/freescale/p1010rdb/p1010rdb.c         |  4 ++-
 board/freescale/p1022ds/p1022ds.c           |  4 ++-
 board/freescale/p1023rdb/p1023rdb.c         |  4 ++-
 board/freescale/p1_p2_rdb/p1_p2_rdb.c       | 41 ++++++++++++++++-------------
 board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c | 36 ++++++++++++-------------
 board/freescale/p1_twr/p1_twr.c             |  4 ++-
 board/freescale/p2020come/p2020come.c       |  4 ++-
 board/freescale/p2020ds/p2020ds.c           |  4 ++-
 board/freescale/p2041rdb/p2041rdb.c         |  4 ++-
 board/freescale/qemu-ppce500/qemu-ppce500.c |  4 ++-
 board/freescale/t1040qds/t1040qds.c         |  4 ++-
 board/freescale/t104xrdb/t104xrdb.c         |  4 ++-
 board/freescale/t208xqds/t208xqds.c         |  4 ++-
 board/freescale/t208xrdb/t208xrdb.c         |  4 ++-
 board/freescale/t4qds/t4240emu.c            |  4 ++-
 board/freescale/t4qds/t4240qds.c            |  4 ++-
 board/freescale/t4rdb/t4240rdb.c            |  4 ++-
 board/galaxy5200/galaxy5200.c               |  4 ++-
 board/gateworks/gw_ventana/gw_ventana.c     | 10 ++++---
 board/gdsys/intip/intip.c                   |  4 ++-
 board/gdsys/p1022/controlcenterd.c          |  4 ++-
 board/highbank/highbank.c                   |  4 ++-
 board/icecube/icecube.c                     |  5 ++--
 board/ids/ids8247/ids8247.c                 |  4 ++-
 board/ids/ids8313/ids8313.c                 |  4 ++-
 board/ifm/ac14xx/ac14xx.c                   |  4 ++-
 board/ifm/o2dnt2/o2dnt2.c                   |  4 ++-
 board/intercontrol/digsy_mtc/digsy_mtc.c    |  4 ++-
 board/ipek01/ipek01.c                       |  4 ++-
 board/jupiter/jupiter.c                     |  5 ++--
 board/keymile/km82xx/km82xx.c               |  4 ++-
 board/keymile/km83xx/km83xx.c               |  4 ++-
 board/keymile/kmp204x/kmp204x.c             |  4 ++-
 board/korat/korat.c                         |  4 ++-
 board/kup/kup4k/kup4k.c                     |  4 ++-
 board/manroland/mucmc52/mucmc52.c           |  4 ++-
 board/manroland/uc101/uc101.c               |  4 ++-
 board/motionpro/motionpro.c                 |  4 ++-
 board/mpc8308_p1m/mpc8308_p1m.c             |  4 ++-
 board/muas3001/muas3001.c                   |  4 ++-
 board/munices/munices.c                     |  5 ++--
 board/pdm360ng/pdm360ng.c                   |  4 ++-
 board/phytec/pcm030/pcm030.c                |  4 ++-
 board/raspberrypi/rpi_b/rpi_b.c             |  4 ++-
 board/sbc8349/sbc8349.c                     |  4 ++-
 board/sbc8548/sbc8548.c                     |  4 ++-
 board/sbc8641d/sbc8641d.c                   |  4 ++-
 board/socrates/socrates.c                   |  5 ++--
 board/stx/stxssa/stxssa.c                   |  4 ++-
 board/ti/ks2_evm/board.c                    |  4 ++-
 board/tqc/tqm5200/tqm5200.c                 |  4 ++-
 board/tqc/tqm834x/tqm834x.c                 |  4 ++-
 board/tqc/tqm8xx/tqm8xx.c                   |  4 ++-
 board/tqc/tqma6/tqma6.c                     |  4 ++-
 board/ve8313/ve8313.c                       |  4 ++-
 board/xes/xpedite517x/xpedite517x.c         |  4 ++-
 board/xes/xpedite520x/xpedite520x.c         |  4 ++-
 board/xes/xpedite537x/xpedite537x.c         |  4 ++-
 board/xes/xpedite550x/xpedite550x.c         |  4 ++-
 include/fdt_support.h                       | 12 ++++++++-
 107 files changed, 378 insertions(+), 167 deletions(-)
arch/nios2/cpu/fdt.c +6 -2
index 4d88f16..5024682 100644
@@ -18,11 +18,13 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-void __ft_board_setup(void *blob, bd_t *bd)
+int __ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
-void ft_board_setup(void *blob, bd_t *bd) \
+int ft_board_setup(void *blob, bd_t *bd)
 	__attribute__((weak, alias("__ft_board_setup")));
 
 void ft_cpu_setup(void *blob, bd_t *bd)
@@ -32,5 +34,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 	 * Note: aliases in the dts are required for this
 	 */
 	fdt_fixup_ethernet(blob);
+
+	return 0;
 }
 #endif /* CONFIG_OF_LIBFDT && CONFIG_OF_BOARD_SETUP */
arch/powerpc/cpu/ppc4xx/fdt.c +5 -2
index bd905d1..eef9c5a 100644
@@ -18,7 +18,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-void __ft_board_setup(void *blob, bd_t *bd)
+int __ft_board_setup(void *blob, bd_t *bd)
 {
 	int rc;
 	int i;
@@ -60,8 +60,11 @@ void __ft_board_setup(void *blob, bd_t *bd)
 		printf("Unable to update property EBC mappings, err=%s\n",
 		       fdt_strerror(rc));
 	}
+
+	return 0;
 }
-void ft_board_setup(void *blob, bd_t *bd) __attribute__((weak, alias("__ft_board_setup")));
+int ft_board_setup(void *blob, bd_t *bd)
+		__attribute__((weak, alias("__ft_board_setup")));
 
 /*
  * Fixup all PCIe nodes by setting the device_type property
board/a3m071/a3m071.c +3 -1
index b96ba81..ee1681b 100644
@@ -392,9 +392,11 @@ int misc_init_r(void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t * bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/a4m072/a4m072.c +3 -2
index d3d4c18..c5d161b 100644
@@ -171,10 +171,11 @@ void pci_init_board(void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
 
board/amcc/canyonlands/canyonlands.c +4 -2
index 79d4bab..c5cc4ff 100644
@@ -490,9 +490,9 @@ int misc_init_r(void)
 #endif	/* !defined(CONFIG_ARCHES) */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-extern void __ft_board_setup(void *blob, bd_t *bd);
+extern int __ft_board_setup(void *blob, bd_t *bd);
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	__ft_board_setup(blob, bd);
 
@@ -515,5 +515,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 		fdt_find_and_setprop(blob, "/plb/sata at bffd1000", "status",
 				     "disabled", sizeof("disabled"), 1);
 	}
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/amcc/sequoia/sequoia.c +10 -9
index 53f9b34..91c6cbf 100644
@@ -10,6 +10,7 @@
  */
 
 #include <common.h>
+#include <errno.h>
 #include <libfdt.h>
 #include <fdt_support.h>
 #include <asm/ppc4xx.h>
@@ -363,7 +364,7 @@ void board_pci_fixup_irq(struct pci_controller *hose, pci_dev_t dev)
  * On NAND-booting sequoia, we need to patch the chips select numbers
  * in the dtb (CS0 - NAND, CS3 - NOR)
  */
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int rc;
 	int len;
@@ -381,15 +382,14 @@ void ft_board_setup(void *blob, bd_t *bd)
 	prop = fdt_get_property_w(blob, nodeoffset, "reg", &len);
 	if (prop == NULL) {
 		printf("Unable to update NOR chip select for NAND booting\n");
-		return;
+		return -FDT_ERR_NOTFOUND;
 	}
 	reg = (u32 *)&prop->data[0];
 	reg[0] = 3;
 	rc = fdt_find_and_setprop(blob, path, "reg", reg, 3 * sizeof(u32), 1);
 	if (rc) {
-		printf("Unable to update property NOR mappings, err=%s\n",
-		       fdt_strerror(rc));
-		return;
+		printf("Unable to update property NOR mappings\n");
+		return rc;
 	}
 
 	/* And now configure NAND chip select to 0 instead of 3 */
@@ -398,15 +398,16 @@ void ft_board_setup(void *blob, bd_t *bd)
 	prop = fdt_get_property_w(blob, nodeoffset, "reg", &len);
 	if (prop == NULL) {
 		printf("Unable to update NDFC chip select for NAND booting\n");
-		return;
+		return len;
 	}
 	reg = (u32 *)&prop->data[0];
 	reg[0] = 0;
 	rc = fdt_find_and_setprop(blob, path, "reg", reg, 3 * sizeof(u32), 1);
 	if (rc) {
-		printf("Unable to update property NDFC mappings, err=%s\n",
-		       fdt_strerror(rc));
-		return;
+		printf("Unable to update property NDFC mapping\n");
+		return rc;
 	}
+
+	return 0;
 }
 #endif /* CONFIG_SYS_RAMBOOT */
board/cm5200/cm5200.c +3 -1
index 048aa6c..5276907 100644
@@ -359,9 +359,11 @@ int last_stage_init(void)
 
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	ft_blob_update(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/compulab/cm_fx6/cm_fx6.c +3 -1
index f77ff48..bff372a 100644
@@ -452,7 +452,7 @@ int cm_fx6_setup_ecspi(void) { return 0; }
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	uint8_t enetaddr[6];
 
@@ -461,6 +461,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 		fdt_find_and_setprop(blob, "/fec", "local-mac-address",
 				     enetaddr, 6, 1);
 	}
+
+	return 0;
 }
 #endif
 
board/compulab/cm_t54/cm_t54.c +3 -1
index 944b723..910c7be 100644
@@ -126,7 +126,7 @@ int board_mmc_init(bd_t *bis)
 
 #ifdef CONFIG_USB_HOST_ETHER
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	uint8_t enetaddr[6];
 
@@ -135,6 +135,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 		fdt_find_and_setprop(blob, "/smsc95xx at 0", "mac-address",
 				     enetaddr, 6, 1);
 	}
+
+	return 0;
 }
 
 static void generate_mac_addr(uint8_t *enetaddr)
board/davedenx/aria/aria.c +3 -1
index c740669..a15a9ed 100644
@@ -107,8 +107,10 @@ int checkboard (void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/esd/cpci405/cpci405.c +3 -1
index 63cd862..e23ec55 100644
@@ -508,7 +508,7 @@ int pci_pre_init(struct pci_controller *hose)
 #endif /* defined(CONFIG_PCI) */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int rc;
 
@@ -526,6 +526,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 			       fdt_strerror(rc));
 		}
 	}
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/esd/mecp5123/mecp5123.c +3 -1
index 9700611..cda1d7b 100644
@@ -199,8 +199,10 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/esd/pmc405de/pmc405de.c +3 -1
index 4409ea6..3e17132 100644
@@ -300,7 +300,7 @@ int pci_pre_init(struct pci_controller *hose)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int rc;
 
@@ -318,6 +318,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 			       fdt_strerror(rc));
 		}
 	}
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/esd/pmc440/pmc440.c +3 -1
index 062ae67..15c3151 100644
@@ -882,7 +882,7 @@ int board_usb_cleanup(int index, enum usb_init_type init)
 #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_BOARD_INIT) */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int rc;
 
@@ -899,5 +899,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 			printf("err=%s\n", fdt_strerror(rc));
 		}
 	}
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/esd/vme8349/vme8349.c +3 -1
index 01365dc..f8f1834 100644
@@ -74,13 +74,15 @@ int board_eth_init(bd_t *bis)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
 
board/exmeritus/hww1u1a/hww1u1a.c +3 -1
index 643ece1..1e77e9b 100644
@@ -252,7 +252,7 @@ int board_eth_init(bd_t *bis)
 	return pci_eth_init(bis);
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -265,4 +265,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_memory(blob, (u64)base, (u64)size);
 
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
board/freescale/b4860qds/b4860qds.c +3 -1
index 34d66d5..bed8f56 100644
@@ -1110,7 +1110,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -1136,6 +1136,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
 
 /*
board/freescale/bsc9131rdb/bsc9131rdb.c +3 -1
index 7fe4ae7..3c8d6f1 100644
@@ -50,7 +50,7 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -63,5 +63,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_memory(blob, (u64)base, (u64)size);
 
 	fdt_fixup_dr_usb(blob, bd);
+
+	return 0;
 }
 #endif
board/freescale/bsc9132qds/bsc9132qds.c +3 -1
index 10580bc..6b99035 100644
@@ -354,7 +354,7 @@ void fdt_del_node_compat(void *blob, const char *compatible)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -411,5 +411,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 			printf("\nRemove sim from hwconfig and reset\n");
 		}
 	}
+
+	return 0;
 }
 #endif
board/freescale/c29xpcie/c29xpcie.c +3 -1
index 534c6d1..d757709 100644
@@ -128,7 +128,7 @@ void fdt_del_sec(void *blob, int offset)
 	}
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -150,5 +150,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 		fdt_del_sec(blob, 1);
 	else if (cpu->soc_ver == SVR_C292)
 		fdt_del_sec(blob, 2);
+
+	return 0;
 }
 #endif
board/freescale/common/cds_pci_ft.c +3 -2
index 2e5dcdf..571dfbb 100644
@@ -63,13 +63,14 @@ static void cds_pci_fixup(void *blob)
 	}
 }
 
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 	cds_pci_fixup(blob);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/corenet_ds/corenet_ds.c +3 -1
index 65b3867..6f0fea1 100644
@@ -190,7 +190,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -213,4 +213,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
board/freescale/ls1021aqds/ls1021aqds.c +3 -1
index 5fafc85..7441a6b 100644
@@ -240,9 +240,11 @@ int board_init(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 
 u8 flash_read8(void *addr)
board/freescale/ls1021atwr/ls1021atwr.c +3 -1
index 50d5640..ee78769 100644
@@ -290,9 +290,11 @@ int misc_init_r(void)
 }
 #endif
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 
 u8 flash_read8(void *addr)
board/freescale/ls2085a/ls2085a.c +3 -1
index 2c79a71..163a4c4 100644
@@ -100,7 +100,7 @@ void fdt_fixup_board_enet(void *fdt)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -115,5 +115,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_MC_ENET
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc5121ads/mpc5121ads.c +3 -1
index 940978e..40bd55d 100644
@@ -275,8 +275,10 @@ int checkboard (void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/freescale/mpc7448hpc2/mpc7448hpc2.c +3 -2
index 71b760c..11747ca 100644
@@ -70,11 +70,12 @@ phys_size_t initdram (int board_type)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
+
+	return 0;
 }
 #endif
 
board/freescale/mpc8308rdb/mpc8308rdb.c +3 -1
index fba41fe..93e1c50 100644
@@ -161,11 +161,13 @@ int misc_init_r(void)
 	return 0;
 }
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	fdt_fixup_dr_usb(blob, bd);
 	fdt_fixup_esdhc(blob, bd);
+
+	return 0;
 }
 #endif
 
board/freescale/mpc8313erdb/mpc8313erdb.c +3 -1
index 69e98a5..eac193e 100644
@@ -116,12 +116,14 @@ int misc_init_r(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
 #else /* CONFIG_SPL_BUILD */
board/freescale/mpc8315erdb/mpc8315erdb.c +3 -1
index e6f091f..ed611c5 100644
@@ -188,7 +188,7 @@ void fdt_tsec1_fixup(void *fdt, bd_t *bd)
 	do_fixup_by_path(fdt, path, "status", disabled, sizeof(disabled), 1);
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
@@ -196,6 +196,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 	fdt_fixup_dr_usb(blob, bd);
 	fdt_tsec1_fixup(blob, bd);
+
+	return 0;
 }
 #endif
 
board/freescale/mpc8323erdb/mpc8323erdb.c +3 -1
index 3dce362..0a0152a 100644
@@ -172,12 +172,14 @@ void pci_init_board(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
 
board/freescale/mpc832xemds/mpc832xemds.c +3 -1
index b7ea0e4..adf4254 100644
@@ -154,11 +154,13 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc8349emds/mpc8349emds.c +3 -1
index d909220..02b5040 100644
@@ -273,11 +273,13 @@ void spi_cs_deactivate(struct spi_slave *slave)
 #endif /* CONFIG_HARD_SPI */
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc8349itx/mpc8349itx.c +3 -1
index 803d722..22a1d99 100644
@@ -378,11 +378,13 @@ int misc_init_r(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc8360emds/mpc8360emds.c +3 -1
index 5ff9dff..f0a55f8 100644
@@ -402,7 +402,7 @@ static void ft_board_fixup_qe_usb(void *blob, bd_t *bd)
 			   "peripheral", sizeof("peripheral"), 1);
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
@@ -447,5 +447,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 		}
 	}
+
+	return 0;
 }
 #endif
board/freescale/mpc8360erdk/mpc8360erdk.c +3 -1
index fef230b..478f820 100644
@@ -340,9 +340,11 @@ void pci_init_board(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	ft_pci_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/freescale/mpc837xemds/mpc837xemds.c +3 -1
index c749e55..572913c 100644
@@ -328,7 +328,7 @@ static void ft_pci_fixup(void *blob, bd_t *bd)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	ft_tsec_fixup(blob, bd);
@@ -340,5 +340,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 		ft_pci_fixup(blob, bd);
 	ft_pcie_fixup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif /* CONFIG_OF_BOARD_SETUP */
board/freescale/mpc837xerdb/mpc837xerdb.c +3 -1
index 9afdcaf..e0a1031 100644
@@ -199,7 +199,7 @@ int misc_init_r(void)
 
 #if defined(CONFIG_OF_BOARD_SETUP)
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
@@ -207,5 +207,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	ft_cpu_setup(blob, bd);
 	fdt_fixup_dr_usb(blob, bd);
 	fdt_fixup_esdhc(blob, bd);
+
+	return 0;
 }
 #endif /* CONFIG_OF_BOARD_SETUP */
board/freescale/mpc8536ds/mpc8536ds.c +2 -1
index 93eed59..7b0f461 100644
@@ -271,7 +271,7 @@ int board_eth_init(bd_t *bis)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
@@ -285,5 +285,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_dr_usb(blob, bd);
 #endif
 
+	return 0;
 }
 #endif
board/freescale/mpc8540ads/mpc8540ads.c +3 -2
index 93288c7..1069e2c 100644
@@ -218,8 +218,7 @@ pci_init_board(void)
 
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int node, tmp[2];
 	const char *path;
@@ -237,5 +236,7 @@ ft_board_setup(void *blob, bd_t *bd)
 		}
 #endif
 	}
+
+	return 0;
 }
 #endif
board/freescale/mpc8544ds/mpc8544ds.c +3 -1
index 1b33db6..66fb228 100644
@@ -305,7 +305,7 @@ int board_eth_init(bd_t *bis)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
@@ -314,5 +314,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_SGMII_RISER
 	fsl_sgmii_riser_fdt_fixup(blob);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc8560ads/mpc8560ads.c +3 -2
index 7104e33..f99d639 100644
@@ -438,8 +438,7 @@ pci_init_board(void)
 
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int node, tmp[2];
 	const char *path;
@@ -457,5 +456,7 @@ ft_board_setup(void *blob, bd_t *bd)
 		}
 #endif
 	}
+
+	return 0;
 }
 #endif
board/freescale/mpc8568mds/mpc8568mds.c +3 -1
index a8fdcb5..a5c5d9d 100644
@@ -345,10 +345,12 @@ void pci_init_board(void)
 #endif /* CONFIG_PCI */
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
 #endif
board/freescale/mpc8569mds/mpc8569mds.c +3 -1
index cb55e1c..836578f 100644
@@ -514,7 +514,7 @@ void pci_init_board(void)
 #endif /* CONFIG_PCI */
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #if defined(CONFIG_SYS_UCC_RMII_MODE)
 	int nodeoff, off, err;
@@ -579,5 +579,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_board_fixup_esdhc(blob, bd);
 	fdt_board_fixup_qe_uart(blob, bd);
 	fdt_board_fixup_qe_usb(blob, bd);
+
+	return 0;
 }
 #endif
board/freescale/mpc8572ds/mpc8572ds.c +3 -1
index 1bbf832..3f68cf4 100644
@@ -232,7 +232,7 @@ int board_eth_init(bd_t *bis)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -249,5 +249,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_SGMII_RISER
 	fsl_sgmii_riser_fdt_fixup(blob);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/mpc8610hpcd/mpc8610hpcd.c +3 -2
index d8740dd..95e398c 100644
@@ -258,12 +258,13 @@ void pci_init_board(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
 #endif
 
board/freescale/mpc8641hpcn/mpc8641hpcn.c +3 -2
index a58b5f9..1ab72f9 100644
@@ -119,8 +119,7 @@ void pci_init_board(void)
 
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int off;
 	u64 *tmp;
@@ -152,6 +151,8 @@ ft_board_setup(void *blob, bd_t *bd)
 			       "in u-boot.  This means your .dts might "
 			       "be old.\n");
 	}
+
+	return 0;
 }
 #endif
 
board/freescale/p1010rdb/p1010rdb.c +3 -1
index 491b576..1cf0ab7 100644
@@ -444,7 +444,7 @@ void fdt_disable_uart1(void *blob)
 	}
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -496,6 +496,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 		fdt_del_flexcan(blob);
 		fdt_disable_uart1(blob);
 	}
+
+	return 0;
 }
 #endif
 
board/freescale/p1022ds/p1022ds.c +3 -1
index f5e1851..d7dd478 100644
@@ -332,7 +332,7 @@ static void ft_codec_setup(void *blob, const char *compatible)
 	}
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -356,5 +356,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 
 	/* Update the WM8776 node's clock frequency property */
 	ft_codec_setup(blob, "wlf,wm8776");
+
+	return 0;
 }
 #endif
board/freescale/p1023rdb/p1023rdb.c +3 -1
index d4d277b..56f561a 100644
@@ -130,7 +130,7 @@ int board_eth_init(bd_t *bis)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -147,5 +147,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 
 	fdt_fixup_fman_ethernet(blob);
+
+	return 0;
 }
 #endif
board/freescale/p1_p2_rdb/p1_p2_rdb.c +22 -19

74 lines not on this page · raw message

board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +18 -18
index a6756c6..66bc041 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <hwconfig.h>
 #include <pci.h>
 #include <i2c.h>
@@ -424,7 +425,7 @@ static void fdt_board_fixup_qe_pins(void *blob)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -459,17 +460,17 @@ void ft_board_setup(void *blob, bd_t *bd)
 		int off = fdt_node_offset_by_compatible(blob, -1,
 				soc_elbc_compat);
 		if (off < 0) {
-			printf("WARNING: could not find compatible node %s: %s.\n",
-			       soc_elbc_compat,
-			       fdt_strerror(off));
-				return;
+			printf("WARNING: could not find compatible node %s\n",
+			       soc_elbc_compat);
+			return off;
 		}
 		err = fdt_del_node(blob, off);
 		if (err < 0) {
-			printf("WARNING: could not remove %s: %s.\n",
-			       soc_elbc_compat, fdt_strerror(err));
+			printf("WARNING: could not remove %s\n",
+			       soc_elbc_compat);
+			return err;
 		}
-		return;
+		return 0;
 	}
 #endif
 
@@ -477,24 +478,23 @@ void ft_board_setup(void *blob, bd_t *bd)
 	usb1_off = fdt_node_offset_by_compatible(blob, -1,
 		soc_usb_compat);
 	if (usb1_off < 0) {
-		printf("WARNING: could not find compatible node %s: %s.\n",
-		       soc_usb_compat,
-		       fdt_strerror(usb1_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb1_off;
 	}
 	usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
 			soc_usb_compat);
 	if (usb2_off < 0) {
-		printf("WARNING: could not find compatible node %s: %s.\n",
-		       soc_usb_compat,
-		       fdt_strerror(usb2_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb2_off;
 	}
 	err = fdt_del_node(blob, usb2_off);
 	if (err < 0) {
-		printf("WARNING: could not remove %s: %s.\n",
-		       soc_usb_compat, fdt_strerror(err));
+		printf("WARNING: could not remove %s\n", soc_usb_compat);
+		return err;
 	}
 
+	return 0;
 }
 #endif
board/freescale/p1_twr/p1_twr.c +3 -1
index a0a416b..a40bea3 100644
@@ -261,7 +261,7 @@ static void fdt_board_fixup_qe_pins(void *blob)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -283,5 +283,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_board_fixup_qe_pins(blob);
 #endif
 	fdt_fixup_dr_usb(blob, bd);
+
+	return 0;
 }
 #endif
board/freescale/p2020come/p2020come.c +3 -1
index f777bb9..1db37e3 100644
@@ -250,7 +250,7 @@ int board_eth_init(bd_t *bis)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -269,5 +269,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_HAS_FSL_DR_USB
 	fdt_fixup_dr_usb(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/p2020ds/p2020ds.c +3 -1
index b72fcff..5d18e8d 100644
@@ -236,7 +236,7 @@ int board_eth_init(bd_t *bis)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -257,5 +257,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_SGMII_RISER
 	fsl_sgmii_riser_fdt_fixup(blob);
 #endif
+
+	return 0;
 }
 #endif
board/freescale/p2041rdb/p2041rdb.c +3 -1
index a14b43b..e600bdb 100644
@@ -215,7 +215,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -239,4 +239,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_SYS_DPAA_FMAN
 	fdt_fixup_fman_ethernet(blob);
 #endif
+
+	return 0;
 }
board/freescale/qemu-ppce500/qemu-ppce500.c +3 -1
index 230870d..a0fca0d 100644
@@ -235,9 +235,11 @@ int board_eth_init(bd_t *bis)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
 #endif
 
board/freescale/t1040qds/t1040qds.c +3 -1
index 19af46e..13285be 100644
@@ -233,7 +233,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -259,6 +259,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
 
 void qixis_dump_switch(void)
board/freescale/t104xrdb/t104xrdb.c +3 -1
index ddb669f..4734f9d 100644
@@ -85,7 +85,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -110,6 +110,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_SYS_DPAA_FMAN
 	fdt_fixup_fman_ethernet(blob);
 #endif
+
+	return 0;
 }
 
 #ifdef CONFIG_DEEP_SLEEP
board/freescale/t208xqds/t208xqds.c +3 -1
index fc6d256..5c470c3 100644
@@ -437,7 +437,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -460,4 +460,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
board/freescale/t208xrdb/t208xrdb.c +3 -1
index be99fb8..341453b 100644
@@ -103,7 +103,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -126,4 +126,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
board/freescale/t4qds/t4240emu.c +3 -1
index 479e124..5441094 100644
@@ -69,7 +69,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -83,4 +83,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 
 	fdt_fixup_liodn(blob);
 	fdt_fixup_dr_usb(blob, bd);
+
+	return 0;
 }
board/freescale/t4qds/t4240qds.c +3 -1
index 6205fea..4f2cccd 100644
@@ -683,7 +683,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -706,6 +706,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
 
 /*
board/freescale/t4rdb/t4240rdb.c +3 -1
index afef7e9..d688f09 100644
@@ -76,7 +76,7 @@ int misc_init_r(void)
 	return 0;
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -99,6 +99,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_board_enet(blob);
 #endif
+
+	return 0;
 }
 
 /*
board/galaxy5200/galaxy5200.c +3 -1
index 29e40eb..5d957b7 100644
@@ -146,9 +146,11 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t * bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/gateworks/gw_ventana/gw_ventana.c +6 -4
index 1038d9d..29499bf 100644
@@ -1482,7 +1482,7 @@ int misc_init_r(void)
  *  - board (full model from EEPROM)
  *  - peripherals removed from DTB if not loaded on board (per EEPROM config)
  */
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	struct ventana_board_info *info = &ventana_info;
 	struct ventana_eeprom_config *cfg;
@@ -1494,7 +1494,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 
 	if (getenv("fdt_noauto")) {
 		puts("   Skiping ft_board_setup (fdt_noauto defined)\n");
-		return;
+		return 0;
 	}
 
 	/* Update partition nodes using info from mtdparts env var */
@@ -1503,7 +1503,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 
 	if (!model) {
 		puts("invalid board info: Leaving FDT fully enabled\n");
-		return;
+		return 0;
 	}
 	printf("   Adjusting FDT per EEPROM for %s...\n", model);
 
@@ -1522,7 +1522,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	 */
 	if (getenv("fdt_noconfig")) {
 		puts("   Skiping periperhal config (fdt_noconfig defined)\n");
-		return;
+		return 0;
 	}
 	cfg = econfig;
 	while (cfg->name) {
@@ -1532,6 +1532,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 		}
 		cfg++;
 	}
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/gdsys/intip/intip.c +3 -1
index ee6f9e0..8d01d8b 100644
@@ -206,7 +206,7 @@ int misc_init_r(void)
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 extern void __ft_board_setup(void *blob, bd_t *bd);
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	__ft_board_setup(blob, bd);
 
@@ -215,5 +215,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 
 	fdt_find_and_setprop(blob, "/plb/sata at bffd1000", "status",
 			     "disabled", sizeof("disabled"), 1);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/gdsys/p1022/controlcenterd.c +3 -1
index f76d968..64d90dd 100644
@@ -326,7 +326,7 @@ int board_eth_init(bd_t *bis)
 }
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -343,6 +343,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
 #endif
 
board/highbank/highbank.c +3 -1
index a1b6749..fc2385c 100644
@@ -94,7 +94,7 @@ void dram_init_banksize(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *fdt, bd_t *bd)
+int ft_board_setup(void *fdt, bd_t *bd)
 {
 	static const char disabled[] = "disabled";
 	u32 reg = readl(HB_SREG_A9_PWRDOM_STAT);
@@ -106,6 +106,8 @@ void ft_board_setup(void *fdt, bd_t *bd)
 	if (!(reg & PWRDOM_STAT_EMMC))
 		do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status",
 			disabled, sizeof(disabled), 1);
+
+	return 0;
 }
 #endif
 
board/icecube/icecube.c +3 -2
index a99416b..f0af24a 100644
@@ -311,10 +311,11 @@ void ide_set_reset (int idereset)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
 
board/ids/ids8247/ids8247.c +3 -1
index 1b2d0e0..3514720 100644
@@ -383,8 +383,10 @@ int board_nand_init(struct nand_chip *nand)
 #endif	/* CONFIG_CMD_NAND */
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup( blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
board/ids/ids8313/ids8313.c +3 -1
index f742143..e7838dc 100644
@@ -138,9 +138,11 @@ phys_size_t initdram(int board_type)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
 
board/ifm/ac14xx/ac14xx.c +3 -1
index 0fbdfdb..5d2ab2f 100644
@@ -608,8 +608,10 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/ifm/o2dnt2/o2dnt2.c +3 -1
index 6716ffc..ca09767 100644
@@ -364,7 +364,7 @@ int update_flash_size(int flash_size)
 }
 #endif /* defined(CONFIG_SYS_UPDATE_FLASH_SIZE) */
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int phy_addr = CONFIG_PHY_ADDR;
 	char eth_path[] = "/soc5200 at f0000000/mdio at 3000/ethernet-phy at 0";
@@ -380,5 +380,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 	/* fix up the phy address */
 	do_fixup_by_path(blob, eth_path, "reg", &phy_addr, sizeof(int), 0);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/intercontrol/digsy_mtc/digsy_mtc.c +3 -1
index 5843725..4ab7160 100644
@@ -454,7 +454,7 @@ int update_flash_size (int flash_size)
 }
 #endif /* defined(CONFIG_SYS_UPDATE_FLASH_SIZE) */
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int phy_addr = CONFIG_PHY_ADDR;
 	char eth_path[] = "/soc5200 at f0000000/mdio at 3000/ethernet-phy at 0";
@@ -478,5 +478,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 #endif
 	/* fix up the phy address */
 	do_fixup_by_path(blob, eth_path, "reg", &phy_addr, sizeof(int), 0);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/ipek01/ipek01.c +3 -1
index d44c4bf..2078f53 100644
@@ -196,10 +196,12 @@ void pci_init_board (void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup (void *blob, bd_t * bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup (blob, bd);
 	fdt_fixup_memory (blob, (u64) bd->bi_memstart, (u64) bd->bi_memsize);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/jupiter/jupiter.c +3 -2
index 78e4b5d..8856393 100644
@@ -283,9 +283,10 @@ void ide_set_reset (int idereset)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/keymile/km82xx/km82xx.c +3 -1
index dfbfab8..e200935 100644
@@ -460,8 +460,10 @@ static void setports(int gpio)
 }
 #endif
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
board/keymile/km83xx/km83xx.c +3 -1
index 0543483..1da0dcb 100644
@@ -359,9 +359,11 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
 
board/keymile/kmp204x/kmp204x.c +3 -1
index 4a73613..a74f75b 100644
@@ -261,7 +261,7 @@ void fdt_fixup_fman_mac_addresses(void *blob)
 }
 #endif
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -286,6 +286,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	fdt_fixup_fman_ethernet(blob);
 	fdt_fixup_fman_mac_addresses(blob);
 #endif
+
+	return 0;
 }
 
 #if defined(CONFIG_POST)
board/korat/korat.c +3 -1
index 8b83000..d9ab2fd 100644
@@ -610,7 +610,7 @@ void pci_target_init(struct pci_controller *hose)
 #endif /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT) */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	u32 val[4];
 	int rc;
@@ -627,5 +627,7 @@ void ft_board_setup(void *blob, bd_t *bd)
 	if (rc)
 		printf("Unable to update property NOR mapping, err=%s\n",
 		       fdt_strerror(rc));
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/kup/kup4k/kup4k.c +3 -1
index a4c1998..71c6a79 100644
@@ -280,8 +280,10 @@ static unsigned char swapbyte(unsigned char c)
  * Device Tree Support
  */
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
board/manroland/mucmc52/mucmc52.c +3 -1
index c3ce66d..c8ed5b7 100644
@@ -385,8 +385,10 @@ void pci_init_board (void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/manroland/uc101/uc101.c +3 -1
index 5c5afa2..e794c46 100644
@@ -358,8 +358,10 @@ void hw_watchdog_reset(void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
board/motionpro/motionpro.c +3 -1
index a6235e5..4d0ebaa 100644
@@ -185,9 +185,11 @@ int checkboard(void)
 
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/mpc8308_p1m/mpc8308_p1m.c +3 -1
index 2009e62..688cc12 100644
@@ -62,10 +62,12 @@ void pci_init_board(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	fdt_fixup_dr_usb(blob, bd);
+
+	return 0;
 }
 #endif
 
board/muas3001/muas3001.c +3 -1
index 08eb5e8..529a58c 100644
@@ -329,9 +329,11 @@ void ft_blob_update (void *blob, bd_t *bd)
 	}
 }
 
-void ft_board_setup (void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup (blob, bd);
 	ft_blob_update (blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
board/munices/munices.c +3 -2
index 319fa8c..23d0f56 100644
@@ -146,9 +146,10 @@ void pci_init_board(void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/pdm360ng/pdm360ng.c +3 -1
index 15f8f31..81f3024 100644
@@ -477,7 +477,7 @@ static unsigned char edid_buf[128] = {
 };
 #endif
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	u32 val[8];
 	int rc, i = 0;
@@ -526,6 +526,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 	if (rc)
 		printf("Unable to update flash reg property, err=%s\n",
 		       fdt_strerror(rc));
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/phytec/pcm030/pcm030.c +3 -1
index ce515d8..ed41de1 100644
@@ -164,9 +164,11 @@ void pci_init_board(void)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t * bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/raspberrypi/rpi_b/rpi_b.c +3 -1
index 447c940..edc10eb 100644
@@ -125,7 +125,7 @@ int board_mmc_init(bd_t *bis)
 				  msg_clk->get_clock_rate.body.resp.rate_hz);
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	/*
 	 * For now, we simply always add the simplefb DT node. Later, we
@@ -133,4 +133,6 @@ void ft_board_setup(void *blob, bd_t *bd)
 	 * node exists for the "real" graphics driver.
 	 */
 	lcd_dt_simplefb_add_node(blob);
+
+	return 0;
 }
board/sbc8349/sbc8349.c +3 -1
index 89da47e..72786d2 100644
@@ -214,11 +214,13 @@ void sdram_init(void)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/sbc8548/sbc8548.c +3 -1
index d584276..25329e4 100644
@@ -301,12 +301,14 @@ int last_stage_init(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 #ifdef CONFIG_FSL_PCI_INIT
 	FT_FSL_PCI_SETUP;
 #endif
+
+	return 0;
 }
 #endif
board/sbc8641d/sbc8641d.c +3 -1
index 4906be4..6bdf1a2 100644
@@ -173,11 +173,13 @@ void pci_init_board(void)
 
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup (void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 	FT_FSL_PCI_SETUP;
+
+	return 0;
 }
 #endif
 
board/socrates/socrates.c +3 -2
index 2caefbb..953a43f 100644
@@ -218,8 +218,7 @@ int board_early_init_r (void)
 #endif /* CONFIG_BOARD_EARLY_INIT_R */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void
-ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	u32 val[12];
 	int rc, i = 0;
@@ -251,6 +250,8 @@ ft_board_setup(void *blob, bd_t *bd)
 	if (rc)
 		printf("Unable to update localbus ranges, err=%s\n",
 		       fdt_strerror(rc));
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/stx/stxssa/stxssa.c +3 -1
index f5c3d75..6e4eed8 100644
@@ -233,9 +233,11 @@ reset_phy(void)
 }
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup (blob, bd);
+
+	return 0;
 }
 #endif /* CONFIG_OF_BOARD_SETUP */
 
board/ti/ks2_evm/board.c +3 -1
index dfe7be6..0c53a39 100644
@@ -84,7 +84,7 @@ int board_eth_init(bd_t *bis)
 #endif
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	int lpae;
 	char *env;
@@ -190,6 +190,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 			}
 		}
 	}
+
+	return 0;
 }
 
 void ft_board_setup_ex(void *blob, bd_t *bd)
board/tqc/tqm5200/tqm5200.c +3 -1
index a1f56cd..e9363ea 100644
@@ -863,12 +863,14 @@ int board_get_height (void)
 #endif /* CONFIG_VIDEO_SM501 */
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #if defined(CONFIG_VIDEO)
 	fdt_add_edid(blob, "smi,sm501", edid_buf);
 #endif
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */
 
board/tqc/tqm834x/tqm834x.c +3 -1
index 814fcb2..d891a38 100644
@@ -414,12 +414,14 @@ static void set_ddr_config(void) {
 }
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif	/* CONFIG_PCI */
+
+	return 0;
 }
 #endif	/* CONFIG_OF_BOARD_SETUP */
board/tqc/tqm8xx/tqm8xx.c +3 -1
index 9ce2a57..3b5230a 100644
@@ -674,10 +674,12 @@ void ft_blob_update (void *blob, bd_t *bd)
 	}
 }
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 	ft_blob_update(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
 
board/tqc/tqma6/tqma6.c +3 -1
index b552bb8..fa35e8b 100644
@@ -251,12 +251,14 @@ int checkboard(void)
  * Device Tree Support
  */
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	/* bring in eMMC dsr settings */
 	do_fixup_by_path_u32(blob,
 			     "/soc/aips-bus at 02100000/usdhc at 02198000",
 			     "dsr", tqma6_emmc_dsr, 2);
 	tqma6_bb_ft_board_setup(blob, bd);
+
+	return 0;
 }
 #endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */
board/ve8313/ve8313.c +3 -1
index c4feef8..7f24a30 100644
@@ -192,11 +192,13 @@ void pci_init_board(void)
 #endif
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
 	ft_pci_setup(blob, bd);
 #endif
+
+	return 0;
 }
 #endif
board/xes/xpedite517x/xpedite517x.c +3 -1
index b7ad349..0028870 100644
@@ -69,11 +69,13 @@ phys_size_t initdram(int board_type)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #ifdef CONFIG_PCI
 	ft_board_pci_setup(blob, bd);
 #endif
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/xes/xpedite520x/xpedite520x.c +3 -1
index aa9e99d..6a3df52 100644
@@ -70,11 +70,13 @@ int board_early_init_r(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #ifdef CONFIG_PCI
 	ft_board_pci_setup(blob, bd);
 #endif
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/xes/xpedite537x/xpedite537x.c +3 -1
index efd563b..41419fe 100644
@@ -72,11 +72,13 @@ int board_early_init_r(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #ifdef CONFIG_PCI
 	ft_board_pci_setup(blob, bd);
 #endif
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
board/xes/xpedite550x/xpedite550x.c +3 -1
index e64d682..1f05150 100644
@@ -72,11 +72,13 @@ int board_early_init_r(void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 #ifdef CONFIG_PCI
 	ft_board_pci_setup(blob, bd);
 #endif
 	ft_cpu_setup(blob, bd);
+
+	return 0;
 }
 #endif
include/fdt_support.h +11 -1
index c3d1fbc..41ce535 100644
@@ -64,7 +64,17 @@ static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {}
 int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
 #endif
 
-void ft_board_setup(void *blob, bd_t *bd);
+/**
+ * Add board-specific data to the FDT before booting the OS.
+ *
+ * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
+ *
+ * @param blob		FDT blob to update
+ * @param bd_t		Pointer to board data
+ * @return 0 if ok, or -FDT_ERR_... on error
+ */
+int ft_board_setup(void *blob, bd_t *bd);
+
 /*
  * The keystone2 SOC requires all 32 bit aliased addresses to be converted
  * to their 36 physical format. This has to happen after all fdt nodes
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#1 lore raw

PATCH v2 2/11 fdt: Report failure of ft_board_setup()

Since this function can fail, print a message when it does.

---

Changes in v2:
- Improve error message on failure

 common/cmd_fdt.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
common/cmd_fdt.c +9 -2
index 5640ded..6f7ea08 100644
@@ -566,8 +566,15 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	}
 #ifdef CONFIG_OF_BOARD_SETUP
 	/* Call the board-specific fixup routine */
-	else if (strncmp(argv[1], "boa", 3) == 0)
-		ft_board_setup(working_fdt, gd->bd);
+	else if (strncmp(argv[1], "boa", 3) == 0) {
+		int err = ft_board_setup(working_fdt, gd->bd);
+
+		if (err) {
+			printf("Failed to update board information in FDT: %s\n",
+			       fdt_strerror(err));
+			return CMD_RET_FAILURE;
+		}
+	}
 #endif
 	/* Create a chosen node */
 	else if (strncmp(argv[1], "cho", 3) == 0) {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#3 lore raw

PATCH v2 2/11 fdt: Report failure of ft_board_setup()

In reply to Simon Glass
Quoted 3 lines · Simon Glass

Since this function can fail, print a message when it does.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/3a49d628/attachment-0001.pgp>
#5 lore raw

PATCH v2 3/11 fdt: Export the fdt_find_or_add_subnode() function

In reply to Simon Glass

This function is useful for ensuring that a node exists. Export it so it can be used more widely.

---

Changes in v2:
- Leave function documentation hidden in the C file

 common/fdt_support.c  | 6 +++---
 include/fdt_support.h | 2 ++
 2 files changed, 5 insertions(+), 3 deletions(-)
common/fdt_support.c +3 -3
index 3f64156..46a15e7 100644
@@ -113,7 +113,8 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
 }
 
 /**
- * fdt_find_or_add_subnode - find or possibly add a subnode of a given node
+ * fdt_find_or_add_subnode() - find or possibly add a subnode of a given node
+ *
  * @fdt: pointer to the device tree blob
  * @parentoffset: structure block offset of a node
  * @name: name of the subnode to locate
@@ -121,8 +122,7 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
  * fdt_subnode_offset() finds a subnode of the node with a given name.
  * If the subnode does not exist, it will be created.
  */
-static int fdt_find_or_add_subnode(void *fdt, int parentoffset,
-				   const char *name)
+int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name)
 {
 	int offset;
 
include/fdt_support.h +2 -0
index 41ce535..e17e609 100644
@@ -64,6 +64,8 @@ static inline void fdt_fixup_crypto_node(void *blob, int sec_rev) {}
 int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
 #endif
 
+int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name);
+
 /**
  * Add board-specific data to the FDT before booting the OS.
  *
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#6 lore raw

PATCH v2 3/11 fdt: Export the fdt_find_or_add_subnode() function

Quoted 4 lines · On Thu, 23 Oct 2014 18:58:49 -0600 Simon Glass <[email protected]> wrote:

This function is useful for ensuring that a node exists. Export it so it can be used more widely.

Quoted 8 lines

---

Changes in v2:
- Leave function documentation hidden in the C file

 common/fdt_support.c  | 6 +++---
 include/fdt_support.h | 2 ++
 2 files changed, 5 insertions(+), 3 deletions(-)

Thanks,

Anatolij

#7 lore raw

PATCH v2 3/11 fdt: Export the fdt_find_or_add_subnode() function

In reply to Simon Glass
Quoted 4 lines · Simon Glass

This function is useful for ensuring that a node exists. Export it so it can be used more widely.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/ea33a7cd/attachment-0001.pgp>
#9 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

In reply to Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

---

Changes in v2: None

 common/fdt_support.c                       |   2 +-
 doc/device-tree-bindings/memory/memory.txt |  67 ++++++++++++++++++
 include/fdtdec.h                           |  33 +++++++++
 lib/fdtdec.c                               | 107 +++++++++++++++++++++++++++++
 4 files changed, 208 insertions(+), 1 deletion(-)
 create mode 100644 doc/device-tree-bindings/memory/memory.txt
common/fdt_support.c +1 -1
index 46a15e7..6da5297 100644
@@ -382,7 +382,7 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
 /*
  * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
  */
-static int fdt_pack_reg(const void *fdt, void *buf, uint64_t *address,
+int fdt_pack_reg(const void *fdt, void *buf, uint64_t *address,
 			uint64_t *size, int n)
 {
 	int i;
doc/device-tree-bindings/memory/memory.txt new file +67 -0

67 lines not on this page · raw message

include/fdtdec.h +33 -0
index 4ae77be..5fb86b0 100644
@@ -661,4 +661,37 @@ int fdt_get_named_resource(const void *fdt, int node, const char *property,
  */
 int fdtdec_pci_get_bdf(const void *fdt, int node, int *bdf);
 
+/**
+ * Decode the size of memory
+ *
+ * RAM size is normally set in a /memory node and consists of a list of
+ * (base, size) cells in the 'reg' property. This information is used to
+ * determine the total available memory as well as the address and size
+ * of each bank.
+ *
+ * Optionally the memory configuration can vary depending on a board id,
+ * typically read from strapping resistors or an EEPROM on the board.
+ *
+ * Finally, memory size can be detected (within certain limits) by probing
+ * the available memory. It is safe to do so within the limits provides by
+ * the board's device tree information. This makes it possible to produce
+ * boards with different memory sizes, where the device tree specifies the
+ * maximum memory configuration, and the smaller memory configuration is
+ * probed.
+ *
+ * This function decodes that information, returning the memory base address,
+ * size and bank information. See the memory.txt binding for full
+ * documentation.
+ *
+ * @param blob		Device tree blob
+ * @param area		Name of node to check (NULL means "/memory")
+ * @param board_id	Board ID to look up
+ * @param basep		Returns base address of first memory bank (NULL to
+ *			ignore)
+ * @param sizep		Returns total memory size (NULL to ignore)
+ * @param bd		Updated with the memory bank information (NULL to skip)
+ * @return 0 if OK, -ve on error
+ */
+int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
+			   phys_addr_t *basep, phys_size_t *sizep, bd_t *bd);
 #endif
lib/fdtdec.c +107 -0

121 lines not on this page · raw message

Signature · 1 line
2.1.0.rc2.206.gedb03e5
#10 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/ea4d1ae6/attachment.pgp>
#11 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

This feature is used on several Exynos Chromebooks.

Regards,
Simon

#12 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Quoted 24 lines · Simon Glass

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

Quoted 7 lines

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

This feature is used on several Exynos Chromebooks.

So that you can use the same DT on several disjoint boards? How does this work with the kernel, does U-Boot then pass along only the correct map? Patches to the kernel to also deal with this?

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141027/b8e1029d/attachment.pgp>
#13 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi Tom,

Quoted 31 lines · Tom Rini
Quoted 30 lines · Simon Glass

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

Quoted 5 lines
Quoted 1 line

This feature is used on several Exynos Chromebooks.

So that you can use the same DT on several disjoint boards? How does this work with the kernel, does U-Boot then pass along only the correct map? Patches to the kernel to also deal with this?

Typically a board may have variants with different amounts of memory, detected at run-time by GPIOs. We want the option of using the same DT for these, similar to what the Compulab people were talking about - otherwise we have something of an explosion of combinations.

Yes U-Boot (already) puts the correct memory map together for the kernel, so it all works from start to finish.

Regards,
Simon

#14 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi,

Quoted 40 lines · Simon Glass

Hi Tom,

Quoted 31 lines · Tom Rini
Quoted 30 lines · Simon Glass

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

Quoted 5 lines
Quoted 1 line

This feature is used on several Exynos Chromebooks.

So that you can use the same DT on several disjoint boards? How does this work with the kernel, does U-Boot then pass along only the correct map? Patches to the kernel to also deal with this?

Quoted 7 lines

Typically a board may have variants with different amounts of memory, detected at run-time by GPIOs. We want the option of using the same DT for these, similar to what the Compulab people were talking about - otherwise we have something of an explosion of combinations.

Yes U-Boot (already) puts the correct memory map together for the kernel, so it all works from start to finish.

Are there any more thoughts on this one? I'd like to pull this series into the u-boot-fdt tree.

Regards,
Simon

#15 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

In reply to Simon Glass
Quoted 40 lines · Simon Glass

Hi Tom,

Quoted 31 lines · Tom Rini
Quoted 30 lines · Simon Glass

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

Quoted 5 lines
Quoted 1 line

This feature is used on several Exynos Chromebooks.

So that you can use the same DT on several disjoint boards? How does this work with the kernel, does U-Boot then pass along only the correct map? Patches to the kernel to also deal with this?

Quoted 7 lines

Typically a board may have variants with different amounts of memory, detected at run-time by GPIOs. We want the option of using the same DT for these, similar to what the Compulab people were talking about - otherwise we have something of an explosion of combinations.

Yes U-Boot (already) puts the correct memory map together for the kernel, so it all works from start to finish.

I'm still not super happy here. If you have different boards then you provide different device trees and the binary that can deal with board A or B, based on what the DT says.

If you can't just use get_ram_size, can't you use one of the other existing hooks such as ft_board_setup (which runs after arch_fixup_fdt) to set the memory size? On PowerPC boards for example this is where the memory node is set anyhow, not arch_fixup_fdt (which is one of those ARM vs PowerPC/everyone-else things I dislike).

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141112/eb7c5bcd/attachment.pgp>
#16 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi Tom,

Quoted 46 lines · Tom Rini
Quoted 45 lines · Simon Glass

Hi Tom,

Quoted 31 lines · Tom Rini
Quoted 30 lines · Simon Glass

Hi Tom,

Quoted 12 lines · Tom Rini
Quoted 9 lines · Simon Glass

From: Michael Pratt <[email protected]>

Support a default memory bank, specified in reg, as well as board-specific memory banks in subtree board-id nodes.

This allows memory information to be provided in the device tree, rather than hard-coded in, which will make it simpler to handle similar devices with different memory banks, as the board-id values or masks can be used to match devices.

[snip]

Quoted 8 lines

doc/device-tree-bindings/memory/memory.txt line 3

Quoted 5 lines

+++ b/doc/device-tree-bindings/memory/memory.txt

doc/device-tree-bindings/memory/memory.txt new file +3 -0
@@ -0,0 +1,67 @@
+* Memory binding
+
+The memory binding for U-Boot is as in the ePAPR with the following additions:

I am wary of being different from ePAPR / Linux Kernel. What do we need this for / when do we use it?

This extends the existing binding. It allows the location and size of memory to be set by a board ID. Unfortunately on sopme hardware you get a hang if you try to access memory that doesn't exist, so this allows the range of available memory to be defined - or at least the maximum bound since we still probe the memory size within that range.

Quoted 5 lines
Quoted 1 line

This feature is used on several Exynos Chromebooks.

So that you can use the same DT on several disjoint boards? How does this work with the kernel, does U-Boot then pass along only the correct map? Patches to the kernel to also deal with this?

Typically a board may have variants with different amounts of memory, detected at run-time by GPIOs. We want the option of using the same DT for these, similar to what the Compulab people were talking about - otherwise we have something of an explosion of combinations.

Quoted 6 lines
Quoted 2 lines

Yes U-Boot (already) puts the correct memory map together for the kernel, so it all works from start to finish.

I'm still not super happy here. If you have different boards then you provide different device trees and the binary that can deal with board A or B, based on what the DT says.

(Note: I'm talking about the U-Boot device tree, and indeed for the kernel we will have two different device trees)

That assumes that you can put a different binary on two different boards. The same discussion came up with the Compulab series, where they have different features but what to use the same U-Boot binary in production for them, since it is such a pain to deal with different incompatible binaries for board variants. It gets worse when you have a module and want to support different base boards.

Quoted 6 lines

If you can't just use get_ram_size, can't you use one of the other existing hooks such as ft_board_setup (which runs after arch_fixup_fdt) to set the memory size? On PowerPC boards for example this is where the memory node is set anyhow, not arch_fixup_fdt (which is one of those ARM vs PowerPC/everyone-else things I dislike).

I think here you are talking about setting up the device tree for the kernel. Yes, U-Boot correctly sets up the memory for the kernel, by copying information from the SDRAM bank list into the kernel's device tree. The question is of course, how do we get the correct SDRAM bank list in the first place.

What I am talking about here is the memory for U-Boot - i.e. how does U-Boot know how much memory is available. The scheme here is that you can have a board ID which controls this, with the U-Boot device tree allowing the options to be specified (i.e. the mapping from board ID to SDRAM banks)

Regards,
Simon

#17 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

On Wed, Nov 12, 2014 at 03:14:35PM -0700, Simon Glass wrote:

[snip, and sorry for the late reply]

Quoted 5 lines

What I am talking about here is the memory for U-Boot - i.e. how does U-Boot know how much memory is available. The scheme here is that you can have a board ID which controls this, with the U-Boot device tree allowing the options to be specified (i.e. the mapping from board ID to SDRAM banks)

OK. So what I'm getting at is how is this different from other boards where we say "Oh, this is $FOO, it has $X LPDRR2 RAM" and "Oh, this is $BAR, it has $Y DDR3 RAM" ? The only thing I'm able to think of is that we cannot call get_ram_size() to see the _size_ of the RAM after doing $whatever to see what board we're on and doing the right configuration for the DDR controller or whatever.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141120/0d358d68/attachment.pgp>
#18 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi Tom,

Quoted 9 lines · Tom Rini

On Wed, Nov 12, 2014 at 03:14:35PM -0700, Simon Glass wrote:

[snip, and sorry for the late reply]

Quoted 5 lines

What I am talking about here is the memory for U-Boot - i.e. how does U-Boot know how much memory is available. The scheme here is that you can have a board ID which controls this, with the U-Boot device tree allowing the options to be specified (i.e. the mapping from board ID to SDRAM banks)

Quoted 6 lines

OK. So what I'm getting at is how is this different from other boards where we say "Oh, this is $FOO, it has $X LPDRR2 RAM" and "Oh, this is $BAR, it has $Y DDR3 RAM" ? The only thing I'm able to think of is that we cannot call get_ram_size() to see the _size_ of the RAM after doing $whatever to see what board we're on and doing the right configuration for the DDR controller or whatever.

Yes the memory type can go in the FDT too (and does for snow and pit).

That's right, we can call get_ram_size() but only within the known boundaries. If we try to probe a 2GB machine as if it has 4GB of RAM it will hang. So we have to *know*.

Regards,
Simon

#19 lore raw

PATCH v2 4/11 fdt: Add device tree memory bindings

Hi Tom,

Quoted 19 lines · Simon Glass

Hi Tom,

Quoted 9 lines · Tom Rini

On Wed, Nov 12, 2014 at 03:14:35PM -0700, Simon Glass wrote:

[snip, and sorry for the late reply]

Quoted 5 lines

What I am talking about here is the memory for U-Boot - i.e. how does U-Boot know how much memory is available. The scheme here is that you can have a board ID which controls this, with the U-Boot device tree allowing the options to be specified (i.e. the mapping from board ID to SDRAM banks)

Quoted 6 lines

OK. So what I'm getting at is how is this different from other boards where we say "Oh, this is $FOO, it has $X LPDRR2 RAM" and "Oh, this is $BAR, it has $Y DDR3 RAM" ? The only thing I'm able to think of is that we cannot call get_ram_size() to see the _size_ of the RAM after doing $whatever to see what board we're on and doing the right configuration for the DDR controller or whatever.

Quoted 5 lines

Yes the memory type can go in the FDT too (and does for snow and pit).

That's right, we can call get_ram_size() but only within the known boundaries. If we try to probe a 2GB machine as if it has 4GB of RAM it will hang. So we have to *know*.

I have left this one out so far, but would like to apply it. With this I can support Pit and Pi (and with a bit more work Snow and Spring) with the same U-Boot board, dealing with the memory differences between the boards.

Regards,
Simon

#20 lore raw

PATCH v2 5/11 fdt: Use the correct return types for fdtdec_decode_region()

In reply to Simon Glass

Use the correct FDT data types for this function. Also add more debugging.

---

Changes in v2: None

 include/fdtdec.h | 10 +++++-----
 lib/fdtdec.c     | 19 ++++++++++++-------
 2 files changed, 17 insertions(+), 12 deletions(-)
include/fdtdec.h +5 -5
index 5fb86b0..3915fe0 100644
@@ -595,12 +595,12 @@ const u8 *fdtdec_locate_byte_array(const void *blob, int node,
  * @param blob		FDT blob
  * @param node		node to examine
  * @param prop_name	name of property to find
- * @param ptrp		returns pointer to region, or NULL if no address
- * @param size		returns size of region
- * @return 0 if ok, -1 on error (propery not found)
+ * @param basep		Returns base address of region
+ * @param size		Returns size of region
+ * @return 0 if ok, -1 on error (property not found)
  */
-int fdtdec_decode_region(const void *blob, int node,
-		const char *prop_name, void **ptrp, size_t *size);
+int fdtdec_decode_region(const void *blob, int node, const char *prop_name,
+			 fdt_addr_t *basep, fdt_size_t *sizep);
 
 /* A flash map entry, containing an offset and length */
 struct fmap_entry {
lib/fdtdec.c +12 -7
index d5a6a3e..4b5e9cd 100644
@@ -671,20 +671,25 @@ char *fdtdec_get_config_string(const void *blob, const char *prop_name)
 	return (char *)nodep;
 }
 
-int fdtdec_decode_region(const void *blob, int node,
-		const char *prop_name, void **ptrp, size_t *size)
+int fdtdec_decode_region(const void *blob, int node, const char *prop_name,
+			 fdt_addr_t *basep, fdt_size_t *sizep)
 {
 	const fdt_addr_t *cell;
 	int len;
 
-	debug("%s: %s\n", __func__, prop_name);
+	debug("%s: %s: %s\n", __func__, fdt_get_name(blob, node, NULL),
+	      prop_name);
 	cell = fdt_getprop(blob, node, prop_name, &len);
-	if (!cell || (len != sizeof(fdt_addr_t) * 2))
+	if (!cell || (len < sizeof(fdt_addr_t) * 2)) {
+		debug("cell=%p, len=%d\n", cell, len);
 		return -1;
+	}
+
+	*basep = fdt_addr_to_cpu(*cell);
+	*sizep = fdt_size_to_cpu(cell[1]);
+	debug("%s: base=%08lx, size=%lx\n", __func__, (ulong)*basep,
+	      (ulong)*sizep);
 
-	*ptrp = map_sysmem(fdt_addr_to_cpu(*cell), *size);
-	*size = fdt_size_to_cpu(cell[1]);
-	debug("%s: size=%zx\n", __func__, *size);
 	return 0;
 }
 
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#21 lore raw

PATCH v2 5/11 fdt: Use the correct return types for fdtdec_decode_region()

Quoted 4 lines · Simon Glass

Use the correct FDT data types for this function. Also add more debugging.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/2d5bee60/attachment.pgp>
#23 lore raw

PATCH v2 6/11 fdt: Enhance flashmap function to deal with region properties

In reply to Simon Glass

Flash regions can optionally be compressed or hashed. Add the ability to read this information from the flashmap.

---

Changes in v2: None

 include/fdtdec.h | 16 ++++++++++++++++
 lib/fdtdec.c     |  8 ++++++++
 2 files changed, 24 insertions(+)
include/fdtdec.h +16 -0
index 3915fe0..9d9627f 100644
@@ -602,10 +602,26 @@ const u8 *fdtdec_locate_byte_array(const void *blob, int node,
 int fdtdec_decode_region(const void *blob, int node, const char *prop_name,
 			 fdt_addr_t *basep, fdt_size_t *sizep);
 
+enum fmap_compress_t {
+	FMAP_COMPRESS_NONE,
+	FMAP_COMPRESS_LZO,
+};
+
+enum fmap_hash_t {
+	FMAP_HASH_NONE,
+	FMAP_HASH_SHA1,
+	FMAP_HASH_SHA256,
+};
+
 /* A flash map entry, containing an offset and length */
 struct fmap_entry {
 	uint32_t offset;
 	uint32_t length;
+	uint32_t used;			/* Number of bytes used in region */
+	enum fmap_compress_t compress_algo;	/* Compression type */
+	enum fmap_hash_t hash_algo;		/* Hash algorithm */
+	const uint8_t *hash;			/* Hash value */
+	int hash_size;				/* Hash size */
 };
 
 /**
lib/fdtdec.c +8 -0
index 4b5e9cd..0b16534 100644
@@ -705,6 +705,7 @@ int fdtdec_decode_region(const void *blob, int node, const char *prop_name,
 int fdtdec_read_fmap_entry(const void *blob, int node, const char *name,
 			   struct fmap_entry *entry)
 {
+	const char *prop;
 	u32 reg[2];
 
 	if (fdtdec_get_int_array(blob, node, "reg", reg, 2)) {
@@ -713,6 +714,13 @@ int fdtdec_read_fmap_entry(const void *blob, int node, const char *name,
 	}
 	entry->offset = reg[0];
 	entry->length = reg[1];
+	entry->used = fdtdec_get_int(blob, node, "used", entry->length);
+	prop = fdt_getprop(blob, node, "compress", NULL);
+	entry->compress_algo = prop && !strcmp(prop, "lzo") ?
+		FMAP_COMPRESS_LZO : FMAP_COMPRESS_NONE;
+	prop = fdt_getprop(blob, node, "hash", &entry->hash_size);
+	entry->hash_algo = prop ? FMAP_HASH_SHA256 : FMAP_HASH_NONE;
+	entry->hash = (uint8_t *)prop;
 
 	return 0;
 }
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#24 lore raw

PATCH v2 6/11 fdt: Enhance flashmap function to deal with region properties

Quoted 5 lines · Simon Glass

Flash regions can optionally be compressed or hashed. Add the ability to read this information from the flashmap.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/00cd97e1/attachment.pgp>
#26 lore raw

PATCH v2 7/11 fdt: Tidy up error handling in image_setup_libfdt()

In reply to Simon Glass

The message about needing to reset should be printed no matter what error is printed. Also, an error should always be printed.

---

Changes in v2: None

 common/image-fdt.c    | 30 ++++++++++++++++++++----------
 include/fdt_support.h |  1 +
 2 files changed, 21 insertions(+), 10 deletions(-)
common/image-fdt.c +20 -10
index a2342fa..01be803 100644
@@ -460,19 +460,25 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 {
 	ulong *initrd_start = &images->initrd_start;
 	ulong *initrd_end = &images->initrd_end;
-	int ret;
+	int ret = -EPERM;
+	int fdt_ret;
 
 	if (fdt_chosen(blob) < 0) {
-		puts("ERROR: /chosen node create failed");
-		puts(" - must RESET the board to recover.\n");
-		return -1;
+		printf("ERROR: /chosen node create failed\n");
+		goto err;
 	}
 	if (arch_fixup_fdt(blob) < 0) {
-		puts("ERROR: arch specific fdt fixup failed");
-		return -1;
+		printf("ERROR: arch-specific fdt fixup failed\n");
+		goto err;
+	}
+	if (IMAGE_OF_BOARD_SETUP) {
+		fdt_ret = ft_board_setup(blob, gd->bd);
+		if (fdt_ret) {
+			printf("ERROR: board-specific fdt fixup failed: %s\n",
+			       fdt_strerror(fdt_ret));
+			goto err;
+		}
 	}
-	if (IMAGE_OF_BOARD_SETUP)
-		ft_board_setup(blob, gd->bd);
 	fdt_fixup_ethernet(blob);
 
 	/* Delete the old LMB reservation */
@@ -481,7 +487,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 
 	ret = fdt_shrink_to_minimum(blob);
 	if (ret < 0)
-		return ret;
+		goto err;
 	of_size = ret;
 
 	if (*initrd_start && *initrd_end) {
@@ -493,7 +499,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 
 	fdt_initrd(blob, *initrd_start, *initrd_end);
 	if (!ft_verify_fdt(blob))
-		return -1;
+		goto err;
 
 #if defined(CONFIG_SOC_KEYSTONE)
 	if (IMAGE_OF_BOARD_SETUP)
@@ -501,4 +507,8 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 #endif
 
 	return 0;
+err:
+	printf(" - must RESET the board to recover.\n\n");
+
+	return ret;
 }
include/fdt_support.h +1 -0
index e17e609..fb90988 100644
@@ -70,6 +70,7 @@ int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name);
  * Add board-specific data to the FDT before booting the OS.
  *
  * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
+ * This function is called if CONFIG_OF_BOARD_SETUP is defined
  *
  * @param blob		FDT blob to update
  * @param bd_t		Pointer to board data
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#27 lore raw

PATCH v2 7/11 fdt: Tidy up error handling in image_setup_libfdt()

Quoted 5 lines · Simon Glass

The message about needing to reset should be printed no matter what error is printed. Also, an error should always be printed.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/34ac1aa3/attachment.pgp>
#29 lore raw

PATCH v2 8/11 fdt: Add ft_system_setup() function for system device tree additions

In reply to Simon Glass

Add an additional function for adding information to the device tree before booting. This permits additions which are not board-specific.

---

Changes in v2:
- Report FDT error from ft_system_setup()
- Fix ft_board_setup error in README

 README                |  9 ++++++++-
 common/cmd_fdt.c      | 15 +++++++++++++++
 common/image-fdt.c    |  7 +++++++
 include/fdt_support.h | 12 ++++++++++++
 include/image.h       |  6 ++++++
 5 files changed, 48 insertions(+), 1 deletion(-)
README +8 -1
index 4dbf2d4..ee06e13 100644
@@ -676,6 +676,13 @@ The following options need to be configured:
 		Board code has addition modification that it wants to make
 		to the flat device tree before handing it off to the kernel
 
+		CONFIG_OF_SYSTEM_SETUP
+
+		Other code has addition modification that it wants to make
+		to the flat device tree before handing it off to the kernel.
+		This causes ft_system_setup() to be called before booting
+		the kernel.
+
 		CONFIG_OF_BOOT_CPU
 
 		This define fills in the correct boot CPU in the boot
@@ -3411,7 +3418,7 @@ FIT uImage format:
 		to 128 or 256, although it does not have to be power of 2).
 
 		default: 4096
-		
+
 		CONFIG_MTD_UBI_BEB_LIMIT
 		This option specifies the maximum bad physical eraseblocks UBI
 		expects on the MTD device (per 1024 eraseblocks). If the
common/cmd_fdt.c +15 -0
index 6f7ea08..25b4675 100644
@@ -576,6 +576,18 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		}
 	}
 #endif
+#ifdef CONFIG_OF_SYSTEM_SETUP
+	/* Call the board-specific fixup routine */
+	else if (strncmp(argv[1], "sys", 3) == 0) {
+		int err = ft_system_setup(working_fdt, gd->bd);
+
+		if (err) {
+			printf("Failed to add system information to FDT: %s\n",
+			       fdt_strerror(err));
+			return CMD_RET_FAILURE;
+		}
+	}
+#endif
 	/* Create a chosen node */
 	else if (strncmp(argv[1], "cho", 3) == 0) {
 		unsigned long initrd_start = 0, initrd_end = 0;
@@ -1015,6 +1027,9 @@ static char fdt_help_text[] =
 #ifdef CONFIG_OF_BOARD_SETUP
 	"fdt boardsetup                      - Do board-specific set up\n"
 #endif
+#ifdef CONFIG_OF_SYSTEM_SETUP
+	"fdt systemsetup                     - Do system-specific set up\n"
+#endif
 	"fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n"
 	"fdt resize                          - Resize fdt to size + padding to 4k addr\n"
 	"fdt print  <path> [<prop>]          - Recursive print starting at <path>\n"
common/image-fdt.c +7 -0
index 01be803..8db3ccb 100644
@@ -479,6 +479,13 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
 			goto err;
 		}
 	}
+	if (IMAGE_OF_SYSTEM_SETUP) {
+		if (ft_system_setup(blob, gd->bd)) {
+			printf("ERROR: system-specific fdt fixup failed: %s\n",
+			       fdt_strerror(fdt_ret));
+			goto err;
+		}
+	}
 	fdt_fixup_ethernet(blob);
 
 	/* Delete the old LMB reservation */
include/fdt_support.h +12 -0
index fb90988..b1092be 100644
@@ -88,6 +88,18 @@ void ft_board_setup_ex(void *blob, bd_t *bd);
 void ft_cpu_setup(void *blob, bd_t *bd);
 void ft_pci_setup(void *blob, bd_t *bd);
 
+/**
+ * Add system-specific data to the FDT before booting the OS.
+ *
+ * Use CONFIG_SYS_FDT_PAD to ensure there is sufficient space.
+ * This function is called if CONFIG_OF_SYSTEM_SETUP is defined
+ *
+ * @param blob		FDT blob to update
+ * @param bd_t		Pointer to board data
+ * @return 0 if ok, or -FDT_ERR_... on error
+ */
+int ft_system_setup(void *blob, bd_t *bd);
+
 void set_working_fdt_addr(void *addr);
 int fdt_shrink_to_minimum(void *blob);
 int fdt_increase_size(void *fdt, int add_len);
include/image.h +6 -0
index a13a302..08ddcc7 100644
@@ -119,6 +119,12 @@ struct lmb;
 # define IMAGE_OF_BOARD_SETUP		0
 #endif
 
+#ifdef CONFIG_OF_SYSTEM_SETUP
+# define IMAGE_OF_SYSTEM_SETUP	1
+#else
+# define IMAGE_OF_SYSTEM_SETUP	0
+#endif
+
 /*
  * Operating System Codes
  */
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#30 lore raw

PATCH v2 8/11 fdt: Add ft_system_setup() function for system device tree additions

Quoted 5 lines · Simon Glass

Add an additional function for adding information to the device tree before booting. This permits additions which are not board-specific.

[snip]

README FIT uImage format: · line 3424

Quoted 9 lines
README +1 -1
@@ -3411,7 +3418,7 @@ FIT uImage format:
 		to 128 or 256, although it does not have to be power of 2).
 
 		default: 4096
-		
+
 		CONFIG_MTD_UBI_BEB_LIMIT
 		This option specifies the maximum bad physical eraseblocks UBI
 		expects on the MTD device (per 1024 eraseblocks). If the

Was this the only whitespace thinko in README? If so, yeah, OK, lets just fix it, if not, drop it. Otherwise...

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/3f90b535/attachment.pgp>
#31 lore raw

PATCH v2 8/11 fdt: Add ft_system_setup() function for system device tree additions

Hi Tom,

Quoted 21 lines · Tom Rini
Quoted 5 lines · Simon Glass

Add an additional function for adding information to the device tree before booting. This permits additions which are not board-specific.

[snip]

README FIT uImage format: · line 3424

Quoted 9 lines
README +1 -1
@@ -3411,7 +3418,7 @@ FIT uImage format:
              to 128 or 256, although it does not have to be power of 2).
 
              default: 4096
-
+
              CONFIG_MTD_UBI_BEB_LIMIT
              This option specifies the maximum bad physical eraseblocks UBI
              expects on the MTD device (per 1024 eraseblocks). If the

Was this the only whitespace thinko in README? If so, yeah, OK, lets just fix it, if not, drop it. Otherwise...

Quoted 1 line

Yes I think it is the only one.

Regards,
Simon

#32 lore raw

PATCH v2 8/11 fdt: Add ft_system_setup() function for system device tree additions

Quoted 24 lines · Simon Glass

Hi Tom,

Quoted 21 lines · Tom Rini
Quoted 5 lines · Simon Glass

Add an additional function for adding information to the device tree before booting. This permits additions which are not board-specific.

[snip]

README FIT uImage format: · line 3424

Quoted 9 lines
README +1 -1
@@ -3411,7 +3418,7 @@ FIT uImage format:
              to 128 or 256, although it does not have to be power of 2).
 
              default: 4096
-
+
              CONFIG_MTD_UBI_BEB_LIMIT
              This option specifies the maximum bad physical eraseblocks UBI
              expects on the MTD device (per 1024 eraseblocks). If the

Was this the only whitespace thinko in README? If so, yeah, OK, lets just fix it, if not, drop it. Otherwise...

Quoted 6 lines
Quoted 1 line

Yes I think it is the only one.

Regards,
Simon

Applied to u-boot-fdt.

#33 lore raw

PATCH v2 9/11 fdt: Change fdt_pack_reg() to static and fix types

In reply to Simon Glass

This function is only called within this file so make it static. Also fix its argument types to be consistent with its caller.

---

Changes in v2: None

 common/fdt_support.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
common/fdt_support.c +2 -2
index 6da5297..f9b81c6 100644
@@ -382,8 +382,8 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
 /*
  * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
  */
-int fdt_pack_reg(const void *fdt, void *buf, uint64_t *address,
-			uint64_t *size, int n)
+static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size,
+			int n)
 {
 	int i;
 	int address_len = get_cells_len(fdt, "#address-cells");
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#34 lore raw

PATCH v2 9/11 fdt: Change fdt_pack_reg() to static and fix types

Quoted 5 lines · Simon Glass

This function is only called within this file so make it static. Also fix its argument types to be consistent with its caller.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/acc316d4/attachment.pgp>
#36 lore raw

PATCH v2 10/11 fdt: Add a function to decode a named memory region

In reply to Simon Glass

Permit decoding of a named memory region from the device tree. This allows easy run-time configuration of the address of on-chip SRAM, SDRAM, etc.

---

Changes in v2: None

 include/fdtdec.h | 28 ++++++++++++++++++++++++++
 lib/fdtdec.c     | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)
include/fdtdec.h +28 -0
index 9d9627f..8c12d2d 100644
@@ -710,4 +710,32 @@ int fdtdec_pci_get_bdf(const void *fdt, int node, int *bdf);
  */
 int fdtdec_decode_ram_size(const void *blob, const char *area, int board_id,
 			   phys_addr_t *basep, phys_size_t *sizep, bd_t *bd);
+
+/**
+ * Decode a named region within a memory bank of a given type.
+ *
+ * This function handles selection of a memory region. The region is
+ * specified as an offset/size within a particular type of memory.
+ *
+ * The properties used are:
+ *
+ *	<mem_type>-memory<suffix> for the name of the memory bank
+ *	<mem_type>-offset<suffix> for the offset in that bank
+ *
+ * The property value must have an offset and a size. The function checks
+ * that the region is entirely within the memory bank.5
+ *
+ * @param blob		FDT blob
+ * @param node		Node containing the properties (-1 for /config)
+ * @param mem_type	Type of memory to use, which is a name, such as
+ *			"u-boot" or "kernel".
+ * @param suffix	String to append to the memory/offset
+ *			property names
+ * @param basep		Returns base of region
+ * @param sizep		Returns size of region
+ * @return 0 if OK, -ive on error
+ */
+int fdtdec_decode_memory_region(const void *blob, int node,
+				const char *mem_type, const char *suffix,
+				fdt_addr_t *basep, fdt_size_t *sizep);
 #endif
lib/fdtdec.c +61 -0

65 lines not on this page · raw message

Signature · 1 line
2.1.0.rc2.206.gedb03e5
#37 lore raw

PATCH v2 10/11 fdt: Add a function to decode a named memory region

Quoted 4 lines · Simon Glass

Permit decoding of a named memory region from the device tree. This allows easy run-time configuration of the address of on-chip SRAM, SDRAM, etc.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/0f139393/attachment.pgp>
#38 lore raw

PATCH v2 10/11 fdt: Add a function to decode a named memory region

Quoted 8 lines · Tom Rini
Quoted 4 lines · Simon Glass

Permit decoding of a named memory region from the device tree. This allows easy run-time configuration of the address of on-chip SRAM, SDRAM, etc.

Applied to u-boot-fdt.

#39 lore raw

PATCH v2 11/11 fdt: Try to use fdt_address_cells()/fdt_size_cells()

In reply to Simon Glass

Use these new functions where possible. They default to a value of 2 so we cannot use them in some places where we need a default value of 1.

---

Changes in v2: None

 board/freescale/mpc8641hpcn/mpc8641hpcn.c |  7 +++---
 common/fdt_support.c                      | 41 ++++++-------------------------
 2 files changed, 12 insertions(+), 36 deletions(-)
board/freescale/mpc8641hpcn/mpc8641hpcn.c +4 -3
index 1ab72f9..94633b5 100644
@@ -123,7 +123,7 @@ int ft_board_setup(void *blob, bd_t *bd)
 {
 	int off;
 	u64 *tmp;
-	u32 *addrcells;
+	int addrcells;
 
 	ft_cpu_setup(blob, bd);
 
@@ -135,12 +135,13 @@ int ft_board_setup(void *blob, bd_t *bd)
 	 * which is defined by the "reg" property in the soc node.
 	 */
 	off = fdt_path_offset(blob, "/soc8641");
-	addrcells = (u32 *)fdt_getprop(blob, 0, "#address-cells", NULL);
+	addrcells = fdt_address_cells(blob, 0);
 	tmp = (u64 *)fdt_getprop(blob, off, "reg", NULL);
 
 	if (tmp) {
 		u64 addr;
-		if (addrcells && (*addrcells == 1))
+
+		if (addrcells == 1)
 			addr = *(u32 *)tmp;
 		else
 			addr = *tmp;
common/fdt_support.c +8 -33

79 lines not on this page · raw message

Signature · 1 line
2.1.0.rc2.206.gedb03e5
#40 lore raw

PATCH v2 11/11 fdt: Try to use fdt_address_cells()/fdt_size_cells()

Quoted 4 lines · Simon Glass

Use these new functions where possible. They default to a value of 2 so we cannot use them in some places where we need a default value of 1.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/9c409e8a/attachment.pgp>
#41 lore raw

PATCH v2 11/11 fdt: Try to use fdt_address_cells()/fdt_size_cells()

Quoted 8 lines · Tom Rini
Quoted 4 lines · Simon Glass

Use these new functions where possible. They default to a value of 2 so we cannot use them in some places where we need a default value of 1.

Applied to u-boot-fdt.

#42 lore raw

PATCH v2 1/11 fdt: Allow ft_board_setup() to report failure

In reply to Simon Glass
Quoted 13 lines · On Thu, 23 Oct 2014 18:58:47 -0600 Simon Glass <[email protected]> wrote:

This function can fail if the device tree runs out of space. Rather than silently booting with an incomplete device tree, allow the failure to be detected.

Unfortunately this involves changing a lot of places in the code. I have not changed behvaiour to return an error where one is not currently returned, to avoid unexpected breakage.

Eventually it would be nice to allow boards to register functions to be called to update the device tree. This would avoid all the many functions to do this. However it's not clear yet if this should be done using driver model or with a linker list. This work is left for later.

Quoted 7 lines

---

Changes in v2:
- Fix return codes in board/amcc/sequoia/sequoia.c
- Fix return codes in board/freescale/p1_p2_rdb/p1_p2_rdb.c
- Fix return codes in board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c

Thanks,

Anatolij

#43 lore raw

PATCH v2 1/11 fdt: Allow ft_board_setup() to report failure

In reply to Simon Glass
Quoted 12 lines · Simon Glass

This function can fail if the device tree runs out of space. Rather than silently booting with an incomplete device tree, allow the failure to be detected.

Unfortunately this involves changing a lot of places in the code. I have not changed behvaiour to return an error where one is not currently returned, to avoid unexpected breakage.

Eventually it would be nice to allow boards to register functions to be called to update the device tree. This would avoid all the many functions to do this. However it's not clear yet if this should be done using driver model or with a linker list. This work is left for later.

[snip]

Quoted 151 lines
board/freescale/p1_p2_rdb/p1_p2_rdb.c +22 -19
index aba4f53..19fef50 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/cache.h>
@@ -234,7 +235,7 @@ int board_eth_init(bd_t *bis)
 #if defined(CONFIG_OF_BOARD_SETUP)
 extern void ft_pci_board_setup(void *blob);
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	const char *soc_usb_compat = "fsl-usb2-dr";
 	int err, usb1_off, usb2_off;
@@ -263,39 +264,41 @@ void ft_board_setup(void *blob, bd_t *bd)
 		int off = fdt_node_offset_by_compatible(blob, -1,
 			soc_elbc_compat);
 		if (off < 0) {
-			printf("WARNING: could not find compatible node"
-				" %s: %s.\n", soc_elbc_compat,
-				fdt_strerror(off));
-				return;
+			printf("WARNING: could not find compatible node %s\n",
+			       soc_elbc_compat);
+			return off;
 		}
 		err = fdt_del_node(blob, off);
 		if (err < 0) {
-			printf("WARNING: could not remove %s: %s.\n",
-				soc_elbc_compat, fdt_strerror(err));
+			printf("WARNING: could not remove %s\n",
+			       soc_elbc_compat);
+			return err;
 		}
-		return;
+		return 0;
 	}
 #endif
 	/* Delete USB2 node as it is muxed with eLBC */
 	usb1_off = fdt_node_offset_by_compatible(blob, -1,
 		soc_usb_compat);
 	if (usb1_off < 0) {
-		printf("WARNING: could not find compatible node"
-			" %s: %s.\n", soc_usb_compat,
-			fdt_strerror(usb1_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb1_off;
 	}
 	usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
 			soc_usb_compat);
 	if (usb2_off < 0) {
-		printf("WARNING: could not find compatible node"
-			" %s: %s.\n", soc_usb_compat,
-			fdt_strerror(usb2_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb2_off;
 	}
 	err = fdt_del_node(blob, usb2_off);
-	if (err < 0)
-		printf("WARNING: could not remove %s: %s.\n",
-			soc_usb_compat, fdt_strerror(err));
+	if (err < 0) {
+		printf("WARNING: could not remove %s\n", soc_usb_compat);
+		return err;
+	}
+
+	return 0;
 }
+
 #endif
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +15 -16
index a6756c6..66bc041 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <hwconfig.h>
 #include <pci.h>
 #include <i2c.h>
@@ -424,7 +425,7 @@ static void fdt_board_fixup_qe_pins(void *blob)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
 	phys_addr_t base;
 	phys_size_t size;
@@ -459,17 +460,17 @@ void ft_board_setup(void *blob, bd_t *bd)
 		int off = fdt_node_offset_by_compatible(blob, -1,
 				soc_elbc_compat);
 		if (off < 0) {
-			printf("WARNING: could not find compatible node %s: %s.\n",
-			       soc_elbc_compat,
-			       fdt_strerror(off));
-				return;
+			printf("WARNING: could not find compatible node %s\n",
+			       soc_elbc_compat);
+			return off;
 		}
 		err = fdt_del_node(blob, off);
 		if (err < 0) {
-			printf("WARNING: could not remove %s: %s.\n",
-			       soc_elbc_compat, fdt_strerror(err));
+			printf("WARNING: could not remove %s\n",
+			       soc_elbc_compat);
+			return err;
 		}
-		return;
+		return 0;
 	}
 #endif
 
@@ -477,24 +478,23 @@ void ft_board_setup(void *blob, bd_t *bd)
 	usb1_off = fdt_node_offset_by_compatible(blob, -1,
 		soc_usb_compat);
 	if (usb1_off < 0) {
-		printf("WARNING: could not find compatible node %s: %s.\n",
-		       soc_usb_compat,
-		       fdt_strerror(usb1_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb1_off;
 	}
 	usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
 			soc_usb_compat);
 	if (usb2_off < 0) {
-		printf("WARNING: could not find compatible node %s: %s.\n",
-		       soc_usb_compat,
-		       fdt_strerror(usb2_off));
-		return;
+		printf("WARNING: could not find compatible node %s\n",
+		       soc_usb_compat);
+		return usb2_off;
 	}
 	err = fdt_del_node(blob, usb2_off);

board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c void ft_board_setup(void *blob, bd_t *bd) · line 500

Quoted 10 lines
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +3 -2
 	if (err < 0) {
-		printf("WARNING: could not remove %s: %s.\n",
-		       soc_usb_compat, fdt_strerror(err));
+		printf("WARNING: could not remove %s\n", soc_usb_compat);
+		return err;
 	}
 
+	return 0;
 }
 #endif

In both of these boards you add <errno.h> but don't make use of it, did you intend to make something return -FDT_ERR_NOTFOUND and then not need to after all? Thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141024/c914842f/attachment-0001.pgp>
#44 lore raw

PATCH v2 1/11 fdt: Allow ft_board_setup() to report failure

Hi Tom,

Quoted 173 lines · Tom Rini
Quoted 12 lines · Simon Glass

This function can fail if the device tree runs out of space. Rather than silently booting with an incomplete device tree, allow the failure to be detected.

Unfortunately this involves changing a lot of places in the code. I have not changed behvaiour to return an error where one is not currently returned, to avoid unexpected breakage.

Eventually it would be nice to allow boards to register functions to be called to update the device tree. This would avoid all the many functions to do this. However it's not clear yet if this should be done using driver model or with a linker list. This work is left for later.

[snip]

Quoted 158 lines
board/freescale/p1_p2_rdb/p1_p2_rdb.c +22 -19
index aba4f53..19fef50 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/cache.h>
@@ -234,7 +235,7 @@ int board_eth_init(bd_t *bis)
 #if defined(CONFIG_OF_BOARD_SETUP)
 extern void ft_pci_board_setup(void *blob);
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
      const char *soc_usb_compat = "fsl-usb2-dr";
      int err, usb1_off, usb2_off;
@@ -263,39 +264,41 @@ void ft_board_setup(void *blob, bd_t *bd)
              int off = fdt_node_offset_by_compatible(blob, -1,
                      soc_elbc_compat);
              if (off < 0) {
-                     printf("WARNING: could not find compatible node"
-                             " %s: %s.\n", soc_elbc_compat,
-                             fdt_strerror(off));
-                             return;
+                     printf("WARNING: could not find compatible node %s\n",
+                            soc_elbc_compat);
+                     return off;
              }
              err = fdt_del_node(blob, off);
              if (err < 0) {
-                     printf("WARNING: could not remove %s: %s.\n",
-                             soc_elbc_compat, fdt_strerror(err));
+                     printf("WARNING: could not remove %s\n",
+                            soc_elbc_compat);
+                     return err;
              }
-             return;
+             return 0;
      }
 #endif
      /* Delete USB2 node as it is muxed with eLBC */
      usb1_off = fdt_node_offset_by_compatible(blob, -1,
              soc_usb_compat);
      if (usb1_off < 0) {
-             printf("WARNING: could not find compatible node"
-                     " %s: %s.\n", soc_usb_compat,
-                     fdt_strerror(usb1_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb1_off;
      }
      usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
                      soc_usb_compat);
      if (usb2_off < 0) {
-             printf("WARNING: could not find compatible node"
-                     " %s: %s.\n", soc_usb_compat,
-                     fdt_strerror(usb2_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb2_off;
      }
      err = fdt_del_node(blob, usb2_off);
-     if (err < 0)
-             printf("WARNING: could not remove %s: %s.\n",
-                     soc_usb_compat, fdt_strerror(err));
+     if (err < 0) {
+             printf("WARNING: could not remove %s\n", soc_usb_compat);
+             return err;
+     }
+
+     return 0;
 }
+
 #endif
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +17 -18
index a6756c6..66bc041 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <hwconfig.h>
 #include <pci.h>
 #include <i2c.h>
@@ -424,7 +425,7 @@ static void fdt_board_fixup_qe_pins(void *blob)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
      phys_addr_t base;
      phys_size_t size;
@@ -459,17 +460,17 @@ void ft_board_setup(void *blob, bd_t *bd)
              int off = fdt_node_offset_by_compatible(blob, -1,
                              soc_elbc_compat);
              if (off < 0) {
-                     printf("WARNING: could not find compatible node %s: %s.\n",
-                            soc_elbc_compat,
-                            fdt_strerror(off));
-                             return;
+                     printf("WARNING: could not find compatible node %s\n",
+                            soc_elbc_compat);
+                     return off;
              }
              err = fdt_del_node(blob, off);
              if (err < 0) {
-                     printf("WARNING: could not remove %s: %s.\n",
-                            soc_elbc_compat, fdt_strerror(err));
+                     printf("WARNING: could not remove %s\n",
+                            soc_elbc_compat);
+                     return err;
              }
-             return;
+             return 0;
      }
 #endif
 
@@ -477,24 +478,23 @@ void ft_board_setup(void *blob, bd_t *bd)
      usb1_off = fdt_node_offset_by_compatible(blob, -1,
              soc_usb_compat);
      if (usb1_off < 0) {
-             printf("WARNING: could not find compatible node %s: %s.\n",
-                    soc_usb_compat,
-                    fdt_strerror(usb1_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb1_off;
      }
      usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
                      soc_usb_compat);
      if (usb2_off < 0) {
-             printf("WARNING: could not find compatible node %s: %s.\n",
-                    soc_usb_compat,
-                    fdt_strerror(usb2_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb2_off;
      }
      err = fdt_del_node(blob, usb2_off);
      if (err < 0) {
-             printf("WARNING: could not remove %s: %s.\n",
-                    soc_usb_compat, fdt_strerror(err));
+             printf("WARNING: could not remove %s\n", soc_usb_compat);
+             return err;
      }
 
Quoted 7 lines

board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c void ft_board_setup(void *blob, bd_t *bd) · line 500

Quoted 3 lines
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +1 -0
+     return 0;
 }
 #endif

In both of these boards you add <errno.h> but don't make use of it, did you intend to make something return -FDT_ERR_NOTFOUND and then not need to after all? Thanks!

Actually -ENOENT I think, but it was a v1 mistake and I removed it. I can remove these headers also.

Regards,
Simon

#45 lore raw

PATCH v2 1/11 fdt: Allow ft_board_setup() to report failure

Quoted 184 lines · Simon Glass

Hi Tom,

Quoted 173 lines · Tom Rini
Quoted 12 lines · Simon Glass

This function can fail if the device tree runs out of space. Rather than silently booting with an incomplete device tree, allow the failure to be detected.

Unfortunately this involves changing a lot of places in the code. I have not changed behvaiour to return an error where one is not currently returned, to avoid unexpected breakage.

Eventually it would be nice to allow boards to register functions to be called to update the device tree. This would avoid all the many functions to do this. However it's not clear yet if this should be done using driver model or with a linker list. This work is left for later.

[snip]

Quoted 158 lines
board/freescale/p1_p2_rdb/p1_p2_rdb.c +22 -19
index aba4f53..19fef50 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/cache.h>
@@ -234,7 +235,7 @@ int board_eth_init(bd_t *bis)
 #if defined(CONFIG_OF_BOARD_SETUP)
 extern void ft_pci_board_setup(void *blob);
 
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
      const char *soc_usb_compat = "fsl-usb2-dr";
      int err, usb1_off, usb2_off;
@@ -263,39 +264,41 @@ void ft_board_setup(void *blob, bd_t *bd)
              int off = fdt_node_offset_by_compatible(blob, -1,
                      soc_elbc_compat);
              if (off < 0) {
-                     printf("WARNING: could not find compatible node"
-                             " %s: %s.\n", soc_elbc_compat,
-                             fdt_strerror(off));
-                             return;
+                     printf("WARNING: could not find compatible node %s\n",
+                            soc_elbc_compat);
+                     return off;
              }
              err = fdt_del_node(blob, off);
              if (err < 0) {
-                     printf("WARNING: could not remove %s: %s.\n",
-                             soc_elbc_compat, fdt_strerror(err));
+                     printf("WARNING: could not remove %s\n",
+                            soc_elbc_compat);
+                     return err;
              }
-             return;
+             return 0;
      }
 #endif
      /* Delete USB2 node as it is muxed with eLBC */
      usb1_off = fdt_node_offset_by_compatible(blob, -1,
              soc_usb_compat);
      if (usb1_off < 0) {
-             printf("WARNING: could not find compatible node"
-                     " %s: %s.\n", soc_usb_compat,
-                     fdt_strerror(usb1_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb1_off;
      }
      usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
                      soc_usb_compat);
      if (usb2_off < 0) {
-             printf("WARNING: could not find compatible node"
-                     " %s: %s.\n", soc_usb_compat,
-                     fdt_strerror(usb2_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb2_off;
      }
      err = fdt_del_node(blob, usb2_off);
-     if (err < 0)
-             printf("WARNING: could not remove %s: %s.\n",
-                     soc_usb_compat, fdt_strerror(err));
+     if (err < 0) {
+             printf("WARNING: could not remove %s\n", soc_usb_compat);
+             return err;
+     }
+
+     return 0;
 }
+
 #endif
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +17 -18
index a6756c6..66bc041 100644
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <hwconfig.h>
 #include <pci.h>
 #include <i2c.h>
@@ -424,7 +425,7 @@ static void fdt_board_fixup_qe_pins(void *blob)
 #endif
 
 #ifdef CONFIG_OF_BOARD_SETUP
-void ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, bd_t *bd)
 {
      phys_addr_t base;
      phys_size_t size;
@@ -459,17 +460,17 @@ void ft_board_setup(void *blob, bd_t *bd)
              int off = fdt_node_offset_by_compatible(blob, -1,
                              soc_elbc_compat);
              if (off < 0) {
-                     printf("WARNING: could not find compatible node %s: %s.\n",
-                            soc_elbc_compat,
-                            fdt_strerror(off));
-                             return;
+                     printf("WARNING: could not find compatible node %s\n",
+                            soc_elbc_compat);
+                     return off;
              }
              err = fdt_del_node(blob, off);
              if (err < 0) {
-                     printf("WARNING: could not remove %s: %s.\n",
-                            soc_elbc_compat, fdt_strerror(err));
+                     printf("WARNING: could not remove %s\n",
+                            soc_elbc_compat);
+                     return err;
              }
-             return;
+             return 0;
      }
 #endif
 
@@ -477,24 +478,23 @@ void ft_board_setup(void *blob, bd_t *bd)
      usb1_off = fdt_node_offset_by_compatible(blob, -1,
              soc_usb_compat);
      if (usb1_off < 0) {
-             printf("WARNING: could not find compatible node %s: %s.\n",
-                    soc_usb_compat,
-                    fdt_strerror(usb1_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb1_off;
      }
      usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
                      soc_usb_compat);
      if (usb2_off < 0) {
-             printf("WARNING: could not find compatible node %s: %s.\n",
-                    soc_usb_compat,
-                    fdt_strerror(usb2_off));
-             return;
+             printf("WARNING: could not find compatible node %s\n",
+                    soc_usb_compat);
+             return usb2_off;
      }
      err = fdt_del_node(blob, usb2_off);
      if (err < 0) {
-             printf("WARNING: could not remove %s: %s.\n",
-                    soc_usb_compat, fdt_strerror(err));
+             printf("WARNING: could not remove %s\n", soc_usb_compat);
+             return err;
      }
 
Quoted 7 lines

board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c void ft_board_setup(void *blob, bd_t *bd) · line 500

Quoted 3 lines
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c +1 -0
+     return 0;
 }
 #endif

In both of these boards you add <errno.h> but don't make use of it, did you intend to make something return -FDT_ERR_NOTFOUND and then not need to after all? Thanks!

Quoted 2 lines

Actually -ENOENT I think, but it was a v1 mistake and I removed it. I can remove these headers also.

Fixed, and applied to u-boot-fdt.