Pull sn-features into release branch
authorTony Luck <tony.luck@intel.com>
Sun, 11 Sep 2005 21:34:23 +0000 (14:34 -0700)
committerTony Luck <tony.luck@intel.com>
Sun, 11 Sep 2005 21:34:23 +0000 (14:34 -0700)
1  2 
arch/ia64/sn/kernel/setup.c
include/asm-ia64/sn/sn_sal.h

@@@ -49,6 -49,7 +49,7 @@@
  #include <asm/sn/clksupport.h>
  #include <asm/sn/sn_sal.h>
  #include <asm/sn/geo.h>
+ #include <asm/sn/sn_feature_sets.h>
  #include "xtalk/xwidgetdev.h"
  #include "xtalk/hubdev.h"
  #include <asm/sn/klconfig.h>
@@@ -56,7 -57,7 +57,7 @@@
  
  DEFINE_PER_CPU(struct pda_s, pda_percpu);
  
 -#define MAX_PHYS_MEMORY               (1UL << 49)     /* 1 TB */
 +#define MAX_PHYS_MEMORY               (1UL << IA64_MAX_PHYS_BITS)     /* Max physical address supported */
  
  lboard_t *root_lboard[MAX_COMPACT_NODES];
  
@@@ -80,6 -81,8 +81,6 @@@ EXPORT_PER_CPU_SYMBOL(__sn_cnodeid_to_n
  DEFINE_PER_CPU(struct nodepda_s *, __sn_nodepda);
  EXPORT_PER_CPU_SYMBOL(__sn_nodepda);
  
 -partid_t sn_partid = -1;
 -EXPORT_SYMBOL(sn_partid);
  char sn_system_serial_number_string[128];
  EXPORT_SYMBOL(sn_system_serial_number_string);
  u64 sn_partition_serial_number;
@@@ -97,6 -100,7 +98,7 @@@ EXPORT_SYMBOL(sn_region_size)
  int sn_prom_type;     /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */
  
  short physical_node_map[MAX_PHYSNODE_ID];
+ static unsigned long sn_prom_features[MAX_PROM_FEATURE_SETS];
  
  EXPORT_SYMBOL(physical_node_map);
  
@@@ -271,7 -275,10 +273,10 @@@ void __init sn_setup(char **cmdline_p
        u32 version = sn_sal_rev();
        extern void sn_cpu_init(void);
  
-       ia64_sn_plat_set_error_handling_features();
+       ia64_sn_plat_set_error_handling_features();     // obsolete
+       ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV);
+       ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES);
  
  #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
        /*
  
        printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
  
-       /*
-        * Confirm the SAL we're running on is recent enough...
-        */
-       if (version < SN_SAL_MIN_VERSION) {
-               printk(KERN_ERR "This kernel needs SGI SAL version >= "
-                      "%x.%02x\n", SN_SAL_MIN_VERSION >> 8,
-                       SN_SAL_MIN_VERSION & 0x00FF);
-               panic("PROM version too old\n");
-       }
        master_nasid = boot_get_nasid();
  
        status =
@@@ -401,7 -398,6 +396,7 @@@ static void __init sn_init_pdas(char **
                memset(nodepdaindr[cnode], 0, sizeof(nodepda_t));
                memset(nodepdaindr[cnode]->phys_cpuid, -1,
                    sizeof(nodepdaindr[cnode]->phys_cpuid));
 +              spin_lock_init(&nodepdaindr[cnode]->ptc_lock);
        }
  
        /*
@@@ -480,6 -476,10 +475,10 @@@ void __init sn_cpu_init(void
        if (nodepdaindr[0] == NULL)
                return;
  
+       for (i = 0; i < MAX_PROM_FEATURE_SETS; i++)
+               if (ia64_sn_get_prom_feature_set(i, &sn_prom_features[i]) != 0)
+                       break;
        cpuid = smp_processor_id();
        cpuphyid = get_sapicid();
  
         */
        {
                u64 pio1[] = {SH1_PIO_WRITE_STATUS_0, 0, SH1_PIO_WRITE_STATUS_1, 0};
 -              u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_1,
 -                      SH2_PIO_WRITE_STATUS_2, SH2_PIO_WRITE_STATUS_3};
 +              u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_2,
 +                      SH2_PIO_WRITE_STATUS_1, SH2_PIO_WRITE_STATUS_3};
                u64 *pio;
                pio = is_shub1() ? pio1 : pio2;
                pda->pio_write_status_addr = (volatile unsigned long *) LOCAL_MMR_ADDR(pio[slice]);
@@@ -651,3 -651,12 +650,12 @@@ nasid_slice_to_cpuid(int nasid, int sli
  
        return -1;
  }
+ int sn_prom_feature_available(int id)
+ {
+       if (id >= BITS_PER_LONG * MAX_PROM_FEATURE_SETS)
+               return 0;
+       return test_bit(id, sn_prom_features);
+ }
+ EXPORT_SYMBOL(sn_prom_feature_available);
@@@ -55,6 -55,7 +55,6 @@@
  #define  SN_SAL_BUS_CONFIG                       0x02000037
  #define  SN_SAL_SYS_SERIAL_GET                           0x02000038
  #define  SN_SAL_PARTITION_SERIAL_GET             0x02000039
 -#define  SN_SAL_SYSCTL_PARTITION_GET             0x0200003a
  #define  SN_SAL_SYSTEM_POWER_DOWN                0x0200003b
  #define  SN_SAL_GET_MASTER_BASEIO_NASID                  0x0200003c
  #define  SN_SAL_COHERENCE                          0x0200003d
  
  #define SN_SAL_HUB_ERROR_INTERRUPT               0x02000060
  #define SN_SAL_BTE_RECOVER                       0x02000061
 -#define SN_SAL_IOIF_GET_PCI_TOPOLOGY             0x02000062
 +#define SN_SAL_RESERVED_DO_NOT_USE               0x02000062
 +#define SN_SAL_IOIF_GET_PCI_TOPOLOGY             0x02000064
  
+ #define  SN_SAL_GET_PROM_FEATURE_SET             0x02000065
+ #define  SN_SAL_SET_OS_FEATURE_SET               0x02000066
  /*
   * Service-specific constants
   */
  /*
   * Error Handling Features
   */
- #define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV   0x1
- #define SAL_ERR_FEAT_LOG_SBES                 0x2
+ #define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV   0x1     // obsolete
+ #define SAL_ERR_FEAT_LOG_SBES                 0x2     // obsolete
  #define SAL_ERR_FEAT_MFR_OVERRIDE             0x4
  #define SAL_ERR_FEAT_SBE_THRESHOLD            0xffff0000
  
@@@ -151,12 -154,6 +154,6 @@@ sn_sal_rev(void
        return (u32)(systab->sal_b_rev_major << 8 | systab->sal_b_rev_minor);
  }
  
- /*
-  * Specify the minimum PROM revsion required for this kernel.
-  * Note that they're stored in hex format...
-  */
- #define SN_SAL_MIN_VERSION    0x0404
  /*
   * Returns the master console nasid, if the call fails, return an illegal
   * value.
@@@ -336,7 -333,7 +333,7 @@@ ia64_sn_plat_cpei_handler(void
  }
  
  /*
-  * Set Error Handling Features
+  * Set Error Handling Features        (Obsolete)
   */
  static inline u64
  ia64_sn_plat_set_error_handling_features(void)
@@@ -585,6 -582,35 +582,6 @@@ sn_partition_serial_number_val(void) 
        return sn_partition_serial_number;
  }
  
 -/*
 - * Returns the partition id of the nasid passed in as an argument,
 - * or INVALID_PARTID if the partition id cannot be retrieved.
 - */
 -static inline partid_t
 -ia64_sn_sysctl_partition_get(nasid_t nasid)
 -{
 -      struct ia64_sal_retval ret_stuff;
 -      ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_SYSCTL_PARTITION_GET, nasid,
 -                              0, 0, 0, 0, 0, 0);
 -      if (ret_stuff.status != 0)
 -          return INVALID_PARTID;
 -      return ((partid_t)ret_stuff.v0);
 -}
 -
 -/*
 - * Returns the partition id of the current processor.
 - */
 -
 -extern partid_t sn_partid;
 -
 -static inline partid_t
 -sn_local_partid(void) {
 -      if (unlikely(sn_partid < 0)) {
 -              sn_partid = ia64_sn_sysctl_partition_get(cpuid_to_nasid(smp_processor_id()));
 -      }
 -      return sn_partid;
 -}
 -
  /*
   * Returns the physical address of the partition's reserved page through
   * an iterative number of calls.
@@@ -720,8 -746,7 +717,8 @@@ ia64_sn_power_down(void
  {
        struct ia64_sal_retval ret_stuff;
        SAL_CALL(ret_stuff, SN_SAL_SYSTEM_POWER_DOWN, 0, 0, 0, 0, 0, 0, 0);
 -      while(1);
 +      while(1)
 +              cpu_relax();
        /* never returns */
  }
  
@@@ -990,6 -1015,24 +987,6 @@@ ia64_sn_get_sn_info(int fc, u8 *shubtyp
        ret_stuff.v2 = 0;
        SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO, fc, 0, 0, 0, 0, 0, 0);
  
 -/***** BEGIN HACK - temp til old proms no longer supported ********/
 -      if (ret_stuff.status == SALRET_NOT_IMPLEMENTED) {
 -              int nasid = get_sapicid() & 0xfff;;
 -#define SH_SHUB_ID_NODES_PER_BIT_MASK 0x001f000000000000UL                                               
 -#define SH_SHUB_ID_NODES_PER_BIT_SHFT 48                                                               
 -              if (shubtype) *shubtype = 0;
 -              if (nasid_bitmask) *nasid_bitmask = 0x7ff;
 -              if (nasid_shift) *nasid_shift = 38;
 -              if (systemsize) *systemsize = 11;
 -              if (sharing_domain_size) *sharing_domain_size = 9;
 -              if (partid) *partid = ia64_sn_sysctl_partition_get(nasid);
 -              if (coher) *coher = nasid >> 9;
 -              if (reg) *reg = (HUB_L((u64 *) LOCAL_MMR_ADDR(SH1_SHUB_ID)) & SH_SHUB_ID_NODES_PER_BIT_MASK) >>
 -                      SH_SHUB_ID_NODES_PER_BIT_SHFT;
 -              return 0;
 -      }
 -/***** END HACK *******/
 -
        if (ret_stuff.status < 0)
                return ret_stuff.status;
  
@@@ -1022,10 -1065,12 +1019,10 @@@ ia64_sn_hwperf_op(nasid_t nasid, u64 op
  }
  
  static inline int
 -ia64_sn_ioif_get_pci_topology(u64 rack, u64 bay, u64 slot, u64 slab,
 -                            u64 buf, u64 len)
 +ia64_sn_ioif_get_pci_topology(u64 buf, u64 len)
  {
        struct ia64_sal_retval rv;
 -      SAL_CALL_NOLOCK(rv, SN_SAL_IOIF_GET_PCI_TOPOLOGY,
 -              rack, bay, slot, slab, buf, len, 0);
 +      SAL_CALL_NOLOCK(rv, SN_SAL_IOIF_GET_PCI_TOPOLOGY, buf, len, 0, 0, 0, 0, 0);
        return (int) rv.status;
  }
  
@@@ -1052,4 -1097,25 +1049,25 @@@ ia64_sn_is_fake_prom(void
        return (rv.status == 0);
  }
  
+ static inline int
+ ia64_sn_get_prom_feature_set(int set, unsigned long *feature_set)
+ {
+       struct ia64_sal_retval rv;
+       SAL_CALL_NOLOCK(rv, SN_SAL_GET_PROM_FEATURE_SET, set, 0, 0, 0, 0, 0, 0);
+       if (rv.status != 0)
+               return rv.status;
+       *feature_set = rv.v0;
+       return 0;
+ }
+ static inline int
+ ia64_sn_set_os_feature(int feature)
+ {
+       struct ia64_sal_retval rv;
+       SAL_CALL_NOLOCK(rv, SN_SAL_SET_OS_FEATURE_SET, feature, 0, 0, 0, 0, 0, 0);
+       return rv.status;
+ }
  #endif /* _ASM_IA64_SN_SN_SAL_H */