sk.syed2 wrote:
I'm currently trying to port a (currently for unreleased hardware and under nda) driver from x86 to arm and in doing so I've run into a problem with allocating memory using pci_alloc_consistent. Looking into it I can't allocate more than 1MB whereas I need to allocate at least 2MB of contiguous memory. I guess pci_alloc_consistent calls dma_alloc_coherent, so why does it fail to allocate 2MB of memory? What is the error do you see?
Well there is no warning or panic, pci_alloc_consistent returns NULL if I request 2MB. If I change my request to 1MB then it succeeds, everything is allocated correctly and I can use the memory without issues, but of course the device requires 2MB (well 6 buffers all 2MB in size) so it's of no use. If I attempt to request a second 1MB then pci_alloc_consistent also returns NULL for that second allocation. I have looked at the code for dma_alloc_coherent etc and it seems to me that it's returning null because there isn't the space available to allocate the requested memory.
The problem I've run into however is that I get a warning at boot which is:
WARNING: at mm/bootmem.c:672 alloc_arch_preferred_bootmem+0x34/0x64()
You need to call alloc_bootmem at an early stage before slab is initialized.
I was thinking that this might be the problem, but in order to do that I'd have to put the alloc_bootmem in core kernel code wouldn't I? This doesn't seem very appealing.
Is the driver using the memory for DMA? Are you using the memory returned by alloc_bootmem directly?
Yes, it is used for DMA and I am using the memory returned by alloc_bootmem directly.
Remember DMA works on physical addresses not virtual. You might have to use dma_map_single/dma_unmap_single.
Yes, I was aware that dma uses physical addresses, isn't that what alloc_bootmem returns? I'm not aware of dma_map_single etc I will look at that soon.
Also does the h/w has any limitations of the physical memory range it can access? Like only first 64MB of RAM?
It's limited to 32bit addressing, but that should be fine for the 512mb of ram on the arm board which I have. Thanks, Phil