can't access PCIe card under sbc8548

Scott Wood scottwood at freescale.com
Fri May 31 02:24:54 EST 2013


On 05/30/2013 07:49:48 AM, wolfking wrote:
> tiejun.chen wrote
> > On 05/30/2013 03:32 PM, wolfking wrote:
> >> (continued)
> >>    I traced the 8139too.c when it uses pci_iomap, the pci_iomap  
> called
> >> the
> >> ioport_map. The difference between 8139 and my PCIe card lies in  
> the
> >> "port" value :
> >> void __iomem *ioport_map(unsigned long port, unsigned int len)
> >> {
> >> 	return (void __iomem *) (port + _IO_BASE);
> >
> > _IO_BASE is equal to isa_io_base. So if this is not zero, I think  
> there's
> > a isa
> > bridge in your platform. So you can access these I/O ports based on  
> that
> > isa
> > bridge/bus with ioreadx/iowritex.
> >
> > I tried ioread8/iowriet8 after ioremap, it doesn't work
> >
> >> }
> >>    in 8139too.c, the "port" value is 0x1000; for my PCIe card, the  
> "port"
> >> value
> >> is 0xfefff000. And the value is got from pci_resource_start. So  
> you see,
> >> the
> >
> > But this means the port is as memory-mapped

Are you sure?  It could mean that it's on a non-primary bus and I/O for  
this bus is mapped at a lower address than the primary.  Just because  
the addition is wrapping around doesn't mean it's wrong.

> > so ioremap() should be workable in this case. Then out_bex/in_bex  
> should be fine.

ioremap() and out_bex/in_bex are not appropriate for PCI I/O regions  
(and presumably that's what it is, if pci_iomap is calling  
ioport_map).  Big-endian is not appropriate for PCI in any case.

The whole point of pci_iomap() appears to be that the driver doesn't  
need to care whether it's MMIO or PIO, and can use ioread/writeX on the  
resulting cookie.  If PPC is messing this up it's not the driver's  
fault.

-Scott


More information about the Linuxppc-dev mailing list