From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Rini Date: Fri, 24 Oct 2014 14:04:32 -0400 Subject: [U-Boot] [PATCH v2 01/11] fdt: Allow ft_board_setup() to report failure In-Reply-To: <1414112337-22735-1-git-send-email-sjg@chromium.org> References: <1414112337-22735-1-git-send-email-sjg@chromium.org> Message-ID: <20141024180432.GY25506@bill-the-cat> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Thu, Oct 23, 2014 at 06:58:47PM -0600, Simon Glass 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. [snip] > diff --git a/board/freescale/p1_p2_rdb/p1_p2_rdb.c b/board/freescale/p1_p2_rdb/p1_p2_rdb.c > index aba4f53..19fef50 100644 > --- a/board/freescale/p1_p2_rdb/p1_p2_rdb.c > +++ b/board/freescale/p1_p2_rdb/p1_p2_rdb.c > @@ -6,6 +6,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -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 > diff --git a/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c b/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c > index a6756c6..66bc041 100644 > --- a/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c > +++ b/board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c > @@ -6,6 +6,7 @@ > > #include > #include > +#include > #include > #include > #include > @@ -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 In both of these boards you add 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! -- Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: