xref: /csrg-svn/sys/vax/vax/ka750.c (revision 49564)
1*49564Sbostic /*-
2*49564Sbostic  * Copyright (c) 1982, 1986, 1988 The Regents of the University of California.
3*49564Sbostic  * All rights reserved.
435047Skarels  *
5*49564Sbostic  * %sccs.include.redist.c%
6*49564Sbostic  *
7*49564Sbostic  *	@(#)ka750.c	7.4 (Berkeley) 05/09/91
834358Skarels  */
934358Skarels 
1034358Skarels #if VAX750
1134358Skarels 
1234358Skarels /*
1334358Skarels  * 750-specific code.
1434358Skarels  */
1534358Skarels 
1645810Sbostic #include "sys/param.h"
1734358Skarels 
1845810Sbostic #include "../include/cpu.h"
1934358Skarels #include "mem.h"
2045810Sbostic #include "../include/mtpr.h"
2134358Skarels 
2234358Skarels struct	mcr750 {
2334358Skarels 	int	mc_err;			/* error bits */
2434358Skarels 	int	mc_inh;			/* inhibit crd */
2534358Skarels };
2634358Skarels 
2734358Skarels #define	M750_ICRD	0x10000000	/* inhibit crd interrupts, in [1] */
2834358Skarels #define	M750_UNCORR	0xc0000000	/* uncorrectable error, in [0] */
2934358Skarels #define	M750_CORERR	0x20000000	/* correctable error, in [0] */
3034358Skarels 
3134358Skarels #define	M750_INH(mcr)	((mcr)->mc_inh = 0)
3234358Skarels #define	M750_ENA(mcr)	((mcr)->mc_err = (M750_UNCORR|M750_CORERR), \
3334358Skarels 			 (mcr)->mc_inh = M750_ICRD)
3434358Skarels #define	M750_ERR(mcr)	((mcr)->mc_err & (M750_UNCORR|M750_CORERR))
3534358Skarels 
3634358Skarels #define	M750_SYN(err)	((err) & 0x7f)
3734358Skarels #define	M750_ADDR(err)	(((err) >> 9) & 0x7fff)
3834358Skarels 
3934358Skarels /* enable crd interrupts */
ka750_memenable()4034358Skarels ka750_memenable()
4134358Skarels {
4234358Skarels 
4334358Skarels 	M750_ENA((struct mcr750 *)mcraddr[0]);
4434358Skarels }
4534358Skarels 
4634358Skarels /* log crd errors */
ka750_memerr()4734358Skarels ka750_memerr()
4834358Skarels {
4934358Skarels 	register struct mcr750 *mcr = (struct mcr750 *)mcraddr[0];
5034358Skarels 	register int err;
5134358Skarels 
5234358Skarels 	if (M750_ERR(mcr)) {
5334358Skarels 		err = mcr->mc_err;	/* careful with i/o space refs */
5434358Skarels 		printf("mcr0: %s", err & M750_UNCORR ?
5534358Skarels 		    "hard error" : "soft ecc");
5634358Skarels 		printf(" addr %x syn %x\n", M750_ADDR(err), M750_SYN(err));
5734358Skarels 		M750_INH(mcr);
5834358Skarels 	}
5934358Skarels }
6034358Skarels 
6134358Skarels extern char *mc780750[];
6234358Skarels 
6334358Skarels struct mc750frame {
6434358Skarels 	int	mc5_bcnt;		/* byte count == 0x28 */
6534358Skarels 	int	mc5_summary;		/* summary parameter (as above) */
6634358Skarels 	int	mc5_va;			/* virtual address register */
6734358Skarels 	int	mc5_errpc;		/* error pc */
6834358Skarels 	int	mc5_mdr;
6934358Skarels 	int	mc5_svmode;		/* saved mode register */
7034358Skarels 	int	mc5_rdtimo;		/* read lock timeout */
7134358Skarels 	int	mc5_tbgpar;		/* tb group parity error register */
7234358Skarels 	int	mc5_cacherr;		/* cache error register */
7334358Skarels 	int	mc5_buserr;		/* bus error register */
7434358Skarels 	int	mc5_mcesr;		/* machine check status register */
7534358Skarels 	int	mc5_pc;			/* trapped pc */
7634358Skarels 	int	mc5_psl;		/* trapped psl */
7734358Skarels };
7834358Skarels 
7934358Skarels #define MC750_TBERR	2		/* type code of cp tbuf par */
8034358Skarels #define	MC750_TBPAR	4		/* tbuf par bit in mcesr */
8134358Skarels 
ka750_mchk(cmcf)8234358Skarels ka750_mchk(cmcf)
8334358Skarels 	caddr_t cmcf;
8434358Skarels {
8534358Skarels 	register struct mc750frame *mcf = (struct mc750frame *)cmcf;
8634358Skarels 	register int type = mcf->mc5_summary;
8734358Skarels 	int mcsr = mfpr(MCSR);
8834358Skarels 
8934358Skarels 	printf("machine check %x: %s%s\n", type, mc780750[type&0xf],
9034358Skarels 	    (type&0xf0) ? " abort" : " fault");
9134358Skarels 	mtpr(TBIA, 0);
9234358Skarels 	mtpr(MCESR, 0xf);
9334358Skarels 	printf(
9434358Skarels "\tva %x errpc %x mdr %x smr %x rdtimo %x tbgpar %x cacherr %x\n",
9534358Skarels 	    mcf->mc5_va, mcf->mc5_errpc, mcf->mc5_mdr, mcf->mc5_svmode,
9634358Skarels 	    mcf->mc5_rdtimo, mcf->mc5_tbgpar, mcf->mc5_cacherr);
9734358Skarels 	printf("\tbuserr %x mcesr %x pc %x psl %x mcsr %x\n",
9834358Skarels 	    mcf->mc5_buserr, mcf->mc5_mcesr, mcf->mc5_pc, mcf->mc5_psl,
9934358Skarels 	    mcsr);
10034358Skarels 	if (type == MC750_TBERR && (mcf->mc5_mcesr&0xe) == MC750_TBPAR) {
10134358Skarels 		printf("tbuf par: flushing and returning\n");
10234358Skarels 		return (MCHK_RECOVERED);
10334358Skarels 	}
10434358Skarels 	return (MCHK_PANIC);
10534358Skarels }
10634358Skarels #endif
107