@@ -142,9 +142,8 @@ struct dino_device
142142{
143143 struct pci_hba_data hba ; /* 'C' inheritance - must be first */
144144 spinlock_t dinosaur_pen ;
145- unsigned long txn_addr ; /* EIR addr to generate interrupt */
146- u32 txn_data ; /* EIR data assign to each dino */
147145 u32 imr ; /* IRQ's which are enabled */
146+ struct gsc_irq gsc_irq ;
148147 int global_irq [DINO_LOCAL_IRQS ]; /* map IMR bit to global irq */
149148#ifdef DINO_DEBUG
150149 unsigned int dino_irr0 ; /* save most recent IRQ line stat */
@@ -339,14 +338,43 @@ static void dino_unmask_irq(struct irq_data *d)
339338 if (tmp & DINO_MASK_IRQ (local_irq )) {
340339 DBG (KERN_WARNING "%s(): IRQ asserted! (ILR 0x%x)\n" ,
341340 __func__ , tmp );
342- gsc_writel (dino_dev -> txn_data , dino_dev -> txn_addr );
341+ gsc_writel (dino_dev -> gsc_irq . txn_data , dino_dev -> gsc_irq . txn_addr );
343342 }
344343}
345344
345+ #ifdef CONFIG_SMP
346+ static int dino_set_affinity_irq (struct irq_data * d , const struct cpumask * dest ,
347+ bool force )
348+ {
349+ struct dino_device * dino_dev = irq_data_get_irq_chip_data (d );
350+ struct cpumask tmask ;
351+ int cpu_irq ;
352+ u32 eim ;
353+
354+ if (!cpumask_and (& tmask , dest , cpu_online_mask ))
355+ return - EINVAL ;
356+
357+ cpu_irq = cpu_check_affinity (d , & tmask );
358+ if (cpu_irq < 0 )
359+ return cpu_irq ;
360+
361+ dino_dev -> gsc_irq .txn_addr = txn_affinity_addr (d -> irq , cpu_irq );
362+ eim = ((u32 ) dino_dev -> gsc_irq .txn_addr ) | dino_dev -> gsc_irq .txn_data ;
363+ __raw_writel (eim , dino_dev -> hba .base_addr + DINO_IAR0 );
364+
365+ irq_data_update_effective_affinity (d , & tmask );
366+
367+ return IRQ_SET_MASK_OK ;
368+ }
369+ #endif
370+
346371static struct irq_chip dino_interrupt_type = {
347372 .name = "GSC-PCI" ,
348373 .irq_unmask = dino_unmask_irq ,
349374 .irq_mask = dino_mask_irq ,
375+ #ifdef CONFIG_SMP
376+ .irq_set_affinity = dino_set_affinity_irq ,
377+ #endif
350378};
351379
352380
@@ -806,7 +834,6 @@ static int __init dino_common_init(struct parisc_device *dev,
806834{
807835 int status ;
808836 u32 eim ;
809- struct gsc_irq gsc_irq ;
810837 struct resource * res ;
811838
812839 pcibios_register_hba (& dino_dev -> hba );
@@ -821,10 +848,8 @@ static int __init dino_common_init(struct parisc_device *dev,
821848 ** still only has 11 IRQ input lines - just map some of them
822849 ** to a different processor.
823850 */
824- dev -> irq = gsc_alloc_irq (& gsc_irq );
825- dino_dev -> txn_addr = gsc_irq .txn_addr ;
826- dino_dev -> txn_data = gsc_irq .txn_data ;
827- eim = ((u32 ) gsc_irq .txn_addr ) | gsc_irq .txn_data ;
851+ dev -> irq = gsc_alloc_irq (& dino_dev -> gsc_irq );
852+ eim = ((u32 ) dino_dev -> gsc_irq .txn_addr ) | dino_dev -> gsc_irq .txn_data ;
828853
829854 /*
830855 ** Dino needs a PA "IRQ" to get a processor's attention.
0 commit comments