18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_GENERIC_PERCPU_H_
38c2ecf20Sopenharmony_ci#define _ASM_GENERIC_PERCPU_H_
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/compiler.h>
68c2ecf20Sopenharmony_ci#include <linux/threads.h>
78c2ecf20Sopenharmony_ci#include <linux/percpu-defs.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/*
128c2ecf20Sopenharmony_ci * per_cpu_offset() is the offset that has to be added to a
138c2ecf20Sopenharmony_ci * percpu variable to get to the instance for a certain processor.
148c2ecf20Sopenharmony_ci *
158c2ecf20Sopenharmony_ci * Most arches use the __per_cpu_offset array for those offsets but
168c2ecf20Sopenharmony_ci * some arches have their own ways of determining the offset (x86_64, s390).
178c2ecf20Sopenharmony_ci */
188c2ecf20Sopenharmony_ci#ifndef __per_cpu_offset
198c2ecf20Sopenharmony_ciextern unsigned long __per_cpu_offset[NR_CPUS];
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define per_cpu_offset(x) (__per_cpu_offset[x])
228c2ecf20Sopenharmony_ci#endif
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/*
258c2ecf20Sopenharmony_ci * Determine the offset for the currently active processor.
268c2ecf20Sopenharmony_ci * An arch may define __my_cpu_offset to provide a more effective
278c2ecf20Sopenharmony_ci * means of obtaining the offset to the per cpu variables of the
288c2ecf20Sopenharmony_ci * current processor.
298c2ecf20Sopenharmony_ci */
308c2ecf20Sopenharmony_ci#ifndef __my_cpu_offset
318c2ecf20Sopenharmony_ci#define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
328c2ecf20Sopenharmony_ci#endif
338c2ecf20Sopenharmony_ci#ifdef CONFIG_DEBUG_PREEMPT
348c2ecf20Sopenharmony_ci#define my_cpu_offset per_cpu_offset(smp_processor_id())
358c2ecf20Sopenharmony_ci#else
368c2ecf20Sopenharmony_ci#define my_cpu_offset __my_cpu_offset
378c2ecf20Sopenharmony_ci#endif
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/*
408c2ecf20Sopenharmony_ci * Arch may define arch_raw_cpu_ptr() to provide more efficient address
418c2ecf20Sopenharmony_ci * translations for raw_cpu_ptr().
428c2ecf20Sopenharmony_ci */
438c2ecf20Sopenharmony_ci#ifndef arch_raw_cpu_ptr
448c2ecf20Sopenharmony_ci#define arch_raw_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
458c2ecf20Sopenharmony_ci#endif
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
488c2ecf20Sopenharmony_ciextern void setup_per_cpu_areas(void);
498c2ecf20Sopenharmony_ci#endif
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#endif	/* SMP */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#ifndef PER_CPU_BASE_SECTION
548c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
558c2ecf20Sopenharmony_ci#define PER_CPU_BASE_SECTION ".data..percpu"
568c2ecf20Sopenharmony_ci#else
578c2ecf20Sopenharmony_ci#define PER_CPU_BASE_SECTION ".data"
588c2ecf20Sopenharmony_ci#endif
598c2ecf20Sopenharmony_ci#endif
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#ifndef PER_CPU_ATTRIBUTES
628c2ecf20Sopenharmony_ci#define PER_CPU_ATTRIBUTES
638c2ecf20Sopenharmony_ci#endif
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#define raw_cpu_generic_read(pcp)					\
668c2ecf20Sopenharmony_ci({									\
678c2ecf20Sopenharmony_ci	*raw_cpu_ptr(&(pcp));						\
688c2ecf20Sopenharmony_ci})
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#define raw_cpu_generic_to_op(pcp, val, op)				\
718c2ecf20Sopenharmony_cido {									\
728c2ecf20Sopenharmony_ci	*raw_cpu_ptr(&(pcp)) op val;					\
738c2ecf20Sopenharmony_ci} while (0)
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#define raw_cpu_generic_add_return(pcp, val)				\
768c2ecf20Sopenharmony_ci({									\
778c2ecf20Sopenharmony_ci	typeof(pcp) *__p = raw_cpu_ptr(&(pcp));				\
788c2ecf20Sopenharmony_ci									\
798c2ecf20Sopenharmony_ci	*__p += val;							\
808c2ecf20Sopenharmony_ci	*__p;								\
818c2ecf20Sopenharmony_ci})
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#define raw_cpu_generic_xchg(pcp, nval)					\
848c2ecf20Sopenharmony_ci({									\
858c2ecf20Sopenharmony_ci	typeof(pcp) *__p = raw_cpu_ptr(&(pcp));				\
868c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
878c2ecf20Sopenharmony_ci	__ret = *__p;							\
888c2ecf20Sopenharmony_ci	*__p = nval;							\
898c2ecf20Sopenharmony_ci	__ret;								\
908c2ecf20Sopenharmony_ci})
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci#define raw_cpu_generic_cmpxchg(pcp, oval, nval)			\
938c2ecf20Sopenharmony_ci({									\
948c2ecf20Sopenharmony_ci	typeof(pcp) *__p = raw_cpu_ptr(&(pcp));				\
958c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
968c2ecf20Sopenharmony_ci	__ret = *__p;							\
978c2ecf20Sopenharmony_ci	if (__ret == (oval))						\
988c2ecf20Sopenharmony_ci		*__p = nval;						\
998c2ecf20Sopenharmony_ci	__ret;								\
1008c2ecf20Sopenharmony_ci})
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#define raw_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2) \
1038c2ecf20Sopenharmony_ci({									\
1048c2ecf20Sopenharmony_ci	typeof(pcp1) *__p1 = raw_cpu_ptr(&(pcp1));			\
1058c2ecf20Sopenharmony_ci	typeof(pcp2) *__p2 = raw_cpu_ptr(&(pcp2));			\
1068c2ecf20Sopenharmony_ci	int __ret = 0;							\
1078c2ecf20Sopenharmony_ci	if (*__p1 == (oval1) && *__p2  == (oval2)) {			\
1088c2ecf20Sopenharmony_ci		*__p1 = nval1;						\
1098c2ecf20Sopenharmony_ci		*__p2 = nval2;						\
1108c2ecf20Sopenharmony_ci		__ret = 1;						\
1118c2ecf20Sopenharmony_ci	}								\
1128c2ecf20Sopenharmony_ci	(__ret);							\
1138c2ecf20Sopenharmony_ci})
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci#define __this_cpu_generic_read_nopreempt(pcp)				\
1168c2ecf20Sopenharmony_ci({									\
1178c2ecf20Sopenharmony_ci	typeof(pcp) ___ret;						\
1188c2ecf20Sopenharmony_ci	preempt_disable_notrace();					\
1198c2ecf20Sopenharmony_ci	___ret = READ_ONCE(*raw_cpu_ptr(&(pcp)));			\
1208c2ecf20Sopenharmony_ci	preempt_enable_notrace();					\
1218c2ecf20Sopenharmony_ci	___ret;								\
1228c2ecf20Sopenharmony_ci})
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci#define __this_cpu_generic_read_noirq(pcp)				\
1258c2ecf20Sopenharmony_ci({									\
1268c2ecf20Sopenharmony_ci	typeof(pcp) ___ret;						\
1278c2ecf20Sopenharmony_ci	unsigned long ___flags;						\
1288c2ecf20Sopenharmony_ci	raw_local_irq_save(___flags);					\
1298c2ecf20Sopenharmony_ci	___ret = raw_cpu_generic_read(pcp);				\
1308c2ecf20Sopenharmony_ci	raw_local_irq_restore(___flags);				\
1318c2ecf20Sopenharmony_ci	___ret;								\
1328c2ecf20Sopenharmony_ci})
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci#define this_cpu_generic_read(pcp)					\
1358c2ecf20Sopenharmony_ci({									\
1368c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
1378c2ecf20Sopenharmony_ci	if (__native_word(pcp))						\
1388c2ecf20Sopenharmony_ci		__ret = __this_cpu_generic_read_nopreempt(pcp);		\
1398c2ecf20Sopenharmony_ci	else								\
1408c2ecf20Sopenharmony_ci		__ret = __this_cpu_generic_read_noirq(pcp);		\
1418c2ecf20Sopenharmony_ci	__ret;								\
1428c2ecf20Sopenharmony_ci})
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci#define this_cpu_generic_to_op(pcp, val, op)				\
1458c2ecf20Sopenharmony_cido {									\
1468c2ecf20Sopenharmony_ci	unsigned long __flags;						\
1478c2ecf20Sopenharmony_ci	raw_local_irq_save(__flags);					\
1488c2ecf20Sopenharmony_ci	raw_cpu_generic_to_op(pcp, val, op);				\
1498c2ecf20Sopenharmony_ci	raw_local_irq_restore(__flags);					\
1508c2ecf20Sopenharmony_ci} while (0)
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#define this_cpu_generic_add_return(pcp, val)				\
1548c2ecf20Sopenharmony_ci({									\
1558c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
1568c2ecf20Sopenharmony_ci	unsigned long __flags;						\
1578c2ecf20Sopenharmony_ci	raw_local_irq_save(__flags);					\
1588c2ecf20Sopenharmony_ci	__ret = raw_cpu_generic_add_return(pcp, val);			\
1598c2ecf20Sopenharmony_ci	raw_local_irq_restore(__flags);					\
1608c2ecf20Sopenharmony_ci	__ret;								\
1618c2ecf20Sopenharmony_ci})
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci#define this_cpu_generic_xchg(pcp, nval)				\
1648c2ecf20Sopenharmony_ci({									\
1658c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
1668c2ecf20Sopenharmony_ci	unsigned long __flags;						\
1678c2ecf20Sopenharmony_ci	raw_local_irq_save(__flags);					\
1688c2ecf20Sopenharmony_ci	__ret = raw_cpu_generic_xchg(pcp, nval);			\
1698c2ecf20Sopenharmony_ci	raw_local_irq_restore(__flags);					\
1708c2ecf20Sopenharmony_ci	__ret;								\
1718c2ecf20Sopenharmony_ci})
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#define this_cpu_generic_cmpxchg(pcp, oval, nval)			\
1748c2ecf20Sopenharmony_ci({									\
1758c2ecf20Sopenharmony_ci	typeof(pcp) __ret;						\
1768c2ecf20Sopenharmony_ci	unsigned long __flags;						\
1778c2ecf20Sopenharmony_ci	raw_local_irq_save(__flags);					\
1788c2ecf20Sopenharmony_ci	__ret = raw_cpu_generic_cmpxchg(pcp, oval, nval);		\
1798c2ecf20Sopenharmony_ci	raw_local_irq_restore(__flags);					\
1808c2ecf20Sopenharmony_ci	__ret;								\
1818c2ecf20Sopenharmony_ci})
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci#define this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)	\
1848c2ecf20Sopenharmony_ci({									\
1858c2ecf20Sopenharmony_ci	int __ret;							\
1868c2ecf20Sopenharmony_ci	unsigned long __flags;						\
1878c2ecf20Sopenharmony_ci	raw_local_irq_save(__flags);					\
1888c2ecf20Sopenharmony_ci	__ret = raw_cpu_generic_cmpxchg_double(pcp1, pcp2,		\
1898c2ecf20Sopenharmony_ci			oval1, oval2, nval1, nval2);			\
1908c2ecf20Sopenharmony_ci	raw_local_irq_restore(__flags);					\
1918c2ecf20Sopenharmony_ci	__ret;								\
1928c2ecf20Sopenharmony_ci})
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci#ifndef raw_cpu_read_1
1958c2ecf20Sopenharmony_ci#define raw_cpu_read_1(pcp)		raw_cpu_generic_read(pcp)
1968c2ecf20Sopenharmony_ci#endif
1978c2ecf20Sopenharmony_ci#ifndef raw_cpu_read_2
1988c2ecf20Sopenharmony_ci#define raw_cpu_read_2(pcp)		raw_cpu_generic_read(pcp)
1998c2ecf20Sopenharmony_ci#endif
2008c2ecf20Sopenharmony_ci#ifndef raw_cpu_read_4
2018c2ecf20Sopenharmony_ci#define raw_cpu_read_4(pcp)		raw_cpu_generic_read(pcp)
2028c2ecf20Sopenharmony_ci#endif
2038c2ecf20Sopenharmony_ci#ifndef raw_cpu_read_8
2048c2ecf20Sopenharmony_ci#define raw_cpu_read_8(pcp)		raw_cpu_generic_read(pcp)
2058c2ecf20Sopenharmony_ci#endif
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci#ifndef raw_cpu_write_1
2088c2ecf20Sopenharmony_ci#define raw_cpu_write_1(pcp, val)	raw_cpu_generic_to_op(pcp, val, =)
2098c2ecf20Sopenharmony_ci#endif
2108c2ecf20Sopenharmony_ci#ifndef raw_cpu_write_2
2118c2ecf20Sopenharmony_ci#define raw_cpu_write_2(pcp, val)	raw_cpu_generic_to_op(pcp, val, =)
2128c2ecf20Sopenharmony_ci#endif
2138c2ecf20Sopenharmony_ci#ifndef raw_cpu_write_4
2148c2ecf20Sopenharmony_ci#define raw_cpu_write_4(pcp, val)	raw_cpu_generic_to_op(pcp, val, =)
2158c2ecf20Sopenharmony_ci#endif
2168c2ecf20Sopenharmony_ci#ifndef raw_cpu_write_8
2178c2ecf20Sopenharmony_ci#define raw_cpu_write_8(pcp, val)	raw_cpu_generic_to_op(pcp, val, =)
2188c2ecf20Sopenharmony_ci#endif
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_1
2218c2ecf20Sopenharmony_ci#define raw_cpu_add_1(pcp, val)		raw_cpu_generic_to_op(pcp, val, +=)
2228c2ecf20Sopenharmony_ci#endif
2238c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_2
2248c2ecf20Sopenharmony_ci#define raw_cpu_add_2(pcp, val)		raw_cpu_generic_to_op(pcp, val, +=)
2258c2ecf20Sopenharmony_ci#endif
2268c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_4
2278c2ecf20Sopenharmony_ci#define raw_cpu_add_4(pcp, val)		raw_cpu_generic_to_op(pcp, val, +=)
2288c2ecf20Sopenharmony_ci#endif
2298c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_8
2308c2ecf20Sopenharmony_ci#define raw_cpu_add_8(pcp, val)		raw_cpu_generic_to_op(pcp, val, +=)
2318c2ecf20Sopenharmony_ci#endif
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci#ifndef raw_cpu_and_1
2348c2ecf20Sopenharmony_ci#define raw_cpu_and_1(pcp, val)		raw_cpu_generic_to_op(pcp, val, &=)
2358c2ecf20Sopenharmony_ci#endif
2368c2ecf20Sopenharmony_ci#ifndef raw_cpu_and_2
2378c2ecf20Sopenharmony_ci#define raw_cpu_and_2(pcp, val)		raw_cpu_generic_to_op(pcp, val, &=)
2388c2ecf20Sopenharmony_ci#endif
2398c2ecf20Sopenharmony_ci#ifndef raw_cpu_and_4
2408c2ecf20Sopenharmony_ci#define raw_cpu_and_4(pcp, val)		raw_cpu_generic_to_op(pcp, val, &=)
2418c2ecf20Sopenharmony_ci#endif
2428c2ecf20Sopenharmony_ci#ifndef raw_cpu_and_8
2438c2ecf20Sopenharmony_ci#define raw_cpu_and_8(pcp, val)		raw_cpu_generic_to_op(pcp, val, &=)
2448c2ecf20Sopenharmony_ci#endif
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci#ifndef raw_cpu_or_1
2478c2ecf20Sopenharmony_ci#define raw_cpu_or_1(pcp, val)		raw_cpu_generic_to_op(pcp, val, |=)
2488c2ecf20Sopenharmony_ci#endif
2498c2ecf20Sopenharmony_ci#ifndef raw_cpu_or_2
2508c2ecf20Sopenharmony_ci#define raw_cpu_or_2(pcp, val)		raw_cpu_generic_to_op(pcp, val, |=)
2518c2ecf20Sopenharmony_ci#endif
2528c2ecf20Sopenharmony_ci#ifndef raw_cpu_or_4
2538c2ecf20Sopenharmony_ci#define raw_cpu_or_4(pcp, val)		raw_cpu_generic_to_op(pcp, val, |=)
2548c2ecf20Sopenharmony_ci#endif
2558c2ecf20Sopenharmony_ci#ifndef raw_cpu_or_8
2568c2ecf20Sopenharmony_ci#define raw_cpu_or_8(pcp, val)		raw_cpu_generic_to_op(pcp, val, |=)
2578c2ecf20Sopenharmony_ci#endif
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_return_1
2608c2ecf20Sopenharmony_ci#define raw_cpu_add_return_1(pcp, val)	raw_cpu_generic_add_return(pcp, val)
2618c2ecf20Sopenharmony_ci#endif
2628c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_return_2
2638c2ecf20Sopenharmony_ci#define raw_cpu_add_return_2(pcp, val)	raw_cpu_generic_add_return(pcp, val)
2648c2ecf20Sopenharmony_ci#endif
2658c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_return_4
2668c2ecf20Sopenharmony_ci#define raw_cpu_add_return_4(pcp, val)	raw_cpu_generic_add_return(pcp, val)
2678c2ecf20Sopenharmony_ci#endif
2688c2ecf20Sopenharmony_ci#ifndef raw_cpu_add_return_8
2698c2ecf20Sopenharmony_ci#define raw_cpu_add_return_8(pcp, val)	raw_cpu_generic_add_return(pcp, val)
2708c2ecf20Sopenharmony_ci#endif
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci#ifndef raw_cpu_xchg_1
2738c2ecf20Sopenharmony_ci#define raw_cpu_xchg_1(pcp, nval)	raw_cpu_generic_xchg(pcp, nval)
2748c2ecf20Sopenharmony_ci#endif
2758c2ecf20Sopenharmony_ci#ifndef raw_cpu_xchg_2
2768c2ecf20Sopenharmony_ci#define raw_cpu_xchg_2(pcp, nval)	raw_cpu_generic_xchg(pcp, nval)
2778c2ecf20Sopenharmony_ci#endif
2788c2ecf20Sopenharmony_ci#ifndef raw_cpu_xchg_4
2798c2ecf20Sopenharmony_ci#define raw_cpu_xchg_4(pcp, nval)	raw_cpu_generic_xchg(pcp, nval)
2808c2ecf20Sopenharmony_ci#endif
2818c2ecf20Sopenharmony_ci#ifndef raw_cpu_xchg_8
2828c2ecf20Sopenharmony_ci#define raw_cpu_xchg_8(pcp, nval)	raw_cpu_generic_xchg(pcp, nval)
2838c2ecf20Sopenharmony_ci#endif
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_1
2868c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_1(pcp, oval, nval) \
2878c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg(pcp, oval, nval)
2888c2ecf20Sopenharmony_ci#endif
2898c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_2
2908c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_2(pcp, oval, nval) \
2918c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg(pcp, oval, nval)
2928c2ecf20Sopenharmony_ci#endif
2938c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_4
2948c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_4(pcp, oval, nval) \
2958c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg(pcp, oval, nval)
2968c2ecf20Sopenharmony_ci#endif
2978c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_8
2988c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_8(pcp, oval, nval) \
2998c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg(pcp, oval, nval)
3008c2ecf20Sopenharmony_ci#endif
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_double_1
3038c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2) \
3048c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
3058c2ecf20Sopenharmony_ci#endif
3068c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_double_2
3078c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2) \
3088c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
3098c2ecf20Sopenharmony_ci#endif
3108c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_double_4
3118c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2) \
3128c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
3138c2ecf20Sopenharmony_ci#endif
3148c2ecf20Sopenharmony_ci#ifndef raw_cpu_cmpxchg_double_8
3158c2ecf20Sopenharmony_ci#define raw_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2) \
3168c2ecf20Sopenharmony_ci	raw_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
3178c2ecf20Sopenharmony_ci#endif
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci#ifndef this_cpu_read_1
3208c2ecf20Sopenharmony_ci#define this_cpu_read_1(pcp)		this_cpu_generic_read(pcp)
3218c2ecf20Sopenharmony_ci#endif
3228c2ecf20Sopenharmony_ci#ifndef this_cpu_read_2
3238c2ecf20Sopenharmony_ci#define this_cpu_read_2(pcp)		this_cpu_generic_read(pcp)
3248c2ecf20Sopenharmony_ci#endif
3258c2ecf20Sopenharmony_ci#ifndef this_cpu_read_4
3268c2ecf20Sopenharmony_ci#define this_cpu_read_4(pcp)		this_cpu_generic_read(pcp)
3278c2ecf20Sopenharmony_ci#endif
3288c2ecf20Sopenharmony_ci#ifndef this_cpu_read_8
3298c2ecf20Sopenharmony_ci#define this_cpu_read_8(pcp)		this_cpu_generic_read(pcp)
3308c2ecf20Sopenharmony_ci#endif
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci#ifndef this_cpu_write_1
3338c2ecf20Sopenharmony_ci#define this_cpu_write_1(pcp, val)	this_cpu_generic_to_op(pcp, val, =)
3348c2ecf20Sopenharmony_ci#endif
3358c2ecf20Sopenharmony_ci#ifndef this_cpu_write_2
3368c2ecf20Sopenharmony_ci#define this_cpu_write_2(pcp, val)	this_cpu_generic_to_op(pcp, val, =)
3378c2ecf20Sopenharmony_ci#endif
3388c2ecf20Sopenharmony_ci#ifndef this_cpu_write_4
3398c2ecf20Sopenharmony_ci#define this_cpu_write_4(pcp, val)	this_cpu_generic_to_op(pcp, val, =)
3408c2ecf20Sopenharmony_ci#endif
3418c2ecf20Sopenharmony_ci#ifndef this_cpu_write_8
3428c2ecf20Sopenharmony_ci#define this_cpu_write_8(pcp, val)	this_cpu_generic_to_op(pcp, val, =)
3438c2ecf20Sopenharmony_ci#endif
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci#ifndef this_cpu_add_1
3468c2ecf20Sopenharmony_ci#define this_cpu_add_1(pcp, val)	this_cpu_generic_to_op(pcp, val, +=)
3478c2ecf20Sopenharmony_ci#endif
3488c2ecf20Sopenharmony_ci#ifndef this_cpu_add_2
3498c2ecf20Sopenharmony_ci#define this_cpu_add_2(pcp, val)	this_cpu_generic_to_op(pcp, val, +=)
3508c2ecf20Sopenharmony_ci#endif
3518c2ecf20Sopenharmony_ci#ifndef this_cpu_add_4
3528c2ecf20Sopenharmony_ci#define this_cpu_add_4(pcp, val)	this_cpu_generic_to_op(pcp, val, +=)
3538c2ecf20Sopenharmony_ci#endif
3548c2ecf20Sopenharmony_ci#ifndef this_cpu_add_8
3558c2ecf20Sopenharmony_ci#define this_cpu_add_8(pcp, val)	this_cpu_generic_to_op(pcp, val, +=)
3568c2ecf20Sopenharmony_ci#endif
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_ci#ifndef this_cpu_and_1
3598c2ecf20Sopenharmony_ci#define this_cpu_and_1(pcp, val)	this_cpu_generic_to_op(pcp, val, &=)
3608c2ecf20Sopenharmony_ci#endif
3618c2ecf20Sopenharmony_ci#ifndef this_cpu_and_2
3628c2ecf20Sopenharmony_ci#define this_cpu_and_2(pcp, val)	this_cpu_generic_to_op(pcp, val, &=)
3638c2ecf20Sopenharmony_ci#endif
3648c2ecf20Sopenharmony_ci#ifndef this_cpu_and_4
3658c2ecf20Sopenharmony_ci#define this_cpu_and_4(pcp, val)	this_cpu_generic_to_op(pcp, val, &=)
3668c2ecf20Sopenharmony_ci#endif
3678c2ecf20Sopenharmony_ci#ifndef this_cpu_and_8
3688c2ecf20Sopenharmony_ci#define this_cpu_and_8(pcp, val)	this_cpu_generic_to_op(pcp, val, &=)
3698c2ecf20Sopenharmony_ci#endif
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci#ifndef this_cpu_or_1
3728c2ecf20Sopenharmony_ci#define this_cpu_or_1(pcp, val)		this_cpu_generic_to_op(pcp, val, |=)
3738c2ecf20Sopenharmony_ci#endif
3748c2ecf20Sopenharmony_ci#ifndef this_cpu_or_2
3758c2ecf20Sopenharmony_ci#define this_cpu_or_2(pcp, val)		this_cpu_generic_to_op(pcp, val, |=)
3768c2ecf20Sopenharmony_ci#endif
3778c2ecf20Sopenharmony_ci#ifndef this_cpu_or_4
3788c2ecf20Sopenharmony_ci#define this_cpu_or_4(pcp, val)		this_cpu_generic_to_op(pcp, val, |=)
3798c2ecf20Sopenharmony_ci#endif
3808c2ecf20Sopenharmony_ci#ifndef this_cpu_or_8
3818c2ecf20Sopenharmony_ci#define this_cpu_or_8(pcp, val)		this_cpu_generic_to_op(pcp, val, |=)
3828c2ecf20Sopenharmony_ci#endif
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci#ifndef this_cpu_add_return_1
3858c2ecf20Sopenharmony_ci#define this_cpu_add_return_1(pcp, val)	this_cpu_generic_add_return(pcp, val)
3868c2ecf20Sopenharmony_ci#endif
3878c2ecf20Sopenharmony_ci#ifndef this_cpu_add_return_2
3888c2ecf20Sopenharmony_ci#define this_cpu_add_return_2(pcp, val)	this_cpu_generic_add_return(pcp, val)
3898c2ecf20Sopenharmony_ci#endif
3908c2ecf20Sopenharmony_ci#ifndef this_cpu_add_return_4
3918c2ecf20Sopenharmony_ci#define this_cpu_add_return_4(pcp, val)	this_cpu_generic_add_return(pcp, val)
3928c2ecf20Sopenharmony_ci#endif
3938c2ecf20Sopenharmony_ci#ifndef this_cpu_add_return_8
3948c2ecf20Sopenharmony_ci#define this_cpu_add_return_8(pcp, val)	this_cpu_generic_add_return(pcp, val)
3958c2ecf20Sopenharmony_ci#endif
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci#ifndef this_cpu_xchg_1
3988c2ecf20Sopenharmony_ci#define this_cpu_xchg_1(pcp, nval)	this_cpu_generic_xchg(pcp, nval)
3998c2ecf20Sopenharmony_ci#endif
4008c2ecf20Sopenharmony_ci#ifndef this_cpu_xchg_2
4018c2ecf20Sopenharmony_ci#define this_cpu_xchg_2(pcp, nval)	this_cpu_generic_xchg(pcp, nval)
4028c2ecf20Sopenharmony_ci#endif
4038c2ecf20Sopenharmony_ci#ifndef this_cpu_xchg_4
4048c2ecf20Sopenharmony_ci#define this_cpu_xchg_4(pcp, nval)	this_cpu_generic_xchg(pcp, nval)
4058c2ecf20Sopenharmony_ci#endif
4068c2ecf20Sopenharmony_ci#ifndef this_cpu_xchg_8
4078c2ecf20Sopenharmony_ci#define this_cpu_xchg_8(pcp, nval)	this_cpu_generic_xchg(pcp, nval)
4088c2ecf20Sopenharmony_ci#endif
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_1
4118c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_1(pcp, oval, nval) \
4128c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg(pcp, oval, nval)
4138c2ecf20Sopenharmony_ci#endif
4148c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_2
4158c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_2(pcp, oval, nval) \
4168c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg(pcp, oval, nval)
4178c2ecf20Sopenharmony_ci#endif
4188c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_4
4198c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_4(pcp, oval, nval) \
4208c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg(pcp, oval, nval)
4218c2ecf20Sopenharmony_ci#endif
4228c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_8
4238c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_8(pcp, oval, nval) \
4248c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg(pcp, oval, nval)
4258c2ecf20Sopenharmony_ci#endif
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_double_1
4288c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_double_1(pcp1, pcp2, oval1, oval2, nval1, nval2) \
4298c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
4308c2ecf20Sopenharmony_ci#endif
4318c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_double_2
4328c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_double_2(pcp1, pcp2, oval1, oval2, nval1, nval2) \
4338c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
4348c2ecf20Sopenharmony_ci#endif
4358c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_double_4
4368c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_double_4(pcp1, pcp2, oval1, oval2, nval1, nval2) \
4378c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
4388c2ecf20Sopenharmony_ci#endif
4398c2ecf20Sopenharmony_ci#ifndef this_cpu_cmpxchg_double_8
4408c2ecf20Sopenharmony_ci#define this_cpu_cmpxchg_double_8(pcp1, pcp2, oval1, oval2, nval1, nval2) \
4418c2ecf20Sopenharmony_ci	this_cpu_generic_cmpxchg_double(pcp1, pcp2, oval1, oval2, nval1, nval2)
4428c2ecf20Sopenharmony_ci#endif
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci#endif /* _ASM_GENERIC_PERCPU_H_ */
445