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