Problems with DMA on Genode+NOVA

Christian Menard Christian.Menard at ...250...
Mon Jul 7 13:47:46 CEST 2014


Hi, 

Thanks for your fast and detailed answers. I compiled the 64-bit version and 
DMA is working now. I think a switch to 64-bit is generally the better idea, 
but somehow I didn't think of that.

Christian

On Monday 07 July 2014 13:26:38 Norman Feske wrote:
> Hi Christian
> 
> welcome to the mailing list!
> 
> > I'm trying to run Genode+NOVA on a Panasonic Toughpad FZ-M1. I'm new to
> > Genode but thanks to documentation and good coding style I came along
> > pretty good so far. However, I ran into a problem with DMA.
> > 
> > I tried to run the AHCI driver, but whenever the driver issued the first
> > SATA- command, the hardware failed because it was not able to read from
> > the specified DMA address. After I enabled IOMMU by adding
> > 'pci_device_pd' to my modules, I got the message "[init -> acpi ->
> > pci_drv -> oci_device_pd] attachment of DMA memory @ cb48c000+1000
> > failed".
> > 
> > I investigated more into the memory allocation process. As far as I
> > understand it, the method 'alloc_dma_buffer' of the PCI session first
> > allocates a dataspace in physical memory. Then it tries to attach this
> > dataspace as a region to the driver's virtual address space. Thereby it
> > enforces the virtual address to be equal to the physical address. So the
> > allocator  searches for a free block that contains that virtual address.
> > But in my case it doesn't find a free block.
> 
> Your analysis is very good. The problem is that the allocation of the
> DMA buffer returned a very high physical address (above 0xc000000). So
> when the device PD tries to create a 1:1 mapping for this block, it
> attempts to create a mapping to the corresponding virtual address. But
> the NOVA kernel preserves all virtual addresses above 0xc0000000 for the
> kernel. Because Genode's core is aware of this constraint, it excludes
> the address range above 0xc0000000 from the virtual-memory allocators
> (that is maintained per process). This problem is related to the
> following issue:
> 
>   https://github.com/genodelabs/genode/issues/1045
> 
> There three possible ways to cope with the problem:
> 
> * As a work-around, we could remove all physical memory above 0xc0000000
>   from core's physical-memory allocator. But that would be a pity
>   because Genode could not use all the memory of your system.
> 
> * You could use NOVA on 64 bit instead of 32 bit. Here, the kernel's
>   virtual address space won't interfere with the physical memory address
>   space.
> 
> * We could add a constraint to Genode's RAM sessions to enable a RAM
>   client to specify a physical memory range from where the allocations
>   should come from. So the PCI/ACPI driver would then limit this range
>   to 0x00000000 - 0xbfffffff. This approach would solve your problem as
>   well as the issue cited above.
> 
> I think the quickest way forward would be to switch to 64 bit. Would
> that be feasible for you?
> 
> > Do you have any ideas on how to resolve this issue? What I don't
> > understand is why physical and virtual address of the dma buffer should
> > be equal. Shouldn't there by some mechanism that ensures that there is a
> > free block that contains the DMA address before the DMA buffer is
> > allocated in physical memory?
> > 
> > Tell me if you need any specification on the device. I would like to print
> > the full Log here, but unfortunately I have no serial interface, I am
> > only able to use a vga console.
> 
> Does you platform support Intel AMT by any chance? It would be
> worthwhile to use it.
> 
> Btw, are you located in Dresden? If yes, you are very welcome to drop by
> at our office - e.g., if you like us to assist you with setting up AMT.
> 
> Cheers
> Norman





More information about the users mailing list