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