18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_SMP_H
38c2ecf20Sopenharmony_ci#define __ASM_SMP_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/threads.h>
68c2ecf20Sopenharmony_ci#include <linux/cpumask.h>
78c2ecf20Sopenharmony_ci#include <linux/bitops.h>
88c2ecf20Sopenharmony_ci#include <asm/pal.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/* HACK: Cabrio WHAMI return value is bogus if more than 8 bits used.. :-( */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistatic __inline__ unsigned char
138c2ecf20Sopenharmony_ci__hard_smp_processor_id(void)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	register unsigned char __r0 __asm__("$0");
168c2ecf20Sopenharmony_ci	__asm__ __volatile__(
178c2ecf20Sopenharmony_ci		"call_pal %1 #whami"
188c2ecf20Sopenharmony_ci		: "=r"(__r0)
198c2ecf20Sopenharmony_ci		:"i" (PAL_whami)
208c2ecf20Sopenharmony_ci		: "$1", "$22", "$23", "$24", "$25");
218c2ecf20Sopenharmony_ci	return __r0;
228c2ecf20Sopenharmony_ci}
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#include <asm/irq.h>
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistruct cpuinfo_alpha {
298c2ecf20Sopenharmony_ci	unsigned long loops_per_jiffy;
308c2ecf20Sopenharmony_ci	unsigned long last_asn;
318c2ecf20Sopenharmony_ci	int need_new_asn;
328c2ecf20Sopenharmony_ci	int asn_lock;
338c2ecf20Sopenharmony_ci	unsigned long ipi_count;
348c2ecf20Sopenharmony_ci	unsigned long prof_multiplier;
358c2ecf20Sopenharmony_ci	unsigned long prof_counter;
368c2ecf20Sopenharmony_ci	unsigned char mcheck_expected;
378c2ecf20Sopenharmony_ci	unsigned char mcheck_taken;
388c2ecf20Sopenharmony_ci	unsigned char mcheck_extra;
398c2ecf20Sopenharmony_ci} __attribute__((aligned(64)));
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciextern struct cpuinfo_alpha cpu_data[NR_CPUS];
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#define hard_smp_processor_id()	__hard_smp_processor_id()
448c2ecf20Sopenharmony_ci#define raw_smp_processor_id()	(current_thread_info()->cpu)
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ciextern int smp_num_cpus;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ciextern void arch_send_call_function_single_ipi(int cpu);
498c2ecf20Sopenharmony_ciextern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#else /* CONFIG_SMP */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define hard_smp_processor_id()		0
548c2ecf20Sopenharmony_ci#define smp_call_function_on_cpu(func,info,wait,cpu)    ({ 0; })
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci#define NO_PROC_ID	(-1)
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#endif
61