xref: /openbmc/linux/arch/mips/include/asm/sn/nmi.h (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
1384740dcSRalf Baechle /*
2384740dcSRalf Baechle  * This file is subject to the terms and conditions of the GNU General Public
3384740dcSRalf Baechle  * License.  See the file "COPYING" in the main directory of this archive
4384740dcSRalf Baechle  * for more details.
5384740dcSRalf Baechle  *
6*165533c3SRalf Baechle  * Derived from IRIX <sys/SN/nmi.h>, Revision 1.5.
7*165533c3SRalf Baechle  *
8384740dcSRalf Baechle  * Copyright (C) 1992 - 1997 Silicon Graphics, Inc.
9384740dcSRalf Baechle  */
10384740dcSRalf Baechle #ifndef __ASM_SN_NMI_H
11384740dcSRalf Baechle #define __ASM_SN_NMI_H
12384740dcSRalf Baechle 
13384740dcSRalf Baechle #include <asm/sn/addrs.h>
14384740dcSRalf Baechle 
15384740dcSRalf Baechle /*
16384740dcSRalf Baechle  * The launch data structure resides at a fixed place in each node's memory
17384740dcSRalf Baechle  * and is used to communicate between the master processor and the slave
18384740dcSRalf Baechle  * processors.
19384740dcSRalf Baechle  *
20384740dcSRalf Baechle  * The master stores launch parameters in the launch structure
21384740dcSRalf Baechle  * corresponding to a target processor that is in a slave loop, then sends
22384740dcSRalf Baechle  * an interrupt to the slave processor.	 The slave calls the desired
23384740dcSRalf Baechle  * function, followed by an optional rendezvous function, then returns to
24384740dcSRalf Baechle  * the slave loop.  The master does not wait for the slaves before
25384740dcSRalf Baechle  * returning.
26384740dcSRalf Baechle  *
27384740dcSRalf Baechle  * There is an array of launch structures, one per CPU on the node.  One
28384740dcSRalf Baechle  * interrupt level is used per CPU.
29384740dcSRalf Baechle  */
30384740dcSRalf Baechle 
31384740dcSRalf Baechle #define NMI_MAGIC		0x48414d4d455201
32384740dcSRalf Baechle #define NMI_SIZEOF		0x40
33384740dcSRalf Baechle 
34384740dcSRalf Baechle #define NMI_OFF_MAGIC		0x00	/* Struct offsets for assembly	    */
35384740dcSRalf Baechle #define NMI_OFF_FLAGS		0x08
36384740dcSRalf Baechle #define NMI_OFF_CALL		0x10
37384740dcSRalf Baechle #define NMI_OFF_CALLC		0x18
38384740dcSRalf Baechle #define NMI_OFF_CALLPARM	0x20
39384740dcSRalf Baechle #define NMI_OFF_GMASTER		0x28
40384740dcSRalf Baechle 
41384740dcSRalf Baechle /*
42384740dcSRalf Baechle  * The NMI routine is called only if the complement address is
43384740dcSRalf Baechle  * correct.
44384740dcSRalf Baechle  *
45384740dcSRalf Baechle  * Before control is transferred to a routine, the complement address
46384740dcSRalf Baechle  * is zeroed (invalidated) to prevent an accidental call from a spurious
47384740dcSRalf Baechle  * interrupt.
48384740dcSRalf Baechle  *
49384740dcSRalf Baechle  */
50384740dcSRalf Baechle 
51384740dcSRalf Baechle #ifndef __ASSEMBLY__
52384740dcSRalf Baechle 
53384740dcSRalf Baechle typedef struct nmi_s {
54384740dcSRalf Baechle 	volatile unsigned long	 magic;		/* Magic number */
55384740dcSRalf Baechle 	volatile unsigned long	 flags;		/* Combination of flags above */
56384740dcSRalf Baechle 	volatile void *call_addr;	/* Routine for slave to call	    */
57384740dcSRalf Baechle 	volatile void *call_addr_c;	/* 1's complement of address	    */
58384740dcSRalf Baechle 	volatile void *call_parm;	/* Single parm passed to call	    */
59384740dcSRalf Baechle 	volatile unsigned long	 gmaster;	/* Flag true only on global master*/
60384740dcSRalf Baechle } nmi_t;
61384740dcSRalf Baechle 
62384740dcSRalf Baechle #endif /* !__ASSEMBLY__ */
63384740dcSRalf Baechle 
64384740dcSRalf Baechle /* Following definitions are needed both in the prom & the kernel
65384740dcSRalf Baechle  * to identify the format of the nmi cpu register save area in the
66384740dcSRalf Baechle  * low memory on each node.
67384740dcSRalf Baechle  */
68384740dcSRalf Baechle #ifndef __ASSEMBLY__
69384740dcSRalf Baechle 
70384740dcSRalf Baechle struct reg_struct {
71384740dcSRalf Baechle 	unsigned long	gpr[32];
72384740dcSRalf Baechle 	unsigned long	sr;
73384740dcSRalf Baechle 	unsigned long	cause;
74384740dcSRalf Baechle 	unsigned long	epc;
75384740dcSRalf Baechle 	unsigned long	badva;
76384740dcSRalf Baechle 	unsigned long	error_epc;
77384740dcSRalf Baechle 	unsigned long	cache_err;
78384740dcSRalf Baechle 	unsigned long	nmi_sr;
79384740dcSRalf Baechle };
80384740dcSRalf Baechle 
81384740dcSRalf Baechle #endif /* !__ASSEMBLY__ */
82384740dcSRalf Baechle 
83384740dcSRalf Baechle /* These are the assembly language offsets into the reg_struct structure */
84384740dcSRalf Baechle 
85384740dcSRalf Baechle #define R0_OFF		0x0
86384740dcSRalf Baechle #define R1_OFF		0x8
87384740dcSRalf Baechle #define R2_OFF		0x10
88384740dcSRalf Baechle #define R3_OFF		0x18
89384740dcSRalf Baechle #define R4_OFF		0x20
90384740dcSRalf Baechle #define R5_OFF		0x28
91384740dcSRalf Baechle #define R6_OFF		0x30
92384740dcSRalf Baechle #define R7_OFF		0x38
93384740dcSRalf Baechle #define R8_OFF		0x40
94384740dcSRalf Baechle #define R9_OFF		0x48
95384740dcSRalf Baechle #define R10_OFF		0x50
96384740dcSRalf Baechle #define R11_OFF		0x58
97384740dcSRalf Baechle #define R12_OFF		0x60
98384740dcSRalf Baechle #define R13_OFF		0x68
99384740dcSRalf Baechle #define R14_OFF		0x70
100384740dcSRalf Baechle #define R15_OFF		0x78
101384740dcSRalf Baechle #define R16_OFF		0x80
102384740dcSRalf Baechle #define R17_OFF		0x88
103384740dcSRalf Baechle #define R18_OFF		0x90
104384740dcSRalf Baechle #define R19_OFF		0x98
105384740dcSRalf Baechle #define R20_OFF		0xa0
106384740dcSRalf Baechle #define R21_OFF		0xa8
107384740dcSRalf Baechle #define R22_OFF		0xb0
108384740dcSRalf Baechle #define R23_OFF		0xb8
109384740dcSRalf Baechle #define R24_OFF		0xc0
110384740dcSRalf Baechle #define R25_OFF		0xc8
111384740dcSRalf Baechle #define R26_OFF		0xd0
112384740dcSRalf Baechle #define R27_OFF		0xd8
113384740dcSRalf Baechle #define R28_OFF		0xe0
114384740dcSRalf Baechle #define R29_OFF		0xe8
115384740dcSRalf Baechle #define R30_OFF		0xf0
116384740dcSRalf Baechle #define R31_OFF		0xf8
117384740dcSRalf Baechle #define SR_OFF		0x100
118384740dcSRalf Baechle #define CAUSE_OFF	0x108
119384740dcSRalf Baechle #define EPC_OFF		0x110
120384740dcSRalf Baechle #define BADVA_OFF	0x118
121384740dcSRalf Baechle #define ERROR_EPC_OFF	0x120
122384740dcSRalf Baechle #define CACHE_ERR_OFF	0x128
123384740dcSRalf Baechle #define NMISR_OFF	0x130
124384740dcSRalf Baechle 
125384740dcSRalf Baechle #endif /* __ASM_SN_NMI_H */
126