Home | History | Annotate | Line # | Download | only in sparc
      1 /*	$NetBSD: cpuvar.h,v 1.97 2018/01/17 07:38:20 mrg Exp $ */
      2 
      3 /*
      4  *  Copyright (c) 1996 The NetBSD Foundation, Inc.
      5  *  All rights reserved.
      6  *
      7  *  This code is derived from software contributed to The NetBSD Foundation
      8  *  by Paul Kranenburg.
      9  *
     10  *  Redistribution and use in source and binary forms, with or without
     11  *  modification, are permitted provided that the following conditions
     12  *  are met:
     13  *  1. Redistributions of source code must retain the above copyright
     14  *     notice, this list of conditions and the following disclaimer.
     15  *  2. Redistributions in binary form must reproduce the above copyright
     16  *     notice, this list of conditions and the following disclaimer in the
     17  *     documentation and/or other materials provided with the distribution.
     18  *
     19  *  THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  *  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  *  POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef _sparc_cpuvar_h
     33 #define _sparc_cpuvar_h
     34 
     35 #if defined(_KERNEL_OPT)
     36 #include "opt_multiprocessor.h"
     37 #include "opt_lockdebug.h"
     38 #include "opt_ddb.h"
     39 #include "opt_sparc_arch.h"
     40 #include "opt_modular.h"
     41 #endif
     42 
     43 #include <sys/device.h>
     44 #include <sys/lock.h>
     45 #include <sys/cpu_data.h>
     46 
     47 #include <sparc/include/reg.h>
     48 #include <sparc/sparc/cache.h>	/* for cacheinfo */
     49 
     50 /*
     51  * CPU/MMU module information.
     52  * There is one of these for each "mainline" CPU module we support.
     53  * The information contained in the structure is used only during
     54  * auto-configuration of the CPUs; some fields are copied into the
     55  * per-cpu data structure (cpu_info) for easy access during normal
     56  * operation.
     57  */
     58 struct cpu_info;
     59 struct module_info {
     60 	int  cpu_type;
     61 	enum vactype vactype;
     62 	void (*cpu_match)(struct cpu_info *, struct module_info *, int);
     63 	void (*getcacheinfo)(struct cpu_info *sc, int node);
     64 	void (*hotfix)(struct cpu_info *);
     65 	void (*mmu_enable)(void);
     66 	void (*cache_enable)(void);
     67 	int  (*getmid)(void);		/* Get MID of current CPU */
     68 	int  ncontext;			/* max. # of contexts (that we use) */
     69 
     70 	void (*get_syncflt)(void);
     71 	int  (*get_asyncflt)(u_int *, u_int *);
     72 	void (*cache_flush)(void *, u_int);
     73 	void (*sp_vcache_flush_page)(int, int);
     74 	void (*ft_vcache_flush_page)(int, int);
     75 	void (*sp_vcache_flush_segment)(int, int, int);
     76 	void (*ft_vcache_flush_segment)(int, int, int);
     77 	void (*sp_vcache_flush_region)(int, int);
     78 	void (*ft_vcache_flush_region)(int, int);
     79 	void (*sp_vcache_flush_context)(int);
     80 	void (*ft_vcache_flush_context)(int);
     81 	void (*sp_vcache_flush_range)(int, int, int);
     82 	void (*ft_vcache_flush_range)(int, int, int);
     83 	void (*pcache_flush_page)(paddr_t, int);
     84 	void (*pure_vcache_flush)(void);
     85 	void (*cache_flush_all)(void);
     86 	void (*memerr)(unsigned, u_int, u_int, struct trapframe *);
     87 	void (*zero_page)(paddr_t);
     88 	void (*copy_page)(paddr_t, paddr_t);
     89 };
     90 
     91 /*
     92  * CPU architectures
     93  */
     94 #define CPUARCH_UNKNOWN		0
     95 #define CPUARCH_SUN4		1
     96 #define CPUARCH_SUN4C		2
     97 #define CPUARCH_SUN4M		3
     98 #define	CPUARCH_SUN4D		4
     99 #define CPUARCH_SUN4U		5
    100 
    101 /*
    102  * CPU classes
    103  */
    104 #define CPUCLS_UNKNOWN		0
    105 
    106 #if defined(SUN4)
    107 #define CPUCLS_SUN4		1
    108 #endif
    109 
    110 #if defined(SUN4C)
    111 #define CPUCLS_SUN4C		5
    112 #endif
    113 
    114 #if defined(SUN4M) || defined(SUN4D)
    115 #define CPUCLS_MICROSPARC	10	/* MicroSPARC-II */
    116 #define CPUCLS_SUPERSPARC	11	/* Generic SuperSPARC */
    117 #define CPUCLS_HYPERSPARC	12	/* Ross HyperSPARC RT620 */
    118 #endif
    119 
    120 /*
    121  * CPU types. Each of these should uniquely identify one platform/type of
    122  * system, i.e. "MBus-based 75 MHz SuperSPARC-II with ECache" is
    123  * CPUTYP_SS2_MBUS_MXCC. The general form is
    124  * 	CPUTYP_proctype_bustype_cachetype_etc_etc
    125  *
    126  * XXX: This is far from complete/comprehensive
    127  * XXX: ADD SUN4, SUN4C TYPES
    128  */
    129 #define CPUTYP_UNKNOWN		0
    130 
    131 #define CPUTYP_4_100		1 	/* Sun4/100 */
    132 #define CPUTYP_4_200		2	/* Sun4/200 */
    133 #define CPUTYP_4_300		3	/* Sun4/300 */
    134 #define CPUTYP_4_400		4	/* Sun4/400 */
    135 
    136 #define CPUTYP_SLC		10	/* SPARCstation SLC */
    137 #define CPUTYP_ELC		11	/* SPARCstation ELC */
    138 #define CPUTYP_IPX		12	/* SPARCstation IPX */
    139 #define CPUTYP_IPC		13	/* SPARCstation IPC */
    140 #define CPUTYP_1		14	/* SPARCstation 1 */
    141 #define CPUTYP_1P		15	/* SPARCstation 1+ */
    142 #define CPUTYP_2		16	/* SPARCstation 2 */
    143 
    144 /* We classify the Sun4m's by feature, not by model (XXX: do same for 4/4c) */
    145 #define	CPUTYP_SS2_MBUS_MXCC	20 	/* SuperSPARC-II, Mbus, MXCC (SS20) */
    146 #define CPUTYP_SS1_MBUS_MXCC	21	/* SuperSPARC-I, Mbus, MXCC (SS10) */
    147 #define CPUTYP_SS2_MBUS_NOMXCC	22	/* SuperSPARC-II, on MBus w/o MXCC */
    148 #define CPUTYP_SS1_MBUS_NOMXCC	23	/* SuperSPARC-I, on MBus w/o MXCC */
    149 #define CPUTYP_MS2		24	/* MicroSPARC-2 */
    150 #define CPUTYP_MS1		25 	/* MicroSPARC-1 */
    151 #define CPUTYP_HS_MBUS		26	/* MBus-based HyperSPARC */
    152 #define CPUTYP_CYPRESS		27	/* MBus-based Cypress */
    153 
    154 /*
    155  * CPU flags
    156  */
    157 #define CPUFLG_HATCHED		0x1000	/* CPU is alive */
    158 #define CPUFLG_PAUSED		0x2000	/* CPU is paused */
    159 #define CPUFLG_GOTMSG		0x4000	/* CPU got an lev13 IPI */
    160 
    161 
    162 /*
    163  * Provide two forms of CPU_INFO_FOREACH.  One fast one for non-modular
    164  * non-SMP kernels, and the other for everyone else.  Both work in the
    165  * non-SMP case, just involving an extra indirection through cpus[0] for
    166  * the portable version.
    167  */
    168 #if defined(MULTIPROCESSOR) || defined(MODULAR) || defined(_MODULE)
    169 #define	CPU_INFO_FOREACH(cii, cp)	cii = 0; (cp = cpus[cii]) && cp->eintstack && cii < sparc_ncpus; cii++
    170 #define CPU_INFO_ITERATOR		int
    171 #else
    172 #define CPU_INFO_FOREACH(cii, cp)	cp = curcpu(); cp != NULL; cp = NULL
    173 #define CPU_INFO_ITERATOR		int __unused
    174 #endif
    175 
    176 
    177 /*
    178  * Related function prototypes
    179  */
    180 void getcpuinfo (struct cpu_info *sc, int node);
    181 void mmu_install_tables (struct cpu_info *);
    182 void pmap_alloc_cpu (struct cpu_info *);
    183 
    184 #define	CPUSET_ALL	0xffffffffU	/* xcall to all configured CPUs */
    185 
    186 #if defined(MULTIPROCESSOR)
    187 void cpu_init_system(void);
    188 typedef void (*xcall_func_t)(int, int, int);
    189 typedef void (*xcall_trap_t)(int, int, int);
    190 void xcall(xcall_func_t, xcall_trap_t, int, int, int, u_int);
    191 /* from intr.c */
    192 void xcallintr(void *);
    193 /* Shorthand */
    194 #define XCALL0(f,cpuset)		\
    195 	xcall((xcall_func_t)f, NULL, 0, 0, 0, cpuset)
    196 #define XCALL1(f,a1,cpuset)		\
    197 	xcall((xcall_func_t)f, NULL, (int)a1, 0, 0, cpuset)
    198 #define XCALL2(f,a1,a2,cpuset)		\
    199 	xcall((xcall_func_t)f, NULL, (int)a1, (int)a2, 0, cpuset)
    200 #define XCALL3(f,a1,a2,a3,cpuset)	\
    201 	xcall((xcall_func_t)f, NULL, (int)a1, (int)a2, (int)a3, cpuset)
    202 
    203 #define FXCALL0(f,tf,cpuset)		\
    204 	xcall((xcall_func_t)f, (xcall_trap_t)tf, 0, 0, 0, cpuset)
    205 #define FXCALL1(f,tf,a1,cpuset)		\
    206 	xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, 0, 0, cpuset)
    207 #define FXCALL2(f,tf,a1,a2,cpuset)	\
    208 	xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, (int)a2, 0, cpuset)
    209 #define FXCALL3(f,tf,a1,a2,a3,cpuset)	\
    210 	xcall((xcall_func_t)f, (xcall_trap_t)tf, (int)a1, (int)a2, (int)a3, cpuset)
    211 #else
    212 #define XCALL0(f,cpuset)		/**/
    213 #define XCALL1(f,a1,cpuset)		/**/
    214 #define XCALL2(f,a1,a2,cpuset)		/**/
    215 #define XCALL3(f,a1,a2,a3,cpuset)	/**/
    216 #define FXCALL0(f,tf,cpuset)		/**/
    217 #define FXCALL1(f,tf,a1,cpuset)		/**/
    218 #define FXCALL2(f,tf,a1,a2,cpuset)	/**/
    219 #define FXCALL3(f,tf,a1,a2,a3,cpuset)	/**/
    220 #endif /* MULTIPROCESSOR */
    221 
    222 extern int bootmid;			/* Module ID of boot CPU */
    223 #define CPU_MID2CPUNO(mid)		((mid) != 0 ? (mid) - 8 : 0)
    224 
    225 extern struct cpu_info *cpus[];
    226 #ifdef MULTIPROCESSOR
    227 extern u_int cpu_ready_mask;		/* the set of CPUs marked as READY */
    228 #endif
    229 
    230 #if defined(DDB) || defined(MULTIPROCESSOR)
    231 /*
    232  * These are called by ddb mach functions.
    233  */
    234 void cpu_debug_dump(void);
    235 void cpu_xcall_dump(void);
    236 #endif
    237 
    238 #endif	/* _sparc_cpuvar_h */
    239