1/* $Id: intr.h,v 1.1.1.1 2008/10/15 03:29:03 james26_jang Exp $ 2 * 3 * This file is subject to the terms and conditions of the GNU General Public 4 * License. See the file "COPYING" in the main directory of this archive 5 * for more details. 6 * 7 * Copyright (C) 1992 - 1997, 2000-2002 Silicon Graphics, Inc. All rights reserved. 8 */ 9#ifndef _ASM_IA64_SN_SN1_INTR_H 10#define _ASM_IA64_SN_SN1_INTR_H 11 12/* Subnode wildcard */ 13#define SUBNODE_ANY (-1) 14 15/* Number of interrupt levels associated with each interrupt register. */ 16#define N_INTPEND_BITS 64 17 18#define INT_PEND0_BASELVL 0 19#define INT_PEND1_BASELVL 64 20 21#define N_INTPENDJUNK_BITS 8 22#define INTPENDJUNK_CLRBIT 0x80 23 24#include <asm/sn/intr_public.h> 25#include <asm/sn/driver.h> 26#include <asm/sn/xtalk/xtalk.h> 27#include <asm/sn/hack.h> 28 29#ifndef __ASSEMBLY__ 30#define II_NAMELEN 24 31 32/* 33 * Dispatch table entry - contains information needed to call an interrupt 34 * routine. 35 */ 36typedef struct intr_vector_s { 37 intr_func_t iv_func; /* Interrupt handler function */ 38 intr_func_t iv_prefunc; /* Interrupt handler prologue func */ 39 void *iv_arg; /* Argument to pass to handler */ 40 cpuid_t iv_mustruncpu; /* Where we must run. */ 41} intr_vector_t; 42 43/* Interrupt information table. */ 44typedef struct intr_info_s { 45 xtalk_intr_setfunc_t ii_setfunc; /* Function to set the interrupt 46 * destination and level register. 47 * It returns 0 (success) or an 48 * error code. 49 */ 50 void *ii_cookie; /* arg passed to setfunc */ 51 devfs_handle_t ii_owner_dev; /* device that owns this intr */ 52 char ii_name[II_NAMELEN]; /* Name of this intr. */ 53 int ii_flags; /* informational flags */ 54} intr_info_t; 55 56 57#define THD_CREATED 0x00000001 /* 58 * We've created a thread for this 59 * interrupt. 60 */ 61 62/* 63 * Bits for ii_flags: 64 */ 65#define II_UNRESERVE 0 66#define II_RESERVE 1 /* Interrupt reserved. */ 67#define II_INUSE 2 /* Interrupt connected */ 68#define II_ERRORINT 4 /* INterrupt is an error condition */ 69#define II_THREADED 8 /* Interrupt handler is threaded. */ 70 71/* 72 * Interrupt level wildcard 73 */ 74#define INTRCONNECT_ANYBIT (-1) 75 76/* 77 * This structure holds information needed both to call and to maintain 78 * interrupts. The two are in separate arrays for the locality benefits. 79 * Since there's only one set of vectors per hub chip (but more than one 80 * CPU, the lock to change the vector tables must be here rather than in 81 * the PDA. 82 */ 83 84typedef struct intr_vecblk_s { 85 intr_vector_t vectors[N_INTPEND_BITS]; /* information needed to 86 call an intr routine. */ 87 intr_info_t info[N_INTPEND_BITS]; /* information needed only 88 to maintain interrupts. */ 89 spinlock_t vector_lock; /* Lock for this and the 90 masks in the PDA. */ 91 splfunc_t vector_spl; /* vector_lock req'd spl */ 92 int vector_state; /* Initialized to zero. 93 Set to INTR_INITED 94 by hubintr_init. 95 */ 96 int vector_count; /* Number of vectors 97 * reserved. 98 */ 99 int cpu_count[CPUS_PER_SUBNODE]; /* How many interrupts are 100 * connected to each CPU 101 */ 102 int ithreads_enabled; /* Are interrupt threads 103 * initialized on this node. 104 * and block? 105 */ 106} intr_vecblk_t; 107 108/* Possible values for vector_state: */ 109#define VECTOR_UNINITED 0 110#define VECTOR_INITED 1 111#define VECTOR_SET 2 112 113#define hub_intrvect0 private.p_intmasks.dispatch0->vectors 114#define hub_intrvect1 private.p_intmasks.dispatch1->vectors 115#define hub_intrinfo0 private.p_intmasks.dispatch0->info 116#define hub_intrinfo1 private.p_intmasks.dispatch1->info 117 118/* 119 * Macros to manipulate the interrupt register on the calling hub chip. 120 */ 121 122#define LOCAL_HUB_SEND_INTR(_level) LOCAL_HUB_S(PI_INT_PEND_MOD, \ 123 (0x100|(_level))) 124#define REMOTE_HUB_PI_SEND_INTR(_hub, _sn, _level) \ 125 REMOTE_HUB_PI_S((_hub), _sn, PI_INT_PEND_MOD, (0x100|(_level))) 126 127#define REMOTE_CPU_SEND_INTR(_cpuid, _level) \ 128 REMOTE_HUB_PI_S(cpuid_to_nasid(_cpuid), \ 129 SUBNODE(cpuid_to_slice(_cpuid)), \ 130 PI_INT_PEND_MOD, (0x100|(_level))) 131 132/* 133 * When clearing the interrupt, make sure this clear does make it 134 * to the hub. Otherwise we could end up losing interrupts. 135 * We do an uncached load of the int_pend0 register to ensure this. 136 */ 137 138#define LOCAL_HUB_CLR_INTR(_level) \ 139 LOCAL_HUB_S(PI_INT_PEND_MOD, (_level)), \ 140 LOCAL_HUB_L(PI_INT_PEND0) 141#define REMOTE_HUB_PI_CLR_INTR(_hub, _sn, _level) \ 142 REMOTE_HUB_PI_S((_hub), (_sn), PI_INT_PEND_MOD, (_level)), \ 143 REMOTE_HUB_PI_L((_hub), (_sn), PI_INT_PEND0) 144 145/* Special support for use by gfx driver only. Supports special gfx hub interrupt. */ 146extern void install_gfxintr(cpuid_t cpu, ilvl_t swlevel, intr_func_t intr_func, void *intr_arg); 147 148void setrtvector(intr_func_t func); 149 150/* 151 * Interrupt blocking 152 */ 153extern void intr_block_bit(cpuid_t cpu, int bit); 154extern void intr_unblock_bit(cpuid_t cpu, int bit); 155 156#endif /* __ASSEMBLY__ */ 157 158/* 159 * Hard-coded interrupt levels: 160 */ 161 162/* 163 * L0 = SW1 164 * L1 = SW2 165 * L2 = INT_PEND0 166 * L3 = INT_PEND1 167 * L4 = RTC 168 * L5 = Profiling Timer 169 * L6 = Hub Errors 170 * L7 = Count/Compare (T5 counters) 171 */ 172 173 174/* INT_PEND0 hard-coded bits. */ 175#ifdef DEBUG_INTR_TSTAMP 176/* hard coded interrupt level for interrupt latency test interrupt */ 177#define CPU_INTRLAT_B 62 178#define CPU_INTRLAT_A 61 179#endif 180 181/* Hardcoded bits required by software. */ 182#define MSC_MESG_INTR 9 183#define CPU_ACTION_B 8 184#define CPU_ACTION_A 7 185 186/* These are determined by hardware: */ 187#define CC_PEND_B 6 188#define CC_PEND_A 5 189#define UART_INTR 4 190#define PG_MIG_INTR 3 191#define GFX_INTR_B 2 192#define GFX_INTR_A 1 193#define RESERVED_INTR 0 194 195/* INT_PEND1 hard-coded bits: */ 196#define MSC_PANIC_INTR 63 197#define NI_ERROR_INTR 62 198#define MD_COR_ERR_INTR 61 199#define COR_ERR_INTR_B 60 200#define COR_ERR_INTR_A 59 201#define CLK_ERR_INTR 58 202 203# define NACK_INT_B 57 204# define NACK_INT_A 56 205# define LB_ERROR 55 206# define XB_ERROR 54 207 208#define BRIDGE_ERROR_INTR 53 /* Setup by PROM to catch Bridge Errors */ 209 210#define IP27_INTR_0 52 /* Reserved for PROM use */ 211#define IP27_INTR_1 51 /* (do not use in Kernel) */ 212#define IP27_INTR_2 50 213#define IP27_INTR_3 49 214#define IP27_INTR_4 48 215#define IP27_INTR_5 47 216#define IP27_INTR_6 46 217#define IP27_INTR_7 45 218 219#define TLB_INTR_B 44 /* used for tlb flush random */ 220#define TLB_INTR_A 43 221 222#define LLP_PFAIL_INTR_B 42 /* see ml/SN/SN0/sysctlr.c */ 223#define LLP_PFAIL_INTR_A 41 224 225#define NI_BRDCAST_ERR_B 40 226#define NI_BRDCAST_ERR_A 39 227 228# define IO_ERROR_INTR 38 /* set up by prom */ 229# define DEBUG_INTR_B 37 /* used by symmon to stop all cpus */ 230# define DEBUG_INTR_A 36 231 232// These aren't strictly accurate or complete. See the 233// Synergy Spec. for details. 234#define SGI_UART_IRQ (65) 235#define SGI_HUB_ERROR_IRQ (182) 236 237#endif /* _ASM_IA64_SN_SN1_INTR_H */ 238