A few questions about SD/MMC drivers

Martin Galvan omgalvan.86 at gmail.com
Mon Oct 13 23:25:36 UTC 2014


2014-10-13 11:57 GMT-03:00 Warner Losh <imp at bsdimp.com>:
> On Oct 12, 2014, at 11:24 PM, Martin Galvan <omgalvan.86 at gmail.com> wrote:
>> The host found in Allwinner SoCs uses a DMA controller which works
>> with a linked list of descriptors, each having info on a data buffer.
>> In the Linux driver they allocate a coherent DMA buffer using
>> dma_alloc_coherent to get both the virtual and bus addresses of the
>> descriptor list. When it's time to do a DMA transfer, the Linux driver
>> allocates a scatterlist with each entry being a buffer corresponding
>> to a descriptor; it then loops through the descriptor list setting the
>> "buffer pointer" field of each one to the bus address of the
>> corresponding scatterlist entry, and the "next descriptor" to the bus
>> address of the following descriptor. It's pretty neat, though it's
>> worth mentioning the scatterlist that the MMC request handler maps
>> already contains the virtual addresses of the requested buffers.
>>
>> Do we have anything like that on BSD? If not, what would be a simple
>> algorithm to make this work?
>
> Pretty much all of that is covered in busdma(8). The mechanics are a bit
> different than Linux, sure, but all that functionality is there.

Actually, other than being able to alloc DMA buffers and get their bus
addresses I didn't see anything like the Linux scatterlists.

The main problem here is that the Linux mmc_data struct comes with an
already-filled scatterlist. In that case, all I have to do is build
the descriptor chain with the buffer addresses from the scatterlist
entries. The only thing that's similar to that in the BSD API is
mbuf_sg, which is used for network stuff. I didn't see anything that
could allow me to build a descriptor chain-- all I saw was that the
BSD mmc_data type has a buffer instead of a scatterlist.

I'm thinking of telling the DMA controller to work with a single
descriptor whose buffer is the one that comes inside mmc_data, but I'm
not sure if this would be right.

Again thanks a lot for your answers.


More information about the freebsd-drivers mailing list