diff options
Diffstat (limited to 'drivers/parisc')
-rw-r--r-- | drivers/parisc/iosapic.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index a39fbfef789a..19657efa8dc3 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -700,6 +700,28 @@ static unsigned int iosapic_startup_irq(unsigned int irq) | |||
700 | return 0; | 700 | return 0; |
701 | } | 701 | } |
702 | 702 | ||
703 | #ifdef CONFIG_SMP | ||
704 | static void iosapic_set_affinity_irq(unsigned int irq, cpumask_t dest) | ||
705 | { | ||
706 | struct vector_info *vi = iosapic_get_vector(irq); | ||
707 | u32 d0, d1, dummy_d0; | ||
708 | unsigned long flags; | ||
709 | |||
710 | if (cpu_check_affinity(irq, &dest)) | ||
711 | return; | ||
712 | |||
713 | vi->txn_addr = txn_affinity_addr(irq, first_cpu(dest)); | ||
714 | |||
715 | spin_lock_irqsave(&iosapic_lock, flags); | ||
716 | /* d1 contains the destination CPU, so only want to set that | ||
717 | * entry */ | ||
718 | iosapic_rd_irt_entry(vi, &d0, &d1); | ||
719 | iosapic_set_irt_data(vi, &dummy_d0, &d1); | ||
720 | iosapic_wr_irt_entry(vi, d0, d1); | ||
721 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
722 | } | ||
723 | #endif | ||
724 | |||
703 | static struct hw_interrupt_type iosapic_interrupt_type = { | 725 | static struct hw_interrupt_type iosapic_interrupt_type = { |
704 | .typename = "IO-SAPIC-level", | 726 | .typename = "IO-SAPIC-level", |
705 | .startup = iosapic_startup_irq, | 727 | .startup = iosapic_startup_irq, |
@@ -708,7 +730,9 @@ static struct hw_interrupt_type iosapic_interrupt_type = { | |||
708 | .disable = iosapic_disable_irq, | 730 | .disable = iosapic_disable_irq, |
709 | .ack = no_ack_irq, | 731 | .ack = no_ack_irq, |
710 | .end = iosapic_end_irq, | 732 | .end = iosapic_end_irq, |
711 | // .set_affinity = iosapic_set_affinity_irq, | 733 | #ifdef CONFIG_SMP |
734 | .set_affinity = iosapic_set_affinity_irq, | ||
735 | #endif | ||
712 | }; | 736 | }; |
713 | 737 | ||
714 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) | 738 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) |