Re: About IO server settings for DMA in L4Linux
Adam Lackorzynski <[email protected]>
| Newsgroups | gmane.comp.micro-kernel.l4.devel |
|---|---|
| Message-ID | <[email protected]> |
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: > 1. The above result seems not reasonable. Do you have any idea? > 2. 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. > 3. 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 -- Adam [email protected] Lackorzynski http://os.inf.tu-dresden.de/~adam/ _______________________________________________ l4-hackers mailing list [email protected] http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers