Hello Konrad, On Wed, May 18, 2011 at 5:40 PM, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> wrote: > On Wed, May 18, 2011 at 05:03:41PM +0200, Leon Woestenberg wrote: >> On Wed, May 18, 2011 at 4:41 PM, Konrad Rzeszutek Wilk >> <konrad.wilk@xxxxxxxxxx> wrote: >> > On Wed, May 18, 2011 at 03:02:30PM +0200, Leon Woestenberg wrote: >> >> >> >> memory allocated with pci_alloc_consistent() returns the (kernel) >> >> virtual address and the bus address (which may be different from the >> >> physical memory address). >> >> >> >> What is the correct implementation of the driver mmap (file operation >> >> method) for such memory? >> > >> >> I could not find PCI driver examples calling vm_insert_page() and I am >> know I can trip into the different memory type pointers easily. > > ttm_bo_vm.c ? > fb_defio.c ? > None of which use pci/dma_alloc_consistent(). Obviously, I have no complete understanding of the Linux memory management subsystem, and the info on vm_insert_page() is rather shallow in the case of pci_alloc_consistent(). http://lxr.linux.no/#linux+v2.6.38/mm/memory.c#L1789 1789 update_mmu_cache(vma, addr, pte); /* XXX: why not for insert_page? */ I tried this: static int buffer_mmap(struct file *file, struct vm_area_struct *vma) { ... /* pages must not be cached as this would result in cache line sized accesses to the end point */ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); /* VM_RESERVED: prevent the pages from being swapped out */ vma->vm_flags |= VM_RESERVED; vma->vm_private_data = file->private_data; /* vaddr is the (virtual) address returned by pci_alloc_consistent(); * vsize is the corresponding size */ start = vma->vm_start; /* size is page-aligned */ while (vsize > 0) { printk(KERN_DEBUG "vaddr = %p\n", lro_char->engine->ringbuffer_virt); printk(KERN_DEBUG "start = %p\n", start); struct page *page = virt_to_page(vaddr); printk(KERN_DEBUG "page = %p\n", page); printk(KERN_DEBUG "vm_insert_page(...0x%08lx)\n", (unsigned long)vaddr); /* insert the given page into vma, mapped at the given start address */ err = vm_insert_page(vma, start, page); if (err) { printk(KERN_DEBUG "vm_insert_page()\n"); return err; } start += PAGE_SIZE; vaddr += PAGE_SIZE; vsize -= PAGE_SIZE; } return 0; } which hard crashes my system. Any ideas on a generic function that mmap() pci_alloc_consistent() memory to user space? Thanks, -- Leon -- 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