[Serious] busdma bug in -current in relation to USB hardware - review wanted

Hans Petter Selasky hselasky at c2i.net
Sun Nov 16 05:06:12 PST 2008


Hi,

It turns out my initial patch need to be limited to the use-case only. Before 
I start any real work, I want to know if anyone will object if I implement 
the following new BUS_DMA flag into FreeBSD's busdma system?

amd64/amd64/busdma_machdep.c
i386/i386/busdma_machdep.c
arm/arm/busdma_machdep.c
ia64/ia64/busdma_machdep.c
mips/mips/busdma_machdep.c
powerpc/powerpc/busdma_machdep.c
sparc64/sparc64/bus_machdep.c
sun4v/sun4v/bus_machdep.c
sys/bus_dma.h

/*
 * The following flag specifies that no re-alignment of individual
 * memory pages is allowed when loaded into DMA. It can only be used
 * when "maxsegsz" is equal to "PAGE_SIZE" and "alignment" is less
 * than or equal to 1.
 *
 * Background: Some kinds of DMA hardware only stores the full
 * physical address of the first memory page when multiple memory
 * pages are loaded into DMA. Consequtive memory pages only gets the
 * non-offset part of the physical address updated. The hardware
 * computes the amount of data that should be stored in the first
 * memory page from the minimum of the total transfer length and
 * PAGE_SIZE minus the initial page offset. When the initial page
 * offset is not preserved the hardware ends up transferring an
 * invalid number of bytes to or from the initial memory page.
 */
#define	BUS_DMA_NOREAL		0x400	/* no page re-alignment allowed */



Without this new feature in busdma the USB hardware will not work when the DMA 
data is placed on bounce pages, for example on 64-bit architectures with more 
than 4GB of RAM.

--HPS


More information about the freebsd-current mailing list