RESEND [PATCH] - SN: Add support for CPU disable

2007-08-22 Thread John Keller
Add additional support for CPU disable on SN platforms.
Correctly setup the smp_affinity mask for I/O error IRQs.
Restrict the use of the feature to Altix 4000 and 450 systems
running with a CPU disable capable PROM, and do not allow disabling
of CPU 0.

Signed-off-by: John Keller <[EMAIL PROTECTED]>
---
Resend #2:
  Add severity levels to the new "printk" messages.

Resend #1:
  Code was incorrectly passing a logical, instead of physical,
  cpuid to set_irq_affinity_info(). Also, some cleanup per
  review comments.


 arch/ia64/kernel/smpboot.c  |6 +
 arch/ia64/sn/kernel/huberror.c  |   14 ---
 arch/ia64/sn/kernel/irq.c   |   15 
 arch/ia64/sn/kernel/sn2/sn2_smp.c   |   26 ++
 arch/ia64/sn/pci/pcibr/pcibr_provider.c |1 
 arch/ia64/sn/pci/tioca_provider.c   |2 +
 arch/ia64/sn/pci/tioce_provider.c   |1 
 include/asm-ia64/sn/arch.h  |1 
 include/asm-ia64/sn/intr.h  |1 
 include/asm-ia64/sn/sn_feature_sets.h   |1 
 10 files changed, 64 insertions(+), 4 deletions(-)


Index: release/arch/ia64/sn/kernel/huberror.c
===
--- release.orig/arch/ia64/sn/kernel/huberror.c 2007-08-22 16:51:28.667238863 
-0500
+++ release/arch/ia64/sn/kernel/huberror.c  2007-08-22 18:41:19.088053993 
-0500
@@ -185,11 +185,14 @@ void hubiio_crb_error_handler(struct hub
  */
 void hub_error_init(struct hubdev_info *hubdev_info)
 {
+
if (request_irq(SGI_II_ERROR, hub_eint_handler, IRQF_SHARED,
-   "SN_hub_error", (void *)hubdev_info))
+   "SN_hub_error", (void *)hubdev_info)) {
printk("hub_error_init: Failed to request_irq for 0x%p\n",
hubdev_info);
-   return;
+   return;
+   }
+   sn_set_err_irq_affinity(SGI_II_ERROR);
 }
 
 
@@ -202,11 +205,14 @@ void hub_error_init(struct hubdev_info *
  */
 void ice_error_init(struct hubdev_info *hubdev_info)
 {
+
 if (request_irq
 (SGI_TIO_ERROR, (void *)hub_eint_handler, IRQF_SHARED, 
"SN_TIO_error",
- (void *)hubdev_info))
+ (void *)hubdev_info)) {
 printk("ice_error_init: request_irq() error hubdev_info 
0x%p\n",
hubdev_info);
-return;
+   return;
+   }
+   sn_set_err_irq_affinity(SGI_TIO_ERROR);
 }
 
Index: release/arch/ia64/sn/pci/pcibr/pcibr_provider.c
===
--- release.orig/arch/ia64/sn/pci/pcibr/pcibr_provider.c2007-08-22 
16:51:28.679240340 -0500
+++ release/arch/ia64/sn/pci/pcibr/pcibr_provider.c 2007-08-22 
18:41:19.100055471 -0500
@@ -145,6 +145,7 @@ pcibr_bus_fixup(struct pcibus_bussoft *p
printk(KERN_WARNING
   "pcibr cannot allocate interrupt for error handler\n");
}
+   sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);
 
/* 
 * Update the Bridge with the "kernel" pagesize 
Index: release/arch/ia64/sn/pci/tioca_provider.c
===
--- release.orig/arch/ia64/sn/pci/tioca_provider.c  2007-08-22 
16:51:28.679240340 -0500
+++ release/arch/ia64/sn/pci/tioca_provider.c   2007-08-22 18:41:19.112056948 
-0500
@@ -654,6 +654,8 @@ tioca_bus_fixup(struct pcibus_bussoft *p
   __FUNCTION__, SGI_TIOCA_ERROR,
   (int)tioca_common->ca_common.bs_persist_busnum);
 
+   sn_set_err_irq_affinity(SGI_TIOCA_ERROR);
+
/* Setup locality information */
controller->node = tioca_kern->ca_closest_node;
return tioca_common;
Index: release/arch/ia64/sn/pci/tioce_provider.c
===
--- release.orig/arch/ia64/sn/pci/tioce_provider.c  2007-08-22 
16:51:28.679240340 -0500
+++ release/arch/ia64/sn/pci/tioce_provider.c   2007-08-22 18:41:19.124058426 
-0500
@@ -1034,6 +1034,7 @@ tioce_bus_fixup(struct pcibus_bussoft *p
   tioce_common->ce_pcibus.bs_persist_segment,
   tioce_common->ce_pcibus.bs_persist_busnum);
 
+   sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);
return tioce_common;
 }
 
Index: release/include/asm-ia64/sn/sn_feature_sets.h
===
--- release.orig/include/asm-ia64/sn/sn_feature_sets.h  2007-08-22 
16:51:32.887758491 -0500
+++ release/include/asm-ia64/sn/sn_feature_sets.h   2007-08-22 
18:41:19.140060396 -0500
@@ -31,6 +31,7 @@ extern int sn_prom_feature_available(int
 #define PRF_PAL_CACHE_FLUSH_SAFE   0
 #define PRF_DEVICE_FLUSH_LIST  1
 #define PRF_HOTPLUG_SUPPORT2
+#define PRF_CPU_DISABLE_SUPPORT3
 
 /* - OS Features ---*/
 
Index: release/arch/ia64/kernel/smpboot

RESEND [PATCH] - SN: Add support for CPU disable

2007-08-01 Thread John Keller
Add additional support for CPU disable on SN platforms.
Correctly setup the smp_affinity mask for I/O error IRQs.
Restrict the use of the feature to Altix 4000 and 450 systems
running with a CPU disable capable PROM, and do not allow disabling
of CPU 0.

Signed-off-by: John Keller <[EMAIL PROTECTED]>
---

Resend #1:
  Code was incorrectly passing a logical, instead of physical,
  cpuid to set_irq_affinity_info(). Also, some cleanup per
  review comments.


 arch/ia64/kernel/smpboot.c  |6 +
 arch/ia64/sn/kernel/huberror.c  |   14 +---
 arch/ia64/sn/kernel/irq.c   |   15 +
 arch/ia64/sn/kernel/sn2/sn2_smp.c   |   24 ++
 arch/ia64/sn/pci/pcibr/pcibr_provider.c |1 
 arch/ia64/sn/pci/tioca_provider.c   |2 +
 arch/ia64/sn/pci/tioce_provider.c   |1 
 include/asm-ia64/sn/arch.h  |1 
 include/asm-ia64/sn/intr.h  |1 
 include/asm-ia64/sn/sn_feature_sets.h   |1 
 10 files changed, 62 insertions(+), 4 deletions(-)


Index: linux-2.6/arch/ia64/sn/kernel/huberror.c
===
--- linux-2.6.orig/arch/ia64/sn/kernel/huberror.c   2007-08-01 
14:28:07.683651839 -0500
+++ linux-2.6/arch/ia64/sn/kernel/huberror.c2007-08-01 14:29:20.400606100 
-0500
@@ -185,11 +185,14 @@ void hubiio_crb_error_handler(struct hub
  */
 void hub_error_init(struct hubdev_info *hubdev_info)
 {
+
if (request_irq(SGI_II_ERROR, hub_eint_handler, IRQF_SHARED,
-   "SN_hub_error", (void *)hubdev_info))
+   "SN_hub_error", (void *)hubdev_info)) {
printk("hub_error_init: Failed to request_irq for 0x%p\n",
hubdev_info);
-   return;
+   return;
+   }
+   sn_set_err_irq_affinity(SGI_II_ERROR);
 }
 
 
@@ -202,11 +205,14 @@ void hub_error_init(struct hubdev_info *
  */
 void ice_error_init(struct hubdev_info *hubdev_info)
 {
+
 if (request_irq
 (SGI_TIO_ERROR, (void *)hub_eint_handler, IRQF_SHARED, 
"SN_TIO_error",
- (void *)hubdev_info))
+ (void *)hubdev_info)) {
 printk("ice_error_init: request_irq() error hubdev_info 
0x%p\n",
hubdev_info);
-return;
+   return;
+   }
+   sn_set_err_irq_affinity(SGI_TIO_ERROR);
 }
 
Index: linux-2.6/arch/ia64/sn/pci/pcibr/pcibr_provider.c
===
--- linux-2.6.orig/arch/ia64/sn/pci/pcibr/pcibr_provider.c  2007-08-01 
14:28:07.683651839 -0500
+++ linux-2.6/arch/ia64/sn/pci/pcibr/pcibr_provider.c   2007-08-01 
14:29:20.420608563 -0500
@@ -145,6 +145,7 @@ pcibr_bus_fixup(struct pcibus_bussoft *p
printk(KERN_WARNING
   "pcibr cannot allocate interrupt for error handler\n");
}
+   sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);
 
/* 
 * Update the Bridge with the "kernel" pagesize 
Index: linux-2.6/arch/ia64/sn/pci/tioca_provider.c
===
--- linux-2.6.orig/arch/ia64/sn/pci/tioca_provider.c2007-08-01 
14:28:07.695653317 -0500
+++ linux-2.6/arch/ia64/sn/pci/tioca_provider.c 2007-08-01 14:29:20.432610041 
-0500
@@ -654,6 +654,8 @@ tioca_bus_fixup(struct pcibus_bussoft *p
   __FUNCTION__, SGI_TIOCA_ERROR,
   (int)tioca_common->ca_common.bs_persist_busnum);
 
+   sn_set_err_irq_affinity(SGI_TIOCA_ERROR);
+
/* Setup locality information */
controller->node = tioca_kern->ca_closest_node;
return tioca_common;
Index: linux-2.6/arch/ia64/sn/pci/tioce_provider.c
===
--- linux-2.6.orig/arch/ia64/sn/pci/tioce_provider.c2007-08-01 
14:28:07.695653317 -0500
+++ linux-2.6/arch/ia64/sn/pci/tioce_provider.c 2007-08-01 14:29:20.444611519 
-0500
@@ -1034,6 +1034,7 @@ tioce_bus_fixup(struct pcibus_bussoft *p
   tioce_common->ce_pcibus.bs_persist_segment,
   tioce_common->ce_pcibus.bs_persist_busnum);
 
+   sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);
return tioce_common;
 }
 
Index: linux-2.6/include/asm-ia64/sn/sn_feature_sets.h
===
--- linux-2.6.orig/include/asm-ia64/sn/sn_feature_sets.h2007-08-01 
14:28:07.695653317 -0500
+++ linux-2.6/include/asm-ia64/sn/sn_feature_sets.h 2007-08-01 
14:29:20.456612997 -0500
@@ -31,6 +31,7 @@ extern int sn_prom_feature_available(int
 #define PRF_PAL_CACHE_FLUSH_SAFE   0
 #define PRF_DEVICE_FLUSH_LIST  1
 #define PRF_HOTPLUG_SUPPORT2
+#define PRF_CPU_DISABLE_SUPPORT3
 
 /* - OS Features ---*/
 
Index: linux-2.6/arch/ia64/kernel/smpboot.c
==