Memory mapping PCI memory region to user space

Wyse, Chris chris.wyse at windriver.com
Fri Mar 24 01:21:05 EST 2006


Hi,
 
I'm trying to map a PCI memory region 1 into user space from my driver
(PPC440GX, Linux 2.6.10).  Here's the mmap routine of the driver that
I'm using:
 
 
staticfun
int phob_mmap(struct file *filp, struct vm_area_struct *vma)
{
    struct phob_file *fptr = filp->private_data;
    struct phob_struct *dev = fptr->dev;
    struct phob_region *rptr = &dev->region[1];
    phys_addr_t physAddr;
 

    physAddr = rptr->address + PPC44x_PCIMEM_PAGE;
    if (io_remap_page_range(vma, vma->vm_start,
                            physAddr,
                            rptr->len,
                            vma->vm_page_prot))
        return -EAGAIN;
}


Am I using the correct routine to do this?
 
When I use this routine, the pfn_pte (pgtable.h): 
 
#define pfn_pte(pfn, prot)      __pte(((pfn) << PAGE_SHIFT) |
pgprot_val(prot))
 
macro shifted out the high order bits of the pfn, which I didn't think
was correct, so I changed it to:

#define pfn_pte(pfn, prot)      __pte((((unsigned long long) (pfn)) <<
PAGE_SHIFT) | pgprot_val(prot))
 
For reference, the call stack up to the pfn_pte macro is:
 
remap_pte_range()
remap_pmd_range()
remap_pfn_range()
io_remap_page_range()
 
After changing the macro, the value seems to be saved properly, and the
TLB gets updated properly when I get a TLB miss.  However, when if I try
to write to the PCI from user space, I get an error from do_wp_page()
stating that it is a bogus pfn.  If I try to read from user space, the
processor goes out to lunch and I need to reboot.
 
Am I missing something obvious?  Anyone have any ideas on how to do this
and/or ways to debug it?
 
Thanks.


Chris Wyse
Member of Technical Staff
Embedded Technologies
860-749-1556 office
860-978-0849 cell
413-778-9101 fax
http://www.windriver.com <http://www.windriver.com/> 
  

 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://ozlabs.org/pipermail/linuxppc-embedded/attachments/20060323/722f56ce/attachment.htm 


More information about the Linuxppc-embedded mailing list