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