Date: Mon, 13 Oct 2014 20:25:35 -0300 From: Martin Galvan <omgalvan.86@gmail.com> To: Warner Losh <imp@bsdimp.com> Cc: freebsd-drivers@freebsd.org, freebsd-embedded@freebsd.org Subject: Re: A few questions about SD/MMC drivers Message-ID: <CAN19L9G8peskHjaYGrUO5ga6oq3PmUy-fqtyKnQoJ2-B4p-=EA@mail.gmail.com> In-Reply-To: <0B7F1C7B-7E38-48FD-B3CF-A4512A45E4C0@bsdimp.com> References: <CAN19L9ENsuAR6_aXwJSRdfDz6UgE6kU%2BrCkGGsdK7tRcUes%2B0w@mail.gmail.com> <20141006171521.GD26076@kib.kiev.ua> <CAN19L9E0K4rhffRwAo-oyxtajCy4R3Y1bF%2BS7RkSD-NKA_MH%2BA@mail.gmail.com> <0B7F1C7B-7E38-48FD-B3CF-A4512A45E4C0@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
2014-10-13 11:57 GMT-03:00 Warner Losh <imp@bsdimp.com>: > On Oct 12, 2014, at 11:24 PM, Martin Galvan <omgalvan.86@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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAN19L9G8peskHjaYGrUO5ga6oq3PmUy-fqtyKnQoJ2-B4p-=EA>