bus_dma coalesce advice

JD Louw jdl.ntq at gmail.com
Mon Feb 20 18:34:22 UTC 2012


Hi,

I have a Xilinx FPGA PCIe DMA design that I'd like to get going on
FreeBSD. I'd like some advice on the best practice of the bus_dma
functions. Specifically, I'd like to understand how best to coalesce
multiple DMA transactions.

Using the bus_dma_tag_create and bus_dmamem_alloc functions I create
256 contiguous descriptors.

	bus_dma_tag_create(NULL, 		/* parent */
		4,				/* alignment */
		0,				/* bounds */
		BUS_SPACE_MAXADDR,		/* lowaddr */
		BUS_SPACE_MAXADDR,		/* highaddr */
		NULL, NULL,			/* filter, filterarg */
		256*sizeof(descriptor),		/* maxsize */
		1,				/* nsegments */
		256*sizeof(descriptor),		/* maxsegsize */
		BUS_DMA_ALLOCNOW,		/* flags */
		NULL, NULL,			/* lockfunc, lockarg */
		&desc_tag);			/* dmat */

I then create another bus_dma_tag for the data:

	bus_dma_tag_create(NULL, 		/* parent */
		4,				/* alignment */
		0,				/* bounds */
		BUS_SPACE_MAXADDR,		/* lowaddr */
		BUS_SPACE_MAXADDR,		/* highaddr */
		NULL, NULL,			/* filter, filterarg */
		0xFFFFF,			/* maxsize - 1MB */
		256,				/* nsegments */
		0x1000,				/* maxsegsize - 4KB*/
		BUS_DMA_ALLOCNOW,		/* flags */
		NULL, NULL,			/* lockfunc, lockarg */
		&data_tag);			/* dmat */

Now my question: In order to batch several mbufs/uios in into the 256
descriptors I'd like to do multiple bus_dmamap_loads on the data tag.
But reading the bus_dmamap_load_mbuf/uio code it looks like this is
not a good idea. Each mapping operation does not subtract its nsegment
count from the tag maximum nsegment count, so at some point
bus_dmamap_load will overrun my 256 descriptors.

Do I need to allocate a separate set of descriptors for each bus_dmamapping?

Any advice much appreciated,

JD


More information about the freebsd-drivers mailing list