intr.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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