Annotation of sys/arch/sparc/sparc/cpuvar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: cpuvar.h,v 1.11 2007/05/31 19:53:14 sobrado Exp $ */
2: /* $NetBSD: cpuvar.h,v 1.4 1997/07/06 21:14:25 pk Exp $ */
3:
4: /*
5: * Copyright (c) 1996 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Paul Kranenburg.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by the NetBSD
22: * Foundation, Inc. and its contributors.
23: * 4. Neither the name of The NetBSD Foundation nor the names of its
24: * contributors may be used to endorse or promote products derived
25: * from this software without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
31: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37: * POSSIBILITY OF SUCH DAMAGE.
38: */
39:
40: #ifndef _SPARC_CPUVAR_H
41: #define _SPARC_CPUVAR_H
42:
43: #include <sys/device.h>
44: #include <sys/sched.h>
45:
46: #include <sparc/sparc/cache.h> /* for cacheinfo */
47:
48: /*
49: * CPU/MMU module information.
50: * There is one of these for each "mainline" CPU module we support.
51: * The information contained in the structure is used only during
52: * auto-configuration of the CPUs; some fields are copied into the
53: * per-cpu data structure (cpu_softc) for easy access during normal
54: * operation.
55: */
56: struct cpu_softc;
57: struct module_info {
58: int cpu_type;
59: enum vactype vactype;
60: void (*cpu_match)(struct cpu_softc *, struct module_info *, int);
61: void (*getcacheinfo)(struct cpu_softc *sc, int node);
62: void (*hotfix)(struct cpu_softc *);
63: void (*mmu_enable)(void);
64: void (*cache_enable)(void);
65: int ncontext; /* max. # of contexts (we use) */
66:
67: void (*get_syncflt)(void);
68: int (*get_asyncflt)(u_int *, u_int *);
69: void (*cache_flush)(caddr_t, u_int);
70: void (*vcache_flush_page)(int);
71: void (*vcache_flush_segment)(int, int);
72: void (*vcache_flush_region)(int);
73: void (*vcache_flush_context)(void);
74: void (*pcache_flush_line)(int, int);
75: void (*pure_vcache_flush)(void);
76: void (*cache_flush_all)(void);
77: void (*memerr)(unsigned, u_int, u_int, struct trapframe *);
78: };
79:
80:
81: struct cpu_softc;
82: struct cpu_info {
83: struct cpu_softc *ci_softc;
84:
85: struct proc *ci_curproc;
86: struct cpu_info *ci_next;
87:
88: struct schedstate_percpu ci_schedstate;
89: };
90:
91: #define curcpu() (&cpuinfo.ci)
92: #define cpu_number() (cpuinfo.mid)
93: #define CPU_IS_PRIMARY(ci) ((ci)->ci_softc->master)
94: #define CPU_INFO_ITERATOR int
95: #define CPU_INFO_FOREACH(cii, ci) \
96: for (cii = 0, ci = curcpu(); ci != NULL; ci = ci->ci_next)
97:
98: /*
99: * The cpu_softc structure. This structure maintains information about one
100: * currently installed CPU (there may be several of these if the machine
101: * supports multiple CPUs, as on some Sun4m architectures). The information
102: * in this structure supersedes the old "cpumod", "mmumod", and similar
103: * fields.
104: */
105:
106: struct cpu_softc {
107: struct device dv; /* generic device info */
108:
109: struct cpu_info ci;
110:
111: int node; /* PROM node for this CPU */
112:
113: /* CPU information */
114: char *cpu_name; /* CPU model */
115: int cpu_impl; /* CPU implementation code */
116: int cpu_vers; /* CPU version code */
117: int mmu_impl; /* MMU implementation code */
118: int mmu_vers; /* MMU version code */
119: int master; /* 1 if this is bootup CPU */
120:
121: int mid; /* Module ID for MP systems */
122: int mbus; /* 1 if CPU is on MBus */
123: int mxcc; /* 1 if a MBus-level MXCC is present */
124:
125: caddr_t mailbox; /* VA of CPU's mailbox */
126:
127:
128: int mmu_ncontext; /* Number of contexts supported */
129: int mmu_nregion; /* Number of regions supported */
130: int mmu_nsegment; /* [4/4c] Segments */
131: int mmu_npmeg; /* [4/4c] Pmegs */
132: int sun4_mmu3l; /* [4]: 3-level MMU present */
133: #if defined(SUN4_MMU3L)
134: #define HASSUN4_MMU3L (cpuinfo.sun4_mmu3l)
135: #else
136: #define HASSUN4_MMU3L (0)
137: #endif
138:
139: /* Context administration */
140: int *ctx_tbl; /* [4m] SRMMU-edible context table */
141: union ctxinfo *ctxinfo;
142: union ctxinfo *ctx_freelist; /* context free list */
143: int ctx_kick; /* allocation rover when none free */
144: int ctx_kickdir; /* ctx_kick roves both directions */
145:
146: /* MMU tables that map `cpuinfo'' on each CPU */
147: int *L1_ptps; /* XXX */
148:
149: /* XXX - of these, we currently use only cpu_type */
150: int arch; /* Architecture: CPU_SUN4x */
151: int class; /* Class: SuperSPARC, microSPARC... */
152: int classlvl; /* Iteration in class: 1, 2, etc. */
153: int classsublvl; /* stepping in class (version) */
154: int cpu_type; /* Type: see CPUTYP_xxx below */
155:
156: int hz; /* Clock speed */
157:
158: /* Cache information */
159: struct cacheinfo cacheinfo; /* see cache.h */
160:
161: /* FPU information */
162: int fpupresent; /* true if FPU is present */
163: int fpuvers; /* FPU revision */
164:
165: /* various flags to workaround anomalies in chips */
166: int flags; /* see CPUFLG_xxx, below */
167:
168: /*
169: * The following pointers point to processes that are somehow
170: * associated with this CPU--running on it, using its FPU,
171: * etc.
172: *
173: * XXXMP: much more needs to go here
174: */
175: struct proc *fpproc; /* FPU owner */
176:
177: /*
178: * The following are function pointers to do interesting CPU-dependent
179: * things without having to do type-tests all the time
180: */
181:
182: /* bootup things: access to physical memory */
183: u_int (*read_physmem)(u_int addr, int space);
184: void (*write_physmem)(u_int addr, u_int data);
185: void (*cache_tablewalks)(void);
186: void (*mmu_enable)(void);
187: void (*hotfix)(struct cpu_softc *);
188:
189: /* locore defined: */
190: void (*get_syncflt)(void); /* Not C-callable */
191: int (*get_asyncflt)(u_int *, u_int *);
192:
193: /* Synchronous Fault Status; temporary storage */
194: struct {
195: int sfsr;
196: int sfva;
197: } syncfltdump;
198:
199: /* Cache handling functions */
200: void (*cache_enable)(void);
201: void (*cache_flush)(caddr_t, u_int);
202: void (*vcache_flush_page)(int);
203: void (*vcache_flush_segment)(int, int);
204: void (*vcache_flush_region)(int);
205: void (*vcache_flush_context)(void);
206: void (*pcache_flush_line)(int, int);
207: void (*pure_vcache_flush)(void);
208: void (*cache_flush_all)(void);
209:
210: #ifdef SUN4M
211: /* hardware-assisted block operation routines */
212: void (*hwbcopy)(const void *from, void *to, size_t len);
213: void (*hwbzero)(void *buf, size_t len);
214:
215: /* routine to clear mbus-sbus buffers */
216: void (*mbusflush)(void);
217: #endif
218:
219: /*
220: * Memory error handler; parity errors, unhandled NMIs and other
221: * unrecoverable faults end up here.
222: */
223: void (*memerr)(unsigned, u_int, u_int, struct trapframe *);
224: /* XXX: Add more here! */
225: };
226:
227: /*
228: * CPU architectures
229: */
230: #define CPUARCH_UNKNOWN 0
231: #define CPUARCH_SUN4 1
232: #define CPUARCH_SUN4C 2
233: #define CPUARCH_SUN4M 3
234: #define CPUARCH_SUN4D 4
235: #define CPUARCH_SUN4U 5
236:
237: /*
238: * CPU classes
239: */
240: #define CPUCLS_UNKNOWN 0
241:
242: #if defined(SUN4)
243: #define CPUCLS_SUN4 1
244: #endif
245:
246: #if defined(SUN4C)
247: #define CPUCLS_SUN4C 5
248: #endif
249:
250: #if defined(SUN4M)
251: #define CPUCLS_MICROSPARC 10 /* MicroSPARC-II */
252: #define CPUCLS_SUPERSPARC 11 /* Generic SuperSPARC */
253: #define CPUCLS_HYPERSPARC 12 /* Ross HyperSPARC RT620 */
254: #endif
255:
256: /*
257: * CPU types. Each of these should uniquely identify one platform/type of
258: * system, i.e. "MBus-based 75 MHz SuperSPARC-II with ECache" is
259: * CPUTYP_SS2_MBUS_MXCC. The general form is
260: * CPUTYP_proctype_bustype_cachetype_etc_etc
261: *
262: * XXX: This is far from complete/comprehensive
263: * XXX: ADD SUN4, SUN4C TYPES
264: */
265: #define CPUTYP_UNKNOWN 0
266:
267: #define CPUTYP_4_100 1 /* Sun4/100 */
268: #define CPUTYP_4_200 2 /* Sun4/200 */
269: #define CPUTYP_4_300 3 /* Sun4/300 */
270: #define CPUTYP_4_400 4 /* Sun4/400 */
271:
272: #define CPUTYP_SLC 10 /* SPARCstation SLC */
273: #define CPUTYP_ELC 11 /* SPARCstation ELC */
274: #define CPUTYP_IPX 12 /* SPARCstation IPX */
275: #define CPUTYP_IPC 13 /* SPARCstation IPC */
276: #define CPUTYP_1 14 /* SPARCstation 1 */
277: #define CPUTYP_1P 15 /* SPARCstation 1+ */
278: #define CPUTYP_2 16 /* SPARCstation 2 */
279:
280: /* We classify the Sun4m's by feature, not by model (XXX: do same for 4/4c) */
281: #define CPUTYP_SS2_MBUS_MXCC 20 /* SuperSPARC-II, MBus, MXCC (SS20) */
282: #define CPUTYP_SS1_MBUS_MXCC 21 /* SuperSPARC-I, MBus, MXCC (SS10) */
283: #define CPUTYP_SS2_MBUS_NOMXCC 22 /* SuperSPARC-II, on MBus w/o MXCC */
284: #define CPUTYP_SS1_MBUS_NOMXCC 23 /* SuperSPARC-I, on MBus w/o MXCC */
285: #define CPUTYP_MS2 24 /* MicroSPARC-2 */
286: #define CPUTYP_MS1 25 /* MicroSPARC-1 */
287: #define CPUTYP_HS_MBUS 26 /* MBus-based HyperSPARC */
288: #define CPUTYP_CYPRESS 27 /* MBus-based Cypress */
289:
290: /*
291: * CPU flags
292: */
293: #define CPUFLG_CACHEPAGETABLES 0x1 /* caching pagetables OK on Sun4m */
294: #define CPUFLG_CACHEIOMMUTABLES 0x2 /* caching IOMMU translations OK */
295: #define CPUFLG_CACHEDVMA 0x4 /* DVMA goes through cache */
296: #define CPUFLG_SUN4CACHEBUG 0x8 /* trap page can't be cached */
297: #define CPUFLG_CACHE_MANDATORY 0x10 /* if cache is on, don't use
298: uncached access */
299:
300: /*
301: * Related function prototypes
302: */
303: void getcpuinfo(struct cpu_softc *sc, int node);
304: void mmu_install_tables(struct cpu_softc *);
305: void pmap_alloc_cpu(struct cpu_softc *);
306:
307: #define cpuinfo (*(struct cpu_softc *)CPUINFO_VA)
308: #endif /* _SPARC_CPUVAR_H */
CVSweb