Messages in this thread | | | Date | Fri, 28 Jan 2011 10:32:59 +0100 | From | Clemens Ladisch <> | Subject | Re: equivalent of phys_to_virt in an iommu system |
| |
MJ embd wrote: > Assuming at core mmu there is a mapping, V1 -> P1
Note: It's possible that there are pages for which there is no mapping, e.g., highmem pages; and it's possible for a page to have multiple mappings.
> And at the IOMMU for the device to access a region of DDR there is a > mapping P2 -> P1. [P2 is the address on which device issues a r/w]
P2 is an address on a different bus, in a different address space, so it might be a better idea to call it D1.
> Now the device driver does the following. > > Line 0: V1 = kmalloc(); > Line 1: P2 = dma_map_single(V1) > > Now if later in the driver, there is a requirement to get V1 from P2 > what is the primitive in linux ?
V1;
That is, save the address in a variable. :-)
The DMA mapping functions typically do not save the original virtual address, and there is no API for the reverse mapping.
If you device gives you some status message with nothing but P2, you have to use some other mechanism to find the original virtual address. This depends on how you device's DMA is organized; often, it is possible to store the pointer near the DMA descriptor, or the device has a offset relative to the known start of the buffer.
> Also is my understanding of Line 1(above) correct ?
Yes; P2 is the address that the device must use on _its_ bus.
Regards, Clemens
| |