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>