Commit e1792087 authored by Tristan Gingold's avatar Tristan Gingold

vmedma.c: add repeat and pattern options.

parent cf17af4f
...@@ -41,13 +41,9 @@ static void ...@@ -41,13 +41,9 @@ static void
rate_done (struct timespec *start_ts, unsigned int nbr_bytes) rate_done (struct timespec *start_ts, unsigned int nbr_bytes)
{ {
struct timespec end_ts; struct timespec end_ts;
unsigned long nano; uint64_t nano;
if (clock_gettime (CLOCK_MONOTONIC, &end_ts) != 0) rate_start(&end_ts);
{
fprintf (stderr, "clock_gettime error: %m\n");
exit (4);
}
nano = (end_ts.tv_nsec - start_ts->tv_nsec) nano = (end_ts.tv_nsec - start_ts->tv_nsec)
+ (end_ts.tv_sec - start_ts->tv_sec) * 1000000000; + (end_ts.tv_sec - start_ts->tv_sec) * 1000000000;
printf ("Rate: %f MB/sec\n", printf ("Rate: %f MB/sec\n",
...@@ -129,10 +125,12 @@ static const struct option options[] = ...@@ -129,10 +125,12 @@ static const struct option options[] =
{ "addr", required_argument, 0, 'a' }, { "addr", required_argument, 0, 'a' },
{ "len", required_argument, 0, 'n' }, { "len", required_argument, 0, 'n' },
{ "am", required_argument, 0, 'm' }, { "am", required_argument, 0, 'm' },
{ "repeat", required_argument, 0, 'r' },
{ "2e", required_argument, 0, 'e' }, { "2e", required_argument, 0, 'e' },
{ "dump", no_argument, 0, 'd' }, { "dump", no_argument, 0, 'd' },
{ "pattern", no_argument, 0, 'p' },
{ "help", no_argument, 0, 'h' }, { "help", no_argument, 0, 'h' },
{ "verbose", no_argument, 0, 'v' }, { "verbose", no_argument, 0, 'v' },
{ "vbs", required_argument, 0, OPT_VBS }, { "vbs", required_argument, 0, OPT_VBS },
{ "pbs", required_argument, 0, OPT_PBS }, { "pbs", required_argument, 0, OPT_PBS },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
...@@ -145,12 +143,14 @@ main (int argc, char **argv) ...@@ -145,12 +143,14 @@ main (int argc, char **argv)
unsigned addr = 0xffffffff; unsigned addr = 0xffffffff;
unsigned int len = 4096; unsigned int len = 4096;
int c; int c;
void *buf; unsigned char *buf;
int flag_dump = 0; int flag_dump = 0;
int flag_pattern = 0;
int flag_verbose = 0; int flag_verbose = 0;
int repeat = 1;
enum vme_2esst_mode vmode = VME_2eVME; enum vme_2esst_mode vmode = VME_2eVME;
while ((c = getopt_long (argc, argv, "a:m:n:e:dhv", while ((c = getopt_long (argc, argv, "a:m:n:e:r:dhv",
options, NULL)) != -1) options, NULL)) != -1)
switch (c) switch (c)
{ {
...@@ -160,6 +160,9 @@ main (int argc, char **argv) ...@@ -160,6 +160,9 @@ main (int argc, char **argv)
case 'n': case 'n':
len = strtol (optarg, NULL, 0); len = strtol (optarg, NULL, 0);
break; break;
case 'r':
repeat = strtol (optarg, NULL, 0);
break;
case 'm': case 'm':
am = strtol (optarg, NULL, 0); am = strtol (optarg, NULL, 0);
break; break;
...@@ -169,6 +172,10 @@ main (int argc, char **argv) ...@@ -169,6 +172,10 @@ main (int argc, char **argv)
else if (strcmp (optarg, "2eSST") == 0 else if (strcmp (optarg, "2eSST") == 0
|| strcmp (optarg, "2eSST-160") == 0) || strcmp (optarg, "2eSST-160") == 0)
vmode = VME_SST160; vmode = VME_SST160;
else if (strcmp (optarg, "2eSST-267") == 0)
vmode = VME_SST267;
else if (strcmp (optarg, "2eSST-320") == 0)
vmode = VME_SST320;
else { else {
fprintf (stderr, "%s: bad value for -e, expect 2eVME or 2eSST-160\n", fprintf (stderr, "%s: bad value for -e, expect 2eVME or 2eSST-160\n",
argv[0]); argv[0]);
...@@ -178,6 +185,9 @@ main (int argc, char **argv) ...@@ -178,6 +185,9 @@ main (int argc, char **argv)
case 'd': case 'd':
flag_dump = 1; flag_dump = 1;
break; break;
case 'p':
flag_pattern = 1;
break;
case 'v': case 'v':
flag_verbose = 1; flag_verbose = 1;
break; break;
...@@ -191,7 +201,9 @@ main (int argc, char **argv) ...@@ -191,7 +201,9 @@ main (int argc, char **argv)
printf ("usage: %s -a ADDR [-m AM] [-n LENGTH]\n", argv[0]); printf ("usage: %s -a ADDR [-m AM] [-n LENGTH]\n", argv[0]);
printf ("options:\n" printf ("options:\n"
" --vbs=SZ set VME block size\n" " --vbs=SZ set VME block size\n"
" --pbs=SZ set PCI block size\n"); " --pbs=SZ set PCI block size\n"
" --dump dump data read\n"
" --pattern check data read\n");
return 0; return 0;
case '?': case '?':
fprintf (stderr, "incorrect option, try %s -h\n", argv[0]); fprintf (stderr, "incorrect option, try %s -h\n", argv[0]);
...@@ -213,25 +225,39 @@ main (int argc, char **argv) ...@@ -213,25 +225,39 @@ main (int argc, char **argv)
printf ("INFO: test DMA for am 0x%02x, mode: %u (addr: 0x%08x, len: 0x%0x)\n", printf ("INFO: test DMA for am 0x%02x, mode: %u (addr: 0x%08x, len: 0x%0x)\n",
am, vmode, addr, len); am, vmode, addr, len);
if (posix_memalign (&buf, 4096, len) != 0) if (posix_memalign ((void **)&buf, 4096, len) != 0)
{ {
fprintf (stderr, "cannot allocate memory\n"); fprintf (stderr, "cannot allocate memory\n");
exit (4); exit (4);
} }
do_test_dma (am, vmode, addr, len, buf); while (repeat-- > 0)
{
do_test_dma (am, vmode, addr, len, buf);
if (flag_dump) if (flag_dump || flag_pattern)
for (unsigned i = 0; i < len; i += 4) for (unsigned i = 0; i < len; i += 4)
{ {
unsigned int v; unsigned int v;
/* Read as BE32. */ /* Read as BE32. */
v = (buf[i] << 24) v = (buf[i] << 24)
| (buf[i + 1] << 16) | (buf[i + 1] << 16)
| (buf[i + 2] << 8) | (buf[i + 2] << 8)
| buf[i + 3]; | buf[i + 3];
printf ("%08x: %08x\n", addr + i, v);
} if (flag_dump)
printf ("%08x: %08x\n", addr + i, v);
if (flag_pattern)
{
unsigned patt = ((addr + i) >> 2) & 0xff;
patt = ((~patt & 0xff) << 8) | patt;
patt = (patt << 16) | patt;
if (v != patt)
printf ("%08x: %08x instead of %08x ERR!\n",
addr + i, v, patt);
}
}
}
free (buf); free (buf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment