aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/mpic.c
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2008-12-31 13:56:05 -0500
committerPierre Ossman <drzeus@drzeus.cx>2008-12-31 13:56:05 -0500
commit418f19ea17a99421b22a64e101e14b6a16bed66d (patch)
tree7c21fcc368c63f1f9907deac6d16b30bd371792d /arch/powerpc/sysdev/mpic.c
parent98444d3dd975653a4a970ecc0dfc30918da92f60 (diff)
parentf6e10b865c3ea56bdaa8c6ecfee313b997900dbb (diff)
Merge branch 'master' of ../mmc
Diffstat (limited to 'arch/powerpc/sysdev/mpic.c')
-rw-r--r--arch/powerpc/sysdev/mpic.c43
1 files changed, 12 insertions, 31 deletions
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
index f6299cca7814..c82babb70074 100644
--- a/arch/powerpc/sysdev/mpic.c
+++ b/arch/powerpc/sysdev/mpic.c
@@ -600,7 +600,7 @@ static int irq_choose_cpu(unsigned int virt_irq)
600 cpuid = first_cpu(tmp); 600 cpuid = first_cpu(tmp);
601 } 601 }
602 602
603 return cpuid; 603 return get_hard_smp_processor_id(cpuid);
604} 604}
605#else 605#else
606static int irq_choose_cpu(unsigned int virt_irq) 606static int irq_choose_cpu(unsigned int virt_irq)
@@ -661,17 +661,6 @@ static inline void mpic_eoi(struct mpic *mpic)
661 (void)mpic_cpu_read(MPIC_INFO(CPU_WHOAMI)); 661 (void)mpic_cpu_read(MPIC_INFO(CPU_WHOAMI));
662} 662}
663 663
664#ifdef CONFIG_SMP
665static irqreturn_t mpic_ipi_action(int irq, void *data)
666{
667 long ipi = (long)data;
668
669 smp_message_recv(ipi);
670
671 return IRQ_HANDLED;
672}
673#endif /* CONFIG_SMP */
674
675/* 664/*
676 * Linux descriptor level callbacks 665 * Linux descriptor level callbacks
677 */ 666 */
@@ -1271,6 +1260,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count)
1271void __init mpic_init(struct mpic *mpic) 1260void __init mpic_init(struct mpic *mpic)
1272{ 1261{
1273 int i; 1262 int i;
1263 int cpu;
1274 1264
1275 BUG_ON(mpic->num_sources == 0); 1265 BUG_ON(mpic->num_sources == 0);
1276 1266
@@ -1313,6 +1303,11 @@ void __init mpic_init(struct mpic *mpic)
1313 1303
1314 mpic_pasemi_msi_init(mpic); 1304 mpic_pasemi_msi_init(mpic);
1315 1305
1306 if (mpic->flags & MPIC_PRIMARY)
1307 cpu = hard_smp_processor_id();
1308 else
1309 cpu = 0;
1310
1316 for (i = 0; i < mpic->num_sources; i++) { 1311 for (i = 0; i < mpic->num_sources; i++) {
1317 /* start with vector = source number, and masked */ 1312 /* start with vector = source number, and masked */
1318 u32 vecpri = MPIC_VECPRI_MASK | i | 1313 u32 vecpri = MPIC_VECPRI_MASK | i |
@@ -1323,8 +1318,7 @@ void __init mpic_init(struct mpic *mpic)
1323 continue; 1318 continue;
1324 /* init hw */ 1319 /* init hw */
1325 mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri); 1320 mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
1326 mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1321 mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu);
1327 1 << hard_smp_processor_id());
1328 } 1322 }
1329 1323
1330 /* Init spurious vector */ 1324 /* Init spurious vector */
@@ -1543,13 +1537,7 @@ unsigned int mpic_get_mcirq(void)
1543void mpic_request_ipis(void) 1537void mpic_request_ipis(void)
1544{ 1538{
1545 struct mpic *mpic = mpic_primary; 1539 struct mpic *mpic = mpic_primary;
1546 long i, err; 1540 int i;
1547 static char *ipi_names[] = {
1548 "IPI0 (call function)",
1549 "IPI1 (reschedule)",
1550 "IPI2 (call function single)",
1551 "IPI3 (debugger break)",
1552 };
1553 BUG_ON(mpic == NULL); 1541 BUG_ON(mpic == NULL);
1554 1542
1555 printk(KERN_INFO "mpic: requesting IPIs ... \n"); 1543 printk(KERN_INFO "mpic: requesting IPIs ... \n");
@@ -1558,17 +1546,10 @@ void mpic_request_ipis(void)
1558 unsigned int vipi = irq_create_mapping(mpic->irqhost, 1546 unsigned int vipi = irq_create_mapping(mpic->irqhost,
1559 mpic->ipi_vecs[0] + i); 1547 mpic->ipi_vecs[0] + i);
1560 if (vipi == NO_IRQ) { 1548 if (vipi == NO_IRQ) {
1561 printk(KERN_ERR "Failed to map IPI %ld\n", i); 1549 printk(KERN_ERR "Failed to map %s\n", smp_ipi_name[i]);
1562 break; 1550 continue;
1563 }
1564 err = request_irq(vipi, mpic_ipi_action,
1565 IRQF_DISABLED|IRQF_PERCPU,
1566 ipi_names[i], (void *)i);
1567 if (err) {
1568 printk(KERN_ERR "Request of irq %d for IPI %ld failed\n",
1569 vipi, i);
1570 break;
1571 } 1551 }
1552 smp_request_message_ipi(vipi, i);
1572 } 1553 }
1573} 1554}
1574 1555