PERFORCE change 181305 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Thu Jul 22 10:29:20 UTC 2010
http://p4web.freebsd.org/@@181305?ac=10
Change 181305 by jceel at jceel on 2010/07/22 10:28:41
DMA testsuite improvements.
Affected files ...
.. //depot/projects/soc2010/jceel_dma/sys/contrib/dmatest/dmatest.c#2 edit
Differences ...
==== //depot/projects/soc2010/jceel_dma/sys/contrib/dmatest/dmatest.c#2 (text+ko) ====
@@ -31,8 +31,12 @@
#include <sys/errno.h>
#include <sys/param.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#include <sys/kdb.h>
-#include <dev/dmae/dmae.h>
+#include <dev/gpdma/gpdma.h>
#define DEVICE "edma0"
#define CHANNEL 42
@@ -41,7 +45,8 @@
#define WAIT(status) \
do { \
- tsleep(status, 0, "dmatst", 5 * hz); \
+ printf("WAIT()\n"); \
+ mtx_sleep(status, &waitmtx, 0, "dmatst", 5 * hz); \
} while (0);
#define ASSERT(cond, args...) \
@@ -55,13 +60,21 @@
} \
} while (0);
-static int dmatest_callback(int status, void *arg);
+static void dmatest_callback(int status, void *arg);
+static void dmatest_run(struct resource *);
+
+/* DMA tests: */
static int dmatest_simplecopy(struct resource *);
static int dmatest_invalid(struct resource *);
+static int dmatest_reuse(struct resource *);
static int dmatest_frame(struct resource *);
-static void dmatest_run(struct resource *);
+static int dmatest_frame_callback(struct resource *);
+static int dmatest_linked(struct resource *);
+static int dmatest_repeated(struct resource *);
+static int dmatest_poll(struct resource *);
static struct resource *rv = NULL;
+static struct mtx waitmtx;
static const struct {
const char *name;
@@ -69,16 +82,23 @@
} dmatest_tests[] = {
{"simple copy", dmatest_simplecopy},
{"invalid transfer", dmatest_invalid},
+ {"transfer descriptor reusing", dmatest_reuse},
{"frame transfer", dmatest_frame},
+ {"frame transfer (stride callbacks)", dmatest_frame_callback},
+ {"linked transfer", dmatest_linked},
+ {"repeated transfer", dmatest_repeated},
+ {"transfer polling", dmatest_poll},
};
-static int
+static void
dmatest_callback(int status, void *arg)
{
+ mtx_lock(&waitmtx);
+
*(int *)arg = status;
wakeup(arg);
-
- return (0);
+
+ mtx_unlock(&waitmtx);
}
static void
@@ -86,10 +106,11 @@
{
int i;
- printf("DMAE testsuite running.\n");
+ uprintf("GPDMA testsuite running.\n");
+ uprintf("Using channel %d on device %s.\n", CHANNEL, DEVICE);
for (i = 0; i < N(dmatest_tests); i++) {
- uprintf("Running test #%d: %s: ", i, dmatest_tests[i].name);
+ uprintf("Running test #%d: %s: ", i + 1, dmatest_tests[i].name);
if (dmatest_tests[i].test(rv) == 0) {
uprintf("passed.\n");
continue;
@@ -103,7 +124,7 @@
static int
dmatest_simplecopy(struct resource *channel)
{
- dmae_transfer_t xfer = NULL;
+ gpdma_transfer_t xfer = NULL;
void *buf_a, *buf_b, *cookie;
int err = 0, status;
@@ -114,72 +135,167 @@
memset(buf_a, 0x55, BUFSIZE);
memset(buf_b, 0x00, BUFSIZE);
- xfer = dmae_alloc_transfer(channel);
- ASSERT(xfer == NULL, "dmae_alloc_transfer: returned NULL");
+ xfer = gpdma_alloc_transfer(channel);
+ ASSERT(xfer == NULL, "gpdma_alloc_transfer: returned NULL");
- dmae_set_transfer_func(xfer, DMAE_COPY);
- dmae_set_transfer_callback(xfer, dmatest_callback, &status);
- dmae_setup_buffer_virt(xfer, DMAE_BUF_SRC, buf_a, BUFSIZE);
- dmae_setup_buffer_virt(xfer, DMAE_BUF_DST, buf_b, BUFSIZE);
+ gpdma_set_transfer_func(xfer, GPDMA_COPY);
+ gpdma_set_transfer_callback(xfer, dmatest_callback, &status);
+ gpdma_load_buffer_virt(xfer, GPDMA_BUF_SRC, buf_a, BUFSIZE);
+ gpdma_load_buffer_virt(xfer, GPDMA_BUF_DST, buf_b, BUFSIZE);
- err = dmae_program_transfer(xfer, &cookie);
- ASSERT(err != 0, "dmae_program_transfer: error %d", err);
- ASSERT(cookie == NULL, "dmae_program_transfer: invalid cookie");
+ err = gpdma_program_transfer(xfer, &cookie);
+ ASSERT(err != 0, "gpdma_program_transfer: error %d", err);
+ ASSERT(cookie == NULL, "gpdma_program_transfer: invalid cookie");
- err = dmae_start_transfer(cookie);
- ASSERT(err != 0, "dmae_start_transfer: error %d", err);
+ mtx_lock(&waitmtx);
+ err = gpdma_start_transfer(cookie);
+ ASSERT(err != 0, "gpdma_start_transfer: error %d", err);
WAIT(&status);
ASSERT(status != 0, "transfer status %d", status);
+ mtx_unlock(&waitmtx);
+ printf("buf_a = %p buf_b = %p\n", buf_a, buf_b);
+ kdb_enter("", "");
err = memcmp(buf_a, buf_b, BUFSIZE);
ASSERT(err != 0, "memory regions doesn't match");
out:
free(buf_a, M_TEMP);
free(buf_b, M_TEMP);
- dmae_free_transfer(xfer);
+ gpdma_free_transfer(xfer);
return (err);
}
static int
dmatest_invalid(struct resource *channel)
{
- dmae_transfer_t xfer;
+ gpdma_transfer_t xfer;
void *cookie;
int err = 0;
- xfer = dmae_alloc_transfer(channel);
- ASSERT(xfer == NULL, "dmae_alloc_transfer: returned NULL");
+ xfer = gpdma_alloc_transfer(channel);
+ ASSERT(xfer == NULL, "gpdma_alloc_transfer: returned NULL");
- dmae_set_transfer_func(xfer, DMAE_COPY);
- dmae_set_transfer_callback(xfer, dmatest_callback, NULL);
- dmae_setup_buffer_raw(xfer, DMAE_BUF_SRC, 0xfffffffe, 0);
- dmae_setup_buffer_raw(xfer, DMAE_BUF_DST, 0xffffff00, 0);
+ gpdma_set_transfer_func(xfer, GPDMA_COPY);
+ gpdma_set_transfer_callback(xfer, dmatest_callback, NULL);
+ gpdma_load_buffer_raw(xfer, GPDMA_BUF_SRC, 0xfffffffe, 0);
+ gpdma_load_buffer_raw(xfer, GPDMA_BUF_DST, 0xffffff00, 0);
- err = dmae_program_transfer(xfer, &cookie);
- ASSERT(err != EINVAL, "dmae_program_transfer: error %d", err);
+ err = gpdma_program_transfer(xfer, &cookie);
+ ASSERT(err != EINVAL, "gpdma_program_transfer: error %d", err);
err = 0;
out:
- dmae_free_transfer(xfer);
+ gpdma_free_transfer(xfer);
return (err);
}
static int
+dmatest_reuse(struct resource *channel)
+{
+ return (0);
+}
+
+static int
dmatest_frame(struct resource *channel)
{
return (0);
}
static int
+dmatest_frame_callback(struct resource *channel)
+{
+ return (0);
+}
+
+static int
+dmatest_linked(struct resource *channel)
+{
+ gpdma_transfer_t xfer, xfer2;
+ void *buf_1, *buf_2, *buf_3, *buf_4, *cookie;
+ int status_1, status_2, err = 0;
+
+ buf_1 = malloc(BUFSIZE, M_TEMP, M_WAITOK);
+ buf_2 = malloc(BUFSIZE, M_TEMP, M_WAITOK);
+ buf_3 = malloc(BUFSIZE, M_TEMP, M_WAITOK);
+ buf_4 = malloc(BUFSIZE, M_TEMP, M_WAITOK);
+
+ memset(buf_1, 0x66, BUFSIZE);
+ memset(buf_3, 0x77, BUFSIZE);
+
+ xfer = gpdma_alloc_transfer(channel);
+ ASSERT(xfer == NULL, "gpdma_alloc_transfer: returned NULL");
+
+ xfer2 = gpdma_alloc_transfer(channel);
+ ASSERT(xfer2 == NULL, "gpdma_alloc_transfer: returned NULL");
+
+ /* First transfer */
+ gpdma_set_transfer_func(xfer, GPDMA_COPY);
+ gpdma_set_transfer_callback(xfer, dmatest_callback, &status_1);
+ gpdma_load_buffer_virt(xfer, GPDMA_BUF_SRC, buf_1, BUFSIZE);
+ gpdma_load_buffer_virt(xfer, GPDMA_BUF_DST, buf_2, BUFSIZE);
+ gpdma_set_transfer_link(xfer, xfer2);
+
+ /* Second transfer */
+ gpdma_set_transfer_func(xfer2, GPDMA_COPY);
+ gpdma_set_transfer_callback(xfer2, dmatest_callback, &status_2);
+ gpdma_load_buffer_virt(xfer2, GPDMA_BUF_SRC, buf_3, BUFSIZE);
+ gpdma_load_buffer_virt(xfer2, GPDMA_BUF_DST, buf_4, BUFSIZE);
+
+ err = gpdma_program_transfer(xfer, &cookie);
+ ASSERT(err != 0, "gpdma_program_transfer: error %d", err);
+
+ mtx_lock(&waitmtx);
+ err = gpdma_start_transfer(cookie);
+ ASSERT(err != 0, "gpdma_start_transfer: error %d", err);
+
+ WAIT(&status_2);
+ printf("status_1 = %d\n", status_1);
+ printf("status_2 = %d\n", status_2);
+ mtx_unlock(&waitmtx);
+
+ err = memcmp(buf_1, buf_2, BUFSIZE);
+ ASSERT(err != 0, "memory regions 1,2 doesn't match");
+
+ err = memcmp(buf_3, buf_4, BUFSIZE);
+ ASSERT(err != 0, "memory regions 3,4 doesn't match");
+
+ err = 0;
+out:
+ gpdma_free_transfer(xfer);
+// gpdma_free_transfer(xfer2);
+ return (err);
+}
+
+static int
+dmatest_repeated(struct resource *rv)
+{
+ gpdma_transfer_t xfer;
+// void *cookie;
+// int err = 0;
+
+ xfer = gpdma_alloc_transfer(rv);
+
+
+ return (0);
+}
+
+static int
+dmatest_poll(struct resource *rv)
+{
+ return (0);
+}
+
+static int
dmatest_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD:
- rv = dmae_alloc_channel(DEVICE, CHANNEL);
+ mtx_init(&waitmtx, "dmatest wait mtx", "dma", MTX_DEF);
+ rv = gpdma_alloc_channel(DEVICE, CHANNEL);
if (rv == NULL) {
uprintf("Cannot allocate DMA resource %s:%d\n", DEVICE, CHANNEL);
err = ENXIO;
@@ -188,7 +304,7 @@
dmatest_run(rv);
break;
case MOD_UNLOAD:
- dmae_release_channel(rv);
+ gpdma_release_channel(rv);
break;
default:
err = EOPNOTSUPP;
More information about the p4-projects
mailing list