]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/ofed/libmlx4/mmio.h
Upgrade Unbound to 1.7.3. More to follow.
[FreeBSD/FreeBSD.git] / contrib / ofed / libmlx4 / mmio.h
1 /* Licensed under the OpenIB.org BSD license (FreeBSD Variant) - See COPYING.md
2  */
3 #ifndef MMIO_H
4 #define MMIO_H
5
6 #include <unistd.h>
7 #include <sys/syscall.h>
8 #ifdef __s390x__
9
10 static inline long mmio_writeb(const unsigned long mmio_addr,
11                                const uint8_t val)
12 {
13         return syscall(__NR_s390_pci_mmio_write, mmio_addr, &val, sizeof(val));
14 }
15
16 static inline long mmio_writew(const unsigned long mmio_addr,
17                                const uint16_t val)
18 {
19         return syscall(__NR_s390_pci_mmio_write, mmio_addr, &val, sizeof(val));
20 }
21
22 static inline long mmio_writel(const unsigned long mmio_addr,
23                                const uint32_t val)
24 {
25         return syscall(__NR_s390_pci_mmio_write, mmio_addr, &val, sizeof(val));
26 }
27
28 static inline long mmio_writeq(const unsigned long mmio_addr,
29                                const uint64_t val)
30 {
31         return syscall(__NR_s390_pci_mmio_write, mmio_addr, &val, sizeof(val));
32 }
33
34 static inline long mmio_write(const unsigned long mmio_addr,
35                               const void *val,
36                               const size_t length)
37 {
38         return syscall(__NR_s390_pci_mmio_write, mmio_addr, val, length);
39 }
40
41 static inline long mmio_readb(const unsigned long mmio_addr, uint8_t *val)
42 {
43         return syscall(__NR_s390_pci_mmio_read, mmio_addr, val, sizeof(*val));
44 }
45
46 static inline long mmio_readw(const unsigned long mmio_addr, uint16_t *val)
47 {
48         return syscall(__NR_s390_pci_mmio_read, mmio_addr, val, sizeof(*val));
49 }
50
51 static inline long mmio_readl(const unsigned long mmio_addr, uint32_t *val)
52 {
53         return syscall(__NR_s390_pci_mmio_read, mmio_addr, val, sizeof(*val));
54 }
55
56 static inline long mmio_readq(const unsigned long mmio_addr, uint64_t *val)
57 {
58         return syscall(__NR_s390_pci_mmio_read, mmio_addr, val, sizeof(*val));
59 }
60
61 static inline long mmio_read(const unsigned long mmio_addr,
62                              void *val,
63                              const size_t length)
64 {
65         return syscall(__NR_s390_pci_mmio_read, mmio_addr, val, length);
66 }
67
68 static inline void mlx4_bf_copy(unsigned long *dst,
69                                 unsigned long *src,
70                                 unsigned bytecnt)
71 {
72         mmio_write((unsigned long)dst, src, bytecnt);
73 }
74
75 #else
76
77 #define mmio_writeb(addr, value) \
78         (*((volatile uint8_t *)addr) = value)
79 #define mmio_writew(addr, value) \
80         (*((volatile uint16_t *)addr) = value)
81 #define mmio_writel(addr, value) \
82         (*((volatile uint32_t *)addr) = value)
83 #define mmio_writeq(addr, value) \
84         (*((volatile uint64_t *)addr) = value)
85 #define mmio_write(addr, value, length) \
86         memcpy(addr, value, length)
87
88 #define mmio_readb(addr, value) \
89         (value = *((volatile uint8_t *)addr))
90 #define mmio_readw(addr, value) \
91         (value = *((volatile uint16_t *)addr))
92 #define mmio_readl(addr, value) \
93         (value = *((volatile uint32_t *)addr))
94 #define mmio_readq(addr, value) \
95         (value = *((volatile uint64_t *)addr))
96 #define mmio_read(addr, value, length) \
97         memcpy(value, addr, length)
98
99 /*
100  * Avoid using memcpy() to copy to BlueFlame page, since memcpy()
101  * implementations may use move-string-buffer assembler instructions,
102  * which do not guarantee order of copying.
103  */
104 static inline void mlx4_bf_copy(unsigned long *dst,
105                                 unsigned long *src,
106                                 unsigned bytecnt)
107 {
108         while (bytecnt > 0) {
109                 *dst++ = *src++;
110                 *dst++ = *src++;
111                 bytecnt -= 2 * sizeof(long);
112         }
113 }
114 #endif
115
116 #endif