linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: dave.martin@linaro.org (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: Mismatched aliases with DMA mappings?
Date: Mon, 8 Oct 2012 11:06:46 +0100	[thread overview]
Message-ID: <20121008100646.GB2302@linaro.org> (raw)
In-Reply-To: <5071290A.6030902@samsung.com>

On Sun, Oct 07, 2012 at 09:02:34AM +0200, Marek Szyprowski wrote:
> Hello,
> 
> I'm sorry for very late response but I was busy with other urgent
> items after getting back from holidays.
> 
> On 9/24/2012 11:52 AM, Dave Martin wrote:
> >On Sat, Sep 22, 2012 at 02:22:07PM +0900, Kyungmin Park wrote:
> 
> >>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);
> >>        }
> >>}
> >
> >OK, so it looks like this is done early and can't happen after the
> >kernel has booted (?)
> 
> Right, the changes in the linear mapping for CMA areas are done very
> early to make sure that the proper mapping will be available for all
> processes in the system (CMA changes the size of the pages used for
> holding low memory linear mappings from 1MiB/2MiB 1-level sections
> to 4KiB pages which require 2 levels of pte). Once the kernel has
> fully started it is not (easily) possible to alter the linear
> mappings.
> 
> >Do you know whether the linear alias for DMA memory is removed when
> >not using CMA?
> 
> Nope, when standard page_alloc() implementation of dma mapping is
> used there exist 2 mappings for each allocated buffer: one in linear
> low memory kernel mapping (cache'able) and the second created by the
> dma-mapping subsystem (non-cache'able or writecombined). Right now
> no one observed any issues caused by such situation assuming that no
> process is accessing linear cache'able lowmem mappings when dma
> non-cache'able mapping exist.

Thanks, that clarifies my understanding.

Eventually, I decided it was not worth attempting to allocate non-
cacheable memory for my case, and I use normal memory with explicit
maintenance instead.  This is a little more cumbersome, but so far
it appears to work.

Cheers
---Dave

      reply	other threads:[~2012-10-08 10:06 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-21 15:21 Mismatched aliases with DMA mappings? Dave Martin
2012-09-22  5:22 ` Kyungmin Park
2012-09-24  9:52   ` Dave Martin
2012-10-07  7:02     ` Marek Szyprowski
2012-10-08 10:06       ` Dave Martin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121008100646.GB2302@linaro.org \
    --to=dave.martin@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).