162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LINUX_IO_64_NONATOMIC_LO_HI_H_ 362306a36Sopenharmony_ci#define _LINUX_IO_64_NONATOMIC_LO_HI_H_ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/io.h> 662306a36Sopenharmony_ci#include <asm-generic/int-ll64.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic inline __u64 lo_hi_readq(const volatile void __iomem *addr) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci const volatile u32 __iomem *p = addr; 1162306a36Sopenharmony_ci u32 low, high; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci low = readl(p); 1462306a36Sopenharmony_ci high = readl(p + 1); 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci return low + ((u64)high << 32); 1762306a36Sopenharmony_ci} 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic inline void lo_hi_writeq(__u64 val, volatile void __iomem *addr) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci writel(val, addr); 2262306a36Sopenharmony_ci writel(val >> 32, addr + 4); 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic inline __u64 lo_hi_readq_relaxed(const volatile void __iomem *addr) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci const volatile u32 __iomem *p = addr; 2862306a36Sopenharmony_ci u32 low, high; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci low = readl_relaxed(p); 3162306a36Sopenharmony_ci high = readl_relaxed(p + 1); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci return low + ((u64)high << 32); 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic inline void lo_hi_writeq_relaxed(__u64 val, volatile void __iomem *addr) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci writel_relaxed(val, addr); 3962306a36Sopenharmony_ci writel_relaxed(val >> 32, addr + 4); 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#ifndef readq 4362306a36Sopenharmony_ci#define readq lo_hi_readq 4462306a36Sopenharmony_ci#endif 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#ifndef writeq 4762306a36Sopenharmony_ci#define writeq lo_hi_writeq 4862306a36Sopenharmony_ci#endif 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#ifndef readq_relaxed 5162306a36Sopenharmony_ci#define readq_relaxed lo_hi_readq_relaxed 5262306a36Sopenharmony_ci#endif 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#ifndef writeq_relaxed 5562306a36Sopenharmony_ci#define writeq_relaxed lo_hi_writeq_relaxed 5662306a36Sopenharmony_ci#endif 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#ifndef ioread64_lo_hi 5962306a36Sopenharmony_ci#define ioread64_lo_hi ioread64_lo_hi 6062306a36Sopenharmony_cistatic inline u64 ioread64_lo_hi(const void __iomem *addr) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci u32 low, high; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci low = ioread32(addr); 6562306a36Sopenharmony_ci high = ioread32(addr + sizeof(u32)); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci return low + ((u64)high << 32); 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#ifndef iowrite64_lo_hi 7262306a36Sopenharmony_ci#define iowrite64_lo_hi iowrite64_lo_hi 7362306a36Sopenharmony_cistatic inline void iowrite64_lo_hi(u64 val, void __iomem *addr) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci iowrite32(val, addr); 7662306a36Sopenharmony_ci iowrite32(val >> 32, addr + sizeof(u32)); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci#endif 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#ifndef ioread64be_lo_hi 8162306a36Sopenharmony_ci#define ioread64be_lo_hi ioread64be_lo_hi 8262306a36Sopenharmony_cistatic inline u64 ioread64be_lo_hi(const void __iomem *addr) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci u32 low, high; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci low = ioread32be(addr + sizeof(u32)); 8762306a36Sopenharmony_ci high = ioread32be(addr); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci return low + ((u64)high << 32); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci#endif 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#ifndef iowrite64be_lo_hi 9462306a36Sopenharmony_ci#define iowrite64be_lo_hi iowrite64be_lo_hi 9562306a36Sopenharmony_cistatic inline void iowrite64be_lo_hi(u64 val, void __iomem *addr) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci iowrite32be(val, addr + sizeof(u32)); 9862306a36Sopenharmony_ci iowrite32be(val >> 32, addr); 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci#endif 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#ifndef ioread64 10362306a36Sopenharmony_ci#define ioread64_is_nonatomic 10462306a36Sopenharmony_ci#define ioread64 ioread64_lo_hi 10562306a36Sopenharmony_ci#endif 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#ifndef iowrite64 10862306a36Sopenharmony_ci#define iowrite64_is_nonatomic 10962306a36Sopenharmony_ci#define iowrite64 iowrite64_lo_hi 11062306a36Sopenharmony_ci#endif 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#ifndef ioread64be 11362306a36Sopenharmony_ci#define ioread64be_is_nonatomic 11462306a36Sopenharmony_ci#define ioread64be ioread64be_lo_hi 11562306a36Sopenharmony_ci#endif 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#ifndef iowrite64be 11862306a36Sopenharmony_ci#define iowrite64be_is_nonatomic 11962306a36Sopenharmony_ci#define iowrite64be iowrite64be_lo_hi 12062306a36Sopenharmony_ci#endif 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#endif /* _LINUX_IO_64_NONATOMIC_LO_HI_H_ */ 123