On Mon Dec 12, 2016 at 11:39:52 +0000, Jesse-SC Chou (周書正) wrote:
However, I've got a very strange virtual memory to physical mapping without the flag "Io.Hw_device_DF_dma_supported". On my platform, the memory physical memory is at "0x20000000 ~ 0x27FFFFFF". When without the flag "Io.Hw_device_DF_dma_supported", the dma_alloc_coherent() give me a physical address "0x05a2d000". This is not a reasonable physical memory address. When adding the flag "Io.Hw_device_DF_dma_supported" to DEVICE1, the dma_alloc_coherent() give me a physical address "0x2502d000". This is a reasonable physical memory address.
I traced into dma_alloc_coherent(), finally it will call to l4x_virt_to_phys(). I printed out the content of v2p_for_each(i) data structure:
Without "Io.Hw_device_DF_dma_supported" in DEVICE1: (the physical address is not correct)
i->virt=0x02000000 i->phys=0x02000000 i->size=48f000 i->virt=0x02600000 i->phys=0x02600000 i->size=4000000 i->virt=0x06604000 i->phys=0x060c0000 i->size=40000 i->virt=0x06732000 i->phys=0x05a2d000 i->size=1000
With "Io.Hw_device_DF_dma_supported" in DEVICE1: (the physical address is reasonable)
i->virt=0x02000000 i->phys=0x2017c000 i->size=48f000 i->virt=0x02600000 i->phys=0x21c00000 i->size=4000000 i->virt=0x06604000 i->phys=0x256c0000 i->size=40000 i->virt=0x06732000 i->phys=0x2502d000 i->size=1000
The result seems the v2p mapping is wrong when without "Io.Hw_device_DF_dma_supported".
Ok, thanks for debugging this. Mixup of versions on my side, you need the flag.
I have the following questions:
- The above result seems not reasonable. Do you have any idea?
- I also noticed that in arm_dma_alloc(), l4x_dmapool_mem_alloc() is wrapped by "CONFIG_L4_DMAPOOL". Is "CONFIG_L4_DMAPOOL" mandatory?
CONFIG_L4_DMAPOOL is for some different use case, do not enable it.
- If "CONFIG_L4_DMA_POOL" is optional, arm_dma_alloc() will call "__dma_alloc(dev, size, handle, gfp, prot, false, attrs, __builtin_return_address(0))".
the 6th argument is "false". Does it mean the dma_alloc_coherent() in L4Linux always return a non-coherent DMA region? That is, we have to handle the cache issue by myself.
There's arm_coherent_dma_alloc() too. I think both variants are there and are used as required. L4Linux has the cache-handling functionality and Linux code will use it as required. I'm not aware of any issues in this area.
Adam