On Tue, Sep 17, 2019 at 1:22 PM Michal Simek <michal.si...@xilinx.com> wrote: > > From: Ashok Reddy Soma <ashok.reddy.s...@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.s...@xilinx.com> > Signed-off-by: Michal Simek <michal.si...@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@lists.denx.de > https://lists.denx.de/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot