aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/mach-voyager/voyager_smp.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c
index d42422fc4af3..2e73f353f165 100644
--- a/arch/i386/mach-voyager/voyager_smp.c
+++ b/arch/i386/mach-voyager/voyager_smp.c
@@ -85,8 +85,8 @@ static int ack_QIC_CPI(__u8 cpi);
85static void ack_special_QIC_CPI(__u8 cpi); 85static void ack_special_QIC_CPI(__u8 cpi);
86static void ack_VIC_CPI(__u8 cpi); 86static void ack_VIC_CPI(__u8 cpi);
87static void send_CPI_allbutself(__u8 cpi); 87static void send_CPI_allbutself(__u8 cpi);
88static void enable_vic_irq(unsigned int irq); 88static void mask_vic_irq(unsigned int irq);
89static void disable_vic_irq(unsigned int irq); 89static void unmask_vic_irq(unsigned int irq);
90static unsigned int startup_vic_irq(unsigned int irq); 90static unsigned int startup_vic_irq(unsigned int irq);
91static void enable_local_vic_irq(unsigned int irq); 91static void enable_local_vic_irq(unsigned int irq);
92static void disable_local_vic_irq(unsigned int irq); 92static void disable_local_vic_irq(unsigned int irq);
@@ -205,15 +205,12 @@ ack_CPI(__u8 cpi)
205/* The VIC IRQ descriptors -- these look almost identical to the 205/* The VIC IRQ descriptors -- these look almost identical to the
206 * 8259 IRQs except that masks and things must be kept per processor 206 * 8259 IRQs except that masks and things must be kept per processor
207 */ 207 */
208static struct hw_interrupt_type vic_irq_type = { 208static struct irq_chip vic_chip = {
209 .typename = "VIC-level", 209 .name = "VIC",
210 .startup = startup_vic_irq, 210 .startup = startup_vic_irq,
211 .shutdown = disable_vic_irq, 211 .mask = mask_vic_irq,
212 .enable = enable_vic_irq, 212 .unmask = unmask_vic_irq,
213 .disable = disable_vic_irq, 213 .set_affinity = set_vic_irq_affinity,
214 .ack = before_handle_vic_irq,
215 .end = after_handle_vic_irq,
216 .set_affinity = set_vic_irq_affinity,
217}; 214};
218 215
219/* used to count up as CPUs are brought on line (starts at 0) */ 216/* used to count up as CPUs are brought on line (starts at 0) */
@@ -1397,6 +1394,17 @@ setup_profiling_timer(unsigned int multiplier)
1397 return 0; 1394 return 0;
1398} 1395}
1399 1396
1397/* This is a bit of a mess, but forced on us by the genirq changes
1398 * there's no genirq handler that really does what voyager wants
1399 * so hack it up with the simple IRQ handler */
1400static void fastcall
1401handle_vic_irq(unsigned int irq, struct irq_desc *desc)
1402{
1403 before_handle_vic_irq(irq);
1404 handle_simple_irq(irq, desc);
1405 after_handle_vic_irq(irq);
1406}
1407
1400 1408
1401/* The CPIs are handled in the per cpu 8259s, so they must be 1409/* The CPIs are handled in the per cpu 8259s, so they must be
1402 * enabled to be received: FIX: enabling the CPIs in the early 1410 * enabled to be received: FIX: enabling the CPIs in the early
@@ -1433,7 +1441,7 @@ smp_intr_init(void)
1433 * This is for later: first 16 correspond to PC IRQs; next 16 1441 * This is for later: first 16 correspond to PC IRQs; next 16
1434 * are Primary MC IRQs and final 16 are Secondary MC IRQs */ 1442 * are Primary MC IRQs and final 16 are Secondary MC IRQs */
1435 for(i = 0; i < 48; i++) 1443 for(i = 0; i < 48; i++)
1436 irq_desc[i].chip = &vic_irq_type; 1444 set_irq_chip_and_handler(i, &vic_chip, handle_vic_irq);
1437} 1445}
1438 1446
1439/* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per 1447/* send a CPI at level cpi to a set of cpus in cpuset (set 1 bit per
@@ -1531,7 +1539,7 @@ ack_VIC_CPI(__u8 cpi)
1531static unsigned int 1539static unsigned int
1532startup_vic_irq(unsigned int irq) 1540startup_vic_irq(unsigned int irq)
1533{ 1541{
1534 enable_vic_irq(irq); 1542 unmask_vic_irq(irq);
1535 1543
1536 return 0; 1544 return 0;
1537} 1545}
@@ -1558,7 +1566,7 @@ startup_vic_irq(unsigned int irq)
1558 * adjust their masks accordingly. */ 1566 * adjust their masks accordingly. */
1559 1567
1560static void 1568static void
1561enable_vic_irq(unsigned int irq) 1569unmask_vic_irq(unsigned int irq)
1562{ 1570{
1563 /* linux doesn't to processor-irq affinity, so enable on 1571 /* linux doesn't to processor-irq affinity, so enable on
1564 * all CPUs we know about */ 1572 * all CPUs we know about */
@@ -1567,7 +1575,7 @@ enable_vic_irq(unsigned int irq)
1567 __u32 processorList = 0; 1575 __u32 processorList = 0;
1568 unsigned long flags; 1576 unsigned long flags;
1569 1577
1570 VDEBUG(("VOYAGER: enable_vic_irq(%d) CPU%d affinity 0x%lx\n", 1578 VDEBUG(("VOYAGER: unmask_vic_irq(%d) CPU%d affinity 0x%lx\n",
1571 irq, cpu, cpu_irq_affinity[cpu])); 1579 irq, cpu, cpu_irq_affinity[cpu]));
1572 spin_lock_irqsave(&vic_irq_lock, flags); 1580 spin_lock_irqsave(&vic_irq_lock, flags);
1573 for_each_online_cpu(real_cpu) { 1581 for_each_online_cpu(real_cpu) {
@@ -1591,7 +1599,7 @@ enable_vic_irq(unsigned int irq)
1591} 1599}
1592 1600
1593static void 1601static void
1594disable_vic_irq(unsigned int irq) 1602mask_vic_irq(unsigned int irq)
1595{ 1603{
1596 /* lazy disable, do nothing */ 1604 /* lazy disable, do nothing */
1597} 1605}
@@ -1819,7 +1827,7 @@ set_vic_irq_affinity(unsigned int irq, cpumask_t mask)
1819 * disabled again as it comes in (voyager lazy disable). If 1827 * disabled again as it comes in (voyager lazy disable). If
1820 * the affinity map is tightened to disable the interrupt on a 1828 * the affinity map is tightened to disable the interrupt on a
1821 * cpu, it will be pushed off when it comes in */ 1829 * cpu, it will be pushed off when it comes in */
1822 enable_vic_irq(irq); 1830 unmask_vic_irq(irq);
1823} 1831}
1824 1832
1825static void 1833static void