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