162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* smp.h: Sparc specific SMP stuff. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _SPARC_SMP_H 862306a36Sopenharmony_ci#define _SPARC_SMP_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/threads.h> 1162306a36Sopenharmony_ci#include <asm/head.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/cpumask.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#ifdef CONFIG_SMP 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <asm/ptrace.h> 2462306a36Sopenharmony_ci#include <asm/asi.h> 2562306a36Sopenharmony_ci#include <linux/atomic.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * Private routines/data 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ciextern unsigned char boot_cpu_id; 3262306a36Sopenharmony_ciextern volatile unsigned long cpu_callin_map[NR_CPUS]; 3362306a36Sopenharmony_ciextern cpumask_t smp_commenced_mask; 3462306a36Sopenharmony_ciextern struct linux_prom_registers smp_penguin_ctable; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_civoid cpu_panic(void); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * General functions that each host system must provide. 4062306a36Sopenharmony_ci */ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_civoid sun4m_init_smp(void); 4362306a36Sopenharmony_civoid sun4d_init_smp(void); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_civoid smp_callin(void); 4662306a36Sopenharmony_civoid smp_store_cpu_info(int); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_civoid smp_resched_interrupt(void); 4962306a36Sopenharmony_civoid smp_call_function_single_interrupt(void); 5062306a36Sopenharmony_civoid smp_call_function_interrupt(void); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct seq_file; 5362306a36Sopenharmony_civoid smp_bogo(struct seq_file *); 5462306a36Sopenharmony_civoid smp_info(struct seq_file *); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistruct sparc32_ipi_ops { 5762306a36Sopenharmony_ci void (*cross_call)(void *func, cpumask_t mask, unsigned long arg1, 5862306a36Sopenharmony_ci unsigned long arg2, unsigned long arg3, 5962306a36Sopenharmony_ci unsigned long arg4); 6062306a36Sopenharmony_ci void (*resched)(int cpu); 6162306a36Sopenharmony_ci void (*single)(int cpu); 6262306a36Sopenharmony_ci void (*mask_one)(int cpu); 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ciextern const struct sparc32_ipi_ops *sparc32_ipi_ops; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline void xc0(void *func) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci sparc32_ipi_ops->cross_call(func, *cpu_online_mask, 0, 0, 0, 0); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline void xc1(void *func, unsigned long arg1) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, 0, 0, 0); 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_cistatic inline void xc2(void *func, unsigned long arg1, unsigned long arg2) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci sparc32_ipi_ops->cross_call(func, *cpu_online_mask, arg1, arg2, 0, 0); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistatic inline void xc3(void *func, unsigned long arg1, unsigned long arg2, 8162306a36Sopenharmony_ci unsigned long arg3) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci sparc32_ipi_ops->cross_call(func, *cpu_online_mask, 8462306a36Sopenharmony_ci arg1, arg2, arg3, 0); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic inline void xc4(void *func, unsigned long arg1, unsigned long arg2, 8862306a36Sopenharmony_ci unsigned long arg3, unsigned long arg4) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci sparc32_ipi_ops->cross_call(func, *cpu_online_mask, 9162306a36Sopenharmony_ci arg1, arg2, arg3, arg4); 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_civoid arch_send_call_function_single_ipi(int cpu); 9562306a36Sopenharmony_civoid arch_send_call_function_ipi_mask(const struct cpumask *mask); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic inline int cpu_logical_map(int cpu) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci return cpu; 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciint hard_smp_processor_id(void); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#define raw_smp_processor_id() (current_thread_info()->cpu) 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_civoid smp_setup_cpu_possible_map(void); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#endif /* !(__ASSEMBLY__) */ 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* Sparc specific messages. */ 11162306a36Sopenharmony_ci#define MSG_CROSS_CALL 0x0005 /* run func on cpus */ 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* Empirical PROM processor mailbox constants. If the per-cpu mailbox 11462306a36Sopenharmony_ci * contains something other than one of these then the ipi is from 11562306a36Sopenharmony_ci * Linux's active_kernel_processor. This facility exists so that 11662306a36Sopenharmony_ci * the boot monitor can capture all the other cpus when one catches 11762306a36Sopenharmony_ci * a watchdog reset or the user enters the monitor using L1-A keys. 11862306a36Sopenharmony_ci */ 11962306a36Sopenharmony_ci#define MBOX_STOPCPU 0xFB 12062306a36Sopenharmony_ci#define MBOX_IDLECPU 0xFC 12162306a36Sopenharmony_ci#define MBOX_IDLECPU2 0xFD 12262306a36Sopenharmony_ci#define MBOX_STOPCPU2 0xFE 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#else /* SMP */ 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define hard_smp_processor_id() 0 12762306a36Sopenharmony_ci#define smp_setup_cpu_possible_map() do { } while (0) 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#endif /* !(SMP) */ 13062306a36Sopenharmony_ci#endif /* !(_SPARC_SMP_H) */ 131