Messages in this thread | | | Date | Thu, 30 Aug 2001 16:06:51 -0700 (PDT) | Subject | Re: [UPDATE] 2.4.10-pre2 PCI64, API changes README | From | "David S. Miller" <> |
| |
From: Gerd Knorr <kraxel@bytesex.org> Date: 30 Aug 2001 12:34:11 GMT
These days I tried what happens if I start a PCI->PCI transfer this way: Open the framebuffer device, mmap the framebuffer memory, then ask bttv to blit one video frame to the framebuffer by passing the pointer of the fb mapping to bttv's read() function.
Didn't work, looks like map_user_buf can deal with main memory only, but not with I/O memory. It gave me NULL pointers in the iobuf page list.
Right.
Is there any way (portable) way to deal with this situation? I'd expect I can get the physical address for the I/O memory by walking the page tables, but then I'd have to translate that to a bus address somehow. How PCI->PCI transfers are handled on architectures with a iommu? Do I need a iommu entry for them?
Not currently. Note that just using that physical address you'd find in the page tables might not even work on many platforms. And anyways, the DMA-mapping.txt document is pretty clear that of what types of memory can be passed in to get DMA mappings for.
You _REALLY_ need to know the PCI device in question before you can properly and portably set up a PCI peer to peer transfer. We have no API for this yet though.
When such an API would be created, it would take two PCI_DEV structs, and it would possibly fail. On sparc64 for example, it is not possible to PCI peer-to-peer DMA between two PCI devices behind different PCI controllers, it simply doesn't work.
Later, David S. Miller davem@redhat.com - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |