1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_IO_64_NONATOMIC_HI_LO_H_ 3 #define _LINUX_IO_64_NONATOMIC_HI_LO_H_ 4 5 #include <linux/io.h> 6 #include <asm-generic/int-ll64.h> 7 8 static inline __u64 hi_lo_readq(const volatile void __iomem *addr) 9 { 10 const volatile u32 __iomem *p = addr; 11 u32 low, high; 12 13 high = readl(p + 1); 14 low = readl(p); 15 16 return low + ((u64)high << 32); 17 } 18 19 static inline void hi_lo_writeq(__u64 val, volatile void __iomem *addr) 20 { 21 writel(val >> 32, addr + 4); 22 writel(val, addr); 23 } 24 25 static inline __u64 hi_lo_readq_relaxed(const volatile void __iomem *addr) 26 { 27 const volatile u32 __iomem *p = addr; 28 u32 low, high; 29 30 high = readl_relaxed(p + 1); 31 low = readl_relaxed(p); 32 33 return low + ((u64)high << 32); 34 } 35 36 static inline void hi_lo_writeq_relaxed(__u64 val, volatile void __iomem *addr) 37 { 38 writel_relaxed(val >> 32, addr + 4); 39 writel_relaxed(val, addr); 40 } 41 42 #ifndef readq 43 #define readq hi_lo_readq 44 #endif 45 46 #ifndef writeq 47 #define writeq hi_lo_writeq 48 #endif 49 50 #ifndef readq_relaxed 51 #define readq_relaxed hi_lo_readq_relaxed 52 #endif 53 54 #ifndef writeq_relaxed 55 #define writeq_relaxed hi_lo_writeq_relaxed 56 #endif 57 58 #ifndef ioread64_hi_lo 59 #define ioread64_hi_lo ioread64_hi_lo 60 static inline u64 ioread64_hi_lo(const void __iomem *addr) 61 { 62 u32 low, high; 63 64 high = ioread32(addr + sizeof(u32)); 65 low = ioread32(addr); 66 67 return low + ((u64)high << 32); 68 } 69 #endif 70 71 #ifndef iowrite64_hi_lo 72 #define iowrite64_hi_lo iowrite64_hi_lo 73 static inline void iowrite64_hi_lo(u64 val, void __iomem *addr) 74 { 75 iowrite32(val >> 32, addr + sizeof(u32)); 76 iowrite32(val, addr); 77 } 78 #endif 79 80 #ifndef ioread64be_hi_lo 81 #define ioread64be_hi_lo ioread64be_hi_lo 82 static inline u64 ioread64be_hi_lo(const void __iomem *addr) 83 { 84 u32 low, high; 85 86 high = ioread32be(addr); 87 low = ioread32be(addr + sizeof(u32)); 88 89 return low + ((u64)high << 32); 90 } 91 #endif 92 93 #ifndef iowrite64be_hi_lo 94 #define iowrite64be_hi_lo iowrite64be_hi_lo 95 static inline void iowrite64be_hi_lo(u64 val, void __iomem *addr) 96 { 97 iowrite32be(val >> 32, addr); 98 iowrite32be(val, addr + sizeof(u32)); 99 } 100 #endif 101 102 #ifndef ioread64 103 #define ioread64_is_nonatomic 104 #define ioread64 ioread64_hi_lo 105 #endif 106 107 #ifndef iowrite64 108 #define iowrite64_is_nonatomic 109 #define iowrite64 iowrite64_hi_lo 110 #endif 111 112 #ifndef ioread64be 113 #define ioread64be_is_nonatomic 114 #define ioread64be ioread64be_hi_lo 115 #endif 116 117 #ifndef iowrite64be 118 #define iowrite64be_is_nonatomic 119 #define iowrite64be iowrite64be_hi_lo 120 #endif 121 122 #endif /* _LINUX_IO_64_NONATOMIC_HI_LO_H_ */ 123
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.