1 /*- 2 * Copyright (c) 1988 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)ka630.c 7.8 (Berkeley) 05/09/91 8 */ 9 10 #ifdef VAX630 11 #include "sys/param.h" 12 #include "sys/time.h" 13 #include "sys/kernel.h" 14 #include "sys/vmmac.h" 15 16 #include "../include/mtpr.h" 17 #include "../include/cpu.h" 18 #include "../include/clock.h" 19 #include "../include/pte.h" 20 #include "ka630.h" 21 22 /* 23 * 630-specific routines 24 */ 25 extern struct pte Clockmap[]; 26 extern struct pte Ka630map[]; 27 struct ka630clock ka630clock; 28 struct ka630cpu ka630cpu; 29 30 ka630_init() 31 { 32 33 /* 34 * Map in the clock and the CPU. 35 */ 36 ioaccess((caddr_t)0x200b8000, &Clockmap[0], sizeof(struct ka630clock)); 37 ioaccess((caddr_t)0x20080000, &Ka630map[0], sizeof(struct ka630cpu)); 38 39 /* 40 * Clear restart and boot in progress flags in the CPMBX. 41 */ 42 ka630clock.cpmbx = (ka630clock.cpmbx & KA630CLK_LANG) | KA630CLK_REBOOT; 43 44 /* 45 * Enable memory parity error detection. 46 */ 47 ka630cpu.ka630_mser = KA630MSER_PAREN; 48 } 49 50 /* Start the real-time clock */ 51 ka630_clkstartrt() 52 { 53 54 mtpr(ICCS, ICCS_IE); 55 } 56 57 /* init system time from tod clock */ 58 /* ARGSUSED */ 59 ka630_clkread(base) 60 time_t base; 61 { 62 register struct ka630clock *claddr = &ka630clock; 63 struct chiptime c; 64 65 claddr->csr1 = KA630CLK_SET; 66 while ((claddr->csr0 & KA630CLK_UIP) != 0) 67 ; 68 /* If the clock is valid, use it. */ 69 if ((claddr->csr3 & KA630CLK_VRT) != 0 && 70 (claddr->csr1 & KA630CLK_ENABLE) == KA630CLK_ENABLE) { 71 c.sec = claddr->sec; 72 c.min = claddr->min; 73 c.hour = claddr->hr; 74 c.day = claddr->day; 75 c.mon = claddr->mon; 76 c.year = claddr->yr; 77 #ifndef lint 78 { int t = claddr->csr2; } /* ??? */ 79 #endif 80 claddr->csr0 = KA630CLK_RATE; 81 claddr->csr1 = KA630CLK_ENABLE; 82 83 time.tv_sec = chiptotime(&c); 84 return (time.tv_sec ? CLKREAD_OK : CLKREAD_BAD); 85 } 86 printf("WARNING: TOY clock invalid"); 87 return (CLKREAD_BAD); 88 } 89 90 /* Set the time of day clock, called via. stime system call.. */ 91 ka630_clkwrite() 92 { 93 register struct ka630clock *claddr = &ka630clock; 94 struct chiptime c; 95 int s; 96 97 timetochip(&c); 98 s = splhigh(); 99 claddr->csr1 = KA630CLK_SET; 100 while ((claddr->csr0 & KA630CLK_UIP) != 0) 101 ; 102 claddr->sec = c.sec; 103 claddr->min = c.min; 104 claddr->hr = c.hour; 105 claddr->day = c.day; 106 claddr->mon = c.mon; 107 claddr->yr = c.year; 108 #ifndef lint 109 { int t = claddr->csr2; } /* ??? */ 110 { int t = claddr->csr3; } /* ??? */ 111 #endif 112 claddr->csr0 = KA630CLK_RATE; 113 claddr->csr1 = KA630CLK_ENABLE; 114 splx(s); 115 } 116 117 ka630_memnop() 118 { 119 120 /* void */ 121 } 122 123 #define NMC630 10 124 char *mc630[] = { 125 0, "immcr (fsd)", "immcr (ssd)", "fpu err 0", 126 "fpu err 7", "mmu st(tb)", "mmu st(m=0)", "pte in p0", 127 "pte in p1", "un intr id", 128 }; 129 130 struct mc630frame { 131 int mc63_bcnt; /* byte count == 0xc */ 132 int mc63_summary; /* summary parameter */ 133 int mc63_mrvaddr; /* most recent vad */ 134 int mc63_istate; /* internal state */ 135 int mc63_pc; /* trapped pc */ 136 int mc63_psl; /* trapped psl */ 137 }; 138 139 ka630_mchk(cmcf) 140 caddr_t cmcf; 141 { 142 register struct ka630cpu *ka630addr = &ka630cpu; 143 register struct mc630frame *mcf = (struct mc630frame *)cmcf; 144 register u_int type = mcf->mc63_summary; 145 146 printf("machine check %x", type); 147 if (type < NMC630 && mc630[type]) 148 printf(": %s", mc630[type]); 149 printf("\n\tvap %x istate %x pc %x psl %x\n", 150 mcf->mc63_mrvaddr, mcf->mc63_istate, 151 mcf->mc63_pc, mcf->mc63_psl); 152 if (ka630addr->ka630_mser & KA630MSER_MERR) { 153 printf("\tmser=0x%x ", ka630addr->ka630_mser); 154 if (ka630addr->ka630_mser & KA630MSER_CPUER) 155 printf("page=%d", ka630addr->ka630_cear); 156 if (ka630addr->ka630_mser & KA630MSER_DQPE) 157 printf("page=%d", ka630addr->ka630_dear); 158 printf("\n"); 159 } 160 return (MCHK_PANIC); 161 } 162 #endif 163