Altix patch to abstract the force_interrupt() mechanism away from the
pcibr provider.
Signed-off-by: Mark Maule <[EMAIL PROTECTED]>
Index: ce-devel/arch/ia64/sn/kernel/irq.c
===================================================================
--- ce-devel.orig/arch/ia64/sn/kernel/irq.c 2005-08-02 15:36:46.190240937
-0500
+++ ce-devel/arch/ia64/sn/kernel/irq.c 2005-08-02 15:39:52.990001754 -0500
@@ -317,6 +317,16 @@
pci_dev_put(pci_dev);
}
+static inline void
+sn_call_force_intr_provider(struct sn_irq_info *sn_irq_info)
+{
+ struct sn_pcibus_provider *pci_provider;
+
+ pci_provider = sn_pci_provider[sn_irq_info->irq_bridge_type];
+ if (pci_provider && pci_provider->force_interrupt)
+ (*pci_provider->force_interrupt)(sn_irq_info);
+}
+
static void force_interrupt(int irq)
{
struct sn_irq_info *sn_irq_info;
@@ -325,11 +335,9 @@
return;
rcu_read_lock();
- list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[irq], list) {
- if (IS_PCI_BRIDGE_ASIC(sn_irq_info->irq_bridge_type) &&
- (sn_irq_info->irq_bridge != NULL))
- pcibr_force_interrupt(sn_irq_info);
- }
+ list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[irq], list)
+ sn_call_force_intr_provider(sn_irq_info);
+
rcu_read_unlock();
}
@@ -351,6 +359,14 @@
struct pcidev_info *pcidev_info;
struct pcibus_info *pcibus_info;
+ /*
+ * Bridge types attached to TIO (anything but PIC) do not need this WAR
+ * since they do not target Shub II interrupt registers. If that
+ * ever changes, this check needs to accomodate.
+ */
+ if (sn_irq_info->irq_bridge_type != PCIIO_ASIC_TYPE_PIC)
+ return;
+
pcidev_info = (struct pcidev_info *)sn_irq_info->irq_pciioinfo;
if (!pcidev_info)
return;
@@ -377,16 +393,12 @@
break;
}
if (!test_bit(irr_bit, &irr_reg)) {
- if (!test_bit(irq, pda->sn_soft_irr)) {
- if (!test_bit(irq, pda->sn_in_service_ivecs)) {
- regval &= 0xff;
- if (sn_irq_info->irq_int_bit & regval &
- sn_irq_info->irq_last_intr) {
- regval &=
- ~(sn_irq_info->
- irq_int_bit & regval);
- pcibr_force_interrupt(sn_irq_info);
- }
+ if (!test_bit(irq, pda->sn_in_service_ivecs)) {
+ regval &= 0xff;
+ if (sn_irq_info->irq_int_bit & regval &
+ sn_irq_info->irq_last_intr) {
+ regval &= ~(sn_irq_info->irq_int_bit & regval);
+ sn_call_force_intr_provider(sn_irq_info);
}
}
}
@@ -404,13 +416,7 @@
rcu_read_lock();
for (i = pda->sn_first_irq; i <= pda->sn_last_irq; i++) {
list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[i], list) {
- /*
- * Only call for PCI bridges that are fully
- * initialized.
- */
- if (IS_PCI_BRIDGE_ASIC(sn_irq_info->irq_bridge_type) &&
- (sn_irq_info->irq_bridge != NULL))
- sn_check_intr(i, sn_irq_info);
+ sn_check_intr(i, sn_irq_info);
}
}
rcu_read_unlock();
Index: ce-devel/arch/ia64/sn/pci/pcibr/pcibr_provider.c
===================================================================
--- ce-devel.orig/arch/ia64/sn/pci/pcibr/pcibr_provider.c 2005-08-02
15:39:43.278078407 -0500
+++ ce-devel/arch/ia64/sn/pci/pcibr/pcibr_provider.c 2005-08-02
15:39:52.992931150 -0500
@@ -170,6 +170,9 @@
struct pcibus_info *pcibus_info;
int bit = sn_irq_info->irq_int_bit;
+ if (! sn_irq_info->irq_bridge)
+ return;
+
pcidev_info = (struct pcidev_info *)sn_irq_info->irq_pciioinfo;
if (pcidev_info) {
pcibus_info =
@@ -214,6 +217,7 @@
.dma_map_consistent = pcibr_dma_map_consistent,
.dma_unmap = pcibr_dma_unmap,
.bus_fixup = pcibr_bus_fixup,
+ .force_interrupt = pcibr_force_interrupt
};
int
Index: ce-devel/arch/ia64/sn/pci/tioca_provider.c
===================================================================
--- ce-devel.orig/arch/ia64/sn/pci/tioca_provider.c 2005-08-02
15:38:06.829674677 -0500
+++ ce-devel/arch/ia64/sn/pci/tioca_provider.c 2005-08-02 15:39:52.995860546
-0500
@@ -655,6 +655,7 @@
.dma_map_consistent = tioca_dma_map,
.dma_unmap = tioca_dma_unmap,
.bus_fixup = tioca_bus_fixup,
+ .force_interrupt = NULL
};
/**
Index: ce-devel/include/asm-ia64/sn/pcibus_provider_defs.h
===================================================================
--- ce-devel.orig/include/asm-ia64/sn/pcibus_provider_defs.h 2005-08-02
15:38:06.824792351 -0500
+++ ce-devel/include/asm-ia64/sn/pcibus_provider_defs.h 2005-08-02
15:39:52.998789942 -0500
@@ -47,6 +47,7 @@
dma_addr_t (*dma_map_consistent)(struct pci_dev *, unsigned long,
size_t);
void (*dma_unmap)(struct pci_dev *, dma_addr_t, int);
void * (*bus_fixup)(struct pcibus_bussoft *);
+ void (*force_interrupt)(struct sn_irq_info *);
};
extern struct sn_pcibus_provider *sn_pci_provider[];
Index: ce-devel/include/asm-ia64/sn/pda.h
===================================================================
--- ce-devel.orig/include/asm-ia64/sn/pda.h 2005-08-02 15:36:58.086517822
-0500
+++ ce-devel/include/asm-ia64/sn/pda.h 2005-08-02 15:39:53.000742872 -0500
@@ -39,7 +39,6 @@
unsigned long pio_write_status_val;
volatile unsigned long *pio_shub_war_cam_addr;
- unsigned long sn_soft_irr[4];
unsigned long sn_in_service_ivecs[4];
int sn_lb_int_war_ticks;
int sn_last_irq;
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html