| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 | 
							- /*
 
-  *	linux/arch/alpha/kernel/err_titan.c
 
-  *
 
-  *	Copyright (C) 2000 Jeff Wiedemeier (Compaq Computer Corporation)
 
-  *
 
-  *	Error handling code supporting TITAN systems
 
-  */
 
- #include <linux/init.h>
 
- #include <linux/pci.h>
 
- #include <linux/sched.h>
 
- #include <asm/io.h>
 
- #include <asm/core_titan.h>
 
- #include <asm/hwrpb.h>
 
- #include <asm/smp.h>
 
- #include <asm/err_common.h>
 
- #include <asm/err_ev6.h>
 
- #include <asm/irq_regs.h>
 
- #include "err_impl.h"
 
- #include "proto.h"
 
- static int
 
- titan_parse_c_misc(u64 c_misc, int print)
 
- {
 
- #ifdef CONFIG_VERBOSE_MCHECK
 
- 	char *src;
 
- 	int nxs = 0;
 
- #endif
 
- 	int status = MCHK_DISPOSITION_REPORT;
 
- #define TITAN__CCHIP_MISC__NXM		(1UL << 28)
 
- #define TITAN__CCHIP_MISC__NXS__S	(29)
 
- #define TITAN__CCHIP_MISC__NXS__M	(0x7)
 
- 	if (!(c_misc & TITAN__CCHIP_MISC__NXM))
 
- 		return MCHK_DISPOSITION_UNKNOWN_ERROR;
 
- #ifdef CONFIG_VERBOSE_MCHECK
 
- 	if (!print)
 
- 		return status;
 
- 	nxs = EXTRACT(c_misc, TITAN__CCHIP_MISC__NXS);
 
- 	switch(nxs) {
 
- 	case 0:	/* CPU 0 */
 
- 	case 1:	/* CPU 1 */
 
- 	case 2:	/* CPU 2 */
 
- 	case 3:	/* CPU 3 */
 
- 		src = "CPU";
 
- 		/* num is already the CPU number */
 
- 		break;
 
- 	case 4:	/* Pchip 0 */
 
- 	case 5:	/* Pchip 1 */
 
- 		src = "Pchip";
 
- 		nxs -= 4;
 
- 		break;
 
- 	default:/* reserved */
 
- 		src = "Unknown, NXS =";
 
- 		/* leave num untouched */
 
- 		break;
 
- 	}
 
- 	printk("%s    Non-existent memory access from: %s %d\n", 
 
- 	       err_print_prefix, src, nxs);
 
- #endif /* CONFIG_VERBOSE_MCHECK */
 
- 	return status;
 
- }
 
- static int
 
- titan_parse_p_serror(int which, u64 serror, int print)
 
- {
 
- 	int status = MCHK_DISPOSITION_REPORT;
 
- #ifdef CONFIG_VERBOSE_MCHECK
 
- 	static const char * const serror_src[] = {
 
- 		"GPCI", "APCI", "AGP HP", "AGP LP"
 
- 	};
 
- 	static const char * const serror_cmd[] = {
 
- 		"DMA Read", "DMA RMW", "SGTE Read", "Reserved"
 
- 	};
 
- #endif /* CONFIG_VERBOSE_MCHECK */
 
- #define TITAN__PCHIP_SERROR__LOST_UECC	(1UL << 0)
 
- #define TITAN__PCHIP_SERROR__UECC	(1UL << 1)
 
- #define TITAN__PCHIP_SERROR__CRE	(1UL << 2)
 
- #define TITAN__PCHIP_SERROR__NXIO	(1UL << 3)
 
- #define TITAN__PCHIP_SERROR__LOST_CRE	(1UL << 4)
 
- #define TITAN__PCHIP_SERROR__ECCMASK	(TITAN__PCHIP_SERROR__UECC |	  \
 
- 					 TITAN__PCHIP_SERROR__CRE)
 
- #define TITAN__PCHIP_SERROR__ERRMASK	(TITAN__PCHIP_SERROR__LOST_UECC | \
 
- 					 TITAN__PCHIP_SERROR__UECC |	  \
 
- 					 TITAN__PCHIP_SERROR__CRE |	  \
 
- 					 TITAN__PCHIP_SERROR__NXIO |	  \
 
- 					 TITAN__PCHIP_SERROR__LOST_CRE)
 
- #define TITAN__PCHIP_SERROR__SRC__S	(52)
 
- #define TITAN__PCHIP_SERROR__SRC__M	(0x3)
 
- #define TITAN__PCHIP_SERROR__CMD__S	(54)
 
- #define TITAN__PCHIP_SERROR__CMD__M	(0x3)
 
- #define TITAN__PCHIP_SERROR__SYN__S	(56)
 
- #define TITAN__PCHIP_SERROR__SYN__M	(0xff)
 
- #define TITAN__PCHIP_SERROR__ADDR__S	(15)
 
- #define TITAN__PCHIP_SERROR__ADDR__M	(0xffffffffUL)
 
- 	if (!(serror & TITAN__PCHIP_SERROR__ERRMASK))
 
- 		return MCHK_DISPOSITION_UNKNOWN_ERROR;
 
- #ifdef CONFIG_VERBOSE_MCHECK
 
- 	if (!print)
 
- 		return status;
 
- 	printk("%s  PChip %d SERROR: %016llx\n",
 
- 	       err_print_prefix, which, serror);
 
- 	if (serror & TITAN__PCHIP_SERROR__ECCMASK) {
 
- 		printk("%s    %sorrectable ECC Error:\n"
 
- 		       "      Source: %-6s  Command: %-8s  Syndrome: 0x%08x\n"
 
- 		       "      Address: 0x%llx\n",
 
- 		       err_print_prefix,
 
- 		       (serror & TITAN__PCHIP_SERROR__UECC) ? "Unc" : "C",
 
- 		       serror_src[EXTRACT(serror, TITAN__PCHIP_SERROR__SRC)],
 
- 		       serror_cmd[EXTRACT(serror, TITAN__PCHIP_SERROR__CMD)],
 
- 		       (unsigned)EXTRACT(serror, TITAN__PCHIP_SERROR__SYN),
 
- 		       EXTRACT(serror, TITAN__PCHIP_SERROR__ADDR));
 
- 	}
 
- 	if (serror & TITAN__PCHIP_SERROR__NXIO)
 
- 		printk("%s    Non Existent I/O Error\n", err_print_prefix);
 
- 	if (serror & TITAN__PCHIP_SERROR__LOST_UECC)
 
- 		printk("%s    Lost Uncorrectable ECC Error\n", 
 
- 		       err_print_prefix);
 
- 	if (serror & TITAN__PCHIP_SERROR__LOST_CRE)
 
- 		printk("%s    Lost Correctable ECC Error\n", err_print_prefix);
 
- #endif /* CONFIG_VERBOSE_MCHECK */
 
- 	return status;
 
- }
 
- static int 
 
- titan_parse_p_perror(int which, int port, u64 perror, int print)
 
- {
 
- 	int cmd;
 
- 	unsigned long addr;
 
- 	int status = MCHK_DISPOSITION_REPORT;
 
- #ifdef CONFIG_VERBOSE_MCHECK
 
- 	static const char * const perror_cmd[] = {
 
- 		"Interrupt Acknowledge", "Special Cycle",
 
- 		"I/O Read",		"I/O Write",
 
- 		"Reserved",		"Reserved",
 
- 		"Memory Read",		"Memory Write",
 
- 		"Reserved",		"Reserved",
 
- 		"Configuration Read",	"Configuration Write",
 
- 		"Memory Read Multiple",	"Dual Address Cycle",
 
- 		"Memory Read Line",	"Memory Write and Invalidate"
 
- 	};
 
- #endif /* CONFIG_VERBOSE_MCHECK */
 
- #define TITAN__PCHIP_PERROR__LOST	(1UL << 0)
 
- #define TITAN__PCHIP_PERROR__SERR	(1UL << 1)
 
- #define TITAN__PCHIP_PERROR__PERR	(1UL << 2)
 
- #define TITAN__PCHIP_PERROR__DCRTO	(1UL << 3)
 
- #define TITAN__PCHIP_PERROR__SGE	(1UL << 4)
 
- #define TITAN__PCHIP_PERROR__APE	(1UL << 5)
 
- #define TITAN__PCHIP_PERROR__TA		(1UL << 6)
 
- #define TITAN__PCHIP_PERROR__DPE	(1UL << 7)
 
- #define TITAN__PCHIP_PERROR__NDS	(1UL << 8)
 
- #define TITAN__PCHIP_PERROR__IPTPR	(1UL << 9)
 
- #define TITAN__PCHIP_PERROR__IPTPW	(1UL << 10)
 
- #define TITAN__PCHIP_PERROR__ERRMASK	(TITAN__PCHIP_PERROR__LOST |	\
 
- 					 TITAN__PCHIP_PERROR__SERR |	\
 
- 					 TITAN__PCHIP_PERROR__PERR |	\
 
- 					 TITAN__PCHIP_PERROR__DCRTO |	\
 
- 					 TITAN__PCHIP_PERROR__SGE |	\
 
- 					 TITAN__PCHIP_PERROR__APE |	\
 
- 					 TITAN__PCHIP_PERROR__TA |	\
 
- 					 TITAN__PCHIP_PERROR__DPE |	\
 
- 					 TITAN__PCHIP_PERROR__NDS |	\
 
- 					 TITAN__PCHIP_PERROR__IPTPR |	\
 
- 					 TITAN__PCHIP_PERROR__IPTPW)
 
- #define TITAN__PCHIP_PERROR__DAC	(1UL << 47)
 
- #define TITAN__PCHIP_PERROR__MWIN	(1UL << 48)
 
- #define TITAN__PCHIP_PERROR__CMD__S	(52)
 
- #define TITAN__PCHIP_PERROR__CMD__M	(0x0f)
 
- #define TITAN__PCHIP_PERROR__ADDR__S	(14)
 
- #define TITAN__PCHIP_PERROR__ADDR__M	(0x1fffffffful)
 
- 	if (!(perror & TITAN__PCHIP_PERROR__ERRMASK))
 
- 		return MCHK_DISPOSITION_UNKNOWN_ERROR;
 
- 	cmd = EXTRACT(perror, TITAN__PCHIP_PERROR__CMD);
 
- 	addr = EXTRACT(perror, TITAN__PCHIP_PERROR__ADDR) << 2;
 
- 	/*
 
- 	 * Initializing the BIOS on a video card on a bus without
 
- 	 * a south bridge (subtractive decode agent) can result in 
 
- 	 * master aborts as the BIOS probes the capabilities of the
 
 
  |