Date: Tue, 6 Jul 2010 18:14:45 GMT From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 180552 for review Message-ID: <201007061814.o66IEjdN046930@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180552?ac=10 Change 180552 by jceel@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007061814.o66IEjdN046930>