aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/sn/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2007-09-04 03:43:57 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2007-09-04 03:43:57 -0400
commitea3c4b126ad63bd782c7bb5266bb4fd88e203169 (patch)
tree1b1dedd3ee501c165910389aea9082fb96a9e8f4 /arch/ia64/sn/kernel
parenta5229e6b3fb77ef92ff585e17ba4aa8a3e945727 (diff)
parent7b3166dbc3df5b72f2ba4ea130f4461e318a3838 (diff)
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
Diffstat (limited to 'arch/ia64/sn/kernel')
-rw-r--r--arch/ia64/sn/kernel/huberror.c14
-rw-r--r--arch/ia64/sn/kernel/irq.c15
-rw-r--r--arch/ia64/sn/kernel/sn2/sn2_smp.c26
-rw-r--r--arch/ia64/sn/kernel/sn2/sn_hwperf.c3
4 files changed, 53 insertions, 5 deletions
diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c
index 2c3f9dfca78b..b663168da55c 100644
--- a/arch/ia64/sn/kernel/huberror.c
+++ b/arch/ia64/sn/kernel/huberror.c
@@ -185,11 +185,14 @@ void hubiio_crb_error_handler(struct hubdev_info *hubdev_info)
185 */ 185 */
186void hub_error_init(struct hubdev_info *hubdev_info) 186void hub_error_init(struct hubdev_info *hubdev_info)
187{ 187{
188
188 if (request_irq(SGI_II_ERROR, hub_eint_handler, IRQF_SHARED, 189 if (request_irq(SGI_II_ERROR, hub_eint_handler, IRQF_SHARED,
189 "SN_hub_error", (void *)hubdev_info)) 190 "SN_hub_error", (void *)hubdev_info)) {
190 printk("hub_error_init: Failed to request_irq for 0x%p\n", 191 printk("hub_error_init: Failed to request_irq for 0x%p\n",
191 hubdev_info); 192 hubdev_info);
192 return; 193 return;
194 }
195 sn_set_err_irq_affinity(SGI_II_ERROR);
193} 196}
194 197
195 198
@@ -202,11 +205,14 @@ void hub_error_init(struct hubdev_info *hubdev_info)
202 */ 205 */
203void ice_error_init(struct hubdev_info *hubdev_info) 206void ice_error_init(struct hubdev_info *hubdev_info)
204{ 207{
208
205 if (request_irq 209 if (request_irq
206 (SGI_TIO_ERROR, (void *)hub_eint_handler, IRQF_SHARED, "SN_TIO_error", 210 (SGI_TIO_ERROR, (void *)hub_eint_handler, IRQF_SHARED, "SN_TIO_error",
207 (void *)hubdev_info)) 211 (void *)hubdev_info)) {
208 printk("ice_error_init: request_irq() error hubdev_info 0x%p\n", 212 printk("ice_error_init: request_irq() error hubdev_info 0x%p\n",
209 hubdev_info); 213 hubdev_info);
210 return; 214 return;
215 }
216 sn_set_err_irq_affinity(SGI_TIO_ERROR);
211} 217}
212 218
diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c
index 360047389449..0f9b12683bf3 100644
--- a/arch/ia64/sn/kernel/irq.c
+++ b/arch/ia64/sn/kernel/irq.c
@@ -19,6 +19,7 @@
19#include <asm/sn/pcidev.h> 19#include <asm/sn/pcidev.h>
20#include <asm/sn/shub_mmr.h> 20#include <asm/sn/shub_mmr.h>
21#include <asm/sn/sn_sal.h> 21#include <asm/sn/sn_sal.h>
22#include <asm/sn/sn_feature_sets.h>
22 23
23static void force_interrupt(int irq); 24static void force_interrupt(int irq);
24static void register_intr_pda(struct sn_irq_info *sn_irq_info); 25static void register_intr_pda(struct sn_irq_info *sn_irq_info);
@@ -233,6 +234,20 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
233 (void)sn_retarget_vector(sn_irq_info, nasid, slice); 234 (void)sn_retarget_vector(sn_irq_info, nasid, slice);
234} 235}
235 236
237#ifdef CONFIG_SMP
238void sn_set_err_irq_affinity(unsigned int irq)
239{
240 /*
241 * On systems which support CPU disabling (SHub2), all error interrupts
242 * are targetted at the boot CPU.
243 */
244 if (is_shub2() && sn_prom_feature_available(PRF_CPU_DISABLE_SUPPORT))
245 set_irq_affinity_info(irq, cpu_physical_id(0), 0);
246}
247#else
248void sn_set_err_irq_affinity(unsigned int irq) { }
249#endif
250
236static void 251static void
237sn_mask_irq(unsigned int irq) 252sn_mask_irq(unsigned int irq)
238{ 253{
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c
index 033c8a9f000e..f3c69329e145 100644
--- a/arch/ia64/sn/kernel/sn2/sn2_smp.c
+++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c
@@ -40,6 +40,7 @@
40#include <asm/sn/shub_mmr.h> 40#include <asm/sn/shub_mmr.h>
41#include <asm/sn/nodepda.h> 41#include <asm/sn/nodepda.h>
42#include <asm/sn/rw_mmr.h> 42#include <asm/sn/rw_mmr.h>
43#include <asm/sn/sn_feature_sets.h>
43 44
44DEFINE_PER_CPU(struct ptc_stats, ptcstats); 45DEFINE_PER_CPU(struct ptc_stats, ptcstats);
45DECLARE_PER_CPU(struct ptc_stats, ptcstats); 46DECLARE_PER_CPU(struct ptc_stats, ptcstats);
@@ -429,6 +430,31 @@ void sn2_send_IPI(int cpuid, int vector, int delivery_mode, int redirect)
429 sn_send_IPI_phys(nasid, physid, vector, delivery_mode); 430 sn_send_IPI_phys(nasid, physid, vector, delivery_mode);
430} 431}
431 432
433#ifdef CONFIG_HOTPLUG_CPU
434/**
435 * sn_cpu_disable_allowed - Determine if a CPU can be disabled.
436 * @cpu - CPU that is requested to be disabled.
437 *
438 * CPU disable is only allowed on SHub2 systems running with a PROM
439 * that supports CPU disable. It is not permitted to disable the boot processor.
440 */
441bool sn_cpu_disable_allowed(int cpu)
442{
443 if (is_shub2() && sn_prom_feature_available(PRF_CPU_DISABLE_SUPPORT)) {
444 if (cpu != 0)
445 return true;
446 else
447 printk(KERN_WARNING
448 "Disabling the boot processor is not allowed.\n");
449
450 } else
451 printk(KERN_WARNING
452 "CPU disable is not supported on this system.\n");
453
454 return false;
455}
456#endif /* CONFIG_HOTPLUG_CPU */
457
432#ifdef CONFIG_PROC_FS 458#ifdef CONFIG_PROC_FS
433 459
434#define PTC_BASENAME "sgi_sn/ptc_statistics" 460#define PTC_BASENAME "sgi_sn/ptc_statistics"
diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
index df8d5bed6119..1a8e49607f11 100644
--- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c
+++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c
@@ -66,7 +66,8 @@ static int sn_hwperf_enum_objects(int *nobj, struct sn_hwperf_object_info **ret)
66 } 66 }
67 67
68 sz = sn_hwperf_obj_cnt * sizeof(struct sn_hwperf_object_info); 68 sz = sn_hwperf_obj_cnt * sizeof(struct sn_hwperf_object_info);
69 if ((objbuf = (struct sn_hwperf_object_info *) vmalloc(sz)) == NULL) { 69 objbuf = vmalloc(sz);
70 if (objbuf == NULL) {
70 printk("sn_hwperf_enum_objects: vmalloc(%d) failed\n", (int)sz); 71 printk("sn_hwperf_enum_objects: vmalloc(%d) failed\n", (int)sz);
71 e = -ENOMEM; 72 e = -ENOMEM;
72 goto out; 73 goto out;