Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Nov 2008 13:14:13 +0100
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        Alexander Motin <mav@freebsd.org>
Cc:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   Re: PERFORCE change 152649 for review - busdma problem
Message-ID:  <200811161314.13923.hselasky@c2i.net>
In-Reply-To: <491DC170.7090409@FreeBSD.org>
References:  <200811080910.mA89AgTZ048172@repoman.freebsd.org> <200811141644.55773.hselasky@c2i.net> <491DC170.7090409@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 14 November 2008, Alexander Motin wrote:
> Hans Petter Selasky wrote:
> > The thing is, you cannot specify how many bytes are on the first page
> > which can take a full physical address. It is assumed that after the page
> > offset wraps to zero a new page begins.
> >
> > Example:
> >
> > xxx: means data
> >
> > Virtual memory:
> >   PG0  PG1
> >
> > | xxx|xxx |
> >
> > In busdma bounce buffer:
> >
> >   PG0  PG1
> >
> > |xxx |xxx |
> >
> > You see there is a hole just before PG1, and it is impossible to tell the
> > USB hardware to skip this hole.
>
> I have seen very alike organization at SD host controller. There is SDMA
> mode, to which most existing controllers limited. There is just initial
> address and total data size can be specified. But on every page boundary
> controller stops transfer and allows software to load the address of the
> next data page. This technique is ugly and new specification provides
> new ADMA and ADMA2 modes which allow start address and length to be
> specified for every data segment.
>
> Now within my sdhci driver I have implemented page bouncing by myself, I
> am preallocating one aligned 4K page and reloading it with new data on
> each page boundary hit. There are many different data alignment
> bugs/limitations in that controllers, so such unperfect DMA operation
> also allows me to manage most of them. Linux sdhci driver instead just
> don't use this page boundary interrupt, operating with only one
> continuous memory block, completely disabling DMA on buggy controllers.
>
> If I understand correctly present busdma API (may be not), it does not
> allow you to be sure that both of segment boundaries will be aligned to
> the page boundaries. You are only specifying maximum number of segments
> and maximum segment size, so busdma, if it wish, may theoretically give
> you several small segments instead of single complete page. So if you
> are not ready to receive uneven sized segments, you probably should not
> specify that you want to receive more then 1 segment.

Hi,

Isn't the smallest segment size "PAGE_SIZE" bytes? That is what USB is using. 
Maybe I can make an exception for that case? maxsegsz=PAGE_SIZE, align=1?

>
> May be it would be good to add some flag to the bus_dma_tag_create()
> which would signaled that hardware is able to handle segment boundaries
> only at page boundaries. It would also allow us to properly combine
> alignment and page boundary requirements. But it is surely not easy task.
>

Yes. I'm going to work on this today. I'm not sure what the best approach is, 
but a flag is probably the best, else you don't know if busdma has been 
patched for this or not.

--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811161314.13923.hselasky>