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 2014 Garrett D'Amore <garrett@damore.org>
  24  *
  25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  */
  28 
  29 #ifndef _SYS_HOTPLUG_HPCTRL_H
  30 #define _SYS_HOTPLUG_HPCTRL_H
  31 
  32 /*
  33  * ****************************************************************
  34  * Hot Plug Controller interfaces for PCI and CompactPCI platforms.
  35  * ****************************************************************
  36  */
  37 #include <sys/types.h>
  38 
  39 #ifdef  __cplusplus
  40 extern "C" {
  41 #endif
  42 
  43 /*
  44  * Type definition for slot handle. This is an opaque pointer
  45  * created by the HPS framework.
  46  */
  47 typedef void *hpc_slot_t;
  48 
  49 #define HPC_SLOT_OPS_VERSION    0
  50 
  51 /*
  52  * slot operations structure definition.
  53  *
  54  *      Function                Description
  55  *      --------                -----------
  56  *      xxx_op_connect          CONNECT the slot to the bus to enable
  57  *                              access to the adapter.
  58  *      xxx_op_disconnect       DISCONNECT the slot from the bus. For PCI,
  59  *                              this disables the power to the slot.
  60  *      xxx_op_insert           Prepare the slot for card insertion. This
  61  *                              may not be applicable for all bus types.
  62  *      xxx_op_remove           Prepare the slot for card removal. This
  63  *                              may not be applicable for all bus types.
  64  *      xxx_op_control          Perform misc. commands to control the
  65  *                              LEDs, get status information, etc.
  66  */
  67 typedef struct hpc_slot_ops {
  68         int     hpc_version;                    /* HPC_SLOT_OPS_VERSION */
  69         int     (*hpc_op_connect)(caddr_t ops_arg, hpc_slot_t slot_hdl,
  70                         void *data, uint_t flags);
  71         int     (*hpc_op_disconnect)(caddr_t ops_arg, hpc_slot_t slot_hdl,
  72                         void *data, uint_t flags);
  73         int     (*hpc_op_insert)(caddr_t ops_arg, hpc_slot_t slot_hdl,
  74                         void *data, uint_t flags);
  75         int     (*hpc_op_remove)(caddr_t ops_arg, hpc_slot_t slot_hdl,
  76                         void *data, uint_t flags);
  77         int     (*hpc_op_control)(caddr_t ops_arg, hpc_slot_t slot_hdl,
  78                         int request, caddr_t arg);
  79 } hpc_slot_ops_t;
  80 
  81 #define HPC_SLOT_INFO_VERSION   1
  82 #define PCI_SLOT_NAME_LEN       256
  83 /*
  84  * Slot information structure.
  85  */
  86 typedef struct hpc_slot_info {
  87         uint16_t        version;                /* HPC_SLOT_INFO_VERSION */
  88         uint16_t        slot_type;              /* slot type: PCI, ... */
  89         uint16_t        slot_flags;
  90         union {
  91             /* pci bus slot */
  92             struct pci_slot_info {
  93                 uint16_t        device_number;          /* PCI device number */
  94                 uint16_t        slot_capabilities;      /* 64bit, etc. */
  95                 char            slot_logical_name[PCI_SLOT_NAME_LEN];
  96             } pci;
  97             struct sbd_slot_info {
  98                 int             slot_num;
  99             } sbd;
 100             /* other bus types go here... */
 101         } slot;
 102 } hpc_slot_info_t;
 103 
 104 /* short names for bus specific fields in hpc_slot_info structure */
 105 #define pci_dev_num             slot.pci.device_number
 106 #define pci_slot_name           slot.pci.slot_logical_name
 107 #define pci_slot_capabilities   slot.pci.slot_capabilities
 108 
 109 #define sbd_slot_num            slot.sbd.slot_num
 110 
 111 /* slot_type definitions */
 112 #define HPC_SLOT_TYPE_PCI       0x1             /* PCI bus slot */
 113 #define HPC_SLOT_TYPE_CPCI      0x2             /* Compact PCI bus slot */
 114 #define HPC_SLOT_TYPE_SBD       0x3             /* System bus slot */
 115 #define HPC_SLOT_TYPE_PCIE      0x4             /* PCI Express slot */
 116 
 117 /* bit definitions in slot_capabilities field for PCI or cPCI bus slots */
 118 #define HPC_SLOT_64BITS         0x0001  /* slot is a 64bit slot */
 119 #define HPC_SLOT_TEST           0x0002  /* testing capability on the slot */
 120 
 121 /* slot_flags definitions */
 122 #define HPC_SLOT_NO_AUTO_ENABLE 0x1     /* No auto-enable on registration */
 123 #define HPC_SLOT_CREATE_DEVLINK 0x2     /* create device link under /dev/cfg */
 124 
 125 /*
 126  * xxx_op_control command definitions.
 127  *
 128  *      Command (request)          arg                  Descritpion
 129  *      -----------------          ---                  -----------
 130  *      HPC_CTRL_GET_LED_STATE     hpc_led_info *       Get state of an LED.
 131  *      HPC_CTRL_SET_LED_STATE     hpc_led_info *       Set state of an LED.
 132  *      HPC_CTRL_GET_SLOT_STATE    hpc_slot_state_t *   Get the slot state.
 133  *      HPC_CTRL_DEV_CONFIGURED    NULL                 Board is configured.
 134  *      HPC_CTRL_DEV_UNCONFIGURED  NULL                 Board is unconfigured.
 135  *      HPC_CTRL_DEV_CONFIG_FAILURE NULL        Board Configuration Failed
 136  *      HPC_CTRL_DEV_UNCONFIG_FAILURE NULL      Board Unconfiguration Failed
 137  *      HPC_CTRL_GET_BOARD_TYPE    hpc_board_type_t *   Get board type info.
 138  *      HPC_CTRL_DISABLE_AUTOCFG   NULL                 Disable auto config-
 139  *                                                      uration for this slot.
 140  *      HPC_CTRL_ENABLE_AUTOCFG    NULL                 Enable auto config-
 141  *                                                      uration for this slot.
 142  *      HPC_CTRL_DISABLE_SLOT      NULL                 Disable the slot for
 143  *                                                      hot plug operations.
 144  *      HPC_CTRL_ENABLE_SLOT       NULL                 ReEnable the slot for
 145  *                                                      hot plug operations.
 146  */
 147 #define HPC_CTRL_GET_LED_STATE          0x1
 148 #define HPC_CTRL_SET_LED_STATE          0x2
 149 #define HPC_CTRL_GET_SLOT_STATE         0x3
 150 #define HPC_CTRL_DEV_CONFIGURED         0x4
 151 #define HPC_CTRL_DEV_UNCONFIGURED       0x5
 152 #define HPC_CTRL_GET_BOARD_TYPE         0x6
 153 #define HPC_CTRL_DISABLE_AUTOCFG        0x7
 154 #define HPC_CTRL_ENABLE_AUTOCFG         0x8
 155 #define HPC_CTRL_DISABLE_SLOT           0x9
 156 #define HPC_CTRL_ENABLE_SLOT            0xa
 157 #define HPC_CTRL_DISABLE_ENUM           0xb
 158 #define HPC_CTRL_ENABLE_ENUM            0xc
 159 #define HPC_CTRL_DEV_CONFIG_FAILURE     0xd
 160 #define HPC_CTRL_DEV_UNCONFIG_FAILURE   0xe
 161 #define HPC_CTRL_DEV_CONFIG_START       0xf
 162 #define HPC_CTRL_DEV_UNCONFIG_START     0x10
 163 
 164 /*
 165  * type definitions for led information.
 166  *
 167  * Note: ATTN/ACTIVE leds are platform specific and they may not be
 168  *       available on all platforms.
 169  */
 170 typedef enum { HPC_FAULT_LED, HPC_POWER_LED, HPC_ATTN_LED,
 171         HPC_ACTIVE_LED} hpc_led_t;
 172 
 173 typedef enum { HPC_LED_OFF, HPC_LED_ON, HPC_LED_BLINK } hpc_led_state_t;
 174 
 175 typedef struct hpc_led_info {
 176         hpc_led_t       led;    /* led id: HPC_POWER_LED, HPC_FAULT_LED, ... */
 177         hpc_led_state_t state;  /* led state: HPC_LED_ON, HPC_LED_OFF, ... */
 178 } hpc_led_info_t;
 179 
 180 /*
 181  * type definition for slot state.
 182  *
 183  *      HPC_SLOT_EMPTY          Slot has no card present.
 184  *      HPC_SLOT_CONNECTED      Card is present in the slot and it is
 185  *                              connected to the bus.
 186  *      HPC_SLOT_DISCONNECTED   Card is present in the slot and it is
 187  *                              disconnected from the bus.
 188  *      HPC_SLOT_UNKNOWN        If the HPC driver can not figure out
 189  *                              the receptacle state. This is possible
 190  *                              on Compact PCI Hot Swap platform.
 191  */
 192 typedef enum { HPC_SLOT_EMPTY, HPC_SLOT_DISCONNECTED,
 193         HPC_SLOT_CONNECTED, HPC_SLOT_UNKNOWN } hpc_slot_state_t;
 194 
 195 /*
 196  * type definition for board type.
 197  *
 198  *      HPC_BOARD_UNKNOWN       Board is either not present or unknown.
 199  *      HPC_BOARD_PCI_HOTPLUG   PCI or PCIe adapter.
 200  *      HPC_BOARD_CPCI_NON_HS   Non Hot Swap cPCI board.
 201  *      HPC_BOARD_CPCI_BASIC_HS Basic Hot Swap cPCI board.
 202  *      HPC_BOARD_CPCI_FULL_HS  Full Hot Swap cPCI board.
 203  *      HPC_BOARD_CPCI_HS       Indicates if HSC driver can not determine
 204  *                              the type of Hot Swap board.
 205  */
 206 typedef enum { HPC_BOARD_UNKNOWN, HPC_BOARD_PCI_HOTPLUG,
 207         HPC_BOARD_CPCI_NON_HS, HPC_BOARD_CPCI_BASIC_HS,
 208         HPC_BOARD_CPCI_FULL_HS, HPC_BOARD_CPCI_HS } hpc_board_type_t;
 209 
 210 /*
 211  * Event type definitions (for hpc_event_notify() interface).
 212  *
 213  *      Event                      Descritpion
 214  *      -----                      -----------
 215  *      HPC_EVENT_SLOT_INSERTION   Card is inserted in the slot.
 216  *      HPC_EVENT_SLOT_REMOVAL     Card is removed from the slot.
 217  *      HPC_EVENT_SLOT_POWER_ON    Slot is powered ON.
 218  *      HPC_EVENT_SLOT_POWER_OFF   Slot is powered OFF.
 219  *      HPC_EVENT_SLOT_LATCH_OPEN  LATCH on the slot is open.
 220  *      HPC_EVENT_SLOT_LATCH_SHUT  LATCH on the slot is shut.
 221  *      HPC_EVENT_SLOT_ENUM        ENUM# signal is generated on the bus
 222  *                                 and it may be generated from this slot.
 223  *      HPC_EVENT_SLOT_NOT_HEALTHY HEALTHY# signal is lost on this slot.
 224  *      HPC_EVENT_SLOT_HEALTHY_OK  HEALTHY# signal on this slot is OK now.
 225  *      HPC_EVENT_SLOT_CONFIGURE   Configure the occupant in the slot.
 226  *      HPC_EVENT_SLOT_UNCONFIGURE Unconfigure the occupant in the slot.
 227  */
 228 #define HPC_EVENT_SLOT_INSERTION        0x00000001
 229 #define HPC_EVENT_SLOT_REMOVAL          0x00000002
 230 #define HPC_EVENT_SLOT_POWER_ON         0x00000004
 231 #define HPC_EVENT_SLOT_POWER_OFF        0x00000008
 232 #define HPC_EVENT_SLOT_LATCH_OPEN       0x00000010
 233 #define HPC_EVENT_SLOT_LATCH_SHUT       0x00000020
 234 #define HPC_EVENT_SLOT_ENUM             0x00000040
 235 #define HPC_EVENT_SLOT_NOT_HEALTHY      0x00000080
 236 #define HPC_EVENT_SLOT_HEALTHY_OK       0x00000100
 237 #define HPC_EVENT_SLOT_CONFIGURE        0x00000200
 238 #define HPC_EVENT_SLOT_UNCONFIGURE      0x00000400
 239 #define HPC_EVENT_SLOT_BLUE_LED_ON      0x00000800
 240 #define HPC_EVENT_SLOT_BLUE_LED_OFF     0x00001000
 241 #define HPC_EVENT_CLEAR_ENUM            0x00002000
 242 #define HPC_EVENT_PROCESS_ENUM          0x00004000
 243 #define HPC_EVENT_ENABLE_ENUM           0x00008000
 244 #define HPC_EVENT_DISABLE_ENUM          0x00010000
 245 #define HPC_EVENT_BUS_ENUM              HPC_EVENT_SLOT_ENUM
 246 #define HPC_EVENT_SLOT_ATTN             0x00020000
 247 #define HPC_EVENT_SLOT_POWER_FAULT      0x00040000
 248 
 249 /*
 250  * return values for errors from HPS framework interfaces.
 251  */
 252 #define HPC_SUCCESS                     0x0
 253 #define HPC_ERR_INVALID                 0x1     /* invalid arguments */
 254 #define HPC_ERR_SLOT_NOTREGISTERED      0x2     /* slot is not registered */
 255 #define HPC_ERR_SLOT_DUPLICATE          0x3     /* slot is already registered */
 256 #define HPC_ERR_BUS_NOTREGISTERED       0x4     /* slot is not registered */
 257 #define HPC_ERR_BUS_DUPLICATE           0x5     /* slot is already registered */
 258 #define HPC_ERR_NOTSUPPORTED            0x6     /* operation not supported */
 259 #define HPC_ERR_FAILED                  0x7     /* operation failed */
 260 
 261 /* return values for event notifications */
 262 #define HPC_EVENT_CLAIMED               0x10    /* HPC event is claimed */
 263 #define HPC_EVENT_UNCLAIMED             -1      /* HPC event is not claimed */
 264 
 265 /* definitions for slot (un)registration events */
 266 #define HPC_SLOT_ONLINE         1       /* slot is registered */
 267 #define HPC_SLOT_OFFLINE        2       /* slot is unregistered */
 268 
 269 /*
 270  * function prototype definitions for interfaces between HPC driver
 271  * and Hot Plug Services framework.
 272  */
 273 extern int hpc_slot_register(dev_info_t *dip, char *bus_path,
 274         hpc_slot_info_t *slot_info, hpc_slot_t *slot_hdl,
 275         hpc_slot_ops_t *slot_ops, caddr_t ops_arg, uint_t flags);
 276 extern int hpc_slot_unregister(hpc_slot_t *slot_hdl);
 277 extern struct hpc_slot_ops *hpc_alloc_slot_ops(int sleepflag);
 278 extern void hpc_free_slot_ops(hpc_slot_ops_t *ops);
 279 extern int hpc_slot_event_notify(hpc_slot_t slot_hdl, uint_t event,
 280         uint_t flags);
 281 extern boolean_t hpc_bus_registered(hpc_slot_t slot_hdl);
 282 
 283 /*
 284  * *****************************************************************
 285  * Implementation specific data structures and definitons. These are
 286  * the private interfaces between cfgadm plug-in and the PCI nexus
 287  * driver.
 288  * *****************************************************************
 289  */
 290 
 291 /*
 292  * Data structure used for DEVCTL_AP_CONTROL ioctl on the AP.
 293  */
 294 struct hpc_control_data {
 295         uint_t  cmd;            /* HPC_CTRL_* command */
 296         void    *data;          /* pointer to data that is exchanged */
 297 };
 298 
 299 struct hpc_control32_data {
 300         uint_t    cmd;          /* HPC_CTRL_* command */
 301         caddr32_t data;         /* pointer to data that is exchanged */
 302 };
 303 
 304 /* misc. control commands for DEVCTL_AP_CONTROL ioctl interface */
 305 #define HPC_CTRL_GET_SLOT_INFO  0x100
 306 #define HPC_CTRL_GET_CARD_INFO  0x101
 307 
 308 /* card information structure to get data from the PCI config header */
 309 typedef struct hpc_card_info {
 310         uint8_t prog_class;     /* PCI_CONF_PROGCLASS byte */
 311         uint8_t base_class;     /* PCI_CONF_BASCLASS byte */
 312         uint8_t sub_class;      /* PCI_CONF_SUBCLASS byte */
 313         uint8_t header_type;    /* PCI_CONF_HEADER byte */
 314 } hpc_card_info_t;
 315 
 316 /* Slot occupant information structure */
 317 #define HPC_MAX_OCCUPANTS       128
 318 typedef struct hpc_occupant_info {
 319         int     i;
 320         char    *id[HPC_MAX_OCCUPANTS];
 321 } hpc_occupant_info_t;
 322 
 323 #ifdef  __cplusplus
 324 }
 325 #endif
 326 
 327 #endif  /* _SYS_HOTPLUG_HPCTRL_H */