marvell kirkwood / openrd-base kernel freeze on bootup with PICe->PCI bridge
Dieter Kiermaier
dk-arm-linux at gmx.de
Tue Nov 3 09:36:20 EST 2009
Some news, but allready no solution...
>
> > For Kirkwood, the registers physical addresses start at 0xF1000000
> > (KIRKWOOD_REGS_PHYS_BASE ). so the physical address that you need to
> > pass to ioremap is 0xf1020100. alternatley, you can use the existing
> > virtual mapping of the register that defined by
> > KIRKWOOD_REGS_VIRT_BASE, so just use: readl(KIRKWOOD_REGS_VIRT_BASE |
> > 0x20100)
> >
> > saeed
>
> thanks for the help.
>
> ok - now I'm able to read the register:
> register 0x20100: 3fb8
>
> So it looks like bit 2 isn't set. That's what Ronen wanted me to have a look for.
>
> Hopefully someone has any further suggestions?
>
> Dieter
I've tracked down the now until pci_setup_device() in drivers/pci/probe.c
if I do something like:
#if 0
case PCI_HEADER_TYPE_BRIDGE: /* bridge header */
if (class != PCI_CLASS_BRIDGE_PCI)
goto bad;
/* The PCI-to-PCI bridge spec requires that subtractive
decoding (i.e. transparent) bridge must have programming
interface code of 0x01. */
pci_read_irq(dev);
dev->transparent = ((dev->class & 0xff) == 1);
pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
set_pcie_hotplug_bridge(dev);
break;
#endif
everything except my pcie->pci bridge seems to work fine.
So I looks like that's a problem with only pcie->pci bridges (or pci bridges more general)?
Is this possible or do I complete understand something wrong?
Could someone please try to reproduce this on a marvell or at least an arm platform?
Many, many thanks,
Dieter
>
> >
> >
> > On Thu, Oct 29, 2009 at 5:16 PM, Russell King - ARM Linux
> > <linux at arm.linux.org.uk> wrote:
> > > On Thu, Oct 29, 2009 at 05:11:02PM +0200, Dieter Kiermaier wrote:
> > >> Am Donnerstag 29 Oktober 2009 12:33:03 schrieb Ronen Shitrit:
> > >> > Sorry I don't have experience with the OpenOCD.
> > >> > Any way by using the printk hack, u can simply read the register and print it...
> > >>
> > >> I fear I need any further help:
> > >>
> > >> I've tried to read the register you told me but now I get an oops:
> > >> <1>Unable to handle kernel paging request at virtual address 40020100
> > >> <1>pgd = c0004000
> > >> <1>[40020100] *pgd=00000000
> > >> <0>Internal error: Oops: 5 [#1] PREEMP
> > >>
> > >> My code to read the register is:
> > >> #include <asm/io.h>
> > >> printk("register 0x20100: %x\n", readl(virt_to_phys(0x20100)))
> > >>
> > >> also a
> > >> printk("register 0x20100: %x\n", readl(0x20100));
> > >> fail with an Ooops :(
> > >>
> > >> What am I doing wrong here?
> > >
> > > 1. virt_to_phys() is only valid for the kernel memory region in the
> > > virtual address space. 0x20100 is not within such a region.
> > >
> > > 2. readl() takes an offsettable cookie representing the location you
> > > want to access. (you get this cookie via ioremap of a bus address
> > > or via a platform defined constant.) Practially (for most existing
> > > implementations but not all) it is a virtual address.
> > >
> > > Assuming 0x20100 is the physical address of the register, you should be
> > > able to read it like this:
> > >
> > > void __iomem *base = ioremap(0x20100, 4);
> > > if (base)
> > > printk("register 0x20100: %x\n", readl(base));
> > > iounmap(base);
> > >
> > > _______________________________________________
> > > linux-arm-kernel mailing list
> > > linux-arm-kernel at lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> > >
> >
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
More information about the linux-arm-kernel
mailing list