162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASM_IA64_PERCPU_H
362306a36Sopenharmony_ci#define _ASM_IA64_PERCPU_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * Copyright (C) 2002-2003 Hewlett-Packard Co
762306a36Sopenharmony_ci *	David Mosberger-Tang <davidm@hpl.hp.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifdef __ASSEMBLY__
1162306a36Sopenharmony_ci# define THIS_CPU(var)	(var)  /* use this to mark accesses to per-CPU variables... */
1262306a36Sopenharmony_ci#else /* !__ASSEMBLY__ */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/threads.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifdef CONFIG_SMP
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
2062306a36Sopenharmony_ci# define PER_CPU_ATTRIBUTES	__attribute__((__model__ (__small__)))
2162306a36Sopenharmony_ci#endif
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define __my_cpu_offset	__ia64_per_cpu_var(local_per_cpu_offset)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciextern void *per_cpu_init(void);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#else /* ! SMP */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define per_cpu_init()				(__phys_per_cpu_start)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#endif	/* SMP */
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define PER_CPU_BASE_SECTION ".data..percpu"
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/*
3662306a36Sopenharmony_ci * Be extremely careful when taking the address of this variable!  Due to virtual
3762306a36Sopenharmony_ci * remapping, it is different from the canonical address returned by this_cpu_ptr(&var)!
3862306a36Sopenharmony_ci * On the positive side, using __ia64_per_cpu_var() instead of this_cpu_ptr() is slightly
3962306a36Sopenharmony_ci * more efficient.
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_ci#define __ia64_per_cpu_var(var) (*({					\
4262306a36Sopenharmony_ci	__verify_pcpu_ptr(&(var));					\
4362306a36Sopenharmony_ci	((typeof(var) __kernel __force *)&(var));			\
4462306a36Sopenharmony_ci}))
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#include <asm-generic/percpu.h>
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
4962306a36Sopenharmony_ciDECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#endif /* _ASM_IA64_PERCPU_H */
54