[U-Boot] [PATCH] spi: Fix manual relocation calling more times
Michal Simek
michal.simek at xilinx.com
Fri Sep 20 08:45:09 UTC 2019
On 20. 09. 19 10:26, Simon Goldschmidt wrote:
>
>
> Michal Simek <michal.simek at xilinx.com <mailto:michal.simek at xilinx.com>>
> schrieb am Fr., 20. Sep. 2019, 10:17:
>
> On 19. 09. 19 16:35, Simon Goldschmidt wrote:
> >
> >
> > Michal Simek <michal.simek at xilinx.com
> <mailto:michal.simek at xilinx.com> <mailto:michal.simek at xilinx.com
> <mailto:michal.simek at xilinx.com>>>
> > schrieb am Do., 19. Sep. 2019, 16:22:
> >
> > On 17. 09. 19 14:53, Simon Goldschmidt wrote:
> > > On Tue, Sep 17, 2019 at 2:48 PM Michal Simek
> > <michal.simek at xilinx.com <mailto:michal.simek at xilinx.com>
> <mailto:michal.simek at xilinx.com <mailto:michal.simek at xilinx.com>>>
> wrote:
> > >>
> > >> On 17. 09. 19 14:43, Simon Goldschmidt wrote:
> > >>> On Tue, Sep 17, 2019 at 1:22 PM Michal Simek
> > <michal.simek at xilinx.com <mailto:michal.simek at xilinx.com>
> <mailto:michal.simek at xilinx.com <mailto:michal.simek at xilinx.com>>>
> wrote:
> > >>>>
> > >>>> From: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com
> <mailto:ashok.reddy.soma at xilinx.com>
> > <mailto:ashok.reddy.soma at xilinx.com
> <mailto: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 <mailto:ashok.reddy.soma at xilinx.com>
> > <mailto:ashok.reddy.soma at xilinx.com
> <mailto:ashok.reddy.soma at xilinx.com>>>
> > >>>> Signed-off-by: Michal Simek <michal.simek at xilinx.com
> <mailto:michal.simek at xilinx.com>
> > <mailto:michal.simek at xilinx.com <mailto: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?
> > >>
> > >> If you look at commits above you will see that several
> subsystems
> > >> support multiple instances already.
> > >> We can check others as well.
> > >
> > > I have looked at the commits above, that's why I ask. To me,
> this code
> > > relocates the ops of the device called first. If a second device
> > has different
> > > ops, it won't get relocated, or am I wrong?
> > >
> > > Given your other similar commits that were already accepted, I
> > don't want to
> > > hold this one, but I still would like to understand.
> >
> > I think you are right. It should be called once per driver and
> after
> > relocation. That means that this should be the part variable
> should be
> > the part of every ops and there should be also handling in
> connection to
> > bind/unbind method.
> > On microblaze which is one architecture common systems only
> one driver
> > is in place that's why none has found any issue with it.
> >
> > Let me play with this a little bit to see if we can setup
> system with
> > also bind/unbind to see how this is exactly working.
> >
> >
> > Right, that's what I came to when thinking about it again. That
> way, it
> > could even be the framework that relocates all ops...
>
> Framework is doing it already but we should do it without static
> variable.
>
>
> Right, it's done in the UCLASSes. What I meant was it could already be
> done in the core DM framework.
DM framework could call it and we can get it out of post_probe functions
but still actual relocation should be likely done in uclasses because
every device type has different ops.
Thanks,
Michal
More information about the U-Boot
mailing list