Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Oct 2014 18:22:10 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        Martin Galvan <omgalvan.86@gmail.com>
Cc:        Konstantin Belousov <kostikbel@gmail.com>, freebsd-drivers@freebsd.org, Ian Lepore <ian@freebsd.org>, freebsd-embedded@freebsd.org
Subject:   Re: A few questions about SD/MMC drivers
Message-ID:  <A5A112C9-05C4-4A3A-8FB3-7B66D551F98E@bsdimp.com>
In-Reply-To: <CAN19L9H%2BLrcj3kuJX%2B2HGhj-FCNkWhnXQyzST15hj3ROHX3Ruw@mail.gmail.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> <CAN19L9G8peskHjaYGrUO5ga6oq3PmUy-fqtyKnQoJ2-B4p-=EA@mail.gmail.com> <1413243678.12052.376.camel@revolution.hippie.lan> <CAN19L9H%2BLrcj3kuJX%2B2HGhj-FCNkWhnXQyzST15hj3ROHX3Ruw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_574CE74E-C0F1-494A-A67D-359860E4B1C7
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=windows-1252

The buffer is always contiguous in virtual space, but maybe not =
necessarily
in physical space, hence the need for SG list. For buffers smaller than =
one
page, the difference doesn=92t matter :) But with multi-block support, =
you=92ll
need to cope with the difference.

Warner

On Oct 13, 2014, at 6:19 PM, Martin Galvan <omgalvan.86@gmail.com> =
wrote:

> Well, that makes sense now. I'll try it out and let you know if it
> worked, thanks a ton!
>=20
> Just to be clear, though (and forgive me for my ignorance on this
> matter): is the "buffer" referenced in mmc_data always contiguous in
> memory? If so, why use segments/scatterlists at all? I thought the
> whole point of using descriptor lists in DMA transfers was to work
> with portions of memory that weren't next to each other. If the data
> we want to transfer is all in a single contiguous region, wouldn't a
> single descriptor with the required bus address and buffer length be
> enough?
>=20
> 2014-10-13 20:41 GMT-03:00 Ian Lepore <ian@freebsd.org>:
>> On Mon, 2014-10-13 at 20:25 -0300, Martin Galvan wrote:
>>> 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.
>>>>>=20
>>>>> Do we have anything like that on BSD? If not, what would be a =
simple
>>>>> algorithm to make this work?
>>>>=20
>>>> 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.
>>>=20
>>> Actually, other than being able to alloc DMA buffers and get their =
bus
>>> addresses I didn't see anything like the Linux scatterlists.
>>>=20
>>> 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.
>>>=20
>>> 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.
>>>=20
>>> Again thanks a lot for your answers.
>>=20
>> When you map the buffer with bus_dmamap_load() your callback function =
is
>> passed an array of bus_dma_segment structures, each element of the =
array
>> is the physical address and size of a contiguous physical segment =
that
>> makes up part of the overall buffer.  You are g'teed not to get more
>> segments than the limit specified in the dma tag used for the map =
(but
>> that just means the map function fails if there are too many =
segments,
>> not that some sort of automatic copy/consolidate is done for you).  =
In
>> general you won't have a problem if you handle (512 * MAX_DATA +
>> PAGE_SIZE - 1) / PAGE_SIZE segments (MAX_DATA is a horrible ivar name
>> but I guess we're stuck with it now).
>>=20
>> If you need a linked list rather than an array of physical addr/size
>> tuples, you'll have to write a callback function that creates the =
list
>> from the array.
>>=20
>> -- Ian
>>=20
>>=20


--Apple-Mail=_574CE74E-C0F1-494A-A67D-359860E4B1C7
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename=signature.asc
Content-Type: application/pgp-signature;
	name=signature.asc
Content-Description: Message signed with OpenPGP using GPGMail

-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org

iQIcBAEBCgAGBQJUPGyyAAoJEGwc0Sh9sBEAuQEQALg1smhHq8LbE8b+SOrzhsKP
qPjakDbn8lUk+hF8k7dXEoqNrPzFmLNt7OSXX1GI5CgiAYsUrZAjNeJJc3xpaUoQ
g4q6EHpNhJCcJlc9NgiJXTRCQh1NeKdt4BHl4C0eIP0CqKywI5EMTBqMl4RW6yjG
vSDaKu66FD5YfHkpi0m1R0eWOVExDSv6W5r/s7BeJAGG/mrOPRFO2RQKwbSIQl2a
X7NCTsAYOGklrqZ0MaEhWfvLfZ5YnBL0eZrmjUOxidkyNXN/yp9qaKqGXlsdBp7C
trpGgXsHeIl3DdWS17wzm4xjg0owbIOyMFgr7NixOxR2I/IDlpcMEHXxhCdQcXZT
3p+ScbFHI/XlF2yAK+v9NnQGDlinw74LKYD5HiXEkzLGtgTI6SlN8WlA6fjY3bNU
BLEDyFDuvH4lzsdITknxwLmUGI7rmXRXzDMRq0Z2lXHpI99mJdO4KCt8dXXXs+9J
M9xU28C+hJ/wJYF8zqjleN91LH6a4cPhk0KKD9c76JLyPYun6zPC2dEZpCOOAeSi
1Q6dQCIqMei3fmE15NQA48BEKPX66JleDF51oCyYdFoUhXJjCYPzERMSmsWZs8/r
CEjEQkAssaoqD5Qmg7ackCsAhbjqU/WLQ7X5iu0FIJwk53nU1FU1Jbnp0LR0/oIu
D7hqPzufhWAQcmIm8P1v
=r/BK
-----END PGP SIGNATURE-----

--Apple-Mail=_574CE74E-C0F1-494A-A67D-359860E4B1C7--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A5A112C9-05C4-4A3A-8FB3-7B66D551F98E>