[U-Boot] [PATCH] Revert "fdt: Fix fdtdec_get_addr_size() for 64-bit"

Bin Meng bmeng.cn at gmail.com
Mon Aug 3 17:40:30 CEST 2015


Hi Simon,

On Mon, Aug 3, 2015 at 8:13 AM, Simon Glass <sjg at chromium.org> wrote:
> This reverts commit 5b34436035fc862b5e8d0d2c3eab74ba36f1a7f4.
>
> This function has a few problems. It calls fdt_parent_offset() which as
> mentioned in code review is very slow.
>
> https://patchwork.ozlabs.org/patch/499482/
> https://patchwork.ozlabs.org/patch/452604/
>
> It also happens to break SPI flash on Minnowboard max which is how I noticed
> that this was applied. I can send a patch to tidy that up, but in any case
> I think we should consider a revert until the function is better implemented.
>

Ah, today I rebased my working branch on top of u-boot-x86/master and
also noticed that SPI flash on Intel Bayley Bay is no longer working.
I haven't got time today to trace the broken commit, but looks that
you have caught it.

I will try this revert commit tomorrow.

> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  lib/fdtdec.c | 56 ++++++++++++++++++++------------------------------------
>  1 file changed, 20 insertions(+), 36 deletions(-)
>
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index a954051..aac4f8d 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -90,45 +90,29 @@ const char *fdtdec_get_compatible(enum fdt_compat_id id)
>  fdt_addr_t fdtdec_get_addr_size(const void *blob, int node,
>                 const char *prop_name, fdt_size_t *sizep)
>  {
> -       const fdt32_t *ptr, *end;
> -       int parent, na, ns, len;
> -       fdt_addr_t addr;
> +       const fdt_addr_t *cell;
> +       int len;
>
>         debug("%s: %s: ", __func__, prop_name);
> -
> -       parent = fdt_parent_offset(blob, node);
> -       if (parent < 0) {
> -               debug("(no parent found)\n");
> -               return FDT_ADDR_T_NONE;
> -       }
> -
> -       na = fdt_address_cells(blob, parent);
> -       ns = fdt_size_cells(blob, parent);
> -
> -       ptr = fdt_getprop(blob, node, prop_name, &len);
> -       if (!ptr) {
> -               debug("(not found)\n");
> -               return FDT_ADDR_T_NONE;
> -       }
> -
> -       end = ptr + len / sizeof(*ptr);
> -
> -       if (ptr + na + ns > end) {
> -               debug("(not enough data: expected %d bytes, got %d bytes)\n",
> -                     (na + ns) * 4, len);
> -               return FDT_ADDR_T_NONE;
> -       }
> -
> -       addr = fdtdec_get_number(ptr, na);
> -
> -       if (sizep) {
> -               *sizep = fdtdec_get_number(ptr + na, ns);
> -               debug("addr=%pa, size=%pa\n", &addr, sizep);
> -       } else {
> -               debug("%pa\n", &addr);
> +       cell = fdt_getprop(blob, node, prop_name, &len);
> +       if (cell && ((!sizep && len == sizeof(fdt_addr_t)) ||
> +                    len == sizeof(fdt_addr_t) * 2)) {
> +               fdt_addr_t addr = fdt_addr_to_cpu(*cell);
> +               if (sizep) {
> +                       const fdt_size_t *size;
> +
> +                       size = (fdt_size_t *)((char *)cell +
> +                                       sizeof(fdt_addr_t));
> +                       *sizep = fdt_size_to_cpu(*size);
> +                       debug("addr=%08lx, size=%llx\n",
> +                             (ulong)addr, (u64)*sizep);
> +               } else {
> +                       debug("%08lx\n", (ulong)addr);
> +               }
> +               return addr;
>         }
> -
> -       return addr;
> +       debug("(not found)\n");
> +       return FDT_ADDR_T_NONE;
>  }
>
>  fdt_addr_t fdtdec_get_addr(const void *blob, int node,
> --

Regards,
Bin


More information about the U-Boot mailing list