xref: /original-bsd/sys/vax/include/cpu.h (revision 13ec26c3)
1 /*
2  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)cpu.h	7.7 (Berkeley) 02/20/92
7  */
8 
9 #ifndef LOCORE
10 /*
11  * Cpu identification, from SID register.
12  */
13 union cpusid {
14 	int	cpusid;
15 	struct cpuany {
16 		u_int	:24,
17 			cp_type:8;
18 	} cpuany;
19 	struct cpu8600 {
20 		u_int	cp_sno:12,		/* serial number */
21 			cp_plant:4,		/* plant number */
22 			cp_eco:8,		/* eco level */
23 			cp_type:8;		/* VAX_8600 */
24 	} cpu8600;
25 	struct cpu8200 {
26 		u_int	cp_urev:8,		/* ucode rev */
27 			cp_secp:1,		/* secondary patch? */
28 			cp_patch:10,		/* patch number */
29 			cp_hrev:4,		/* hardware rev */
30 			cp_5:1,			/* true iff KA825 */
31 			cp_type:8;		/* VAX_8200 */
32 	} cpu8200;
33 	struct cpu780 {
34 		u_int	cp_sno:12,		/* serial number */
35 			cp_plant:3,		/* plant number */
36 			cp_eco:8,		/* eco level */
37 			cp_5:1,			/* true iff 785 */
38 			cp_type:8;		/* VAX_780 */
39 	} cpu780;
40 	struct cpu750 {
41 		u_int	cp_hrev:8,		/* hardware rev level */
42 			cp_urev:8,		/* ucode rev level */
43 			:8,
44 			cp_type:8;		/* VAX_750 */
45 	} cpu750;
46 	struct cpu730 {
47 		u_int	:8,			/* reserved */
48 			cp_urev:8,		/* ucode rev level */
49 			:8,			/* reserved */
50 			cp_type:8;		/* VAX_730 */
51 	} cpu730;
52  	struct cpu630 {
53 		u_int	cp_hrev:8,		/* hardware rev level */
54 			cp_urev:8,		/* ucode rev level */
55 			:8,
56  			cp_type:8;		/* VAX_630 */
57  	} cpu630;
58 	struct cpu650 {
59 		u_int	cp_urev:8,		/* ucode rev level */
60 			:16,			/* reserved */
61 			cp_type:8;		/* VAX_650 */
62 	} cpu650;
63 };
64 #endif
65 /*
66  * Vax CPU types.
67  * Similar types are grouped with their earliest example.
68  */
69 #define	VAX_780		1
70 #define	VAX_750		2
71 #define	VAX_730		3
72 #define	VAX_8600	4
73 #define	VAX_8200	5
74 #define	VAX_8800	6
75 #define	VAX_8500	6	/* same as 8800, 8700 */
76 #define	VAX_610		7	/* uVAX I */
77 #define	VAX_630		8	/* uVAX II */
78 #define	VAX_650		10	/* uVAX 3000 */
79 
80 #define	VAX_MAX		10
81 
82 /*
83  * Main IO backplane types.
84  * This gives us a handle on how to do autoconfiguration.
85  */
86 #define	IO_SBI780	1
87 #define	IO_CMI750	2
88 #define	IO_XXX730	3
89 #define IO_ABUS		4
90 #define IO_QBUS		5
91 #define	IO_BI		6
92 #define	IO_NMI		7
93 
94 #ifndef LOCORE
95 /*
96  * CPU-dependent operations.
97  */
98 struct	clockops {
99 	int	(*clkstartrt)();	/* start real time clock */
100 	int	(*clkread)();		/* set system time from clock */
101 	int	(*clkwrite)();		/* reset clock from system time */
102 };
103 
104 struct	cpuops {
105 	struct	clockops *cpu_clock;	/* clock operations */
106 	int	(*cpu_memenable)();	/* memory error (CRD intr) enable */
107 	int	(*cpu_memerr)();	/* memory error handler */
108 	int	(*cpu_mchk)();		/* machine check handler */
109 	int	(*cpu_init)();		/* special initialisation, if any */
110 };
111 
112 /* return values from cpu_mchk */
113 #define	MCHK_PANIC	-1
114 #define	MCHK_RECOVERED	0
115 
116 /*
117  * Per-cpu information for system.
118  */
119 struct	percpu {
120 	short	pc_cputype;		/* cpu type code */
121 	short	pc_cpuspeed;		/* relative speed of cpu */
122 	short	pc_nioa;		/* number of IO adaptors/nexus blocks */
123 	struct	iobus *pc_io;		/* descriptions of IO adaptors */
124 	struct	cpuops *pc_ops;		/* per-cpu operations */
125 };
126 
127 /*
128  * Generic description of an I/O "adaptor"
129  * (any top-level I/O bus visible to software
130  * and requiring autoconfiguration).
131  * The remainder of the description
132  * is pointed to by io_details.
133  */
134 struct iobus {
135 	int	io_type;		/* io adaptor types */
136 	caddr_t	io_addr;		/* phys address of IO adaptor */
137 	int	io_size;		/* size of an IO space */
138 	caddr_t	io_details;		/* specific to adaptor types */
139 };
140 
141 /*
142  * Description of a main bus that maps "nexi", ala the 780 SBI.
143  */
144 struct nexusconnect {
145 	short	psb_nnexus;		/* number of nexus slots */
146 	struct	nexus *psb_nexbase;	/* base of nexus space */
147 	short	psb_ubatype;		/* type of "unibus adaptor" */
148 	short	psb_nubabdp;		/* number of bdp's per uba */
149 	caddr_t	*psb_umaddr;		/* unibus memory addresses */
150 /* the 750 has some slots which don't promise to tell you their types */
151 /* if this pointer is non-zero, then you get the type from this array */
152 /* rather than from the (much more sensible) low byte of the config register */
153 	short	*psb_nextype;		/* botch */
154 };
155 
156 /*
157  * Description of a BI bus configuration.
158  */
159 struct bibus {
160 	struct	bi_node *pbi_base;	/* base of node space */
161 	/* that cannot possibly be all! */
162 };
163 
164 /*
165  * Description of a Q-bus configuration.
166  */
167 struct qbus {
168 	int	qb_type;		/* type of "unibus adaptor" */
169 	int	qb_memsize;		/* size of (used) memory, pages */
170 	struct	pte *qb_map;		/* base of map registers */
171 	caddr_t	qb_maddr;		/* "unibus" memory address */
172 	caddr_t	qb_iopage;		/* "unibus" IO page address */
173 };
174 
175 #ifndef _MTPR_H_
176 #include "mtpr.h"
177 #endif
178 
179 #ifdef KERNEL
180 int	cpu;
181 #if VAX8800 || VAX8200
182 int	mastercpu;		/* if multiple cpus, this identifies master */
183 #endif
184 struct	percpu percpu[];
185 struct	cpuops *cpuops;
186 #endif
187 
188 /*
189  * Enable realtime clock (always enabled).
190  */
191 #define	enablertclock()
192 #endif /* LOCORE */
193