static void sn_end_irq(unsigned int irq) { #ifdef CONFIG_IA64_SGI_SN1 unsigned long long intpend_val, mask = 0x70L; int subnode; #endif int nasid; #ifdef CONFIG_IA64_SGI_SN2 unsigned long event_occurred; #endif irq = irq & 0xff; #ifdef CONFIG_IA64_SGI_SN1 if (irq == SGI_UART_IRQ) { nasid = smp_physical_node_id(); subnode = cpuid_to_subnode(smp_processor_id()); intpend_val = REMOTE_HUB_PI_L(nasid, subnode, PI_INT_PEND0); if (intpend_val & mask) { platform_send_ipi(smp_processor_id(), SGI_UART_IRQ, IA64_IPI_DM_INT, 0); } } #endif #ifdef CONFIG_IA64_SGI_SN2 if (irq == SGI_UART_VECTOR) { nasid = smp_physical_node_id(); event_occurred = HUB_L( (unsigned long *)GLOBAL_MMR_ADDR(nasid,SH_EVENT_OCCURRED) ); // If the UART bit is set here, we may have received an interrupt from the // UART that the driver missed. To make sure, we IPI ourselves to force us // to look again. if (event_occurred & SH_EVENT_OCCURRED_UART_INT_MASK) { platform_send_ipi(smp_processor_id(), SGI_UART_VECTOR, IA64_IPI_DM_INT, 0); } } #endif }
static void sn_end_irq(unsigned int irq) { int nasid; int ivec; unsigned long event_occurred; ivec = irq & 0xff; if (ivec == SGI_UART_VECTOR) { nasid = smp_physical_node_id(); event_occurred = HUB_L( (unsigned long *)GLOBAL_MMR_ADDR(nasid,SH_EVENT_OCCURRED) ); // If the UART bit is set here, we may have received an interrupt from the // UART that the driver missed. To make sure, we IPI ourselves to force us // to look again. if (event_occurred & SH_EVENT_OCCURRED_UART_INT_MASK) { platform_send_ipi(smp_processor_id(), SGI_UART_VECTOR, IA64_IPI_DM_INT, 0); } } clear_bit(ivec, (volatile void *)pda.sn_in_service_ivecs); if (sn_force_interrupt_flag) force_interrupt(irq); }
static void sn_ack_irq(unsigned int irq) { unsigned long event_occurred, mask = 0; int nasid; irq = irq & 0xff; nasid = smp_physical_node_id(); event_occurred = HUB_L( (unsigned long *)GLOBAL_MMR_ADDR(nasid,SH_EVENT_OCCURRED) ); if (event_occurred & SH_EVENT_OCCURRED_UART_INT_MASK) { mask |= (1 << SH_EVENT_OCCURRED_UART_INT_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_IPI_INT_MASK) { mask |= (1 << SH_EVENT_OCCURRED_IPI_INT_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_II_INT0_MASK) { mask |= (1 << SH_EVENT_OCCURRED_II_INT0_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_II_INT1_MASK) { mask |= (1 << SH_EVENT_OCCURRED_II_INT1_SHFT); } HUB_S((unsigned long *)GLOBAL_MMR_ADDR(nasid, SH_EVENT_OCCURRED_ALIAS), mask ); __set_bit(irq, (volatile void *)pda.sn_in_service_ivecs); }
static void sn_ack_irq(unsigned int irq) { #ifdef CONFIG_IA64_SGI_SN1 int bit = -1; unsigned long long intpend_val; int subnode; #endif #ifdef CONFIG_IA64_SGI_SN2 unsigned long event_occurred, mask = 0; #endif int nasid; irq = irq & 0xff; nasid = smp_physical_node_id(); #ifdef CONFIG_IA64_SGI_SN1 subnode = cpuid_to_subnode(smp_processor_id()); if (irq == SGI_UART_IRQ) { intpend_val = REMOTE_HUB_PI_L(nasid, subnode, PI_INT_PEND0); if (intpend_val & (1L<<GFX_INTR_A) ) { bit = GFX_INTR_A; REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); } if ( intpend_val & (1L<<GFX_INTR_B) ) { bit = GFX_INTR_B; REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); } if (intpend_val & (1L<<PG_MIG_INTR) ) { bit = PG_MIG_INTR; REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); } if (intpend_val & (1L<<CC_PEND_A)) { bit = CC_PEND_A; REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); } if (intpend_val & (1L<<CC_PEND_B)) { bit = CC_PEND_B; REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); } return; } bit = irq_to_bit_pos(irq); REMOTE_HUB_PI_CLR_INTR(nasid, subnode, bit); #endif #ifdef CONFIG_IA64_SGI_SN2 event_occurred = HUB_L( (unsigned long *)GLOBAL_MMR_ADDR(nasid,SH_EVENT_OCCURRED) ); if (event_occurred & SH_EVENT_OCCURRED_UART_INT_MASK) { mask |= (1 << SH_EVENT_OCCURRED_UART_INT_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_IPI_INT_MASK) { mask |= (1 << SH_EVENT_OCCURRED_IPI_INT_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_II_INT0_MASK) { mask |= (1 << SH_EVENT_OCCURRED_II_INT0_SHFT); } if (event_occurred & SH_EVENT_OCCURRED_II_INT1_MASK) { mask |= (1 << SH_EVENT_OCCURRED_II_INT1_SHFT); } HUB_S((unsigned long *)GLOBAL_MMR_ADDR(nasid, SH_EVENT_OCCURRED_ALIAS), mask ); #endif }