Add support for microvax 3000.
[unix-history] / usr / src / sys / vax / include / cpu.h
index dd32b44..2021cbf 100644 (file)
@@ -1,4 +1,10 @@
-/*     cpu.h   4.5     81/03/21        */
+/*
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *     @(#)cpu.h       7.6 (Berkeley) %G%
+ */
 
 #ifndef LOCORE
 /*
 
 #ifndef LOCORE
 /*
@@ -10,10 +16,25 @@ union cpusid {
                u_int   :24,
                        cp_type:8;
        } cpuany;
                u_int   :24,
                        cp_type:8;
        } cpuany;
+       struct cpu8600 {
+               u_int   cp_sno:12,              /* serial number */
+                       cp_plant:4,             /* plant number */
+                       cp_eco:8,               /* eco level */
+                       cp_type:8;              /* VAX_8600 */
+       } cpu8600;
+       struct cpu8200 {
+               u_int   cp_urev:8,              /* ucode rev */
+                       cp_secp:1,              /* secondary patch? */
+                       cp_patch:10,            /* patch number */
+                       cp_hrev:4,              /* hardware rev */
+                       cp_5:1,                 /* true iff KA825 */
+                       cp_type:8;              /* VAX_8200 */
+       } cpu8200;
        struct cpu780 {
                u_int   cp_sno:12,              /* serial number */
                        cp_plant:3,             /* plant number */
        struct cpu780 {
                u_int   cp_sno:12,              /* serial number */
                        cp_plant:3,             /* plant number */
-                       cp_eco:9,               /* eco level */
+                       cp_eco:8,               /* eco level */
+                       cp_5:1,                 /* true iff 785 */
                        cp_type:8;              /* VAX_780 */
        } cpu780;
        struct cpu750 {
                        cp_type:8;              /* VAX_780 */
        } cpu780;
        struct cpu750 {
@@ -22,37 +43,146 @@ union cpusid {
                        :8,
                        cp_type:8;              /* VAX_750 */
        } cpu750;
                        :8,
                        cp_type:8;              /* VAX_750 */
        } cpu750;
-       /* need structure for 730 */
+       struct cpu730 {
+               u_int   :8,                     /* reserved */
+                       cp_urev:8,              /* ucode rev level */
+                       :8,                     /* reserved */
+                       cp_type:8;              /* VAX_730 */
+       } cpu730;
+       struct cpu630 {
+               u_int   cp_hrev:8,              /* hardware rev level */
+                       cp_urev:8,              /* ucode rev level */
+                       :8,
+                       cp_type:8;              /* VAX_630 */
+       } cpu630;
+       struct cpu650 {
+               u_int   cp_urev:8,              /* ucode rev level */
+                       :16,                    /* reserved */
+                       cp_type:8;              /* VAX_650 */
+       } cpu650;
 };
 #endif
 };
 #endif
+/*
+ * Vax CPU types.
+ * Similar types are grouped with their earliest example.
+ */
 #define        VAX_780         1
 #define        VAX_750         2
 #define        VAX_730         3
 #define        VAX_780         1
 #define        VAX_750         2
 #define        VAX_730         3
+#define        VAX_8600        4
+#define        VAX_8200        5
+#define        VAX_8800        6
+#define        VAX_8500        6       /* same as 8800, 8700 */
+#define        VAX_610         7       /* uVAX I */
+#define        VAX_630         8       /* uVAX II */
+#define        VAX_650         10      /* uVAX 3000 */
+
+#define        VAX_MAX         10
 
 
-#define        VAX_MAX         3
+/*
+ * Main IO backplane types.
+ * This gives us a handle on how to do autoconfiguration.
+ */
+#define        IO_SBI780       1
+#define        IO_CMI750       2
+#define        IO_XXX730       3
+#define IO_ABUS                4
+#define IO_QBUS                5
+#define        IO_BI           6
+#define        IO_NMI          7
 
 #ifndef LOCORE
 
 #ifndef LOCORE
+/*
+ * CPU-dependent operations.
+ */
+struct clockops {
+       int     (*clkstartrt)();        /* start real time clock */
+       int     (*clkread)();           /* set system time from clock */
+       int     (*clkwrite)();          /* reset clock from system time */
+};
+
+struct cpuops {
+       struct  clockops *cpu_clock;    /* clock operations */
+       int     (*cpu_memenable)();     /* memory error (CRD intr) enable */
+       int     (*cpu_memerr)();        /* memory error handler */
+       int     (*cpu_mchk)();          /* machine check handler */
+       int     (*cpu_init)();          /* special initialisation, if any */
+};
+
+/* return values from cpu_mchk */
+#define        MCHK_PANIC      -1
+#define        MCHK_RECOVERED  0
+
 /*
  * Per-cpu information for system.
  */
 struct percpu {
        short   pc_cputype;             /* cpu type code */
 /*
  * Per-cpu information for system.
  */
 struct percpu {
        short   pc_cputype;             /* cpu type code */
-       short   pc_nnexus;              /* number of nexus slots */
-       struct  nexus *pc_nexbase;      /* base of nexus space */
-/* we should be able to have just one address for the unibus memories */
-/* and calculate successive addresses by adding to the base, but the 750 */
-/* doesn't obey the sensible rule: uba1 has a lower address than uba0! */
-       caddr_t *pc_umaddr;             /* unibus memory addresses */
-       short   pc_nubabdp;             /* number of bdp's per uba */
-       short   pc_haveubasr;           /* have uba status register */
+       short   pc_cpuspeed;            /* relative speed of cpu */
+       short   pc_nioa;                /* number of IO adaptors/nexus blocks */
+       struct  iobus *pc_io;           /* descriptions of IO adaptors */
+       struct  cpuops *pc_ops;         /* per-cpu operations */
+};
+
+/*
+ * Generic description of an I/O "adaptor"
+ * (any top-level I/O bus visible to software
+ * and requiring autoconfiguration).
+ * The remainder of the description
+ * is pointed to by io_details.
+ */
+struct iobus {
+       int     io_type;                /* io adaptor types */
+       caddr_t io_addr;                /* phys address of IO adaptor */
+       int     io_size;                /* size of an IO space */
+       caddr_t io_details;             /* specific to adaptor types */
+};
+
+/*
+ * Description of a main bus that maps "nexi", ala the 780 SBI.
+ */
+struct nexusconnect {
+       short   psb_nnexus;             /* number of nexus slots */
+       struct  nexus *psb_nexbase;     /* base of nexus space */
+       short   psb_ubatype;            /* type of "unibus adaptor" */
+       short   psb_nubabdp;            /* number of bdp's per uba */
+       caddr_t *psb_umaddr;            /* unibus memory addresses */
 /* the 750 has some slots which don't promise to tell you their types */
 /* if this pointer is non-zero, then you get the type from this array */
 /* rather than from the (much more sensible) low byte of the config register */
 /* the 750 has some slots which don't promise to tell you their types */
 /* if this pointer is non-zero, then you get the type from this array */
 /* rather than from the (much more sensible) low byte of the config register */
-       short   *pc_nextype;            /* botch */
+       short   *psb_nextype;           /* botch */
+};
+
+/*
+ * Description of a BI bus configuration.
+ */
+struct bibus {
+       struct  bi_node *pbi_base;      /* base of node space */
+       /* that cannot possibly be all! */
+};
+
+/*
+ * Description of a Q-bus configuration.
+ */
+struct qbus {
+       int     qb_type;                /* type of "unibus adaptor" */
+       int     qb_memsize;             /* size of (used) memory, pages */
+       struct  pte *qb_map;            /* base of map registers */
+       caddr_t qb_maddr;               /* "unibus" memory address */
+       caddr_t qb_iopage;              /* "unibus" IO page address */
 };
 
 #ifdef KERNEL
 int    cpu;
 };
 
 #ifdef KERNEL
 int    cpu;
-struct percpu percpu[];
+#if VAX8800 || VAX8200
+int    mastercpu;              /* if multiple cpus, this identifies master */
 #endif
 #endif
+struct percpu percpu[];
+struct cpuops *cpuops;
 #endif
 #endif
+
+/*
+ * Enable realtime clock (always enabled).
+ */
+#define        enablertclock()
+#endif /* LOCORE */