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