[uClinux-dev] Freescale's MCDMAAPI vs. Generic Linux DMA API on Coldfire MCF548x

Markus Franke markus.franke at informatik.tu-chemnitz.de
Wed Feb 27 02:42:52 EST 2008


Hi Greg,

Zitat von Greg Ungerer <gerg at snapgear.com>:
> Hi Markus,
>
> Markus Franke wrote:
>> well, as far as I understand the generic DMA API in the Linux   
>> kernel should provide an abstraction layer to driver developers and  
>>  tries to hide all the specifics about DMA implementation. That   
>> means a developer should be able to use DMA in it's drivers by   
>> simply using some kind of a call flow:
>>
>> request_dma
>> set_dma_addr
>> set_dma_mode
>> set_dma_count
>> enable_dma
>> disable_dma
>> free_dma
>>
>> As such, no specific knowledge about the DMA controller is needed   
>> by the driver developer to set up DMA transfers.
>>
>> The MCF548x uses a very different DMA controller than for example   
>> the MCF5272. Now, Freescale provides the MCDMAAPI in order to   
>> control all the tiny bits in the controller. Furthermore, I have a   
>> modified version of the FEC-driver, from Freescale's latest BSP,   
>> running within uClinux. This driver strongly depends on the   
>> MCDMAAPI and some internals of the DMA controller itself. (e.g.   
>> setting descriptors which point to microcode necessary for the DMA   
>> engine)
>> I want to move this code on top of the generic linux DMA layer.
>>
>> Now, my problem is that there are lot's of things to be followed in  
>>  the FEC driver in order to get DMA working. Actually, all these   
>> things should be moved somewhere in target specific DMA code (maybe  
>>  arch/m68knommu/dma.c???)
>
> Perhaps something like arch/m68knommu/platform/547x/dma.c
> may be more appropriate. I expect this will remain specific
> to the 547x/548x parts.

Yeah, I think I will go for this approach.

>> in order to hide these things from the driver developer, right? The  
>>  idea is now to remove all the MCDMAAPI-calls from the FEC-driver   
>> and replace them with the generic API calls listed above. Would   
>> this be the right way?
>
> Yes, I think that is the right way to do it.
> The DMA engine can be used for other things than the FEC ethernets
> right?

Yes. The DMA engine can be used for different mem-to-mem,  
periph-to-mem and mem-to-periph transfers. It is a mulitfunctional  
controller although it is very different from a traditional DMA  
controller. It's a microcoded engine, that means Freescale offers  
special microcode (undocumented) for supporting FEC transaction.  
Similar to this they provide generic microcode for doing  
memory-to-memory transactions.

>> If so I have some doubts that with the small amount of functions   
>> above, I will be able to use all the functionality of the MCF548x's  
>>  DMA controller.
>
> What parts of supporting don't you think will fit in that
> framework?

I have just some doubts with respect to this microcoded DMA engine  
which is not a DMA controller in a usual way. I think I will go for  
the approach described above and the I'll how see how things are going  
on. I also thought about just providing a generic interface for  
mem-to-mem transfers in a first step and leaving the special  
microcoded FEC transfers beside.

Thanks and with best regards,
Markus





More information about the uClinux-dev mailing list