1*434b2660SHeiko Carstens /* SPDX-License-Identifier: GPL-2.0 */ 2*434b2660SHeiko Carstens 3*434b2660SHeiko Carstens #ifndef __ASM_S390_RWONCE_H 4*434b2660SHeiko Carstens #define __ASM_S390_RWONCE_H 5*434b2660SHeiko Carstens 6*434b2660SHeiko Carstens #include <linux/compiler_types.h> 7*434b2660SHeiko Carstens 8*434b2660SHeiko Carstens /* 9*434b2660SHeiko Carstens * Use READ_ONCE_ALIGNED_128() for 128-bit block concurrent (atomic) read 10*434b2660SHeiko Carstens * accesses. Note that x must be 128-bit aligned, otherwise a specification 11*434b2660SHeiko Carstens * exception is generated. 12*434b2660SHeiko Carstens */ 13*434b2660SHeiko Carstens #define READ_ONCE_ALIGNED_128(x) \ 14*434b2660SHeiko Carstens ({ \ 15*434b2660SHeiko Carstens union { \ 16*434b2660SHeiko Carstens typeof(x) __x; \ 17*434b2660SHeiko Carstens __uint128_t val; \ 18*434b2660SHeiko Carstens } __u; \ 19*434b2660SHeiko Carstens \ 20*434b2660SHeiko Carstens BUILD_BUG_ON(sizeof(x) != 16); \ 21*434b2660SHeiko Carstens asm volatile( \ 22*434b2660SHeiko Carstens " lpq %[val],%[_x]\n" \ 23*434b2660SHeiko Carstens : [val] "=d" (__u.val) \ 24*434b2660SHeiko Carstens : [_x] "QS" (x) \ 25*434b2660SHeiko Carstens : "memory"); \ 26*434b2660SHeiko Carstens __u.__x; \ 27*434b2660SHeiko Carstens }) 28*434b2660SHeiko Carstens 29*434b2660SHeiko Carstens #include <asm-generic/rwonce.h> 30*434b2660SHeiko Carstens 31*434b2660SHeiko Carstens #endif /* __ASM_S390_RWONCE_H */ 32