aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/sn/pci/tioce_provider.c
diff options
context:
space:
mode:
authorMark Maule <maule@sgi.com>2005-08-25 14:45:00 -0400
committerTony Luck <tony.luck@intel.com>2005-08-26 15:09:01 -0400
commit8409668b561fbe464f7a392e8dc77eca225d27ac (patch)
tree7783a2e701b7ae866be858e9121ec70f91fe4fa9 /arch/ia64/sn/pci/tioce_provider.c
parent5b9021bc5800796e23e4994f8cf2dc61536be0a7 (diff)
[IA64] altix: Abstract irq_affinity at the sn pci provider
Altix patch to abstract irq_affinity down to the pci provider level since different SGI hardware implements this in different ways. Signed-off-by: Mark Maule <maule@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/sn/pci/tioce_provider.c')
-rw-r--r--arch/ia64/sn/pci/tioce_provider.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c
index d9081369cf96..8e75db2b825d 100644
--- a/arch/ia64/sn/pci/tioce_provider.c
+++ b/arch/ia64/sn/pci/tioce_provider.c
@@ -669,6 +669,43 @@ tioce_force_interrupt(struct sn_irq_info *sn_irq_info)
669} 669}
670 670
671/** 671/**
672 * tioce_target_interrupt - implement set_irq_affinity for tioce resident
673 * functions. Note: only applies to line interrupts, not MSI's.
674 *
675 * @sn_irq_info: SN IRQ context
676 *
677 * Given an sn_irq_info, set the associated CE device's interrupt destination
678 * register. Since the interrupt destination registers are on a per-ce-slot
679 * basis, this will retarget line interrupts for all functions downstream of
680 * the slot.
681 */
682static void
683tioce_target_interrupt(struct sn_irq_info *sn_irq_info)
684{
685 struct pcidev_info *pcidev_info;
686 struct tioce_common *ce_common;
687 struct tioce *ce_mmr;
688 int bit;
689
690 pcidev_info = (struct pcidev_info *)sn_irq_info->irq_pciioinfo;
691 if (!pcidev_info)
692 return;
693
694 ce_common = (struct tioce_common *)pcidev_info->pdi_pcibus_info;
695 ce_mmr = (struct tioce *)ce_common->ce_pcibus.bs_base;
696
697 bit = sn_irq_info->irq_int_bit;
698
699 ce_mmr->ce_adm_int_mask |= (1UL << bit);
700 ce_mmr->ce_adm_int_dest[bit] =
701 ((uint64_t)sn_irq_info->irq_irq << INTR_VECTOR_SHFT) |
702 sn_irq_info->irq_xtalkaddr;
703 ce_mmr->ce_adm_int_mask &= ~(1UL << bit);
704
705 tioce_force_interrupt(sn_irq_info);
706}
707
708/**
672 * tioce_bus_fixup - perform final PCI fixup for a TIO CE bus 709 * tioce_bus_fixup - perform final PCI fixup for a TIO CE bus
673 * @prom_bussoft: Common prom/kernel struct representing the bus 710 * @prom_bussoft: Common prom/kernel struct representing the bus
674 * 711 *
@@ -719,7 +756,8 @@ static struct sn_pcibus_provider tioce_pci_interfaces = {
719 .dma_map_consistent = tioce_dma_consistent, 756 .dma_map_consistent = tioce_dma_consistent,
720 .dma_unmap = tioce_dma_unmap, 757 .dma_unmap = tioce_dma_unmap,
721 .bus_fixup = tioce_bus_fixup, 758 .bus_fixup = tioce_bus_fixup,
722 .force_interrupt = tioce_force_interrupt 759 .force_interrupt = tioce_force_interrupt,
760 .target_interrupt = tioce_target_interrupt
723}; 761};
724 762
725/** 763/**