Thread (21 messages) 21 messages, 4 authors, 2013-06-08

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=
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help