[U-Boot] [PATCH v3 043/108] x86: Adjust mrccache_get_region() to use livetree

Bin Meng bmeng.cn at gmail.com
Mon Nov 4 15:06:04 UTC 2019


Hi Simon,

On Mon, Oct 21, 2019 at 11:40 AM Simon Glass <sjg at chromium.org> wrote:
>
> Change the algorithm to first find the flash device then read the
> properties using the livetree API. With this change the device is not
> probed so this needs to be done in mrccache_save().
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v3:
> - Update mrccache livetree patch to just convert to livetree
>
> Changes in v2: None
>
>  arch/x86/lib/mrccache.c | 55 +++++++++++++++++++----------------------
>  1 file changed, 26 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/lib/mrccache.c b/arch/x86/lib/mrccache.c
> index 7292d1fe070..b8bc5de602c 100644
> --- a/arch/x86/lib/mrccache.c
> +++ b/arch/x86/lib/mrccache.c
> @@ -14,6 +14,8 @@
>  #include <spi.h>
>  #include <spi_flash.h>
>  #include <asm/mrccache.h>
> +#include <dm/device-internal.h>
> +#include <dm/uclass-internal.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -201,45 +203,37 @@ int mrccache_reserve(void)
>
>  int mrccache_get_region(struct udevice **devp, struct mrc_region *entry)
>  {
> -       const void *blob = gd->fdt_blob;
> -       int node, mrc_node;
> +       struct udevice *dev;
> +       ofnode mrc_node;
>         u32 reg[2];
>         int ret;
>
> -       /* Find the flash chip within the SPI controller node */
> -       node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
> -       if (node < 0) {
> -               debug("%s: Cannot find SPI flash\n", __func__);
> -               return -ENOENT;
> -       }
> -
> -       if (fdtdec_get_int_array(blob, node, "memory-map", reg, 2)) {
> -               debug("%s: Cannot find memory map\n", __func__);
> -               return -EINVAL;
> -       }
> +       /*
> +        * Find the flash chip within the SPI controller node. Avoid probing
> +        * the device here since it may put it into a strange state where the
> +        * memory map cannot be read.
> +        */
> +       ret = uclass_find_first_device(UCLASS_SPI_FLASH, &dev);

Adding probe of UCLASS_SPI_FLASH should be in the next patch:

[U-Boot,v3,044/108] x86: Adjust mrccache_get_region() to support get_mmap()

> +       if (ret)
> +               return log_msg_ret("Cannot find SPI flash\n", ret);
> +       ret = dev_read_u32_array(dev, "memory-map", reg, 2);
> +       if (ret)
> +               return log_msg_ret("Cannot find memory map\n", ret);
>         entry->base = reg[0];
>
>         /* Find the place where we put the MRC cache */
> -       mrc_node = fdt_subnode_offset(blob, node, "rw-mrc-cache");
> -       if (mrc_node < 0) {
> -               debug("%s: Cannot find node\n", __func__);
> -               return -EPERM;
> -       }
> +       mrc_node = dev_read_subnode(dev, "rw-mrc-cache");
> +       if (!ofnode_valid(mrc_node))
> +               return log_msg_ret("Cannot find node", -EPERM);
>
> -       if (fdtdec_get_int_array(blob, mrc_node, "reg", reg, 2)) {
> -               debug("%s: Cannot find address\n", __func__);
> -               return -EINVAL;
> -       }
> +       ret = ofnode_read_u32_array(mrc_node, "reg", reg, 2);
> +       if (ret)
> +               return log_msg_ret("Cannot find address", ret);
>         entry->offset = reg[0];
>         entry->length = reg[1];
>
> -       if (devp) {
> -               ret = uclass_get_device_by_of_offset(UCLASS_SPI_FLASH, node,
> -                                                    devp);
> -               debug("ret = %d\n", ret);
> -               if (ret)
> -                       return ret;
> -       }
> +       if (devp)
> +               *devp = dev;
>
>         return 0;
>  }
> @@ -257,6 +251,9 @@ int mrccache_save(void)
>               gd->arch.mrc_output_len);
>
>         ret = mrccache_get_region(&sf, &entry);
> +       if (ret)
> +               goto err_entry;
> +       ret = device_probe(sf);

This needs a comment as we discussed in v2, or maybe it should also go
into next patch?

>         if (ret)
>                 goto err_entry;
>         data  = (struct mrc_data_container *)gd->arch.mrc_output;
> --

Regards,
Bin


More information about the U-Boot mailing list