From owner-p4-projects@FreeBSD.ORG Wed Jul 21 11:01:27 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1BAA7106566B; Wed, 21 Jul 2010 11:01:26 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B953106566C for ; Wed, 21 Jul 2010 11:01:26 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 459798FC20 for ; Wed, 21 Jul 2010 11:01:26 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o6LB1Qfb024755 for ; Wed, 21 Jul 2010 11:01:26 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o6LB1QQu024753 for perforce@freebsd.org; Wed, 21 Jul 2010 11:01:26 GMT (envelope-from jceel@freebsd.org) Date: Wed, 21 Jul 2010 11:01:26 GMT Message-Id: <201007211101.o6LB1QQu024753@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 181253 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jul 2010 11:01:27 -0000 http://p4web.freebsd.org/@@181253?ac=10 Change 181253 by jceel@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 #include +#include + #include #include @@ -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