12
#define DEVICE "/dev/fpga0"
13
#define BAR PCILIB_BAR0
14
#define USE PCILIB_KMEM_USE(PCILIB_KMEM_USE_USER, 1)
16
#define ITERATIONS 16384
17
#define PAGE_SIZE 4096
18
#define TIMEOUT 100000
20
//#define WR(addr, value) { val = value; pcilib_write(pci, BAR, addr, sizeof(val), &val); }
21
//#define RD(addr, value) { pcilib_read(pci, BAR, addr, sizeof(val), &val); value = val; }
22
#define WR(addr, value) { *(uint32_t*)(bar + addr) = value; }
23
#define RD(addr, value) { value = *(uint32_t*)(bar + addr); }
25
static void fail(const char *msg, ...) {
40
pcilib_kmem_handle_t *kbuf;
42
struct timeval start, end;
43
size_t size, run_time;
46
pcilib_kmem_flags_t clean_flags = PCILIB_KMEM_FLAG_HARDWARE|PCILIB_KMEM_FLAG_PERSISTENT|PCILIB_KMEM_FLAG_EXCLUSIVE;
49
pci = pcilib_open(DEVICE, PCILIB_MODEL_DETECT);
50
if (!pci) fail("pcilib_open");
52
bar = pcilib_map_bar(pci, BAR);
58
pcilib_enable_irq(pci, PCILIB_IRQ_TYPE_ALL, 0);
59
pcilib_clear_irq(pci, PCILIB_IRQ_SOURCE_DEFAULT);
61
pcilib_clean_kernel_memory(pci, USE, clean_flags);
64
kbuf = pcilib_alloc_kernel_memory(pci, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, BUFFERS, PAGE_SIZE, 4096, USE, 0);
77
gettimeofday(&start, NULL);
78
for (i = 0; i < ITERATIONS; i++) {
79
for (j = 0; j < BUFFERS; j++ ) {
80
uintptr_t ba = pcilib_kmem_get_block_ba(pci, kbuf, j);
85
err = pcilib_wait_irq(pci, PCILIB_IRQ_SOURCE_DEFAULT, TIMEOUT, NULL);
86
if (err) printf("Timeout waiting for IRQ, err: %i\n", err);
89
if ((status&0xFFFF) != 0x101) printf("Invalid status %x\n", status);
95
} while (status != 0);
100
gettimeofday(&end, NULL);
102
pcilib_free_kernel_memory(pci, kbuf, 0);
103
pcilib_disable_irq(pci, 0);
104
pcilib_unmap_bar(pci, BAR, bar);
107
run_time = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
108
size = ITERATIONS * BUFFERS * PAGE_SIZE;
110
printf("%.3lf GB/s: transfered %zu bytes in %zu us using %u buffers\n", 1000000. * size / run_time / 1024 / 1024 / 1024, size, run_time, BUFFERS);