[U-Boot] [PATCH] spi: Fix manual relocation calling more times

Simon Goldschmidt simon.k.r.goldschmidt at gmail.com
Tue Sep 17 12:43:37 UTC 2019


On Tue, Sep 17, 2019 at 1:22 PM Michal Simek <michal.simek at xilinx.com> wrote:
>
> From: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com>
>
> When two instances of AXI QSPI with flash are added and tested
> simultaneously the spi driver operations are relocated twice.
> As a result code is accessing addresses outside of RAM when
> relocated second time which is causing a crash.
>
> Tested on Microblaze.
>
> Similar change was done in past by:
> commit f238b3f0fbc9 ("watchdog: dm: Support manual relocation for watchdogs")
> commit 2588f2ddfd60 ("dm: sf: Add support for all targets which requires MANUAL_RELOC")
> commit 1b4c2aa25bdf ("gpio: dm: Support manual relocation for gpio")
>
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>
>  drivers/spi/spi-uclass.c | 34 +++++++++++++++++++---------------
>  1 file changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c
> index 88cb2a126227..6d63006d186c 100644
> --- a/drivers/spi/spi-uclass.c
> +++ b/drivers/spi/spi-uclass.c
> @@ -129,21 +129,25 @@ static int spi_post_probe(struct udevice *bus)
>  #endif
>  #if defined(CONFIG_NEEDS_MANUAL_RELOC)
>         struct dm_spi_ops *ops = spi_get_ops(bus);
> -
> -       if (ops->claim_bus)
> -               ops->claim_bus += gd->reloc_off;
> -       if (ops->release_bus)
> -               ops->release_bus += gd->reloc_off;
> -       if (ops->set_wordlen)
> -               ops->set_wordlen += gd->reloc_off;
> -       if (ops->xfer)
> -               ops->xfer += gd->reloc_off;
> -       if (ops->set_speed)
> -               ops->set_speed += gd->reloc_off;
> -       if (ops->set_mode)
> -               ops->set_mode += gd->reloc_off;
> -       if (ops->cs_info)
> -               ops->cs_info += gd->reloc_off;
> +       static int reloc_done;

So with CONFIG_NEEDS_MANUAL_RELOC, we don't support multiple
(differen) spi (or watchdog, sf, gpio) drivers?

Regards,
Simon

> +
> +       if (!reloc_done) {
> +               if (ops->claim_bus)
> +                       ops->claim_bus += gd->reloc_off;
> +               if (ops->release_bus)
> +                       ops->release_bus += gd->reloc_off;
> +               if (ops->set_wordlen)
> +                       ops->set_wordlen += gd->reloc_off;
> +               if (ops->xfer)
> +                       ops->xfer += gd->reloc_off;
> +               if (ops->set_speed)
> +                       ops->set_speed += gd->reloc_off;
> +               if (ops->set_mode)
> +                       ops->set_mode += gd->reloc_off;
> +               if (ops->cs_info)
> +                       ops->cs_info += gd->reloc_off;
> +               reloc_done++;
> +       }
>  #endif
>
>         return 0;
> --
> 2.17.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list