11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * License.  See the file "COPYING" in the main directory of this archive
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for more details.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6165533c3bd750042e7e140dff5bc2406a5104efeRalf Baechle * Derived from IRIX <sys/SN/nmi.h>, Revision 1.5.
7165533c3bd750042e7e140dff5bc2406a5104efeRalf Baechle *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1992 - 1997 Silicon Graphics, Inc.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASM_SN_NMI_H
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __ASM_SN_NMI_H
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/sn/addrs.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The launch data structure resides at a fixed place in each node's memory
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and is used to communicate between the master processor and the slave
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * processors.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The master stores launch parameters in the launch structure
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * corresponding to a target processor that is in a slave loop, then sends
227034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle * an interrupt to the slave processor.	 The slave calls the desired
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * function, followed by an optional rendezvous function, then returns to
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the slave loop.  The master does not wait for the slaves before
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * returning.
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * There is an array of launch structures, one per CPU on the node.  One
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt level is used per CPU.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_MAGIC		0x48414d4d455201
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_SIZEOF		0x40
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
347034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle#define NMI_OFF_MAGIC		0x00	/* Struct offsets for assembly	    */
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_OFF_FLAGS		0x08
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_OFF_CALL		0x10
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_OFF_CALLC		0x18
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_OFF_CALLPARM	0x20
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMI_OFF_GMASTER		0x28
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The NMI routine is called only if the complement address is
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * correct.
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Before control is transferred to a routine, the complement address
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is zeroed (invalidated) to prevent an accidental call from a spurious
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interrupt.
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct nmi_s {
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile unsigned long	 magic;		/* Magic number */
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile unsigned long	 flags;		/* Combination of flags above */
567034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle	volatile void *call_addr;	/* Routine for slave to call	    */
577034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle	volatile void *call_addr_c;	/* 1's complement of address	    */
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile void *call_parm;	/* Single parm passed to call	    */
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile unsigned long	 gmaster;	/* Flag true only on global master*/
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} nmi_t;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !__ASSEMBLY__ */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Following definitions are needed both in the prom & the kernel
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to identify the format of the nmi cpu register save area in the
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * low memory on each node.
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct reg_struct {
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	gpr[32];
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	sr;
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	cause;
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	epc;
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	badva;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	error_epc;
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	cache_err;
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long	nmi_sr;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !__ASSEMBLY__ */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* These are the assembly language offsets into the reg_struct structure */
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R0_OFF		0x0
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R1_OFF		0x8
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R2_OFF		0x10
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R3_OFF		0x18
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R4_OFF		0x20
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R5_OFF		0x28
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R6_OFF		0x30
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R7_OFF		0x38
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R8_OFF		0x40
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R9_OFF		0x48
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R10_OFF		0x50
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R11_OFF		0x58
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R12_OFF		0x60
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R13_OFF		0x68
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R14_OFF		0x70
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R15_OFF		0x78
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R16_OFF		0x80
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R17_OFF		0x88
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R18_OFF		0x90
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R19_OFF		0x98
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R20_OFF		0xa0
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R21_OFF		0xa8
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R22_OFF		0xb0
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R23_OFF		0xb8
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R24_OFF		0xc0
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R25_OFF		0xc8
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R26_OFF		0xd0
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R27_OFF		0xd8
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R28_OFF		0xe0
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R29_OFF		0xe8
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R30_OFF		0xf0
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define R31_OFF		0xf8
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SR_OFF		0x100
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CAUSE_OFF	0x108
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define EPC_OFF		0x110
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BADVA_OFF	0x118
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ERROR_EPC_OFF	0x120
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CACHE_ERR_OFF	0x128
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NMISR_OFF	0x130
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ASM_SN_NMI_H */
126