From owner-freebsd-drivers@FreeBSD.ORG Mon Feb 20 18:34:21 2012 Return-Path: Delivered-To: freebsd-drivers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E4941106564A for ; Mon, 20 Feb 2012 18:34:21 +0000 (UTC) (envelope-from jdl.ntq@gmail.com) Received: from mail-iy0-f182.google.com (mail-iy0-f182.google.com [209.85.210.182]) by mx1.freebsd.org (Postfix) with ESMTP id AE0CB8FC0A for ; Mon, 20 Feb 2012 18:34:21 +0000 (UTC) Received: by iaeo4 with SMTP id o4so10522174iae.13 for ; Mon, 20 Feb 2012 10:34:21 -0800 (PST) Received-SPF: pass (google.com: domain of jdl.ntq@gmail.com designates 10.50.185.228 as permitted sender) client-ip=10.50.185.228; Authentication-Results: mr.google.com; spf=pass (google.com: domain of jdl.ntq@gmail.com designates 10.50.185.228 as permitted sender) smtp.mail=jdl.ntq@gmail.com; dkim=pass header.i=jdl.ntq@gmail.com Received: from mr.google.com ([10.50.185.228]) by 10.50.185.228 with SMTP id ff4mr14795342igc.17.1329762861172 (num_hops = 1); Mon, 20 Feb 2012 10:34:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; bh=Ag0v4U2rwRQgE4dXEGfISwRno1IzSt/k1LTnMioPT/A=; b=gl15iCWbQ5JfAwwNIzjI8+ENjZV03E5cUAud+nSwIXYhJjpPWxjk2s551iXUrBuL/3 JMmb57p0F04e+/pZWFt1YmENoJFCn3o4DIY7i+tYAE1VmycU2qFwiRf2DAV348ZsNVws R9jI6QlCBqcLu4IBUlCXLvJNCcKNvN3FDAgh8= MIME-Version: 1.0 Received: by 10.50.185.228 with SMTP id ff4mr11844183igc.17.1329761140994; Mon, 20 Feb 2012 10:05:40 -0800 (PST) Received: by 10.231.51.18 with HTTP; Mon, 20 Feb 2012 10:05:40 -0800 (PST) Date: Mon, 20 Feb 2012 20:05:40 +0200 Message-ID: From: JD Louw To: freebsd-drivers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: bus_dma coalesce advice X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Feb 2012 18:34:22 -0000 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