Mismatched aliases with DMA mappings?
Kyungmin Park
kmpark at infradead.org
Sat Sep 22 01:22:07 EDT 2012
Hi Dave,
Marek is on vacation and will back 24 Sep. he will explain it in detail.
I just show how CMA addresses mismatched aliases codes.
In reserve function, it declares the require memory size with base
address. At that time it calles 'dma_contiguous_early_fixup()'. it
just registered address and size.
void __init dma_contiguous_early_fixup(phys_addr_t base, unsigned long size)
{
dma_mmu_remap[dma_mmu_remap_num].base = base;
dma_mmu_remap[dma_mmu_remap_num].size = size;
dma_mmu_remap_num++;
}
These registerd base and size will be remap at dma_contiguous_remap
function at paging_init.
void __init dma_contiguous_remap(void)
{
int i;
for (i = 0; i < dma_mmu_remap_num; i++) {
phys_addr_t start = dma_mmu_remap[i].base;
phys_addr_t end = start + dma_mmu_remap[i].size;
struct map_desc map;
unsigned long addr;
if (end > arm_lowmem_limit)
end = arm_lowmem_limit;
if (start >= end)
continue;
map.pfn = __phys_to_pfn(start);
map.virtual = __phys_to_virt(start);
map.length = end - start;
map.type = MT_MEMORY_DMA_READY;
/*
* Clear previous low-memory mapping
*/
for (addr = __phys_to_virt(start); addr < __phys_to_virt(end);
addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr));
iotable_init(&map, 1);
}
}
Thank you,
Kyungmin Park
On 9/22/12, Dave Martin <dave.martin at linaro.org> wrote:
> Hi Marek,
>
> I've been trying to understand whether (and if so, how) and DMA buffer
> allocation code in dma-mapping.c avoids mismatched alises in the kernel
> linear map.
>
>
> I need a way of getting some uncached memory for communicating with
> temporarily noncoherent CPUs during CPU bringup/teardown. Although
> the DMA API does not seem quite the right solution for this, nothing
> else currently feels like quite the right solution either. Approaches
> based on memblock_steal() and on using cacheable memory with explicit
> flushing both have problems, and reserving specific physical memory
> via DT seems ugly, because we really don't care where the memory is.
>
> What is needed is something like an ioremap of anonymous memory with
> specific attributes, using largely the same infrastructure as the DMA
> API, but eliminating a mismatched alias of the allocated memory in the
> kernel linear mapping is likely to be important.
>
> Can you explain how the DMA mapping code eliminates mismatched aliases?
> I can see the attributes of new mappings being set, but currently I
> don't see how the linear map gets modified.
>
> Cheers
> ---Dave
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
More information about the linux-arm-kernel
mailing list