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