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