[PATCH RFC 3/4] io-128-nonatomic: introduce io{read|write}128_{lo_hi|hi_lo}
From: Chenghai Huang <hidden>
Date: 2025-11-12 01:58:58
Also in:
linux-api, linux-arch, linux-crypto, lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Weili Qian <qianweili@huawei.com>
In order to provide non-atomic functions for io{read|write}128.
We define a number of variants of these functions in the generic
iomap that will do non-atomic operations.
These functions are only defined if io{read|write}128 are defined.
If they are not, then the wrappers that always use non-atomic operations
from include/linux/io-128-nonatomic*.h will be used.
Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Chenghai Huang <redacted>
---
include/linux/io-128-nonatomic-hi-lo.h | 35 ++++++++++++++++++++++++++
include/linux/io-128-nonatomic-lo-hi.h | 34 +++++++++++++++++++++++++
2 files changed, 69 insertions(+)
create mode 100644 include/linux/io-128-nonatomic-hi-lo.h
create mode 100644 include/linux/io-128-nonatomic-lo-hi.h
diff --git a/include/linux/io-128-nonatomic-hi-lo.h b/include/linux/io-128-nonatomic-hi-lo.h
new file mode 100644
index 000000000000..b5b083a9e81b
--- /dev/null
+++ b/include/linux/io-128-nonatomic-hi-lo.h@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_IO_128_NONATOMIC_HI_LO_H_ +#define _LINUX_IO_128_NONATOMIC_HI_LO_H_ + +#include <linux/io.h> +#include <asm-generic/int-ll64.h> + +static inline u128 ioread128_hi_lo(const void __iomem *addr) +{ + u32 low, high; + + high = ioread64(addr + sizeof(u64)); + low = ioread64(addr); + + return low + ((u128)high << 64); +} + +static inline void iowrite128_hi_lo(u128 val, void __iomem *addr) +{ + iowrite64(val >> 64, addr + sizeof(u64)); + iowrite64(val, addr); +} + +#ifndef ioread128 +#define ioread128_is_nonatomic +#define ioread128 ioread128_hi_lo +#endif + +#ifndef iowrite128 +#define iowrite128_is_nonatomic +#define iowrite128 iowrite128_hi_lo +#endif + +#endif /* _LINUX_IO_128_NONATOMIC_HI_LO_H_ */ +
diff --git a/include/linux/io-128-nonatomic-lo-hi.h b/include/linux/io-128-nonatomic-lo-hi.h
new file mode 100644
index 000000000000..0448ee5a13de
--- /dev/null
+++ b/include/linux/io-128-nonatomic-lo-hi.h@@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_IO_128_NONATOMIC_LO_HI_H_ +#define _LINUX_IO_128_NONATOMIC_LO_HI_H_ + +#include <linux/io.h> +#include <asm-generic/int-ll64.h> + +static inline u128 ioread128_lo_hi(const void __iomem *addr) +{ + u64 low, high; + + low = ioread64(addr); + high = ioread64(addr + sizeof(u64)); + + return low + ((u128)high << 64); +} + +static inline void iowrite128_lo_hi(u128 val, void __iomem *addr) +{ + iowrite64(val, addr); + iowrite64(val >> 64, addr + sizeof(u64)); +} + +#ifndef ioread128 +#define ioread128_is_nonatomic +#define ioread128 ioread128_lo_hi +#endif + +#ifndef iowrite128 +#define iowrite128_is_nonatomic +#define iowrite128 iowrite128_lo_hi +#endif + +#endif /* _LINUX_IO_128_NONATOMIC_LO_HI_H_ */
--
2.33.0