[U-Boot] Raspberry Pi with driver model
Stephen Warren
swarren at nvidia.com
Tue Nov 25 05:21:24 CET 2014
On 11/24/2014 08:58 AM, Simon Glass wrote:
> Hi Stephen,
>
> There was another thread where you reported a hang when booting
> Raspberry Pi with driver model. It can be repeated by applying this
> patch and trying to boot with syslinux.
>
> http://patchwork.ozlabs.org/patch/392180/
>
> When it hangs, the HDMI display displays lots of spaces, then lots of
> dots, scrolling forever. The serial console displays nothing further.
>
> I narrowed the problem down to writing to address 0. So it is easy to
> repeat with something like 'mw 0 0'.
>
> However I'm really not sure what is going on. Something with driver
> model seems to make address 0 sensitive to writes. I can't see what
> that might be, but I don't understand the platform very well. Do you
> have any ideas?
The problem seems to be that inside pl01x_serial_probe() (well, I assume
all serial functions), dev_get_priv() returns 0, which ends up using
address 0 as the UART address since that's the first field in struct
pl01x_priv.
I found this by amending pl01x_serial_probe() as follows, and dumping
the data after boot:
uint32_t *log = (uint32_t *)(128*1024*1024);
uint32_t log_i = 1;
static int pl01x_serial_probe(struct udevice *dev)
{
struct pl01x_serial_platdata *plat = dev_get_platdata(dev);
struct pl01x_priv *priv = dev_get_priv(dev);
log[log_i++] = (uint32_t)dev;
log[log_i++] = (uint32_t)plat;
log[log_i++] = (uint32_t)priv;
log[0] = log_i;
priv->regs = (struct pl01x_regs *)plat->base;
priv->type = plat->type;
return pl01x_generic_serial_init(priv->regs, priv->type);
}
U-Boot> md.l 0x08000000
08000000: 00000007 07fffaf8 0003972c 00000000 ........,.......
08000010: 1db4e108 1df8372c 00000000 00000000 ....,7..........
It seems a bit odd that pl01x_serial_probe() is called twice, but
perhaps that's expected?
More information about the U-Boot
mailing list