PERFORCE change 180552 for review

Jakub Wojciech Klama jceel at FreeBSD.org
Tue Jul 6 18:14:45 UTC 2010


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

Change 180552 by jceel at jceel on 2010/07/06 18:13:43

	Minor improvements.

Affected files ...

.. //depot/projects/soc2010/jceel_dma/sys/dev/dmae/dmae.c#3 edit
.. //depot/projects/soc2010/jceel_dma/sys/dev/dmae/dmae.h#3 edit
.. //depot/projects/soc2010/jceel_dma/sys/dev/dmae/dmae_cdev.c#3 edit

Differences ...

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

@@ -71,8 +71,6 @@
 {
 	bus_dma_segment_t *seg = (bus_dma_segment_t *)arg;
 
-	KASSERT(nseg > 1, "bus_dmamap_load returned nseg > 1");
-
 	seg->ds_addr = segs[0].ds_addr;
 	seg->ds_len = segs[0].ds_len;	
 }
@@ -83,8 +81,6 @@
 {
 	bus_dma_segment_t *seg = (bus_dma_segment_t *)arg;
 
-	KASSERT(nseg > 1, "bus_dmamap_load returned nseg > 1");
-
 	seg->ds_addr = segs[0].ds_addr;
 	seg->ds_len = segs[0].ds_len;
 }
@@ -136,7 +132,7 @@
 
 	LIST_INIT(&engine->de_cdevs);
 
-	for (i = 0; i < caps->dc_nchannels; i++) {
+	for (i = 0; i < 15; i++) {
 		cdev = malloc(sizeof(*cdev), M_DMAE, M_WAITOK);
 		rv = dmae_alloc_channel(device_get_nameunit(engine->de_dev), i);
 		dmae_make_cdev(engine, rv, &cdev->dec_cdev);
@@ -195,6 +191,11 @@
 	struct resource *rv;
 	struct dmae_engine *engine = dmae_engine_by_name(name);
 
+#ifdef	DEBUG
+	if (engine == NULL)
+		debugf("cannot find engine %s\n", name);
+#endif
+
 	rv = rman_reserve_resource(&engine->de_rman, chno, chno, 1,
 	    RF_ACTIVE, NULL);
 
@@ -204,28 +205,35 @@
 int
 dmae_release_channel(struct resource *res)
 {
+	if (res == NULL)
+		return (0);
+
 	return (rman_release_resource(res));
 }
 
-void *
-dmae_program_transfer(struct dmae_transfer *xfer)
+int
+dmae_program_transfer(struct dmae_transfer *xfer, void **cookiep)
 {
 	struct dmae_engine *engine = xfer->dt_engine;
 	int channel = rman_get_start(xfer->dt_res);
+	int err = 0;
 
 	if (rman_get_size(xfer->dt_res) != 1)
-		return (NULL);
+		return (EINVAL);
 
 	if (engine == NULL)
-		return (NULL);
+		return (EINVAL);
 
-	if (dmae_check_transfer(xfer))
-		return (NULL);
+	err = dmae_check_transfer(xfer);
+	if (err)
+		return (err);
 
-	if (DMAE_SETUP_CHANNEL(engine->de_dev, channel, xfer))
-		return (NULL);
+	err = DMAE_SETUP_CHANNEL(engine->de_dev, channel, xfer);
+	if (err)
+		return (err);
 
-	return (xfer);
+	*cookiep = xfer;
+	return (0);
 }
 
 int
@@ -257,13 +265,19 @@
 	if (engine == NULL)
 		return (NULL);
 
-	xfer = malloc(sizeof(struct dmae_transfer), M_DMAE, M_WAITOK);
+	xfer = malloc(sizeof(struct dmae_transfer), M_DMAE, M_WAITOK | M_ZERO);
 	xfer->dt_res = res;
 	xfer->dt_engine = engine;
 
 	return (xfer);
 }
 
+void
+dmae_free_transfer(struct dmae_transfer *xfer)
+{
+	free(xfer, M_DMAE);
+}
+
 int 
 dmae_setup_buffer_raw(struct dmae_transfer *xfer, int buffer,
     bus_addr_t paddr, bus_size_t length)
@@ -282,13 +296,13 @@
 	struct dmae_buffer *buf = &xfer->dt_buffers[buffer];
 	bus_dma_segment_t seg;
 
-	bus_dma_tag_create(buf->db_transfer->dt_engine->de_dmatag,
+	bus_dma_tag_create(xfer->dt_engine->de_dmatag,
 	    1, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
 	    NULL, NULL, length, 1, length, BUS_DMA_ALLOCNOW,
 	    NULL, NULL, &buf->db_dmatag);
 
 	bus_dmamap_create(buf->db_dmatag, 0, &buf->db_dmamap);
-	bus_dmamap_load(buf->db_dmatag, buf->db_dmamap, buf, 
+	bus_dmamap_load(buf->db_dmatag, buf->db_dmamap, addr, 
 	    length, dmae_dmamap_load_cb, &seg, BUS_DMA_NOWAIT);
 
 	buf->db_addr = seg.ds_addr;
@@ -318,6 +332,12 @@
 }
 
 inline void
+dmae_set_transfer_func(struct dmae_transfer *xfer, int func)
+{
+	xfer->dt_func = func;
+}
+
+inline void
 dmae_set_transfer_opts(struct dmae_transfer *xfer, int flags)
 {
 	xfer->dt_flags = flags;

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

@@ -56,9 +56,18 @@
 	DMAE_TRANSFER_COMPLETED_STRIDE,
 	DMAE_TRANSFER_COMPLETED_LINK,
 	DMAE_TRANSFER_CANCELLED,
+	DMAE_TRANSFER_INPROGRESS,
 	DMAE_TRANSFER_ERROR,
 };
 
+enum dmae_transfer_error {
+	DMAE_ERROR_INVALID,
+	DMAE_ERROR_BUS,
+	DMAE_ERROR_READ,
+	DMAE_ERROR_WRITE,
+	DMAE_ERROR_UNKNOWN,
+};
+
 struct dmae_engine {
 	device_t			de_dev;
 	bus_dma_tag_t			de_dmatag;
@@ -101,7 +110,7 @@
 
 struct dmae_transfer {
 	int			dt_type;
-	int			dt_op;
+	int			dt_func;
 	int			dt_flags;
 #define	DMAE_TRANSFER_EXTTRIG		0x1 /* transfer is triggered by external source */
 #define	DMAE_TRANSFER_REPEAT		0x2 /* repeat transfer until cancel */
@@ -136,7 +145,7 @@
 
 dmae_transfer_t dmae_alloc_transfer(struct resource *);
 void dmae_free_transfer(dmae_transfer_t);
-void *dmae_program_transfer(dmae_transfer_t);
+int dmae_program_transfer(dmae_transfer_t, void **);
 int dmae_start_transfer(void *);
 int dmae_stop_transfer(void *);
 

==== //depot/projects/soc2010/jceel_dma/sys/dev/dmae/dmae_cdev.c#3 (text+ko) ====

@@ -50,6 +50,7 @@
 static d_close_t dmae_cdev_close;
 static d_read_t dmae_cdev_read;
 static d_write_t dmae_cdev_write;
+static d_ioctl_t dmae_cdev_ioctl;
 
 static int dmae_cdev_callback(int, void *);
 
@@ -66,6 +67,7 @@
 	.d_close	= dmae_cdev_close,
 	.d_read		= dmae_cdev_read,
 	.d_write	= dmae_cdev_write,
+	.d_ioctl	= dmae_cdev_ioctl,
 	.d_name		= "dmae"
 };
 
@@ -170,7 +172,7 @@
 	struct dmae_cdev_request req;
 	struct dmae_transfer *xfer;
 	struct uio uiosrc, uiodst;
-	int ret;
+	int ret = 0;
 	bus_size_t length;
 
 	debugf("dmae_cdev_write entry for %s", dev->si_name);
@@ -226,9 +228,18 @@
 	}
 	
 	/* Setup transfer */
-	dcs->dcs_xfercookie = dmae_program_transfer(xfer);
-	dmae_start_transfer(dcs->dcs_xfercookie);
-	
+	ret = dmae_program_transfer(xfer, &dcs->dcs_xfercookie);
+	if (ret) {
+		dcs_unlock(dcs);
+		return (EIO);
+	}
+
+	ret = dmae_start_transfer(dcs->dcs_xfercookie);
+	if (ret) {
+		return (EIO);
+		dcs_unlock(dcs);
+	}
+
 	dcs->dcs_state = DCS_ACTIVE;
 	dcs_unlock(dcs);
 
@@ -236,6 +247,19 @@
 }
 
 static int
+dmae_cdev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
+    struct thread *td)
+{
+	int ret = 0;
+
+	switch (cmd) {
+
+	}
+
+	return (ret);
+}
+
+static int
 dmae_cdev_callback(int status, void *arg)
 {
 	struct dmae_cdev_softc *dcs = arg;
@@ -244,8 +268,8 @@
 
 	dcs_lock(dcs);
 
-	KASSERT(dcs->dcs_state != DCS_ACTIVE, 
-	    "dmae_cdev_callback: inactive channel");
+	KASSERT(dcs->dcs_state == DCS_ACTIVE, 
+	    ("dmae_cdev_callback: inactive channel"));
 	
 	dcs->dcs_status = status;
 	dcs->dcs_state = DCS_COMPLETED;


More information about the p4-projects mailing list