Commit 39659d98 authored by Pat Gefre's avatar Pat Gefre Committed by David Mosberger

[PATCH] ia64: fix SN2 interrupt rerouting

Signed-off-by: default avatarPatrick Gefre <pfg@sgi.com>
Signed-off-by: default avatarDavid Mosberger <davidm@hpl.hp.com>
parent 72d6438c
...@@ -517,6 +517,14 @@ io_init_node(cnodeid_t cnodeid) ...@@ -517,6 +517,14 @@ io_init_node(cnodeid_t cnodeid)
ASSERT(hubv != GRAPH_VERTEX_NONE); ASSERT(hubv != GRAPH_VERTEX_NONE);
/*
* attach our hub_provider information to hubv,
* so we can use it as a crosstalk provider "master"
* vertex.
*/
xtalk_provider_register(hubv, &hub_provider);
xtalk_provider_startup(hubv);
/* /*
* If nothing connected to this hub's xtalk port, we're done. * If nothing connected to this hub's xtalk port, we're done.
*/ */
...@@ -527,14 +535,6 @@ io_init_node(cnodeid_t cnodeid) ...@@ -527,14 +535,6 @@ io_init_node(cnodeid_t cnodeid)
/* NOTREACHED */ /* NOTREACHED */
} }
/*
* attach our hub_provider information to hubv,
* so we can use it as a crosstalk provider "master"
* vertex.
*/
xtalk_provider_register(hubv, &hub_provider);
xtalk_provider_startup(hubv);
/* /*
* Create a vertex to represent the crosstalk bus * Create a vertex to represent the crosstalk bus
* attached to this hub, and a vertex to be used * attached to this hub, and a vertex to be used
......
...@@ -41,6 +41,7 @@ static void force_interrupt(int irq); ...@@ -41,6 +41,7 @@ static void force_interrupt(int irq);
extern void pcibr_force_interrupt(pcibr_intr_t intr); extern void pcibr_force_interrupt(pcibr_intr_t intr);
extern int sn_force_interrupt_flag; extern int sn_force_interrupt_flag;
struct irq_desc * sn_irq_desc(unsigned int irq); struct irq_desc * sn_irq_desc(unsigned int irq);
extern cpumask_t __cacheline_aligned pending_irq_cpumask[NR_IRQS];
struct sn_intr_list_t { struct sn_intr_list_t {
struct sn_intr_list_t *next; struct sn_intr_list_t *next;
...@@ -71,6 +72,21 @@ sn_enable_irq(unsigned int irq) ...@@ -71,6 +72,21 @@ sn_enable_irq(unsigned int irq)
{ {
} }
static inline void move_irq(int irq)
{
/* note - we hold desc->lock */
cpumask_t tmp;
irq_desc_t *desc = irq_descp(irq);
if (!cpus_empty(pending_irq_cpumask[irq])) {
cpus_and(tmp, pending_irq_cpumask[irq], cpu_online_map);
if (unlikely(!cpus_empty(tmp))) {
desc->handler->set_affinity(irq, pending_irq_cpumask[irq]);
}
cpus_clear(pending_irq_cpumask[irq]);
}
}
static void static void
sn_ack_irq(unsigned int irq) sn_ack_irq(unsigned int irq)
{ {
...@@ -94,6 +110,7 @@ sn_ack_irq(unsigned int irq) ...@@ -94,6 +110,7 @@ sn_ack_irq(unsigned int irq)
} }
HUB_S((unsigned long *)GLOBAL_MMR_ADDR(nasid, SH_EVENT_OCCURRED_ALIAS), mask ); HUB_S((unsigned long *)GLOBAL_MMR_ADDR(nasid, SH_EVENT_OCCURRED_ALIAS), mask );
__set_bit(irq, (volatile void *)pda->sn_in_service_ivecs); __set_bit(irq, (volatile void *)pda->sn_in_service_ivecs);
move_irq(irq);
} }
static void static void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment