Re: equivalent of phys_to_virt in an iommu system

From: Clemens Ladisch
Date: Fri Jan 28 2011 - 04:39:49 EST


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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/