intr.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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