Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Jul 2019 14:04:08 +0000 (UTC)
From:      Ruslan Bukin <br@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r349727 - in head/sys/dev: altera/softdma xdma xilinx
Message-ID:  <201907041404.x64E48DN051883@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: br
Date: Thu Jul  4 14:04:08 2019
New Revision: 349727
URL: https://svnweb.freebsd.org/changeset/base/349727

Log:
  Negate the logic of XCHAN_CAP_NOBUFS macro and rename it to
  XCHAN_CAP_BOUNCE.
  
  The only application that uses bounce buffering for now is the Government
  Furnished Equipment (GFE) P2's dma core (AXIDMA) with its own dedicated
  cacheless bounce buffer.
  
  Sponsored by:	DARPA, AFRL

Modified:
  head/sys/dev/altera/softdma/softdma.c
  head/sys/dev/xdma/xdma.h
  head/sys/dev/xdma/xdma_sg.c
  head/sys/dev/xilinx/axidma.c

Modified: head/sys/dev/altera/softdma/softdma.c
==============================================================================
--- head/sys/dev/altera/softdma/softdma.c	Thu Jul  4 13:23:18 2019	(r349726)
+++ head/sys/dev/altera/softdma/softdma.c	Thu Jul  4 14:04:08 2019	(r349727)
@@ -616,7 +616,6 @@ softdma_channel_alloc(device_t dev, struct xdma_channe
 		if (chan->used == 0) {
 			chan->xchan = xchan;
 			xchan->chan = (void *)chan;
-			xchan->caps |= XCHAN_CAP_NOBUFS;
 			xchan->caps |= XCHAN_CAP_NOSEG;
 			chan->index = i;
 			chan->idx_head = 0;

Modified: head/sys/dev/xdma/xdma.h
==============================================================================
--- head/sys/dev/xdma/xdma.h	Thu Jul  4 13:23:18 2019	(r349726)
+++ head/sys/dev/xdma/xdma.h	Thu Jul  4 14:04:08 2019	(r349727)
@@ -137,7 +137,7 @@ struct xdma_channel {
 	uint32_t			caps;
 #define	XCHAN_CAP_BUSDMA		(1 << 0)
 #define	XCHAN_CAP_NOSEG			(1 << 1)
-#define	XCHAN_CAP_NOBUFS		(1 << 2)
+#define	XCHAN_CAP_BOUNCE		(1 << 2)
 
 	/* A real hardware driver channel. */
 	void				*chan;

Modified: head/sys/dev/xdma/xdma_sg.c
==============================================================================
--- head/sys/dev/xdma/xdma_sg.c	Thu Jul  4 13:23:18 2019	(r349726)
+++ head/sys/dev/xdma/xdma_sg.c	Thu Jul  4 14:04:08 2019	(r349727)
@@ -290,7 +290,7 @@ xdma_prep_sg(xdma_channel_t *xchan, uint32_t xr_num,
 	}
 
 	/* Allocate buffers if required. */
-	if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0) {
+	if (xchan->caps & (XCHAN_CAP_BUSDMA | XCHAN_CAP_BOUNCE)) {
 		ret = xchan_bufs_alloc(xchan);
 		if (ret != 0) {
 			device_printf(xdma->dev,
@@ -347,9 +347,8 @@ xchan_seg_done(xdma_channel_t *xchan,
 				bus_dmamap_sync(xchan->dma_tag_bufs, b->map, 
 				    BUS_DMASYNC_POSTREAD);
 			bus_dmamap_unload(xchan->dma_tag_bufs, b->map);
-		} else {
-			if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0 &&
-			    xr->req_type == XR_TYPE_MBUF &&
+		} else if (xchan->caps & XCHAN_CAP_BOUNCE) {
+			if (xr->req_type == XR_TYPE_MBUF &&
 			    xr->direction == XDMA_DEV_TO_MEM)
 				m_copyback(xr->m, 0, st->transferred,
 				    (void *)xr->buf.vaddr);
@@ -494,13 +493,14 @@ _xdma_load_data(xdma_channel_t *xchan, struct xdma_req
 
 	switch (xr->req_type) {
 	case XR_TYPE_MBUF:
-		if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0) {
+		if (xchan->caps & XCHAN_CAP_BUSDMA)
+			seg[0].ds_addr = mtod(m, bus_addr_t);
+		else if (xchan->caps & XCHAN_CAP_BOUNCE) {
 			if (xr->direction == XDMA_MEM_TO_DEV)
 				m_copydata(m, 0, m->m_pkthdr.len,
 				    (void *)xr->buf.vaddr);
 			seg[0].ds_addr = (bus_addr_t)xr->buf.paddr;
-		} else
-			seg[0].ds_addr = mtod(m, bus_addr_t);
+		}
 		seg[0].ds_len = m->m_pkthdr.len;
 		break;
 	case XR_TYPE_BIO:
@@ -626,7 +626,7 @@ xdma_queue_submit_sg(xdma_channel_t *xchan)
 
 	sg = xchan->sg;
 
-	if ((xchan->caps & XCHAN_CAP_NOBUFS) == 0 &&
+	if ((xchan->caps & (XCHAN_CAP_BOUNCE | XCHAN_CAP_BUSDMA)) &&
 	   (xchan->flags & XCHAN_BUFS_ALLOCATED) == 0) {
 		device_printf(xdma->dev,
 		    "%s: Can't submit a transfer: no bufs\n",

Modified: head/sys/dev/xilinx/axidma.c
==============================================================================
--- head/sys/dev/xilinx/axidma.c	Thu Jul  4 13:23:18 2019	(r349726)
+++ head/sys/dev/xilinx/axidma.c	Thu Jul  4 14:04:08 2019	(r349727)
@@ -399,6 +399,7 @@ axidma_channel_alloc(device_t dev, struct xdma_channel
 		if (axidma_reset(sc, data->id) != 0)
 			return (-1);
 		chan->xchan = xchan;
+		xchan->caps |= XCHAN_CAP_BOUNCE;
 		xchan->chan = (void *)chan;
 		chan->sc = sc;
 		chan->used = true;



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