PERFORCE change 181253 for review

Jakub Wojciech Klama jceel at FreeBSD.org
Wed Jul 21 11:01:27 UTC 2010


http://p4web.freebsd.org/@@181253?ac=10

Change 181253 by jceel at jceel on 2010/07/21 11:00:31

	Some minor changes in framework.

Affected files ...

.. //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.c#2 edit
.. //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.h#2 edit
.. //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma_cdev.c#2 edit

Differences ...

==== //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.c#2 (text+ko) ====

@@ -71,6 +71,13 @@
 {
 	bus_dma_segment_t *seg = (bus_dma_segment_t *)arg;
 
+	KASSERT(nseg == 1, ("bus_dmamap_load returned nseg != 1"));
+
+	if (error) {
+		printf("gpdma_dmamap_load_cb: error %d\n", error);
+		panic("cannot map DMA memory");
+	}
+
 	seg->ds_addr = segs[0].ds_addr;
 	seg->ds_len = segs[0].ds_len;	
 }
@@ -81,6 +88,15 @@
 {
 	bus_dma_segment_t *seg = (bus_dma_segment_t *)arg;
 
+	KASSERT(nseg == 1, ("bus_dmamap_load returned nseg != 1"));
+
+	printf("mapsize=%ld\n", mapsize);
+
+	if (error) {
+		printf("gpdma_dmamap_load_cb2: error %d\n", error);
+		panic("cannot map DMA memory");
+	}
+
 	seg->ds_addr = segs[0].ds_addr;
 	seg->ds_len = segs[0].ds_len;
 }
@@ -211,6 +227,14 @@
 	return (rman_release_resource(res));
 }
 
+bus_dma_tag_t
+gpdma_get_dma_tag(struct resource *res)
+{
+	struct gpdma_engine *engine = gpdma_engine_by_res(res);
+
+	return (engine->de_dmatag);
+}
+
 int
 gpdma_program_transfer(struct gpdma_transfer *xfer, void **cookiep)
 {
@@ -281,7 +305,7 @@
 }
 
 int 
-gpdma_setup_buffer_raw(struct gpdma_transfer *xfer, int buffer,
+gpdma_load_buffer_raw(struct gpdma_transfer *xfer, int buffer,
     bus_addr_t paddr, bus_size_t length)
 {
 	struct gpdma_buffer *buf = &xfer->dt_buffers[buffer];
@@ -292,7 +316,7 @@
 }
 
 int
-gpdma_setup_buffer_virt(struct gpdma_transfer *xfer, int buffer, void *addr,
+gpdma_load_buffer_virt(struct gpdma_transfer *xfer, int buffer, void *addr,
     size_t length)
 {
 	struct gpdma_buffer *buf = &xfer->dt_buffers[buffer];
@@ -307,13 +331,16 @@
 	bus_dmamap_load(buf->db_dmatag, buf->db_dmamap, addr, 
 	    length, gpdma_dmamap_load_cb, &seg, BUS_DMA_NOWAIT);
 
+	if (seg.ds_len != length)
+		return (EFBIG);
+
 	buf->db_addr = seg.ds_addr;
 	buf->db_length = seg.ds_len;
 	return (0);
 }
 
 int
-gpdma_setup_buffer_uio(struct gpdma_transfer *xfer, int buffer, struct uio *uio)
+gpdma_load_buffer_uio(struct gpdma_transfer *xfer, int buffer, struct uio *uio)
 {
 	struct gpdma_buffer *buf = &xfer->dt_buffers[buffer];
 	bus_dma_segment_t seg;
@@ -328,6 +355,9 @@
 	bus_dmamap_load_uio(buf->db_dmatag, buf->db_dmamap, uio, 
 	    gpdma_dmamap_load_cb2, &seg, BUS_DMA_NOWAIT);
 
+	if (seg.ds_len != length)
+		return (EFBIG);
+
 	buf->db_addr = seg.ds_addr;
 	buf->db_length = seg.ds_len;
 	return (0);
@@ -377,6 +407,12 @@
 }
 
 inline void
+gpdma_set_buffer_flags(struct gpdma_transfer *xfer, int buffer, int flags)
+{
+	xfer->dt_buffers[buffer].db_flags = flags;
+}
+
+inline void
 gpdma_set_buffer_stride(struct gpdma_transfer *xfer, int buffer, int stride_width, int stride_spacing)
 {
 	xfer->dt_buffers[buffer].db_stride_width = stride_width;

==== //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.h#2 (text+ko) ====

@@ -43,7 +43,7 @@
 
 typedef struct gpdma_engine *gpdma_engine_t;
 typedef struct gpdma_transfer *gpdma_transfer_t;
-typedef int (*gpdma_callback_t)(int status, void *arg);
+typedef void (*gpdma_callback_t)(int status, void *arg);
 
 enum gpdma_op {
 	GPDMA_FILL 	= 0x1,
@@ -97,6 +97,7 @@
 	struct gpdma_transfer *	db_transfer;
 	int			db_type;
 	int			db_flags;
+#define	GPDMA_BUFFER_FIFO		0x1
 	bus_addr_t		db_addr;
 	bus_size_t		db_length;
 	bus_size_t		db_stride_width;
@@ -118,7 +119,7 @@
 #define	GPDMA_TRANSFER_REPEAT		0x2 /* repeat transfer until cancel */
 #define	GPDMA_TRANSFER_NOINTR		0x4 /* don't generate callbacks */
 #define	GPDMA_TRANSFER_STRIDE_CALLBACK	0x8 /* callback on every stride */
-#define	GPDMA_TRANSFER_LINK_CALLBACK	0x10 /* callback on every linked transfer */
+#define	GPDMA_TRANSFER_STRIDE_SYNC	0x10 /* sync on every stride */
 	gpdma_callback_t		dt_callback;
 	void *			dt_callback_arg;
 	struct gpdma_buffer	dt_buffers[8];
@@ -145,15 +146,17 @@
 struct resource *gpdma_alloc_channel(const char *name, int);
 int gpdma_release_channel(struct resource *);
 
+bus_dma_tag_t gpdma_get_dma_tag(struct resource *);
+
 gpdma_transfer_t gpdma_alloc_transfer(struct resource *);
 void gpdma_free_transfer(gpdma_transfer_t);
 int gpdma_program_transfer(gpdma_transfer_t, void **);
 int gpdma_start_transfer(void *);
 int gpdma_stop_transfer(void *);
 
-int gpdma_setup_buffer_raw(gpdma_transfer_t, int, bus_addr_t, bus_size_t);
-int gpdma_setup_buffer_virt(gpdma_transfer_t, int, void *, size_t);
-int gpdma_setup_buffer_uio(gpdma_transfer_t, int, struct uio *);
+int gpdma_load_buffer_raw(gpdma_transfer_t, int, bus_addr_t, bus_size_t);
+int gpdma_load_buffer_virt(gpdma_transfer_t, int, void *, size_t);
+int gpdma_load_buffer_uio(gpdma_transfer_t, int, struct uio *);
 
 void gpdma_set_transfer_func(gpdma_transfer_t, int);
 void gpdma_set_transfer_opts(gpdma_transfer_t, int);
@@ -163,6 +166,7 @@
 
 int gpdma_get_buffer_layout(gpdma_transfer_t, int);
 void gpdma_set_buffer_layout(gpdma_transfer_t, int, int);
+void gpdma_set_buffer_flags(gpdma_transfer_t, int, int);
 void gpdma_set_buffer_stride(gpdma_transfer_t, int, int, int);
 void gpdma_set_buffer_fifo_width(gpdma_transfer_t, int, int);
 

==== //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma_cdev.c#2 (text+ko) ====

@@ -34,6 +34,8 @@
 #include <sys/priv.h>
 #include <sys/bus.h>
 
+#include <machine/vmparam.h>
+
 #include <dev/gpdma/gpdma.h>
 #include <dev/gpdma/gpdma_cdev.h>
 
@@ -52,7 +54,7 @@
 static d_write_t gpdma_cdev_write;
 static d_ioctl_t gpdma_cdev_ioctl;
 
-static int gpdma_cdev_callback(int, void *);
+static void gpdma_cdev_callback(int, void *);
 
 enum gpdma_cdev_state {
 	DCS_CLOSED,
@@ -195,14 +197,15 @@
 	length = req.dcr_src.dcb_iov.iov_len;
 	xfer = dcs->dcs_xfer;
 
+	debugf("LENGTH = %ld\n", length);
+
 	/* Set transfer callback */
 	gpdma_set_transfer_callback(xfer, &gpdma_cdev_callback, dcs);
 
 	/* Setup source buffer */
 	setup_uio(&uiosrc, &req.dcr_src.dcb_iov, uio->uio_td);
-	gpdma_setup_buffer_uio(xfer, GPDMA_BUF_SRC, &uiosrc);
+	gpdma_load_buffer_uio(xfer, GPDMA_BUF_SRC, &uiosrc);
 	gpdma_set_buffer_layout(xfer, GPDMA_BUF_SRC, req.dcr_src.dcb_type);
-	debugf("SRC buffer type: %d\n", req.dcr_src.dcb_type);
 	if (req.dcr_src.dcb_type == GPDMA_CDEVBUF_FRAME) {
 		debugf("setting stride parameters for SRC buffer...\n");
 		gpdma_set_buffer_stride(xfer, GPDMA_BUF_SRC,
@@ -212,9 +215,8 @@
 
 	/* Setup destination buffer */
 	setup_uio(&uiodst, &req.dcr_dst.dcb_iov, uio->uio_td);
-	gpdma_setup_buffer_uio(xfer, GPDMA_BUF_DST, &uiodst);
+	gpdma_load_buffer_uio(xfer, GPDMA_BUF_DST, &uiodst);
 	gpdma_set_buffer_layout(xfer, GPDMA_BUF_DST, req.dcr_dst.dcb_type);
-	debugf("DST buffer type: %d\n", req.dcr_dst.dcb_type);
 	if (req.dcr_dst.dcb_type == GPDMABUF_FRAME) {
 		debugf("setting stride parameters for DST buffer...\n");
 		gpdma_set_buffer_stride(xfer, GPDMA_BUF_DST, 
@@ -262,7 +264,7 @@
 	return (ret);
 }
 
-static int
+static void
 gpdma_cdev_callback(int status, void *arg)
 {
 	struct gpdma_cdev_softc *dcs = arg;
@@ -277,11 +279,9 @@
 	dcs->dcs_status = status;
 	dcs->dcs_state = DCS_COMPLETED;
 	
-	dcs_unlock(dcs);
-
 	wakeup(dcs);
 
-	return (0);	
+	dcs_unlock(dcs);
 }
 
 int


More information about the p4-projects mailing list