[RFC] ARM: dma_map|unmap_sg plus iommu

Ramirez Luna, Omar omar.ramirez at ti.com
Mon Aug 8 11:04:58 EDT 2011


Hi,

On Fri, Jul 29, 2011 at 2:50 AM, Marek Szyprowski
<m.szyprowski at samsung.com> wrote:
>> 1. There is no way to keep track of what virtual address are being mapped
>> in the scatterlist, which we need to propagate to the dsp, in order that it
>> knows where does the buffers start and end on its virtual address space.
>> I ended up adding an iov_address to scatterlist which if accepted should be
>> toggled/affected by the selection of CONFIG_IOMMU_API.
>
> Sorry, but your patch is completely wrong. You should not add any additional
> entries to scatterlist.

At the time it was the easiest way for me to keep track of both
virtual and physical addresses, without doing a page_to_phys every
time on unmap. I understand that it might fall out of the scope of the
scatterlist struct.

> dma_addr IS the virtual address in the device's io
> address space, so the dma_addr is a value that your device should put into
> it's own registers to start dma transfer to provided memory pages.

I also wanted to keep the same part as the original arm_dma_map_sg:

s->dma_address = __dma_map_page...

Where the dma_address was the "clean" (from cache) physical address.
But if desired, I guess this value can be replaced for the iommu va.

>> 2. tidspbridge driver sometimes needs to map a physical address into a
>> fixed virtual address (i.e. the start of a firmware section is expected to
>> be at dsp va 0x20000000), there is no straight forward way to do this with
>> the dma api given that it only expects to receive a cpu_addr, a sg or a
>> page, by adding iov_address I could pass phys and iov addresses in a sg
>> and overcome this limitation, but, these addresses belong to:
>
> We also encountered the problem of fixed firmware address. We addressed is by
> setting io address space start to this address and letting device driver to
> rely on the fact that the first call to dma_alloc() will match this address.

Indeed, however in my case, I need sections at (I might have
approximated the numbers to the real ones):

0x11000000 for dsp shared memory
0x11800000 for peripherals
0x20000000 for dsp external code
0x21000000 for mapped buffers

The end of a section and start of the other usually have a gap, so the
exact address needs to be specified by the firmware. So, this won't
work with just letting the pool manager to provide the virtual
address.

>>   2a. Shared memory between ARM and DSP: this memory is allocated through
>>       memblock API which takes it out of kernel control to be later
>>       ioremap'd and iommu map'd to the dsp (this because a non-cacheable
>>       requirement), so, these physical addresses doesn't have a linear
>>       virtual address translation, which is what dma api expects.
>
> I hope that the issue with page cache attributes can be resolved if we always
> allocate memory from CMA (see the latest CMAv12 patches:
> http://www.spinics.net/lists/linux-media/msg35674.html )

I'll take a look more closely and will be trying them if possible.

>>   2b. Bus addresses: of dsp peripherals which are also ioremap'd and
>>       affected by the same thing.
>
> Right now I have no idea how to handle ioremapped areas in dma-mapping
> framework, but do we really need to support them?

It would be good to know if this is expected to be handled by
dma-mapping, otherwise it can be dealt by iommu api as Joerg pointed
out.

Thanks for your comments,

Omar



More information about the linux-arm-kernel mailing list