Pull altix-fpga-reset into release branch
authorTony Luck <tony.luck@intel.com>
Fri, 28 Oct 2005 18:14:47 +0000 (11:14 -0700)
committerTony Luck <tony.luck@intel.com>
Fri, 28 Oct 2005 18:14:47 +0000 (11:14 -0700)
1  2 
arch/ia64/sn/kernel/tiocx.c
include/asm-ia64/sn/sn_sal.h

index b45db5133f55062abda30bc36b194e3ff8f2012f,d8664715764ba5912c1523f5ec2b0a77815ec301..e0819ec53116bfc477edd4e3ce46f4b2629415da
@@@ -183,15 -183,16 +183,16 @@@ int cx_driver_unregister(struct cx_drv 
   * @part_num: device's part number
   * @mfg_num: device's manufacturer number
   * @hubdev: hub info associated with this device
+  * @bt: board type of the device
   *
   */
  int
  cx_device_register(nasid_t nasid, int part_num, int mfg_num,
-                  struct hubdev_info *hubdev)
+                  struct hubdev_info *hubdev, int bt)
  {
        struct cx_dev *cx_dev;
  
 -      cx_dev = kcalloc(1, sizeof(struct cx_dev), GFP_KERNEL);
 +      cx_dev = kzalloc(sizeof(struct cx_dev), GFP_KERNEL);
        DBG("cx_dev= 0x%p\n", cx_dev);
        if (cx_dev == NULL)
                return -ENOMEM;
        cx_dev->cx_id.mfg_num = mfg_num;
        cx_dev->cx_id.nasid = nasid;
        cx_dev->hubdev = hubdev;
+       cx_dev->bt = bt;
  
        cx_dev->dev.parent = NULL;
        cx_dev->dev.bus = &tiocx_bus_type;
@@@ -238,7 -240,8 +240,8 @@@ static int cx_device_reload(struct cx_d
  {
        cx_device_unregister(cx_dev);
        return cx_device_register(cx_dev->cx_id.nasid, cx_dev->cx_id.part_num,
-                                 cx_dev->cx_id.mfg_num, cx_dev->hubdev);
+                                 cx_dev->cx_id.mfg_num, cx_dev->hubdev,
+                                 cx_dev->bt);
  }
  
  static inline uint64_t tiocx_intr_alloc(nasid_t nasid, int widget,
@@@ -365,26 -368,20 +368,20 @@@ static void tio_corelet_reset(nasid_t n
        udelay(2000);
  }
  
- static int tiocx_btchar_get(int nasid)
+ static int is_fpga_tio(int nasid, int *bt)
  {
-       moduleid_t module_id;
-       geoid_t geoid;
-       int cnodeid;
-       cnodeid = nasid_to_cnodeid(nasid);
-       geoid = cnodeid_get_geoid(cnodeid);
-       module_id = geo_module(geoid);
-       return MODULE_GET_BTCHAR(module_id);
- }
+       int ioboard_type;
  
- static int is_fpga_brick(int nasid)
- {
-       switch (tiocx_btchar_get(nasid)) {
+       ioboard_type = ia64_sn_sysctl_ioboard_get(nasid);
+       switch (ioboard_type) {
        case L1_BRICKTYPE_SA:
        case L1_BRICKTYPE_ATHENA:
-       case L1_BRICKTYPE_DAYTONA:
+       case L1_BOARDTYPE_DAYTONA:
+               *bt = ioboard_type;
                return 1;
        }
        return 0;
  }
  
@@@ -407,16 -404,22 +404,22 @@@ static int tiocx_reload(struct cx_dev *
  
        if (bitstream_loaded(nasid)) {
                uint64_t cx_id;
-               cx_id =
-                   *(volatile uint64_t *)(TIO_SWIN_BASE(nasid, TIOCX_CORELET) +
+               int rv;
+               rv = ia64_sn_sysctl_tio_clock_reset(nasid);
+               if (rv) {
+                       printk(KERN_ALERT "CX port JTAG reset failed.\n");
+               } else {
+                       cx_id = *(volatile uint64_t *)
+                               (TIO_SWIN_BASE(nasid, TIOCX_CORELET) +
                                          WIDGET_ID);
-               part_num = XWIDGET_PART_NUM(cx_id);
-               mfg_num = XWIDGET_MFG_NUM(cx_id);
-               DBG("part= 0x%x, mfg= 0x%x\n", part_num, mfg_num);
-               /* just ignore it if it's a CE */
-               if (part_num == TIO_CE_ASIC_PARTNUM)
-                       return 0;
+                       part_num = XWIDGET_PART_NUM(cx_id);
+                       mfg_num = XWIDGET_MFG_NUM(cx_id);
+                       DBG("part= 0x%x, mfg= 0x%x\n", part_num, mfg_num);
+                       /* just ignore it if it's a CE */
+                       if (part_num == TIO_CE_ASIC_PARTNUM)
+                               return 0;
+               }
        }
  
        cx_dev->cx_id.part_num = part_num;
@@@ -436,10 -439,10 +439,10 @@@ static ssize_t show_cxdev_control(struc
  {
        struct cx_dev *cx_dev = to_cx_dev(dev);
  
-       return sprintf(buf, "0x%x 0x%x 0x%x %d\n",
+       return sprintf(buf, "0x%x 0x%x 0x%x 0x%x\n",
                       cx_dev->cx_id.nasid,
                       cx_dev->cx_id.part_num, cx_dev->cx_id.mfg_num,
-                      tiocx_btchar_get(cx_dev->cx_id.nasid));
+                      cx_dev->bt);
  }
  
  static ssize_t store_cxdev_control(struct device *dev, struct device_attribute *attr, const char *buf,
@@@ -488,11 -491,12 +491,12 @@@ static int __init tiocx_init(void
  
        for (cnodeid = 0; cnodeid < MAX_COMPACT_NODES; cnodeid++) {
                nasid_t nasid;
+               int bt;
  
                if ((nasid = cnodeid_to_nasid(cnodeid)) < 0)
                        break;  /* No more nasids .. bail out of loop */
  
-               if ((nasid & 0x1) && is_fpga_brick(nasid)) {
+               if ((nasid & 0x1) && is_fpga_tio(nasid, &bt)) {
                        struct hubdev_info *hubdev;
                        struct xwidget_info *widgetp;
  
  
                        if (cx_device_register
                            (nasid, widgetp->xwi_hwid.part_num,
-                            widgetp->xwi_hwid.mfg_num, hubdev) < 0)
+                            widgetp->xwi_hwid.mfg_num, hubdev, bt) < 0)
                                return -ENXIO;
                        else
                                found_tiocx_device++;
index fea35b33d4e485f835cbfd678121f053f4a925f2,6f96ae8b4fbe88106bda7b1cc4b2c3384e299cf3..34f3127e44161ccf1ebbb93be06b99bdfa7a8475
@@@ -47,6 -47,7 +47,7 @@@
  #define  SN_SAL_CONSOLE_PUTB                     0x02000028
  #define  SN_SAL_CONSOLE_XMIT_CHARS               0x0200002a
  #define  SN_SAL_CONSOLE_READC                    0x0200002b
+ #define  SN_SAL_SYSCTL_OP                        0x02000030
  #define  SN_SAL_SYSCTL_MODID_GET                 0x02000031
  #define  SN_SAL_SYSCTL_GET                         0x02000032
  #define  SN_SAL_SYSCTL_IOBRICK_MODULE_GET          0x02000033
@@@ -80,9 -81,6 +81,9 @@@
  #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
   */
  #define SAL_INTR_ALLOC                1
  #define SAL_INTR_FREE         2
  
+ /*
+  * operations available on the generic SN_SAL_SYSCTL_OP
+  * runtime service
+  */
+ #define SAL_SYSCTL_OP_IOBOARD         0x0001  /*  retrieve board type */
+ #define SAL_SYSCTL_OP_TIO_JLCK_RST      0x0002  /* issue TIO clock reset */
  /*
   * IRouter (i.e. generalized system controller) operations
   */
  /*
   * 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
  
@@@ -154,6 -159,12 +162,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.
@@@ -333,7 -344,7 +341,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)
@@@ -873,6 -884,41 +881,41 @@@ ia64_sn_sysctl_event_init(nasid_t nasid
          return (int) rv.v0;
  }
  
+ /*
+  * Ask the system controller on the specified nasid to reset
+  * the CX corelet clock.  Only valid on TIO nodes.
+  */
+ static inline int
+ ia64_sn_sysctl_tio_clock_reset(nasid_t nasid)
+ {
+       struct ia64_sal_retval rv;
+       SAL_CALL_REENTRANT(rv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_TIO_JLCK_RST,
+                       nasid, 0, 0, 0, 0, 0);
+       if (rv.status != 0)
+               return (int)rv.status;
+       if (rv.v0 != 0)
+               return (int)rv.v0;
+       return 0;
+ }
+ /*
+  * Get the associated ioboard type for a given nasid.
+  */
+ static inline int
+ ia64_sn_sysctl_ioboard_get(nasid_t nasid)
+ {
+         struct ia64_sal_retval rv;
+         SAL_CALL_REENTRANT(rv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD,
+                         nasid, 0, 0, 0, 0, 0);
+         if (rv.v0 != 0)
+                 return (int)rv.v0;
+         if (rv.v1 != 0)
+                 return (int)rv.v1;
+         return 0;
+ }
  /**
   * ia64_sn_get_fit_compt - read a FIT entry from the PROM header
   * @nasid: NASID of node to read
@@@ -1049,25 -1095,4 +1092,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 */