/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool
330 by Suren A. Chilingaryan
Support for 64-bit registes
1
#define _POSIX_C_SOURCE 200112L
2
#define _GNU_SOURCE
3
4
#include <stdio.h>
5
#include <string.h>
6
#include <unistd.h>
7
#include <stdint.h>
8
#include <assert.h>
9
#include <ctype.h>
10
#include <time.h>
11
#include <sched.h>
12
#include <arpa/inet.h>
13
#include <sys/time.h>
14
15
#include "pci.h"
16
#include "tools.h"
17
#include "error.h"
18
19
void *pcilib_memcpy8(void * dst, void const * src, size_t len) {
20
    int i;
21
    for (i = 0; i < len; i++) ((char*)dst)[i] = ((char*)src)[i];
22
    return dst;
23
}
24
25
void *pcilib_memcpy32(void * dst, void const * src, size_t len) {
26
    uint32_t * plDst = (uint32_t *) dst;
27
    uint32_t const * plSrc = (uint32_t const *) src;
28
29
    while (len >= 4) {
30
//        *plDst = ntohl(*plSrc);
31
	*plDst = *plSrc;
32
        plSrc++;
33
        plDst++;
34
        len -= 4;
35
    }
36
37
    char * pcDst = (char *) plDst;
38
    char const * pcSrc = (char const *) plSrc;
39
40
    while (len--) {
41
        *pcDst++ = *pcSrc++;
42
    }
43
44
    return (dst);
45
} 
46
47
48
void *pcilib_memcpy64(void * dst, void const * src, size_t len) {
49
    uint64_t * plDst = (uint64_t *) dst;
50
    uint64_t const * plSrc = (uint64_t const *) src;
51
52
    while (len >= 8) {
53
        *plDst++ = *plSrc++;
54
        len -= 8;
55
    }
56
57
    char * pcDst = (char *) plDst;
58
    char const * pcSrc = (char const *) plSrc;
59
60
    while (len--) {
61
        *pcDst++ = *pcSrc++;
62
    }
63
64
    return (dst);
65
} 
66
345 by Suren A. Chilingaryan
64-bit access to BAR memory
67
typedef void* (*pcilib_memcpy_routine_t)(void * dst, void const *src, size_t bytes);
68
static pcilib_memcpy_routine_t pcilib_memcpy_routines[4] = {
69
    pcilib_memcpy8, NULL, pcilib_memcpy32, pcilib_memcpy64
70
};
71
72
void *pcilib_memcpy(void * dst, void const * src, uint8_t access, size_t n) {
73
    size_t pos = 0, size = n * access;
74
    pcilib_memcpy_routine_t routine;
75
76
    assert((access)&&(access <= 8));
77
78
    while (access >>= 1) ++pos;
79
    routine = pcilib_memcpy_routines[pos];
80
81
    return routine(dst, src, size);
82
}