Blame view

include/linux/io-64-nonatomic-hi-lo.h 2.41 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
2f8e2c877   Christoph Hellwig   move io-64-nonato...
2
3
  #ifndef _LINUX_IO_64_NONATOMIC_HI_LO_H_
  #define _LINUX_IO_64_NONATOMIC_HI_LO_H_
797a796a1   Hitoshi Mitake   asm-generic: arch...
4
5
6
  
  #include <linux/io.h>
  #include <asm-generic/int-ll64.h>
3a044178c   Jason Baron   readq/writeq: Add...
7
  static inline __u64 hi_lo_readq(const volatile void __iomem *addr)
797a796a1   Hitoshi Mitake   asm-generic: arch...
8
9
10
11
12
13
14
15
16
  {
  	const volatile u32 __iomem *p = addr;
  	u32 low, high;
  
  	high = readl(p + 1);
  	low = readl(p);
  
  	return low + ((u64)high << 32);
  }
797a796a1   Hitoshi Mitake   asm-generic: arch...
17

3a044178c   Jason Baron   readq/writeq: Add...
18
  static inline void hi_lo_writeq(__u64 val, volatile void __iomem *addr)
797a796a1   Hitoshi Mitake   asm-generic: arch...
19
20
21
22
  {
  	writel(val >> 32, addr + 4);
  	writel(val, addr);
  }
3a044178c   Jason Baron   readq/writeq: Add...
23

e511267bc   Robin Murphy   io-64-nonatomic: ...
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  static inline __u64 hi_lo_readq_relaxed(const volatile void __iomem *addr)
  {
  	const volatile u32 __iomem *p = addr;
  	u32 low, high;
  
  	high = readl_relaxed(p + 1);
  	low = readl_relaxed(p);
  
  	return low + ((u64)high << 32);
  }
  
  static inline void hi_lo_writeq_relaxed(__u64 val, volatile void __iomem *addr)
  {
  	writel_relaxed(val >> 32, addr + 4);
  	writel_relaxed(val, addr);
  }
3a044178c   Jason Baron   readq/writeq: Add...
40
41
42
43
44
45
  #ifndef readq
  #define readq hi_lo_readq
  #endif
  
  #ifndef writeq
  #define writeq hi_lo_writeq
797a796a1   Hitoshi Mitake   asm-generic: arch...
46
  #endif
e511267bc   Robin Murphy   io-64-nonatomic: ...
47
48
49
50
51
52
53
  #ifndef readq_relaxed
  #define readq_relaxed hi_lo_readq_relaxed
  #endif
  
  #ifndef writeq_relaxed
  #define writeq_relaxed hi_lo_writeq_relaxed
  #endif
c81d64d3d   Logan Gunthorpe   io-64-nonatomic: ...
54
55
  #ifndef ioread64_hi_lo
  #define ioread64_hi_lo ioread64_hi_lo
8f28ca6bd   Krzysztof Kozlowski   iomap: constify i...
56
  static inline u64 ioread64_hi_lo(const void __iomem *addr)
c81d64d3d   Logan Gunthorpe   io-64-nonatomic: ...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  {
  	u32 low, high;
  
  	high = ioread32(addr + sizeof(u32));
  	low = ioread32(addr);
  
  	return low + ((u64)high << 32);
  }
  #endif
  
  #ifndef iowrite64_hi_lo
  #define iowrite64_hi_lo iowrite64_hi_lo
  static inline void iowrite64_hi_lo(u64 val, void __iomem *addr)
  {
  	iowrite32(val >> 32, addr + sizeof(u32));
  	iowrite32(val, addr);
  }
  #endif
  
  #ifndef ioread64be_hi_lo
  #define ioread64be_hi_lo ioread64be_hi_lo
8f28ca6bd   Krzysztof Kozlowski   iomap: constify i...
78
  static inline u64 ioread64be_hi_lo(const void __iomem *addr)
c81d64d3d   Logan Gunthorpe   io-64-nonatomic: ...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  {
  	u32 low, high;
  
  	high = ioread32be(addr);
  	low = ioread32be(addr + sizeof(u32));
  
  	return low + ((u64)high << 32);
  }
  #endif
  
  #ifndef iowrite64be_hi_lo
  #define iowrite64be_hi_lo iowrite64be_hi_lo
  static inline void iowrite64be_hi_lo(u64 val, void __iomem *addr)
  {
  	iowrite32be(val >> 32, addr);
  	iowrite32be(val, addr + sizeof(u32));
  }
  #endif
  
  #ifndef ioread64
  #define ioread64_is_nonatomic
  #define ioread64 ioread64_hi_lo
  #endif
  
  #ifndef iowrite64
  #define iowrite64_is_nonatomic
  #define iowrite64 iowrite64_hi_lo
  #endif
  
  #ifndef ioread64be
  #define ioread64be_is_nonatomic
  #define ioread64be ioread64be_hi_lo
  #endif
  
  #ifndef iowrite64be
  #define iowrite64be_is_nonatomic
  #define iowrite64be iowrite64be_hi_lo
  #endif
2f8e2c877   Christoph Hellwig   move io-64-nonato...
117
  #endif	/* _LINUX_IO_64_NONATOMIC_HI_LO_H_ */