Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jul 2010 10:29:19 GMT
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 181305 for review
Message-ID:  <201007221029.o6MATJhr033809@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181305?ac=10

Change 181305 by jceel@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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201007221029.o6MATJhr033809>