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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * SN1 Platform specific error Support
  3.  *
  4.  * Copyright (C) 2001 Silicon Graphics, Inc.
  5.  * Copyright (C) 2001 Alan Mayer (ajm@sgi.com)
  6.  */
  7. #include <linux/kernel.h>
  8. #include <linux/sched.h>
  9. #include <linux/mm.h>
  10. #include <asm/ptrace.h>
  11. #include <linux/devfs_fs_kernel.h>
  12. #include <asm/smp.h>
  13. #include <asm/sn/sn_cpuid.h>
  14. #include <asm/sn/sn1/bedrock.h>
  15. #include <asm/sn/intr.h>
  16. #include <asm/sn/addrs.h>
  17. void
  18. snia_error_intr_handler(int irq, void *devid, struct pt_regs *pt_regs) {
  19. unsigned long long intpend_val;
  20. unsigned long long bit;
  21. switch (irq) {
  22. case SGI_UART_IRQ:
  23. // This isn't really an error interrupt.  We're just
  24. // here because we have to do something with them.
  25. // This is probably wrong, and this code will be
  26. // removed.
  27. intpend_val = LOCAL_HUB_L(PI_INT_PEND0);
  28. if ( (bit = ~(1L<<GFX_INTR_A)) ==
  29. (intpend_val & ~(1L<<GFX_INTR_A)) ) {
  30. LOCAL_HUB_CLR_INTR(bit);
  31. return;
  32. }
  33. if ( (bit = ~(1L<<GFX_INTR_B)) ==
  34. (intpend_val & ~(1L<<GFX_INTR_B)) ) {
  35. LOCAL_HUB_CLR_INTR(bit);
  36. return;
  37. }
  38. if ( (bit = ~(1L<<PG_MIG_INTR)) ==
  39. (intpend_val & ~(1L<<PG_MIG_INTR)) ) {
  40. LOCAL_HUB_CLR_INTR(bit);
  41. return;
  42. }
  43. if ( (bit = ~(1L<<UART_INTR)) ==
  44. (intpend_val & ~(1L<<UART_INTR)) ) {
  45. LOCAL_HUB_CLR_INTR(bit);
  46. return;
  47. }
  48. if ( (bit = ~(1L<<CC_PEND_A)) ==
  49. (intpend_val & ~(1L<<CC_PEND_A)) ) {
  50. LOCAL_HUB_CLR_INTR(bit);
  51. return;
  52. }
  53. if ( (bit = ~(1L<<CC_PEND_B)) ==
  54. (intpend_val & ~(1L<<CC_PEND_B)) ) {
  55. LOCAL_HUB_CLR_INTR(bit);
  56. return;
  57. }
  58. printk("Received SGI_UART_IRQ (65), but no intpend0 bits were set???n");
  59. return;
  60. case SGI_HUB_ERROR_IRQ:
  61. // These are mostly error interrupts of various
  62. // sorts.  We need to do more than panic here, but
  63. // what the heck, this is bring up.
  64. intpend_val = LOCAL_HUB_L(PI_INT_PEND1);
  65. if ( (bit = ~(1L<<XB_ERROR)) ==
  66. (intpend_val & ~(1L<<XB_ERROR)) ) {
  67. LOCAL_HUB_CLR_INTR(bit);
  68. panic("RECEIVED XB_ERROR on cpu %d, cnode %dn",
  69. smp_processor_id(), 
  70. cpuid_to_cnodeid(smp_processor_id()));
  71. }
  72. if ( (bit = ~(1L<<LB_ERROR)) ==
  73. (intpend_val & ~(1L<<LB_ERROR)) ) {
  74. LOCAL_HUB_CLR_INTR(bit);
  75. panic("RECEIVED LB_ERROR on cpu %d, cnode %dn",
  76. smp_processor_id(), 
  77. cpuid_to_cnodeid(smp_processor_id()));
  78. }
  79. if ( (bit = ~(1L<<NACK_INT_A)) ==
  80. (intpend_val & ~(1L<<NACK_INT_A)) ) {
  81. LOCAL_HUB_CLR_INTR(bit);
  82. panic("RECEIVED NACK_INT_A on cpu %d, cnode %dn",
  83. smp_processor_id(), 
  84. cpuid_to_cnodeid(smp_processor_id()));
  85. }
  86. if ( (bit = ~(1L<<NACK_INT_B)) ==
  87. (intpend_val & ~(1L<<NACK_INT_B)) ) {
  88. LOCAL_HUB_CLR_INTR(bit);
  89. panic("RECEIVED NACK_INT_B on cpu %d, cnode %dn",
  90. smp_processor_id(), 
  91. cpuid_to_cnodeid(smp_processor_id()));
  92. }
  93. if ( (bit = ~(1L<<CLK_ERR_INTR)) ==
  94. (intpend_val & ~(1L<<CLK_ERR_INTR)) ) {
  95. LOCAL_HUB_CLR_INTR(bit);
  96. panic("RECEIVED CLK_ERR_INTR on cpu %d, cnode %dn",
  97. smp_processor_id(), 
  98. cpuid_to_cnodeid(smp_processor_id()));
  99. }
  100. if ( (bit = ~(1L<<COR_ERR_INTR_A)) ==
  101. (intpend_val & ~(1L<<COR_ERR_INTR_A)) ) {
  102. LOCAL_HUB_CLR_INTR(bit);
  103. panic("RECEIVED COR_ERR_INTR_A on cpu %d, cnode %dn",
  104. smp_processor_id(), 
  105. cpuid_to_cnodeid(smp_processor_id()));
  106. }
  107. if ( (bit = ~(1L<<COR_ERR_INTR_B)) ==
  108. (intpend_val & ~(1L<<COR_ERR_INTR_B)) ) {
  109. LOCAL_HUB_CLR_INTR(bit);
  110. panic("RECEIVED COR_ERR_INTR_B on cpu %d, cnode %dn",
  111. smp_processor_id(), 
  112. cpuid_to_cnodeid(smp_processor_id()));
  113. }
  114. if ( (bit = ~(1L<<MD_COR_ERR_INTR)) ==
  115. (intpend_val & ~(1L<<MD_COR_ERR_INTR)) ) {
  116. LOCAL_HUB_CLR_INTR(bit);
  117. panic("RECEIVED MD_COR_ERR_INTR on cpu %d, cnode %dn",
  118. smp_processor_id(), 
  119. cpuid_to_cnodeid(smp_processor_id()));
  120. }
  121. if ( (bit = ~(1L<<NI_ERROR_INTR)) ==
  122. (intpend_val & ~(1L<<NI_ERROR_INTR)) ) {
  123. LOCAL_HUB_CLR_INTR(bit);
  124. panic("RECEIVED NI_ERROR_INTR on cpu %d, cnode %dn",
  125. smp_processor_id(), 
  126. cpuid_to_cnodeid(smp_processor_id()));
  127. }
  128. if ( (bit = ~(1L<<MSC_PANIC_INTR)) ==
  129. (intpend_val & ~(1L<<MSC_PANIC_INTR)) ) {
  130. LOCAL_HUB_CLR_INTR(bit);
  131. panic("RECEIVED MSC_PANIC_INTR on cpu %d, cnode %dn",
  132. smp_processor_id(), 
  133. cpuid_to_cnodeid(smp_processor_id()));
  134. }
  135. printk("Received SGI_XB_ERROR_IRQ (182) but no intpend1 bits are set???n");
  136. return;
  137. default:
  138. printk("Received invalid irq in snia_error_intr_handler()/n");
  139. }
  140. }