> I am writing a driver to map a PCI board memory space (pcibar2) into a > user-space vma via 'mmap'. What is the relationship between the address > returned from ioremap and the type of address needed in the > 'io_remap_page_range' or 'remap_pfn_range' functions? How about the > following? (I am developing under RHEL4 and a 2.6.9 kernel)
There is no relationship between the address returned from ioremap and what you pass into io_remap_page_range(). ioremap gives you a kernel virtual address for the PCI address you remap. io_remap_page_range() creates a userspace mapping in the same way, and you should pass in the PCI address exactly the same way you pass in the PCI address into ioremap. io_remap_pfn_range() takes a PFN ("page frame number"), which is basically the PCI address you want to map divided by PAGE_SIZE. The main reason for using PFNs is that they allow you to map addresses above 4G even if sizeof long is only 4. In your code: > dev.pcibar2 = ioremap_nocache(resource,size); > dev.region_start = dev.pcibar2 + offset; // RAM is at some offset > from base This gives you a kernel mapping that you can use with readl(), writel() etc to access the PCI memory from the kernel. To map to userspace, this: > if (io_remap_page_range(vma, phyaddr, vma->vm_start, vsize, > vma->vm_page_prot)) should use phyaddr as you have it here: > // phyaddr = physical address of PCI memory area This is just wrong: > unsigned long phy = __pa(dev->region_start + off); __pa() doesn't work on addresses returned from ioremap. Just use the same resource address you passed into ioremap. - R. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/