:: Re: [maemo-leste] [PATCH] Revert "m…
Top Page
Delete this message
Reply to this message
Author: Pali Rohár
Date:  
To: Faiz Abbas
CC: Peng Fan, u-boot@lists.denx.de, maemo-leste@lists.dyne.org
Subject: Re: [maemo-leste] [PATCH] Revert "mmc: disable UHS modes if Vcc cannot be switched on and off"
Ivo found workaround for this issue. I will send a patch for it.

On Friday 25 September 2020 00:03:24 Pali Rohár wrote:
> Hello Faiz! Do you need any other details for this issue?
>
> On Friday 14 August 2020 22:16:00 Pali Rohár wrote:
> > On Tuesday 11 August 2020 18:27:23 Pali Rohár wrote:
> > > On Tuesday 11 August 2020 21:33:19 Faiz Abbas wrote:
> > > > Pali,
> > > >
> > > > On 11/08/20 1:19 pm, Pali Rohár wrote:
> > > > > On Tuesday 11 August 2020 08:39:24 Faiz Abbas wrote:
> > > > >> Pali, Peng,
> > > > >>
> > > > >> On 10/08/20 6:25 am, Peng Fan wrote:
> > > > >>> Faiz, Jean
> > > > >>>
> > > > >>>> Subject: [PATCH] Revert "mmc: disable UHS modes if Vcc cannot be switched
> > > > >>>> on and off"
> > > > >>>
> > > > >>> Got time to take a look?
> > > > >>>
> > > > >>
> > > > >> When this issue was reported in the last thread, Pali said that he was unable to get
> > > > >> prints because of the constant reboot loops? Shouldn't it be easy to put while(1)
> > > > >> at different points in this execution and see which step causes the reboot loop?
> > > > >
> > > > > In May in that last thread I wrote details which I was able to gather:
> > > > >
> > > > >     Month ago I was able to detect that problem is somewhere in function
> > > > >     mmc_set_ios() from mmc.c file. I put long debug line prior and also
> > > > >     after mmc_set_ios() call. And it was printed only prior. Not after.
> > > > >     So I think NULL pointer dereference is in mmc_set_ios() function.

> > > > >
> > > > > I could try with that while(1) loop to print detailed log message and
> > > > > read/capture it. But what information for debugging you need? Or what do
> > > > > you want to print which could help you?
> > > > >
> > > >
> > > > You can continue to bisect into omap_hsmmc_set_ios() to see at what point the NULL pointer
> > > > gets triggered and what the NULL pointer is.
> > >
> > > I could try it, but I do not think I would be able to gather more data.
> > > I will try to find free time for this debugging on device either at the
> > > end of this week or end of next week.
> >
> > Here are more details. Crash is in omap_hsmmc_stop_clock() function when
> > trying to dereference mmc_base->sysctl.
> >
> > Call trace is:
> >
> > mmc_set_ios --> mmc->cfg->ops->set_ios --> omap_hsmmc_set_ios --> omap_hsmmc_stop_clock
> >
> > I applied following diff
> >
> > diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
> > index 715eee0e3e..d4bbfd7b97 100644
> > --- a/drivers/mmc/omap_hsmmc.c
> > +++ b/drivers/mmc/omap_hsmmc.c
> > @@ -22,6 +22,8 @@
> > * MA 02111-1307 USA
> > */
> >
> > +#define DEBUG
> > +
> >  #include <config.h>
> >  #include <common.h>
> >  #include <cpu_func.h>
> > @@ -1335,7 +1337,16 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
> >  #endif
> >  static void omap_hsmmc_stop_clock(struct hsmmc *mmc_base)
> >  {
> > +    debug("omap_hsmmc_stop_clock: before writel\n");
> > +    debug("mmc_base=%p\n", mmc_base);
> > +    debug("barrier\n");
> > +    asm volatile ("");
> > +    debug("mmc_base->sysctl=%x\n", mmc_base->sysctl);
> > +    debug("barrier\n");
> > +    asm volatile ("");
> > +    debug("readl(&mmc_base->sysctl)=%x\n", readl(&mmc_base->sysctl));
> >      writel(readl(&mmc_base->sysctl) & ~CEN_ENABLE, &mmc_base->sysctl);
> > +    debug("omap_hsmmc_stop_clock: after writel\n");
> >  }

> >
> > static void omap_hsmmc_start_clock(struct hsmmc *mmc_base)
> >
> > and I see that first word "barrier" is written. There is no
> > "mmc_base->sysctl=" string on output display.
> >
> > If you are interested, mmc_base has value 480b4000.
> >
> > That is probably all what I can do.
> >
> > > As I wrote in previous thread, main issue which makes it hard to debug
> > > is that this error is not triggered in emulator.
> > >
> > > > Also can you point to your config file?
> > >
> > > I'm using standard config file without any modifications. It is:
> > > configs/nokia_rx51_defconfig
> > >
> > > In case you are interested, I'm compiling u-boot by commands:
> > >
> > > export ARCH=arm
> > > export CROSS_COMPILE=arm-linux-gnueabi-
> > > make nokia_rx51_config
> > > make -j12 u-boot.bin