1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __ASM_SMP_H 3*4882a593Smuzhiyun #define __ASM_SMP_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/threads.h> 6*4882a593Smuzhiyun #include <linux/cpumask.h> 7*4882a593Smuzhiyun #include <linux/bitops.h> 8*4882a593Smuzhiyun #include <asm/pal.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* HACK: Cabrio WHAMI return value is bogus if more than 8 bits used.. :-( */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun static __inline__ unsigned char __hard_smp_processor_id(void)13*4882a593Smuzhiyun__hard_smp_processor_id(void) 14*4882a593Smuzhiyun { 15*4882a593Smuzhiyun register unsigned char __r0 __asm__("$0"); 16*4882a593Smuzhiyun __asm__ __volatile__( 17*4882a593Smuzhiyun "call_pal %1 #whami" 18*4882a593Smuzhiyun : "=r"(__r0) 19*4882a593Smuzhiyun :"i" (PAL_whami) 20*4882a593Smuzhiyun : "$1", "$22", "$23", "$24", "$25"); 21*4882a593Smuzhiyun return __r0; 22*4882a593Smuzhiyun } 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifdef CONFIG_SMP 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #include <asm/irq.h> 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct cpuinfo_alpha { 29*4882a593Smuzhiyun unsigned long loops_per_jiffy; 30*4882a593Smuzhiyun unsigned long last_asn; 31*4882a593Smuzhiyun int need_new_asn; 32*4882a593Smuzhiyun int asn_lock; 33*4882a593Smuzhiyun unsigned long ipi_count; 34*4882a593Smuzhiyun unsigned long prof_multiplier; 35*4882a593Smuzhiyun unsigned long prof_counter; 36*4882a593Smuzhiyun unsigned char mcheck_expected; 37*4882a593Smuzhiyun unsigned char mcheck_taken; 38*4882a593Smuzhiyun unsigned char mcheck_extra; 39*4882a593Smuzhiyun } __attribute__((aligned(64))); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun extern struct cpuinfo_alpha cpu_data[NR_CPUS]; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define hard_smp_processor_id() __hard_smp_processor_id() 44*4882a593Smuzhiyun #define raw_smp_processor_id() (current_thread_info()->cpu) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun extern int smp_num_cpus; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun extern void arch_send_call_function_single_ipi(int cpu); 49*4882a593Smuzhiyun extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #else /* CONFIG_SMP */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define hard_smp_processor_id() 0 54*4882a593Smuzhiyun #define smp_call_function_on_cpu(func,info,wait,cpu) ({ 0; }) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #endif /* CONFIG_SMP */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define NO_PROC_ID (-1) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #endif 61