1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright (c) 1999, 2000 by Sun Microsystems, Inc.
  24  * All rights reserved.
  25  */
  26 
  27 #ifndef _MONTECARLO_SYS_MCT_TOPOLOGY_H
  28 #define _MONTECARLO_SYS_MCT_TOPOLOGY_H
  29 
  30 #pragma ident   "%Z%%M% %I%     %E% SMI"
  31 
  32 #ifdef  __cplusplus
  33 extern "C" {
  34 #endif
  35 
  36 /*
  37  * mct_topology.h
  38  * MonteCarlo / Tonga topology structures and types for the scsb driver
  39  * and its kstat structure "env_topology", to be available to applications
  40  * like envmond and snmp agents.
  41  */
  42 /*
  43  * SCB information also defined in scsb.h, which file is not available to
  44  * applications.
  45  */
  46 #define SCB_P10_NOK_LED_REGS    4
  47 #define SCB_P10_OK_LED_REGS     4
  48 #define SCB_P10_BLINK_LED_REGS  2
  49 #define SCB_P10_LED_REGS        10
  50 #define SCB_P15_NOK_LED_REGS    3
  51 #define SCB_P15_OK_LED_REGS     3
  52 #define SCB_P15_BLINK_LED_REGS  3
  53 #define SCB_P15_LED_REGS        9
  54 
  55 /* Save this existing definition, but use it as the MAX */
  56 #define SCSB_LEDDATA_REGISTERS  SCB_P10_LED_REGS
  57 
  58 #define MC_MAX_SLOTS            8       /* CPU, ALRM, cPCI Slots */
  59 #define MC_MAX_FAN              2
  60 #define MC_MAX_PDU              2
  61 #define MC_MAX_PS               2
  62 #define MC_MAX_DISK             3
  63 #define MC_MAX_SCB              1
  64 #define MC_MAX_AC               1
  65 #define MC_MAX_CFTM             1
  66 #define MC_MAX_CRTM             1
  67 #define MC_MAX_PRTM             1
  68 
  69 #define TG_MAX_SLOTS            5       /* CPU, ALRM, cPCI Slots */
  70 #define TG_MAX_FAN              2
  71 #define TG_MAX_PS               1
  72 #define TG_MAX_PDU              1
  73 #define TG_MAX_DISK             1
  74 #define TG_MAX_SCB              1
  75 #define TG_MAX_AC               1
  76 #define TG_MAX_CFTM             1
  77 #define TG_MAX_CRTM             1
  78 #define TG_MAX_PRTM             1
  79 
  80 /*
  81  * Maximum number of FRUs in MCT systems,
  82  * used for sizeof fru_id_table[] and index check
  83  */
  84 #define MCT_MAX_FRUS            32
  85 
  86 /*
  87  * The I2C addresses of System I2C devices
  88  * from "MonteCarlo: Programming Interface Specifications" Version 0.9
  89  */
  90 #define MCT_I2C_CPUPWR          0x72
  91 #define MCT_I2C_FAN1            0x74
  92 #define MCT_I2C_FAN2            0x76
  93 #define MCT_I2C_FAN3            0x78
  94 #define MCT_I2C_PS1             0x7c
  95 #define MCT_I2C_PS2             0x7e
  96 #define MCT_I2C_SCB             0x80
  97 #define MCT_I2C_CPUTEMP         0x9e
  98 
  99 /*
 100  * CFG1_MPID masks
 101  */
 102 #define SCTRL_MPID_MASK                 0xf
 103 #define SCTRL_MPID_HALF                 0x0
 104 #define SCTRL_MPID_QUARTER              0x1
 105 #define SCTRL_MPID_QUARTER_NODSK        0x3
 106 
 107 /*
 108  * Interrupt Event Codes
 109  * Also used by "scsb" to locate fruid_table index,
 110  * so the order is very important.
 111  */
 112 #define SCTRL_EVENT_NONE                0x0000
 113 #define SCTRL_EVENT_SLOT1               0x00000001
 114 #define SCTRL_EVENT_SLOT2               0x00000002
 115 #define SCTRL_EVENT_SLOT3               0x00000004
 116 #define SCTRL_EVENT_SLOT4               0x00000008
 117 #define SCTRL_EVENT_SLOT5               0x00000010
 118 #define SCTRL_EVENT_SLOT6               0x00000020
 119 #define SCTRL_EVENT_SLOT7               0x00000040
 120 #define SCTRL_EVENT_SLOT8               0x00000080
 121 #define SCTRL_EVENT_SLOT9               0x00000100
 122 #define SCTRL_EVENT_SLOT10              0x00000200
 123 #define SCTRL_EVENT_PDU1                0x00000400
 124 #define SCTRL_EVENT_PDU2                0x00000800
 125 #define SCTRL_EVENT_PS1                 0x00001000
 126 #define SCTRL_EVENT_PS2                 0x00002000
 127 #define SCTRL_EVENT_DISK1               0x00004000
 128 #define SCTRL_EVENT_DISK2               0x00008000
 129 #define SCTRL_EVENT_DISK3               0x00010000
 130 #define SCTRL_EVENT_FAN1                0x00020000
 131 #define SCTRL_EVENT_FAN2                0x00040000
 132 #define SCTRL_EVENT_FAN3                0x00080000
 133 #define SCTRL_EVENT_ALARM               0x00100000
 134 #define SCTRL_EVENT_SCB                 0x00200000
 135 #define SCTRL_EVENT_SSB                 0x00400000
 136 #define SCTRL_EVENT_CRTM                0x00800000
 137 #define SCTRL_EVENT_CFTM                0x01000000
 138 #define SCTRL_EVENT_PRTM                0x02000000
 139 #define SCTRL_EVENT_PWRDWN              0x04000000
 140 #define SCTRL_EVENT_REPLACE             0x08000000
 141 #define SCTRL_EVENT_ALARM_INT           0x10000000
 142 #define SCTRL_EVENT_ALARM_INSERTION     0x20000000
 143 #define SCTRL_EVENT_ALARM_REMOVAL       0x40000000
 144 #define SCTRL_EVENT_OTHER               0x80000000
 145 
 146 
 147 
 148 typedef uchar_t         topo_id_t;
 149 typedef uchar_t         fru_id_t;
 150 typedef uint16_t        fru_version_t;
 151 typedef uint16_t        fru_max_t;
 152 typedef uint16_t        scsb_unum_t;
 153 
 154 typedef enum {
 155         MCT_HEALTH_NA   = 0,
 156         MCT_HEALTH_OK   = 1,
 157         MCT_HEALTH_NOK  = 2
 158 } fru_health_t;
 159 
 160 /*
 161  * Known MC/Tg Slot occupants, and UNKN for unknown
 162  * NOTE: the CTC occupant is the CFTM FRU type on MonteCarlo
 163  */
 164 typedef enum {
 165         OC_UNKN = 0,
 166         OC_CPU  = 1,
 167         OC_AC   = 2,
 168         OC_BHS  = 3,
 169         OC_FHS  = 4,
 170         OC_HAHS = 5,
 171         OC_QFE  = 6,
 172         OC_FRCH = 7,
 173         OC_COMBO = 8,
 174         OC_PMC  = 9,
 175         OC_ATM  = 10,
 176         OC_CTC  = 11
 177 } mct_slot_occupant_t;
 178 
 179 typedef enum {
 180         SLOT    = 0,
 181         PDU     = 1,
 182         PS      = 2,
 183         DISK    = 3,
 184         FAN     = 4,
 185         ALARM   = 5,
 186         SCB     = 6,
 187         SSB     = 7,
 188         CFTM    = 8,
 189         CRTM    = 9,
 190         PRTM    = 10,
 191         MIDPLANE = 11
 192 } scsb_utype_t;
 193 
 194 #define SCSB_UNIT_TYPES         11      /* w/o MIDPLANE */
 195 
 196 typedef enum scsb_fru_status {
 197         FRU_NOT_PRESENT,
 198         FRU_PRESENT,
 199         FRU_NOT_AVAILABLE
 200 } scsb_fru_status_t;
 201 
 202 typedef enum {
 203         SWAP_NOT, SWAP_BASIC, SWAP_FULL, SWAP_HA
 204 } cpci_swap_type_t;
 205 
 206 typedef struct fru_options {
 207         char                    *board_name;
 208         cpci_swap_type_t        swap_type;
 209         struct fru_options      *next;
 210 } fru_options_t;
 211 
 212 typedef struct fru_i2c_info {
 213         uchar_t         syscfg_reg;
 214         uchar_t         syscfg_bit;
 215         uchar_t         ledata_reg;
 216         uchar_t         ledata_bit;
 217         uchar_t         blink_reg;
 218         uchar_t         blink_bit;
 219 } fru_i2c_info_t;
 220 
 221 typedef struct fru_info {
 222         scsb_fru_status_t fru_status;   /* FRU present status           */
 223         scsb_unum_t     fru_unit;       /* FRU external unit number     */
 224         scsb_utype_t    fru_type;       /* also an index to FRU lists   */
 225         fru_id_t        fru_id;         /* I2C address, SCSIID, Slot Num */
 226         fru_version_t   fru_version;    /* version number where possible */
 227         fru_options_t   *type_list;     /* list of possible boards for slots */
 228         fru_i2c_info_t  *i2c_info;      /* for I2C devices              */
 229         struct fru_info *next;
 230 } fru_info_t;
 231 
 232 struct system_info {
 233         fru_info_t      mid_plane;      /* one always present           */
 234         fru_max_t       max_units[SCSB_UNIT_TYPES];
 235         fru_info_t      *fru_info_list[SCSB_UNIT_TYPES];
 236 };
 237 
 238 /*
 239  * scsb kstat types
 240  */
 241 #define SCSB_KS_LEDDATA         "scsb_leddata"
 242 #define SCSB_KS_STATE           "scsb_state"
 243 #define SCSB_KS_EVC_REGISTER    "scsb_evc_register"
 244 #define SCSB_KS_TOPOLOGY        "env_topology"
 245 
 246 typedef struct ks_fru_info {
 247         scsb_fru_status_t fru_status;   /* FRU presence/availability status  */
 248         scsb_unum_t     fru_unit;       /* FRU external unit number     */
 249         scsb_utype_t    fru_type;       /* and occupant type for solts  */
 250         fru_id_t        fru_id;         /* I2C address, SCSIID, Slot Num */
 251         fru_version_t   fru_version;    /* version number where possible */
 252         fru_health_t    fru_health;     /* From NOK LED, if available   */
 253 } ks_fru_info_t;
 254 
 255 typedef union scsb_leddata {
 256         uchar_t         scb_led_regs[SCSB_LEDDATA_REGISTERS];
 257         union {
 258                 struct {
 259                         uchar_t nok_leds[SCB_P10_NOK_LED_REGS];
 260                         uchar_t  ok_leds[SCB_P10_OK_LED_REGS];
 261                         uchar_t blink_leds[SCB_P10_BLINK_LED_REGS];
 262                 } p10;
 263                 struct {
 264                         uchar_t nok_leds[SCB_P15_NOK_LED_REGS];
 265                         uchar_t  ok_leds[SCB_P15_OK_LED_REGS];
 266                         uchar_t blink_leds[SCB_P15_BLINK_LED_REGS];
 267                 } p15;
 268         } leds;
 269 } scsb_ks_leddata_t;
 270 
 271 typedef struct {
 272         uint8_t         scb_present;            /* SCB is present         */
 273         uint8_t         ssb_present;            /* SSB is present         */
 274         uint8_t         scsb_frozen;            /* SCB swap state         */
 275         uint8_t         scsb_mode;              /* driver access mode     */
 276         uint8_t         unused_1;
 277         uint8_t         unused_2;
 278         uint8_t         unused_3;
 279         uint8_t         unused_4;
 280         uint32_t        event_code;             /* event code bit map     */
 281 } scsb_ks_state_t;
 282 
 283 typedef struct {
 284         ks_fru_info_t   mid_plane;
 285         fru_max_t       max_units[SCSB_UNIT_TYPES];
 286         ks_fru_info_t   mct_slots[MC_MAX_SLOTS];
 287         ks_fru_info_t   mct_pdu[MC_MAX_PDU];
 288         ks_fru_info_t   mct_ps[MC_MAX_PS];
 289         ks_fru_info_t   mct_disk[MC_MAX_DISK];
 290         ks_fru_info_t   mct_fan[MC_MAX_FAN];
 291         ks_fru_info_t   mct_scb[MC_MAX_SCB];
 292         ks_fru_info_t   mct_ssb[MC_MAX_SCB];
 293         ks_fru_info_t   mct_alarm[MC_MAX_AC];
 294         ks_fru_info_t   mct_cftm[MC_MAX_CFTM];
 295         ks_fru_info_t   mct_crtm[MC_MAX_CRTM];
 296         ks_fru_info_t   mct_prtm[MC_MAX_PRTM];
 297 } mct_topology_t;
 298 
 299 #ifdef  __cplusplus
 300 }
 301 #endif
 302 
 303 #endif  /* _MONTECARLO_SYS_MCT_TOPOLOGY_H */