On Fri, Feb 07, 2014 at 05:54:10PM +0000, Jason Gunthorpe wrote: > On Fri, Feb 07, 2014 at 11:46:07AM +0000, Will Deacon wrote: > > > > In practice, there can be various ways that a system requires something > > > more complex: > > > > > > * You can have a memory space range that puts PCI bus address zero > > > at the start of the pci->mem resource. In this case, you have > > > mem_offset = pci->mem.start. We should probably try not to do > > > this, but there is existing hardware doing it. > > > > If it's not the common case, then the generic driver might not need to care > > (at least, initially). > > Something to think about, other people are going to reference this > driver when writing drivers for their own hardware, it would be nice > to see it perfect.. > > AFAIK, the job is fairly simple, when you call pci_add_resource_offset > for memory compute the offset from > of_pci_range.pci_addr - of_pci_range.cpu_addr > > (or is it the other way around ?) I think it's the other way round: bus = cpu - offset, then Arnd's example of PCI bus 0 works out as: 0 = cpu - pci->mem_start. I added that to my driver, but I get some weird looking bus addresses in dmesg: [ 0.307585] pci-arm-generic 40000000.pci: PCI host bridge to bus 0000:00 [ 0.307601] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] [ 0.307615] pci_bus 0000:00: root bus resource [mem 0x00000000-0x3effffff] (bus address [0xffffffffbf000000-0xfffffffffdffffff]) Looking at drivers/pci/probe.c, it seems to think that res->start - offset gives a bus address, which implies that the resources are indeed *CPU* addresses. Are you sure pci_add_resource_offset wants bus addresses? Will -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html