Re: can't access PCIe card under sbc8548
From: Scott Wood <hidden>
Date: 2013-05-30 16:29:31
On 05/29/2013 10:42:01 PM, wolfking wrote:
hi, all I'm doing some developing on the windriver's sbc8548 board. The =20 kernel I use is 3.6.10 and the u-boot version is 2012-10. I changed the board's configuration: the board now boot from the 64MB SODIMM Flash (not the default 8MB =20 on-board Flash memory), and the PCI clock rate is changed to 33MHZ. Now the trouble I am in is that: the PCI card (a NIC card rtl8139) =20 can be accessed OK, while the PCIe card can't work, that is, the kernel can't access its internal register. The kernel can correctly probe the PCIe card. =20 its BAR0 is a I/O mapped register, I use ioport_map to map the BAR0 to kernel's address space, then use ioread8/iowrite8 to access its internal register, it =20 doesn't work.
In what specific way does it not work?
I analyse the ioport_map function and find it just add the input =20
parameter
to
a fixed _IO_BASE value, below is the function:
void __iomem *ioport_map(unsigned long port, unsigned int len)
{
return (void __iomem *) (port + _IO_BASE);
}
the _IO_BASE value under sbc8548 is 0xfd7fd000, the value of =20
ioport_map
paramenter
"port" is 0xfefff000. Obviously the add overflows, so the follow-up
operations
can't succeed.Why can't it succeed? Is there nothing mapped at 0xfc7fc000?
The value of "port" is got from the function pci_resource_start. So I guess the kernel allocate a bad address to this PCIe card. How =20 can I fix this? I also plug this PCIe card into a freescale's board mpc8641-hpcn, =20 try the same driver, I noticed ioport_map also meet overflow, but it does work fine.
So don't focus on the overflow, but rather on the actual breakage. -Scott=