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