On Tue, Jul 04, 2023 at 11:39:59AM -0300, Fabio Estevam wrote:
> Hi Francesco,
> 
> On Mon, Jul 3, 2023 at 5:49 PM Francesco Dolcini <france...@dolcini.it> wrote:
> 
> > If I do this small partial revert
> >
> > --- a/arch/arm/dts/imx7d-colibri-eval-v3-u-boot.dtsi
> > +++ b/arch/arm/dts/imx7d-colibri-eval-v3-u-boot.dtsi
> > @@ -15,7 +15,8 @@
> >         pinctrl-0 = <&pinctrl_lcdif_dat
> >                      &pinctrl_lcdif_ctrl>;
> >         display = <&display0>;
> > -       u-boot,dm-pre-reloc;
> > +       bootph-all;
> 
> I managed to reproduce the behavior on a imx7d-sabresd by doing:
> 
> --- a/board/freescale/mx7dsabresd/mx7dsabresd.c
> +++ b/board/freescale/mx7dsabresd/mx7dsabresd.c
> @@ -25,6 +25,7 @@
>  #include <i2c.h>
>  #include <asm/mach-imx/mxc_i2c.h>
>  #include <asm/arch/crm_regs.h>
> +#include <fdt_support.h>
> 
>  DECLARE_GLOBAL_DATA_PTR;
> 
> @@ -289,6 +290,20 @@ int power_init_board(void)
>  }
>  #endif
> 
> +int board_fix_fdt(void *rw_fdt_blob)
> +{
> +       int ret;
> +
> +       int offset = fdt_path_offset(rw_fdt_blob,
> "/soc/bus@30800000/usb@30b20000");
> +
> +       ret = fdt_status_disabled(rw_fdt_blob, offset);
> +
> +       printf("******** offset is 0x%x\n", offset);
> +       printf("******** ret is %d\n", ret);
> +
> +       return 0;
> +}
> +
>  int board_late_init(void)
> 
> --- a/configs/mx7dsabresd_defconfig
> +++ b/configs/mx7dsabresd_defconfig
> @@ -86,3 +86,4 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
>  CONFIG_CI_UDC=y
>  CONFIG_USB_GADGET_DOWNLOAD=y
>  CONFIG_ERRNO_STR=y
> +CONFIG_OF_BOARD_FIXUP=y
> 
> With top of tree U-Boot it fails with:
> 
> ******** offset is 0x7ba4
> ******** ret is -3
> 
> If u-boot.dtsi gets smaller, for example, by reverting 0aea5dda2928
> then it succeeds:
> 
> ******** offset is 0x7988
> ******** ret is 0
> 
> > fdt_status_disabled() returns 0 again.
> >
> > With the current master, fdt_status_disabled() returns -3,
> > -FDT_ERR_NOSPACE, and I assume I could just change my code to call
> > fdt_increase_size() and call it done.
> >
> > However, what the reason for this different behavior triggered by that
> > change in the *-u-boot.dtsi ? Is this expected?
> >
> > From a quick check multiple place in the code just disable/enable nodes
> > or set properties without taking care of this, are those going to be
> > affected by that commit that created the regression? Are those all
> > buggy?
> >
> > $ git grep fdt_setprop |wc -l
> > 461
> >
> > We have some helper around, for example
> > arch/arm/mach-imx/imx8/fdt.c:disable_fdt_node(), but this is for example
> > just specific on that file.
> 
> Here is my suggestion: let's increase the fdt size locally on your
> board for now, just like turris_omnia.c:
> 
> --- a/board/toradex/colibri_imx7/colibri_imx7.c
> +++ b/board/toradex/colibri_imx7/colibri_imx7.c
> @@ -315,6 +315,15 @@ int board_fix_fdt(void *rw_fdt_blob)
>         if (is_cpu_type(MXC_CPU_MX7S)) {
>                 int offset = fdt_path_offset(rw_fdt_blob,
> "/soc/bus@30800000/usb@30b20000");
> 
> +       /*
> +        * We're either adding status = "disabled" property, or changing
> +        * status = "okay" to status = "disabled". In both cases we'll need 
> more
> +        * space. Increase the size a little.
> +        */
> +       if (fdt_increase_size(rw_fdt_blob, 32) < 0) {
> +               printf("Cannot increase FDT size.\n");
> +               return -ENOMEM;
> +       }
>                 return fdt_status_disabled(rw_fdt_blob, offset);
>         }
> 
> Then for the next cycle, we should plan on adding this
> fdt_increase_size() into the common fdt_status_disabled().

I'm a little leary of generic changes here having an unexpected size /
performance impact.  The API specifically does not "just" handle this
case like it does for some others. We should update the docs around
fdt_set_node_status and fdt_status_disabled to reference the return
codes of fdt_setprop_string itself and check for anyone else that hasn't
been considering this possible failure case.

-- 
Tom

Attachment: signature.asc
Description: PGP signature

Reply via email to