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