ppc440spe-adma: ADMA driver for PPC440SP(e) and 64-bit physical addresses

John Burr jlburr at cadence.com
Thu Dec 11 06:42:06 EST 2008


I am confused about the capabilities of the PPC440SPe DMA hardware.  I'm wondering if I can use it to transfer data between system memory and a PCI Express slave-only device.  To do that, the DMA scatter-gather list entry used by the DMA hardware would need to support addresses > 32-bits as the PCI Express slave memory is mapped by Linux above the 4GB line (i.e. 440SPe hardware uses a 36-bit physical address).
 
The AMCC PPC440SPe User's Manual V1.27 chapter 20 on the I20/DMA core indicates (among other things):
 
DMA0 features include:
* Any source PLB address to any destination address
* 64-bit addressing
 
These items lead me to think I should be able to do this.  However, section 20.5.1, "Basic Command Descriptor Block Structure" indicates:
 
"The DMA engine only supports the simple addressing Scatter/Gather List (SGL) format defined in I2O (v1.5).  No other SGL formats are supported."
 
>From what I can see from the I20 V1.5 specification, only 32-bit physical addresses are supported in the SGL entry.  
 
I looked over the recent post of the ppc440spe-adma ADMA driver and see the physical addresses used seem to be type dma_addr_t.  That's 32-bits on the PPC440SPe powerpc Linux platform.  So, this leads me to believe I cannot use the DMA hardware to address above the 4GB line.
 
I don't get why the 440SPe DMA hardware goes to such lengths to support the placement of the CDBs anywhere in memory (these do use 64-bit addresses) while then limiting the SGL addresses for the data itself to 32-bits.  I believe the completely different DMA hardware on the 440GX did not have this kind of "weirdness".
 
Is there any way to use the 440SPe hardware to transfer data to a PCI Express slave device?  If so, are there any drivers that show how to do it?
 
I realize that my PCI Express device should really be a master and do its own transfer.  But that's not an option in the near term.  I'm trying to use DMA to try to get higher-performing burst transfers on the PCI Express interface (as compared to the quite-slow CPU-based memcpy I'm using now).
 
Thanks for your help.
 
John Burr
 
 



More information about the Linuxppc-dev mailing list