smp.h revision 91617
180708Sjake/*-
280708Sjake * Copyright (c) 2001 Jake Burkholder.
380708Sjake * All rights reserved.
480708Sjake *
580708Sjake * Redistribution and use in source and binary forms, with or without
680708Sjake * modification, are permitted provided that the following conditions
780708Sjake * are met:
880708Sjake * 1. Redistributions of source code must retain the above copyright
980708Sjake *    notice, this list of conditions and the following disclaimer.
1080708Sjake * 2. Redistributions in binary form must reproduce the above copyright
1180708Sjake *    notice, this list of conditions and the following disclaimer in the
1280708Sjake *    documentation and/or other materials provided with the distribution.
1380708Sjake *
1481334Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1580708Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1680708Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1781334Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1880708Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1980708Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2080708Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2180708Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2280708Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2380708Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2480708Sjake * SUCH DAMAGE.
2580708Sjake *
2680708Sjake * $FreeBSD: head/sys/sparc64/include/smp.h 91617 2002-03-04 07:12:36Z jake $
2780708Sjake */
2880708Sjake
2980708Sjake#ifndef	_MACHINE_SMP_H_
3080708Sjake#define	_MACHINE_SMP_H_
3180708Sjake
3291617Sjake#define	CPU_CLKSYNC		1
3391617Sjake#define	CPU_INIT		2
3491617Sjake#define	CPU_BOOTSTRAP		3
3589051Sjake
3689051Sjake#ifndef	LOCORE
3789051Sjake
3891157Sjake#include <machine/intr_machdep.h>
3991617Sjake#include <machine/tte.h>
4091157Sjake
4189051Sjake#define	IDR_BUSY	(1<<0)
4289051Sjake#define	IDR_NACK	(1<<1)
4389051Sjake
4489051Sjake#define	IPI_AST		PIL_AST
4589051Sjake#define	IPI_RENDEZVOUS	PIL_RENDEZVOUS
4689051Sjake#define	IPI_STOP	PIL_STOP
4789051Sjake
4889051Sjake#define	IPI_RETRIES	100
4989051Sjake
5089051Sjakestruct cpu_start_args {
5189051Sjake	u_int	csa_mid;
5289051Sjake	u_int	csa_state;
5391617Sjake	u_long	csa_tick;
5491617Sjake	u_long	csa_ver;
5591617Sjake	struct	tte csa_ttes[PCPU_PAGES];
5689051Sjake};
5789051Sjake
5889051Sjakestruct ipi_level_args {
5989051Sjake	u_int	ila_count;
6089051Sjake	u_int	ila_level;
6189051Sjake};
6289051Sjake
6389051Sjakestruct ipi_tlb_args {
6489051Sjake	u_int	ita_count;
6589051Sjake	u_long	ita_tlb;
6689051Sjake	u_long	ita_ctx;
6789051Sjake	u_long	ita_start;
6889051Sjake	u_long	ita_end;
6989051Sjake};
7089051Sjake#define	ita_va	ita_start
7189051Sjake
7289051Sjakestruct pcpu;
7389051Sjake
7489051Sjakevoid	cpu_mp_bootstrap(struct pcpu *pc);
7589051Sjake
7689051Sjakevoid	cpu_ipi_selected(u_int cpus, u_long d0, u_long d1, u_long d2);
7789051Sjakevoid	cpu_ipi_send(u_int mid, u_long d0, u_long d1, u_long d2);
7889051Sjake
7989051Sjakevoid	ipi_selected(u_int cpus, u_int ipi);
8089051Sjakevoid	ipi_all(u_int ipi);
8189051Sjakevoid	ipi_all_but_self(u_int ipi);
8289051Sjake
8391617Sjakevm_offset_t mp_tramp_alloc(void);
8491617Sjake
8589425Sjakeextern	struct	ipi_level_args ipi_level_args;
8689425Sjakeextern	struct	ipi_tlb_args ipi_tlb_args;
8789051Sjake
8889051Sjakeextern	int mp_ncpus;
8989051Sjake
9091617Sjakeextern	vm_offset_t mp_tramp;
9191617Sjakeextern	char *mp_tramp_code;
9291617Sjakeextern	u_long mp_tramp_code_len;
9391617Sjakeextern	u_long mp_tramp_tlb_slots;
9491617Sjakeextern	u_long mp_tramp_func;
9591617Sjake
9691617Sjakeextern	void mp_startup(void);
9791617Sjake
9889051Sjakeextern	char tl_ipi_level[];
9989051Sjakeextern	char tl_ipi_test[];
10089051Sjakeextern	char tl_ipi_tlb_context_demap[];
10189051Sjakeextern	char tl_ipi_tlb_page_demap[];
10289051Sjakeextern	char tl_ipi_tlb_range_demap[];
10389051Sjake
10489051Sjake#ifdef SMP
10589051Sjake
10689051Sjakestatic __inline void *
10789051Sjakeipi_tlb_context_demap(u_int ctx)
10889051Sjake{
10989051Sjake	struct ipi_tlb_args *ita;
11089051Sjake
11189051Sjake	if (mp_ncpus == 1)
11289051Sjake		return (NULL);
11389051Sjake	ita = &ipi_tlb_args;
11489051Sjake	ita->ita_count = mp_ncpus;
11589051Sjake	ita->ita_ctx = ctx;
11689051Sjake	cpu_ipi_selected(PCPU_GET(other_cpus), 0,
11789051Sjake	    (u_long)tl_ipi_tlb_context_demap, (u_long)ita);
11889051Sjake	return (&ita->ita_count);
11989051Sjake}
12089051Sjake
12189051Sjakestatic __inline void *
12289051Sjakeipi_tlb_page_demap(u_int tlb, u_int ctx, vm_offset_t va)
12389051Sjake{
12489051Sjake	struct ipi_tlb_args *ita;
12589051Sjake
12689051Sjake	if (mp_ncpus == 1)
12789051Sjake		return (NULL);
12889051Sjake	ita = &ipi_tlb_args;
12989051Sjake	ita->ita_count = mp_ncpus;
13089051Sjake	ita->ita_tlb = tlb;
13189051Sjake	ita->ita_ctx = ctx;
13289051Sjake	ita->ita_va = va;
13389051Sjake	cpu_ipi_selected(PCPU_GET(other_cpus), 0,
13489051Sjake	    (u_long)tl_ipi_tlb_page_demap, (u_long)ita);
13589051Sjake	return (&ita->ita_count);
13689051Sjake}
13789051Sjake
13889051Sjakestatic __inline void *
13989051Sjakeipi_tlb_range_demap(u_int ctx, vm_offset_t start, vm_offset_t end)
14089051Sjake{
14189051Sjake	struct ipi_tlb_args *ita;
14289051Sjake
14389051Sjake	if (mp_ncpus == 1)
14489051Sjake		return (NULL);
14589051Sjake	ita = &ipi_tlb_args;
14689051Sjake	ita->ita_count = mp_ncpus;
14789051Sjake	ita->ita_ctx = ctx;
14889051Sjake	ita->ita_start = start;
14989051Sjake	ita->ita_end = end;
15089051Sjake	cpu_ipi_selected(PCPU_GET(other_cpus), 0,
15189051Sjake	    (u_long)tl_ipi_tlb_range_demap, (u_long)ita);
15289051Sjake	return (&ita->ita_count);
15389051Sjake}
15489051Sjake
15589051Sjakestatic __inline void
15689051Sjakeipi_wait(void *cookie)
15789051Sjake{
15889051Sjake	u_int *count;
15989051Sjake
16089051Sjake	if ((count = cookie) != NULL) {
16189051Sjake		atomic_subtract_int(count, 1);
16289051Sjake		while (*count != 0)
16391617Sjake			;
16489051Sjake	}
16589051Sjake}
16689051Sjake
16789051Sjake#else
16889051Sjake
16989051Sjakestatic __inline void *
17089051Sjakeipi_tlb_context_demap(u_int ctx)
17189051Sjake{
17289051Sjake	return (NULL);
17389051Sjake}
17489051Sjake
17589051Sjakestatic __inline void *
17689051Sjakeipi_tlb_page_demap(u_int tlb, u_int ctx, vm_offset_t va)
17789051Sjake{
17889051Sjake	return (NULL);
17989051Sjake}
18089051Sjake
18189051Sjakestatic __inline void *
18289051Sjakeipi_tlb_range_demap(u_int ctx, vm_offset_t start, vm_offset_t end)
18389051Sjake{
18489051Sjake	return (NULL);
18589051Sjake}
18689051Sjake
18789051Sjakestatic __inline void
18889051Sjakeipi_wait(void *cookie)
18989051Sjake{
19089051Sjake}
19189051Sjake
19289051Sjake#endif /* SMP */
19389051Sjake
19489051Sjake#endif /* !LOCORE */
19589051Sjake
19680708Sjake#endif /* !_MACHINE_SMP_H_ */
197