diff options
author | Prarit Bhargava <prarit@sgi.com> | 2005-07-06 17:59:44 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-07-06 17:59:44 -0400 |
commit | cb4cb2cb9b0b14bdf2fc7125e099ed7e818cea42 (patch) | |
tree | 11e110ce3201e0cbd3e30f1d4a1b0dc6ebe19bfa /include/asm-ia64/sn | |
parent | bd53d1270f51c6cfb53b06c8f93fd42327871d6b (diff) |
[IA64] hotplug/ia64: SN Hotplug Driver: SN IRQ Fixes
This patch fixes the SN IRQ code such that cpu affinity and
Hotplug can modify IRQ values. The sn_irq_info structures are now locked
using a RCU lock mechanism to avoid lock contention in the lost interrupt
WAR code.
Signed-off-by: Prarit Bhargava <prarit@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'include/asm-ia64/sn')
-rw-r--r-- | include/asm-ia64/sn/intr.h | 6 | ||||
-rw-r--r-- | include/asm-ia64/sn/pcidev.h | 4 |
2 files changed, 7 insertions, 3 deletions
diff --git a/include/asm-ia64/sn/intr.h b/include/asm-ia64/sn/intr.h index e51471fb0867..e190dd4213d5 100644 --- a/include/asm-ia64/sn/intr.h +++ b/include/asm-ia64/sn/intr.h | |||
@@ -9,6 +9,8 @@ | |||
9 | #ifndef _ASM_IA64_SN_INTR_H | 9 | #ifndef _ASM_IA64_SN_INTR_H |
10 | #define _ASM_IA64_SN_INTR_H | 10 | #define _ASM_IA64_SN_INTR_H |
11 | 11 | ||
12 | #include <linux/rcupdate.h> | ||
13 | |||
12 | #define SGI_UART_VECTOR (0xe9) | 14 | #define SGI_UART_VECTOR (0xe9) |
13 | #define SGI_PCIBR_ERROR (0x33) | 15 | #define SGI_PCIBR_ERROR (0x33) |
14 | 16 | ||
@@ -33,7 +35,7 @@ | |||
33 | 35 | ||
34 | // The SN PROM irq struct | 36 | // The SN PROM irq struct |
35 | struct sn_irq_info { | 37 | struct sn_irq_info { |
36 | struct sn_irq_info *irq_next; /* sharing irq list */ | 38 | struct sn_irq_info *irq_next; /* deprecated DO NOT USE */ |
37 | short irq_nasid; /* Nasid IRQ is assigned to */ | 39 | short irq_nasid; /* Nasid IRQ is assigned to */ |
38 | int irq_slice; /* slice IRQ is assigned to */ | 40 | int irq_slice; /* slice IRQ is assigned to */ |
39 | int irq_cpuid; /* kernel logical cpuid */ | 41 | int irq_cpuid; /* kernel logical cpuid */ |
@@ -47,6 +49,8 @@ struct sn_irq_info { | |||
47 | int irq_cookie; /* unique cookie */ | 49 | int irq_cookie; /* unique cookie */ |
48 | int irq_flags; /* flags */ | 50 | int irq_flags; /* flags */ |
49 | int irq_share_cnt; /* num devices sharing IRQ */ | 51 | int irq_share_cnt; /* num devices sharing IRQ */ |
52 | struct list_head list; /* list of sn_irq_info structs */ | ||
53 | struct rcu_head rcu; /* rcu callback list */ | ||
50 | }; | 54 | }; |
51 | 55 | ||
52 | extern void sn_send_IPI_phys(int, long, int, int); | 56 | extern void sn_send_IPI_phys(int, long, int, int); |
diff --git a/include/asm-ia64/sn/pcidev.h b/include/asm-ia64/sn/pcidev.h index ed4031d80811..42aea21ee187 100644 --- a/include/asm-ia64/sn/pcidev.h +++ b/include/asm-ia64/sn/pcidev.h | |||
@@ -10,8 +10,6 @@ | |||
10 | 10 | ||
11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
12 | 12 | ||
13 | extern struct sn_irq_info **sn_irq; | ||
14 | |||
15 | #define SN_PCIDEV_INFO(pci_dev) \ | 13 | #define SN_PCIDEV_INFO(pci_dev) \ |
16 | ((struct pcidev_info *)(pci_dev)->sysdata) | 14 | ((struct pcidev_info *)(pci_dev)->sysdata) |
17 | 15 | ||
@@ -50,9 +48,11 @@ struct pcidev_info { | |||
50 | 48 | ||
51 | struct sn_irq_info *pdi_sn_irq_info; | 49 | struct sn_irq_info *pdi_sn_irq_info; |
52 | struct sn_pcibus_provider *pdi_provider; /* sn pci ops */ | 50 | struct sn_pcibus_provider *pdi_provider; /* sn pci ops */ |
51 | struct pci_dev *host_pci_dev; /* host bus link */ | ||
53 | }; | 52 | }; |
54 | 53 | ||
55 | extern void sn_irq_fixup(struct pci_dev *pci_dev, | 54 | extern void sn_irq_fixup(struct pci_dev *pci_dev, |
56 | struct sn_irq_info *sn_irq_info); | 55 | struct sn_irq_info *sn_irq_info); |
57 | 56 | ||
57 | extern void sn_irq_lh_init(void); | ||
58 | #endif /* _ASM_IA64_SN_PCI_PCIDEV_H */ | 58 | #endif /* _ASM_IA64_SN_PCI_PCIDEV_H */ |