Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
mips
sgi-ip27
ip27-berr.c
Go to the documentation of this file.
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 1994, 1995, 1996, 1999, 2000 by Ralf Baechle
7
* Copyright (C) 1999, 2000 by Silicon Graphics
8
* Copyright (C) 2002 Maciej W. Rozycki
9
*/
10
#include <
linux/init.h
>
11
#include <linux/kernel.h>
12
#include <linux/module.h>
13
#include <linux/signal.h>
/* for SIGBUS */
14
#include <linux/sched.h>
/* schow_regs(), force_sig() */
15
16
#include <asm/module.h>
17
#include <asm/sn/addrs.h>
18
#include <asm/sn/arch.h>
19
#include <
asm/sn/sn0/hub.h
>
20
#include <
asm/tlbdebug.h
>
21
#include <asm/traps.h>
22
#include <asm/uaccess.h>
23
24
static
void
dump_hub_information(
unsigned
long
errst0,
unsigned
long
errst1)
25
{
26
static
char
*err_type[2][8] = {
27
{
NULL
,
"Uncached Partial Read PRERR"
,
"DERR"
,
"Read Timeout"
,
28
NULL
,
NULL
,
NULL
, NULL },
29
{
"WERR"
,
"Uncached Partial Write"
,
"PWERR"
,
"Write Timeout"
,
30
NULL
,
NULL
,
NULL
, NULL }
31
};
32
int
wrb
= errst1 &
PI_ERR_ST1_WRBRRB_MASK
;
33
34
if
(!(errst0 &
PI_ERR_ST0_VALID_MASK
)) {
35
printk
(
"Hub does not contain valid error information\n"
);
36
return
;
37
}
38
39
40
printk
(
"Hub has valid error information:\n"
);
41
if
(errst0 &
PI_ERR_ST0_OVERRUN_MASK
)
42
printk
(
"Overrun is set. Error stack may contain additional "
43
"information.\n"
);
44
printk
(
"Hub error address is %08lx\n"
,
45
(errst0 &
PI_ERR_ST0_ADDR_MASK
) >> (
PI_ERR_ST0_ADDR_SHFT
- 3));
46
printk
(
"Incoming message command 0x%lx\n"
,
47
(errst0 &
PI_ERR_ST0_CMD_MASK
) >>
PI_ERR_ST0_CMD_SHFT
);
48
printk
(
"Supplemental field of incoming message is 0x%lx\n"
,
49
(errst0 &
PI_ERR_ST0_SUPPL_MASK
) >>
PI_ERR_ST0_SUPPL_SHFT
);
50
printk
(
"T5 Rn (for RRB only) is 0x%lx\n"
,
51
(errst0 &
PI_ERR_ST0_REQNUM_MASK
) >>
PI_ERR_ST0_REQNUM_SHFT
);
52
printk
(
"Error type is %s\n"
, err_type[wrb]
53
[(errst0 &
PI_ERR_ST0_TYPE_MASK
) >>
PI_ERR_ST0_TYPE_SHFT
]
54
? :
"invalid"
);
55
}
56
57
int
ip27_be_handler
(
struct
pt_regs
*
regs
,
int
is_fixup)
58
{
59
unsigned
long
errst0, errst1;
60
int
data
= regs->
cp0_cause
& 4;
61
int
cpu
=
LOCAL_HUB_L
(
PI_CPU_NUM
);
62
63
if
(is_fixup)
64
return
MIPS_BE_FIXUP
;
65
66
printk
(
"Slice %c got %cbe at 0x%lx\n"
,
'A'
+ cpu, data ?
'd'
:
'i'
,
67
regs->
cp0_epc
);
68
printk
(
"Hub information:\n"
);
69
printk
(
"ERR_INT_PEND = 0x%06llx\n"
,
LOCAL_HUB_L
(
PI_ERR_INT_PEND
));
70
errst0 =
LOCAL_HUB_L
(cpu ?
PI_ERR_STATUS0_B
:
PI_ERR_STATUS0_A
);
71
errst1 =
LOCAL_HUB_L
(cpu ?
PI_ERR_STATUS1_B
:
PI_ERR_STATUS1_A
);
72
dump_hub_information(errst0, errst1);
73
show_regs
(regs);
74
dump_tlb_all
();
75
while
(1);
76
force_sig
(
SIGBUS
,
current
);
77
}
78
79
void
__init
ip27_be_init
(
void
)
80
{
81
/* XXX Initialize all the Hub & Bridge error handling here. */
82
int
cpu
=
LOCAL_HUB_L
(
PI_CPU_NUM
);
83
int
cpuoff = cpu << 8;
84
85
board_be_handler
=
ip27_be_handler
;
86
87
LOCAL_HUB_S
(
PI_ERR_INT_PEND
,
88
cpu ?
PI_ERR_CLEAR_ALL_B
:
PI_ERR_CLEAR_ALL_A
);
89
LOCAL_HUB_S
(
PI_ERR_INT_MASK_A
+ cpuoff, 0);
90
LOCAL_HUB_S
(
PI_ERR_STACK_ADDR_A
+ cpuoff, 0);
91
LOCAL_HUB_S
(
PI_ERR_STACK_SIZE
, 0);
/* Disable error stack */
92
LOCAL_HUB_S
(
PI_SYSAD_ERRCHK_EN
,
PI_SYSAD_CHECK_ALL
);
93
}
Generated on Thu Jan 10 2013 13:12:13 for Linux Kernel by
1.8.2