/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to apps/xilinx.c

  • Committer: Suren A. Chilingaryan
  • Date: 2012-11-14 04:39:28 UTC
  • Revision ID: csa@dside.dyndns.org-20121114043928-f4do26r8bn0llgle
Xilinx benchmark

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#define _BSD_SOURCE
 
2
#include <stdio.h>
 
3
#include <stdlib.h>
 
4
#include <unistd.h>
 
5
#include <stdarg.h>
 
6
#include <sys/time.h>
 
7
 
 
8
#include "pcilib.h"
 
9
#include "irq.h"
 
10
#include "kmem.h"
 
11
 
 
12
#define DEVICE "/dev/fpga0"
 
13
#define BAR PCILIB_BAR0
 
14
#define USE PCILIB_KMEM_USE(PCILIB_KMEM_USE_USER, 1)
 
15
#define BUFFERS 16
 
16
#define ITERATIONS 16384
 
17
#define PAGE_SIZE 4096
 
18
#define TIMEOUT 100000
 
19
 
 
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); }
 
24
 
 
25
static void fail(const char *msg, ...) {
 
26
    va_list va;
 
27
    
 
28
    va_start(va, msg);
 
29
    vprintf(msg, va);
 
30
    va_end(va);
 
31
    printf("\n");
 
32
 
 
33
    exit(-1);
 
34
}
 
35
 
 
36
int main() {
 
37
    int err;
 
38
    int i, j;
 
39
    pcilib_t *pci;
 
40
    pcilib_kmem_handle_t *kbuf;
 
41
    uint32_t status;
 
42
    struct timeval start, end;
 
43
    size_t size, run_time;
 
44
    void* volatile bar;
 
45
 
 
46
    pcilib_kmem_flags_t clean_flags = PCILIB_KMEM_FLAG_HARDWARE|PCILIB_KMEM_FLAG_PERSISTENT|PCILIB_KMEM_FLAG_EXCLUSIVE;
 
47
 
 
48
 
 
49
    pci = pcilib_open(DEVICE, PCILIB_MODEL_DETECT);
 
50
    if (!pci) fail("pcilib_open");
 
51
 
 
52
    bar = pcilib_map_bar(pci, BAR);
 
53
    if (!bar) {
 
54
        pcilib_close(pci);
 
55
        fail("map bar");
 
56
    }
 
57
 
 
58
    pcilib_enable_irq(pci, PCILIB_IRQ_TYPE_ALL, 0);
 
59
    pcilib_clear_irq(pci, PCILIB_IRQ_SOURCE_DEFAULT);
 
60
 
 
61
    pcilib_clean_kernel_memory(pci, USE, clean_flags);
 
62
 
 
63
 
 
64
    kbuf = pcilib_alloc_kernel_memory(pci, PCILIB_KMEM_TYPE_DMA_C2S_PAGE, BUFFERS, PAGE_SIZE, 4096, USE, 0);
 
65
 
 
66
    
 
67
    WR(0x00, 1)
 
68
    usleep(1000);
 
69
    WR(0x00, 0)
 
70
    WR(0x04, 0)
 
71
    
 
72
    WR(0x0C, 0x20)
 
73
    WR(0x10, 0x20)
 
74
    WR(0x14, 0x13131313)
 
75
 
 
76
 
 
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);
 
81
            WR(0x08, ba)
 
82
            
 
83
            WR(0x04, 0x01)
 
84
 
 
85
            err = pcilib_wait_irq(pci, PCILIB_IRQ_SOURCE_DEFAULT, TIMEOUT, NULL);
 
86
            if (err) printf("Timeout waiting for IRQ, err: %i\n", err);
 
87
            
 
88
            RD(0x04, status);
 
89
            if ((status&0xFFFF) != 0x101) printf("Invalid status %x\n", status);
 
90
//          WR(0x04, 0x00);
 
91
 
 
92
            WR(0x00, 1)
 
93
            do {
 
94
                RD(0x04, status);
 
95
            } while (status != 0);
 
96
//          usleep(1);
 
97
            WR(0x00, 0)
 
98
        }
 
99
    }
 
100
    gettimeofday(&end, NULL);
 
101
 
 
102
    pcilib_free_kernel_memory(pci, kbuf,  0);
 
103
    pcilib_disable_irq(pci, 0);
 
104
    pcilib_unmap_bar(pci, BAR, bar);
 
105
    pcilib_close(pci);
 
106
 
 
107
    run_time = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
 
108
    size = ITERATIONS * BUFFERS * PAGE_SIZE;
 
109
 
 
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);
 
111
}