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
mmio_writeb(const unsigned long mmio_addr,const uint8_t val)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
mmio_writew(const unsigned long mmio_addr,const uint16_t val)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
mmio_writel(const unsigned long mmio_addr,const uint32_t val)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
mmio_writeq(const unsigned long mmio_addr,const uint64_t val)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
mmio_write(const unsigned long mmio_addr,const void * val,const size_t length)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
mmio_readb(const unsigned long mmio_addr,uint8_t * val)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
mmio_readw(const unsigned long mmio_addr,uint16_t * val)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
mmio_readl(const unsigned long mmio_addr,uint32_t * val)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
mmio_readq(const unsigned long mmio_addr,uint64_t * val)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
mmio_read(const unsigned long mmio_addr,void * val,const size_t length)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
mlx4_bf_copy(unsigned long * dst,unsigned long * src,unsigned bytecnt)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 */
mlx4_bf_copy(unsigned long * dst,unsigned long * src,unsigned bytecnt)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
117