Home | History | Annotate | Line # | Download | only in vax
      1 /*	$NetBSD: ka630.c,v 1.30 2010/12/14 23:44:49 matt Exp $	*/
      2 /*-
      3  * Copyright (c) 1982, 1988, 1990, 1993
      4  *	The Regents of the University of California.  All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. Neither the name of the University nor the names of its contributors
     15  *    may be used to endorse or promote products derived from this software
     16  *    without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28  * SUCH DAMAGE.
     29  *
     30  *	@(#)ka630.c	7.8 (Berkeley) 5/9/91
     31  */
     32 
     33 #include <sys/cdefs.h>
     34 __KERNEL_RCSID(0, "$NetBSD: ka630.c,v 1.30 2010/12/14 23:44:49 matt Exp $");
     35 
     36 #include "opt_cputype.h"
     37 
     38 #include <sys/param.h>
     39 #include <sys/systm.h>
     40 #include <sys/cpu.h>
     41 #include <sys/device.h>
     42 #include <sys/kernel.h>
     43 #include <sys/time.h>
     44 
     45 #include <machine/ka630.h>
     46 #include <machine/clock.h>
     47 #include <machine/vsbus.h>
     48 
     49 static struct uvaxIIcpu *uvaxIIcpu_ptr;
     50 
     51 static void ka630_conf(void);
     52 static void ka630_memerr(void);
     53 static int ka630_mchk(void *);
     54 static void ka630_halt(void);
     55 static void ka630_reboot(int);
     56 static void ka630_clrf(void);
     57 
     58 static const char * const ka630_devs[] = { "cpu", "uba", NULL };
     59 
     60 const struct cpu_dep ka630_calls = {
     61 	.cpu_mchk	= ka630_mchk,
     62 	.cpu_memerr	= ka630_memerr,
     63 	.cpu_conf	= ka630_conf,
     64 	.cpu_gettime	= chip_gettime,
     65 	.cpu_settime	= chip_settime,
     66 	.cpu_vups	= 1,      /* ~VUPS */
     67 	.cpu_scbsz	= 2,	/* SCB pages */
     68 	.cpu_halt	= ka630_halt,
     69 	.cpu_reboot	= ka630_reboot,
     70 	.cpu_clrf	= ka630_clrf,
     71 	.cpu_devs	= ka630_devs
     72 };
     73 
     74 /*
     75  * uvaxII_conf() is called by cpu_startup to do the cpu_specific setup.
     76  */
     77 void
     78 ka630_conf(void)
     79 {
     80 	curcpu()->ci_cpustr = "KA630, UV2";
     81 
     82 	clk_adrshift = 0;	/* Addressed at short's... */
     83 	clk_tweak = 0;		/* ...and no shifting */
     84 	clk_page = (short *)vax_map_physmem((paddr_t)KA630CLK, 1);
     85 
     86 	uvaxIIcpu_ptr = (void *)vax_map_physmem(VS_REGS, 1);
     87 
     88 	/*
     89 	 * Enable memory parity error detection and clear error bits.
     90 	 */
     91 	uvaxIIcpu_ptr->uvaxII_mser = (UVAXIIMSER_PEN | UVAXIIMSER_MERR |
     92 	    UVAXIIMSER_LEB);
     93 }
     94 
     95 /* log crd errors */
     96 void
     97 ka630_memerr(void)
     98 {
     99 	printf("memory err!\n");
    100 }
    101 
    102 #define NMC78032 10
    103 const char * const mc78032[] = {
    104 	0,		"immcr (fsd)",	"immcr (ssd)",	"fpu err 0",
    105 	"fpu err 7",	"mmu st(tb)",	"mmu st(m=0)",	"pte in p0",
    106 	"pte in p1",	"un intr id",
    107 };
    108 
    109 struct mc78032frame {
    110 	int	mc63_bcnt;		/* byte count == 0xc */
    111 	int	mc63_summary;		/* summary parameter */
    112 	int	mc63_mrvaddr;		/* most recent vad */
    113 	int	mc63_istate;		/* internal state */
    114 	int	mc63_pc;		/* trapped pc */
    115 	int	mc63_psl;		/* trapped psl */
    116 };
    117 
    118 int
    119 ka630_mchk(void *cmcf)
    120 {
    121 	struct mc78032frame * const mcf = (struct mc78032frame *)cmcf;
    122 	u_int type = mcf->mc63_summary;
    123 
    124 	printf("machine check %x", type);
    125 	if (type < NMC78032 && mc78032[type])
    126 		printf(": %s", mc78032[type]);
    127 	printf("\n\tvap %x istate %x pc %x psl %x\n",
    128 	    mcf->mc63_mrvaddr, mcf->mc63_istate,
    129 	    mcf->mc63_pc, mcf->mc63_psl);
    130 	if (uvaxIIcpu_ptr && uvaxIIcpu_ptr->uvaxII_mser & UVAXIIMSER_MERR) {
    131 		printf("\tmser=0x%lx ", uvaxIIcpu_ptr->uvaxII_mser);
    132 		if (uvaxIIcpu_ptr->uvaxII_mser & UVAXIIMSER_CPUE)
    133 			printf("page=%ld", uvaxIIcpu_ptr->uvaxII_cear);
    134 		if (uvaxIIcpu_ptr->uvaxII_mser & UVAXIIMSER_DQPE)
    135 			printf("page=%ld", uvaxIIcpu_ptr->uvaxII_dear);
    136 		printf("\n");
    137 	}
    138 	return (-1);
    139 }
    140 
    141 void
    142 ka630_halt(void)
    143 {
    144 	((volatile struct ka630clock *)clk_page)->cpmbx = KA630CLK_DOTHIS|KA630CLK_HALT;
    145 	__asm("halt");
    146 }
    147 
    148 void
    149 ka630_reboot(int arg)
    150 {
    151 	((volatile struct ka630clock *)clk_page)->cpmbx =
    152 	    KA630CLK_DOTHIS | KA630CLK_REBOOT;
    153 }
    154 
    155 /*
    156  * Clear restart and boot in progress flags in the CPMBX.
    157  */
    158 void
    159 ka630_clrf(void)
    160 {
    161 	short i = ((volatile struct ka630clock *)clk_page)->cpmbx;
    162 
    163 	((volatile struct ka630clock *)clk_page)->cpmbx = i & KA630CLK_LANG;
    164 }
    165