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   * Derived from IRIX <sys/SN/nmi.h>, Revision 1.5.
7   *
8   * Copyright (C) 1992 - 1997 Silicon Graphics, Inc.
9   */
10  #ifndef __ASM_SN_NMI_H
11  #define __ASM_SN_NMI_H
12  
13  #include <asm/sn/addrs.h>
14  
15  /*
16   * The launch data structure resides at a fixed place in each node's memory
17   * and is used to communicate between the master processor and the slave
18   * processors.
19   *
20   * The master stores launch parameters in the launch structure
21   * corresponding to a target processor that is in a slave loop, then sends
22   * an interrupt to the slave processor.	 The slave calls the desired
23   * function, followed by an optional rendezvous function, then returns to
24   * the slave loop.  The master does not wait for the slaves before
25   * returning.
26   *
27   * There is an array of launch structures, one per CPU on the node.  One
28   * interrupt level is used per CPU.
29   */
30  
31  #define NMI_MAGIC		0x48414d4d455201
32  #define NMI_SIZEOF		0x40
33  
34  #define NMI_OFF_MAGIC		0x00	/* Struct offsets for assembly	    */
35  #define NMI_OFF_FLAGS		0x08
36  #define NMI_OFF_CALL		0x10
37  #define NMI_OFF_CALLC		0x18
38  #define NMI_OFF_CALLPARM	0x20
39  #define NMI_OFF_GMASTER		0x28
40  
41  /*
42   * The NMI routine is called only if the complement address is
43   * correct.
44   *
45   * Before control is transferred to a routine, the complement address
46   * is zeroed (invalidated) to prevent an accidental call from a spurious
47   * interrupt.
48   *
49   */
50  
51  #ifndef __ASSEMBLY__
52  
53  typedef struct nmi_s {
54  	volatile unsigned long	 magic;		/* Magic number */
55  	volatile unsigned long	 flags;		/* Combination of flags above */
56  	volatile void *call_addr;	/* Routine for slave to call	    */
57  	volatile void *call_addr_c;	/* 1's complement of address	    */
58  	volatile void *call_parm;	/* Single parm passed to call	    */
59  	volatile unsigned long	 gmaster;	/* Flag true only on global master*/
60  } nmi_t;
61  
62  #endif /* !__ASSEMBLY__ */
63  
64  /* Following definitions are needed both in the prom & the kernel
65   * to identify the format of the nmi cpu register save area in the
66   * low memory on each node.
67   */
68  #ifndef __ASSEMBLY__
69  
70  struct reg_struct {
71  	unsigned long	gpr[32];
72  	unsigned long	sr;
73  	unsigned long	cause;
74  	unsigned long	epc;
75  	unsigned long	badva;
76  	unsigned long	error_epc;
77  	unsigned long	cache_err;
78  	unsigned long	nmi_sr;
79  };
80  
81  #endif /* !__ASSEMBLY__ */
82  
83  /* These are the assembly language offsets into the reg_struct structure */
84  
85  #define R0_OFF		0x0
86  #define R1_OFF		0x8
87  #define R2_OFF		0x10
88  #define R3_OFF		0x18
89  #define R4_OFF		0x20
90  #define R5_OFF		0x28
91  #define R6_OFF		0x30
92  #define R7_OFF		0x38
93  #define R8_OFF		0x40
94  #define R9_OFF		0x48
95  #define R10_OFF		0x50
96  #define R11_OFF		0x58
97  #define R12_OFF		0x60
98  #define R13_OFF		0x68
99  #define R14_OFF		0x70
100  #define R15_OFF		0x78
101  #define R16_OFF		0x80
102  #define R17_OFF		0x88
103  #define R18_OFF		0x90
104  #define R19_OFF		0x98
105  #define R20_OFF		0xa0
106  #define R21_OFF		0xa8
107  #define R22_OFF		0xb0
108  #define R23_OFF		0xb8
109  #define R24_OFF		0xc0
110  #define R25_OFF		0xc8
111  #define R26_OFF		0xd0
112  #define R27_OFF		0xd8
113  #define R28_OFF		0xe0
114  #define R29_OFF		0xe8
115  #define R30_OFF		0xf0
116  #define R31_OFF		0xf8
117  #define SR_OFF		0x100
118  #define CAUSE_OFF	0x108
119  #define EPC_OFF		0x110
120  #define BADVA_OFF	0x118
121  #define ERROR_EPC_OFF	0x120
122  #define CACHE_ERR_OFF	0x128
123  #define NMISR_OFF	0x130
124  
125  #endif /* __ASM_SN_NMI_H */
126