1*10923SEvan.Yan@Sun.COM /* 2*10923SEvan.Yan@Sun.COM * CDDL HEADER START 3*10923SEvan.Yan@Sun.COM * 4*10923SEvan.Yan@Sun.COM * The contents of this file are subject to the terms of the 5*10923SEvan.Yan@Sun.COM * Common Development and Distribution License (the "License"). 6*10923SEvan.Yan@Sun.COM * You may not use this file except in compliance with the License. 7*10923SEvan.Yan@Sun.COM * 8*10923SEvan.Yan@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*10923SEvan.Yan@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*10923SEvan.Yan@Sun.COM * See the License for the specific language governing permissions 11*10923SEvan.Yan@Sun.COM * and limitations under the License. 12*10923SEvan.Yan@Sun.COM * 13*10923SEvan.Yan@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*10923SEvan.Yan@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*10923SEvan.Yan@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*10923SEvan.Yan@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*10923SEvan.Yan@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*10923SEvan.Yan@Sun.COM * 19*10923SEvan.Yan@Sun.COM * CDDL HEADER END 20*10923SEvan.Yan@Sun.COM */ 21*10923SEvan.Yan@Sun.COM /* 22*10923SEvan.Yan@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*10923SEvan.Yan@Sun.COM * Use is subject to license terms. 24*10923SEvan.Yan@Sun.COM */ 25*10923SEvan.Yan@Sun.COM 26*10923SEvan.Yan@Sun.COM #ifndef _SYS_PCIE_HP_H 27*10923SEvan.Yan@Sun.COM #define _SYS_PCIE_HP_H 28*10923SEvan.Yan@Sun.COM 29*10923SEvan.Yan@Sun.COM #ifdef __cplusplus 30*10923SEvan.Yan@Sun.COM extern "C" { 31*10923SEvan.Yan@Sun.COM #endif 32*10923SEvan.Yan@Sun.COM 33*10923SEvan.Yan@Sun.COM #ifdef _KERNEL 34*10923SEvan.Yan@Sun.COM #include <sys/ddi_hp.h> 35*10923SEvan.Yan@Sun.COM #include <sys/pcie_impl.h> 36*10923SEvan.Yan@Sun.COM #endif /* _KERNEL */ 37*10923SEvan.Yan@Sun.COM #include "../../../../../common/pci/pci_strings.h" 38*10923SEvan.Yan@Sun.COM #include <sys/hotplug/pci/pcihp.h> 39*10923SEvan.Yan@Sun.COM 40*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_HELP "help" 41*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_ALL "all" 42*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_LED_FAULT "fault_led" 43*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_LED_POWER "power_led" 44*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_LED_ATTN "attn_led" 45*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_LED_ACTIVE "active_led" 46*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_CARD_TYPE "card_type" 47*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_BOARD_TYPE "board_type" 48*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_SLOT_CONDITION "slot_condition" 49*10923SEvan.Yan@Sun.COM 50*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_UNKNOWN "unknown" 51*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_ON "on" 52*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_OFF "off" 53*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_BLINK "blink" 54*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_PCIHOTPLUG "pci hotplug" 55*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_OK "ok" 56*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_FAILING "failing" 57*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_FAILED "failed" 58*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_UNUSABLE "unusable" 59*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_LED "<on|off|blink>" 60*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_TYPE "<type description>" 61*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_VALUE_CONDITION "<unknown|ok|failing|failed|unusable>" 62*10923SEvan.Yan@Sun.COM 63*10923SEvan.Yan@Sun.COM /* condition */ 64*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_COND_OK "ok" 65*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_COND_FAILING "failing" 66*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_COND_FAILED "failed" 67*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_COND_UNUSABLE "unusable" 68*10923SEvan.Yan@Sun.COM #define PCIEHPC_PROP_COND_UNKNOWN "unknown" 69*10923SEvan.Yan@Sun.COM 70*10923SEvan.Yan@Sun.COM #ifdef _KERNEL 71*10923SEvan.Yan@Sun.COM 72*10923SEvan.Yan@Sun.COM #define PCIE_HP_MAX_SLOTS 31 /* Max # of slots */ 73*10923SEvan.Yan@Sun.COM #define PCIE_HP_CMD_WAIT_TIME 10000 /* Delay in microseconds */ 74*10923SEvan.Yan@Sun.COM #define PCIE_HP_CMD_WAIT_RETRY 100 /* Max retry count */ 75*10923SEvan.Yan@Sun.COM #define PCIE_HP_DLL_STATE_CHANGE_TIMEOUT 1 /* Timeout in seconds */ 76*10923SEvan.Yan@Sun.COM #define PCIE_HP_POWER_GOOD_WAIT_TIME 220000 /* Wait time after issuing a */ 77*10923SEvan.Yan@Sun.COM /* cmd to change slot state */ 78*10923SEvan.Yan@Sun.COM 79*10923SEvan.Yan@Sun.COM /* definations for PCIEHPC/PCISHPC */ 80*10923SEvan.Yan@Sun.COM #define PCIE_NATIVE_HP_TYPE "PCIe-Native" /* PCIe Native type */ 81*10923SEvan.Yan@Sun.COM #define PCIE_ACPI_HP_TYPE "PCIe-ACPI" /* PCIe ACPI type */ 82*10923SEvan.Yan@Sun.COM #define PCIE_PROP_HP_TYPE "PCIe-Proprietary" /* PCIe Prop type */ 83*10923SEvan.Yan@Sun.COM #define PCIE_PCI_HP_TYPE "PCI-SHPC" /* PCI (SHPC) type */ 84*10923SEvan.Yan@Sun.COM 85*10923SEvan.Yan@Sun.COM #define PCIE_GET_HP_CTRL(dip) \ 86*10923SEvan.Yan@Sun.COM (pcie_hp_ctrl_t *)PCIE_DIP2BUS(dip)->bus_hp_ctrl 87*10923SEvan.Yan@Sun.COM 88*10923SEvan.Yan@Sun.COM #define PCIE_SET_HP_CTRL(dip, ctrl_p) \ 89*10923SEvan.Yan@Sun.COM (PCIE_DIP2BUS(dip)->bus_hp_ctrl) = (pcie_hp_ctrl_t *)ctrl_p 90*10923SEvan.Yan@Sun.COM 91*10923SEvan.Yan@Sun.COM #define PCIE_IS_PCIE_HOTPLUG_CAPABLE(bus_p) \ 92*10923SEvan.Yan@Sun.COM ((bus_p->bus_hp_sup_modes & PCIE_ACPI_HP_MODE) || \ 93*10923SEvan.Yan@Sun.COM (bus_p->bus_hp_sup_modes & PCIE_NATIVE_HP_MODE)) 94*10923SEvan.Yan@Sun.COM 95*10923SEvan.Yan@Sun.COM #define PCIE_IS_PCI_HOTPLUG_CAPABLE(bus_p) \ 96*10923SEvan.Yan@Sun.COM (bus_p->bus_hp_sup_modes & PCIE_PCI_HP_MODE) 97*10923SEvan.Yan@Sun.COM 98*10923SEvan.Yan@Sun.COM #define PCIE_IS_PCIE_HOTPLUG_ENABLED(bus_p) \ 99*10923SEvan.Yan@Sun.COM ((bus_p->bus_hp_curr_mode == PCIE_ACPI_HP_MODE) || \ 100*10923SEvan.Yan@Sun.COM (bus_p->bus_hp_curr_mode == PCIE_NATIVE_HP_MODE)) 101*10923SEvan.Yan@Sun.COM 102*10923SEvan.Yan@Sun.COM #define PCIE_IS_PCI_HOTPLUG_ENABLED(bus_p) \ 103*10923SEvan.Yan@Sun.COM (bus_p->bus_hp_curr_mode & PCIE_PCI_HP_MODE) 104*10923SEvan.Yan@Sun.COM 105*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_ctrl pcie_hp_ctrl_t; 106*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_slot pcie_hp_slot_t; 107*10923SEvan.Yan@Sun.COM 108*10923SEvan.Yan@Sun.COM /* 109*10923SEvan.Yan@Sun.COM * Maximum length of the string converted from the digital number of pci device 110*10923SEvan.Yan@Sun.COM * number and function number, including the string's end mark. For example, 111*10923SEvan.Yan@Sun.COM * device number 0 and function number 255 (ARI case), then the length is 112*10923SEvan.Yan@Sun.COM * (1 + 3 + 1). 113*10923SEvan.Yan@Sun.COM */ 114*10923SEvan.Yan@Sun.COM #define PCIE_HP_DEV_FUNC_NUM_STRING_LEN 5 115*10923SEvan.Yan@Sun.COM 116*10923SEvan.Yan@Sun.COM /* 117*10923SEvan.Yan@Sun.COM * Length of the characters in a PCI port name. 118*10923SEvan.Yan@Sun.COM * The format of the PCI port name is: pci.d,f where d is device number, f is 119*10923SEvan.Yan@Sun.COM * function number. The constant string and characters are "pci." and ",". 120*10923SEvan.Yan@Sun.COM */ 121*10923SEvan.Yan@Sun.COM #define PCIE_HP_PORT_NAME_STRING_LEN 5 122*10923SEvan.Yan@Sun.COM 123*10923SEvan.Yan@Sun.COM /* Platform specific ops (Native HP, ACPI, etc.) */ 124*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_ops { 125*10923SEvan.Yan@Sun.COM /* initialize/setup hot plug controller hw */ 126*10923SEvan.Yan@Sun.COM int (*init_hpc_hw)(pcie_hp_ctrl_t *ctrl_p); 127*10923SEvan.Yan@Sun.COM 128*10923SEvan.Yan@Sun.COM /* uninitialize hot plug controller hw */ 129*10923SEvan.Yan@Sun.COM int (*uninit_hpc_hw)(pcie_hp_ctrl_t *ctrl_p); 130*10923SEvan.Yan@Sun.COM 131*10923SEvan.Yan@Sun.COM /* initialize slot information structure */ 132*10923SEvan.Yan@Sun.COM int (*init_hpc_slotinfo)(pcie_hp_ctrl_t *ctrl_p); 133*10923SEvan.Yan@Sun.COM 134*10923SEvan.Yan@Sun.COM /* uninitialize slot information structure */ 135*10923SEvan.Yan@Sun.COM int (*uninit_hpc_slotinfo)(pcie_hp_ctrl_t *ctrl_p); 136*10923SEvan.Yan@Sun.COM 137*10923SEvan.Yan@Sun.COM /* slot poweron */ 138*10923SEvan.Yan@Sun.COM int (*poweron_hpc_slot)(pcie_hp_slot_t *slot_p, 139*10923SEvan.Yan@Sun.COM ddi_hp_cn_state_t *result); 140*10923SEvan.Yan@Sun.COM 141*10923SEvan.Yan@Sun.COM /* slot poweroff */ 142*10923SEvan.Yan@Sun.COM /* uninitialize hot plug controller hw */ 143*10923SEvan.Yan@Sun.COM int (*poweroff_hpc_slot)(pcie_hp_slot_t *slot_p, 144*10923SEvan.Yan@Sun.COM ddi_hp_cn_state_t *result); 145*10923SEvan.Yan@Sun.COM 146*10923SEvan.Yan@Sun.COM /* enable hot plug interrupts/events */ 147*10923SEvan.Yan@Sun.COM int (*enable_hpc_intr)(pcie_hp_ctrl_t *ctrl_p); 148*10923SEvan.Yan@Sun.COM 149*10923SEvan.Yan@Sun.COM /* disable hot plug interrupts/events */ 150*10923SEvan.Yan@Sun.COM int (*disable_hpc_intr)(pcie_hp_ctrl_t *ctrl_p); 151*10923SEvan.Yan@Sun.COM } pcie_hp_ops_t; 152*10923SEvan.Yan@Sun.COM 153*10923SEvan.Yan@Sun.COM /* Slot occupant information structure */ 154*10923SEvan.Yan@Sun.COM #define PCIE_HP_MAX_OCCUPANTS 128 155*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_occupant_info { 156*10923SEvan.Yan@Sun.COM int i; 157*10923SEvan.Yan@Sun.COM char *id[PCIE_HP_MAX_OCCUPANTS]; 158*10923SEvan.Yan@Sun.COM } pcie_hp_occupant_info_t; 159*10923SEvan.Yan@Sun.COM 160*10923SEvan.Yan@Sun.COM /* 161*10923SEvan.Yan@Sun.COM * pcie_hp_led_t 162*10923SEvan.Yan@Sun.COM * 163*10923SEvan.Yan@Sun.COM * Type definitions for LED type 164*10923SEvan.Yan@Sun.COM */ 165*10923SEvan.Yan@Sun.COM typedef enum { 166*10923SEvan.Yan@Sun.COM PCIE_HP_FAULT_LED, 167*10923SEvan.Yan@Sun.COM PCIE_HP_POWER_LED, 168*10923SEvan.Yan@Sun.COM PCIE_HP_ATTN_LED, 169*10923SEvan.Yan@Sun.COM PCIE_HP_ACTIVE_LED 170*10923SEvan.Yan@Sun.COM } pcie_hp_led_t; 171*10923SEvan.Yan@Sun.COM 172*10923SEvan.Yan@Sun.COM /* 173*10923SEvan.Yan@Sun.COM * pcie_hp_led_state_t 174*10923SEvan.Yan@Sun.COM * 175*10923SEvan.Yan@Sun.COM * Type definitions for LED state 176*10923SEvan.Yan@Sun.COM */ 177*10923SEvan.Yan@Sun.COM typedef enum { 178*10923SEvan.Yan@Sun.COM PCIE_HP_LED_OFF, 179*10923SEvan.Yan@Sun.COM PCIE_HP_LED_ON, 180*10923SEvan.Yan@Sun.COM PCIE_HP_LED_BLINK 181*10923SEvan.Yan@Sun.COM } pcie_hp_led_state_t; 182*10923SEvan.Yan@Sun.COM 183*10923SEvan.Yan@Sun.COM /* 184*10923SEvan.Yan@Sun.COM * PCI and PCI Express Hotplug slot structure 185*10923SEvan.Yan@Sun.COM */ 186*10923SEvan.Yan@Sun.COM struct pcie_hp_slot { 187*10923SEvan.Yan@Sun.COM uint32_t hs_num; /* Logical slot number */ 188*10923SEvan.Yan@Sun.COM uint32_t hs_phy_slot_num; /* Physical slot number */ 189*10923SEvan.Yan@Sun.COM uint32_t hs_device_num; /* PCI device num for slot */ 190*10923SEvan.Yan@Sun.COM uint16_t hs_minor; /* Minor num for this slot */ 191*10923SEvan.Yan@Sun.COM ddi_hp_cn_info_t hs_info; /* Slot information */ 192*10923SEvan.Yan@Sun.COM ddi_hp_cn_state_t hs_state; /* Slot state */ 193*10923SEvan.Yan@Sun.COM 194*10923SEvan.Yan@Sun.COM pcie_hp_led_state_t hs_power_led_state; /* Power LED state */ 195*10923SEvan.Yan@Sun.COM pcie_hp_led_state_t hs_attn_led_state; /* Attn LED state */ 196*10923SEvan.Yan@Sun.COM pcie_hp_led_state_t hs_active_led_state; /* Active LED state */ 197*10923SEvan.Yan@Sun.COM pcie_hp_led_state_t hs_fault_led_state; /* Fault LED state */ 198*10923SEvan.Yan@Sun.COM 199*10923SEvan.Yan@Sun.COM ap_condition_t hs_condition; /* Condition of the slot. */ 200*10923SEvan.Yan@Sun.COM /* For cfgadm condition. */ 201*10923SEvan.Yan@Sun.COM 202*10923SEvan.Yan@Sun.COM /* Synchronization variable(s) for hot plug events */ 203*10923SEvan.Yan@Sun.COM kcondvar_t hs_attn_btn_cv; /* ATTN button pressed intr */ 204*10923SEvan.Yan@Sun.COM boolean_t hs_attn_btn_pending; 205*10923SEvan.Yan@Sun.COM kthread_t *hs_attn_btn_threadp; /* ATTN button event thread */ 206*10923SEvan.Yan@Sun.COM boolean_t hs_attn_btn_thread_exit; 207*10923SEvan.Yan@Sun.COM kcondvar_t hs_dll_active_cv; /* DLL State Changed intr */ 208*10923SEvan.Yan@Sun.COM 209*10923SEvan.Yan@Sun.COM pcie_hp_ctrl_t *hs_ctrl; /* Hotplug ctrl for this slot */ 210*10923SEvan.Yan@Sun.COM }; 211*10923SEvan.Yan@Sun.COM 212*10923SEvan.Yan@Sun.COM /* 213*10923SEvan.Yan@Sun.COM * Register ops for read/write of non-standard HPC (e.g: OPL platform). 214*10923SEvan.Yan@Sun.COM */ 215*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_regops { 216*10923SEvan.Yan@Sun.COM uint_t (*get)(void *cookie, off_t offset); 217*10923SEvan.Yan@Sun.COM uint_t (*put)(void *cookie, off_t offset, uint_t val); 218*10923SEvan.Yan@Sun.COM void *cookie; 219*10923SEvan.Yan@Sun.COM } pcie_hp_regops_t; 220*10923SEvan.Yan@Sun.COM 221*10923SEvan.Yan@Sun.COM /* 222*10923SEvan.Yan@Sun.COM * PCI and PCI Express Hotplug controller structure 223*10923SEvan.Yan@Sun.COM */ 224*10923SEvan.Yan@Sun.COM struct pcie_hp_ctrl { 225*10923SEvan.Yan@Sun.COM dev_info_t *hc_dip; /* DIP for HP controller */ 226*10923SEvan.Yan@Sun.COM kmutex_t hc_mutex; /* Mutex for this ctrl */ 227*10923SEvan.Yan@Sun.COM uint_t hc_flags; /* Misc flags */ 228*10923SEvan.Yan@Sun.COM 229*10923SEvan.Yan@Sun.COM /* Slot information */ 230*10923SEvan.Yan@Sun.COM pcie_hp_slot_t *hc_slots[PCIE_HP_MAX_SLOTS]; /* Slot pointers */ 231*10923SEvan.Yan@Sun.COM boolean_t hc_has_attn; /* Do we have attn btn? */ 232*10923SEvan.Yan@Sun.COM boolean_t hc_has_mrl; /* Do we have MRL? */ 233*10923SEvan.Yan@Sun.COM kcondvar_t hc_cmd_comp_cv; /* Command Completion intr */ 234*10923SEvan.Yan@Sun.COM boolean_t hc_cmd_pending; /* Command completion pending */ 235*10923SEvan.Yan@Sun.COM 236*10923SEvan.Yan@Sun.COM /* PCI Express Hotplug specific fields */ 237*10923SEvan.Yan@Sun.COM boolean_t hc_has_emi_lock; /* Do we have EMI Lock? */ 238*10923SEvan.Yan@Sun.COM boolean_t hc_dll_active_rep; /* Report DLL DL_Active state */ 239*10923SEvan.Yan@Sun.COM pcie_hp_ops_t hc_ops; /* Platform specific ops */ 240*10923SEvan.Yan@Sun.COM /* (Native, ACPI) */ 241*10923SEvan.Yan@Sun.COM 242*10923SEvan.Yan@Sun.COM /* PCI Hotplug (SHPC) specific fields */ 243*10923SEvan.Yan@Sun.COM uint32_t hc_num_slots_impl; /* # of HP Slots Implemented */ 244*10923SEvan.Yan@Sun.COM uint32_t hc_num_slots_connected; /* # of HP Slots Connected */ 245*10923SEvan.Yan@Sun.COM int hc_curr_bus_speed; /* Current Bus Speed */ 246*10923SEvan.Yan@Sun.COM uint32_t hc_device_start; /* 1st PCI Device # */ 247*10923SEvan.Yan@Sun.COM uint32_t hc_phys_start; /* 1st Phys Device # */ 248*10923SEvan.Yan@Sun.COM uint32_t hc_device_increases; /* Device # Increases */ 249*10923SEvan.Yan@Sun.COM boolean_t hc_arbiter_timeout; /* Got a Arb timeout IRQ */ 250*10923SEvan.Yan@Sun.COM 251*10923SEvan.Yan@Sun.COM /* Register read/write ops for non-standard HPC (e.g: OPL) */ 252*10923SEvan.Yan@Sun.COM pcie_hp_regops_t hc_regops; 253*10923SEvan.Yan@Sun.COM 254*10923SEvan.Yan@Sun.COM /* Platform implementation specific data if any: ACPI, CK804,... */ 255*10923SEvan.Yan@Sun.COM void *hc_misc_data; 256*10923SEvan.Yan@Sun.COM }; 257*10923SEvan.Yan@Sun.COM 258*10923SEvan.Yan@Sun.COM /* 259*10923SEvan.Yan@Sun.COM * Control structure for tree walk during configure/unconfigure operation. 260*10923SEvan.Yan@Sun.COM */ 261*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_cn_cfg_t { 262*10923SEvan.Yan@Sun.COM void *slotp; 263*10923SEvan.Yan@Sun.COM boolean_t flag; /* Flag to ignore errors */ 264*10923SEvan.Yan@Sun.COM int rv; /* Return error code */ 265*10923SEvan.Yan@Sun.COM dev_info_t *dip; /* dip at which the (first) */ 266*10923SEvan.Yan@Sun.COM /* error occurred */ 267*10923SEvan.Yan@Sun.COM void *cn_private; /* Connection specific data */ 268*10923SEvan.Yan@Sun.COM } pcie_hp_cn_cfg_t; 269*10923SEvan.Yan@Sun.COM 270*10923SEvan.Yan@Sun.COM /* 271*10923SEvan.Yan@Sun.COM * arg for unregistering port of a pci bridge 272*10923SEvan.Yan@Sun.COM */ 273*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_unreg_port { 274*10923SEvan.Yan@Sun.COM /* pci bridge dip to which the port is associated */ 275*10923SEvan.Yan@Sun.COM dev_info_t *nexus_dip; 276*10923SEvan.Yan@Sun.COM /* 277*10923SEvan.Yan@Sun.COM * Connector number of the physical slot whose dependent ports will be 278*10923SEvan.Yan@Sun.COM * unregistered. If NULL, then all the ports of the pci bridge dip will 279*10923SEvan.Yan@Sun.COM * be unregistered. 280*10923SEvan.Yan@Sun.COM */ 281*10923SEvan.Yan@Sun.COM int connector_num; 282*10923SEvan.Yan@Sun.COM int rv; 283*10923SEvan.Yan@Sun.COM } pcie_hp_unreg_port_t; 284*10923SEvan.Yan@Sun.COM 285*10923SEvan.Yan@Sun.COM /* 286*10923SEvan.Yan@Sun.COM * arg for getting a port's state 287*10923SEvan.Yan@Sun.COM */ 288*10923SEvan.Yan@Sun.COM typedef struct pcie_hp_port_state { 289*10923SEvan.Yan@Sun.COM char *cn_name; 290*10923SEvan.Yan@Sun.COM ddi_hp_cn_state_t cn_state; 291*10923SEvan.Yan@Sun.COM int rv; 292*10923SEvan.Yan@Sun.COM } pcie_hp_port_state_t; 293*10923SEvan.Yan@Sun.COM 294*10923SEvan.Yan@Sun.COM /* hc_flags */ 295*10923SEvan.Yan@Sun.COM #define PCIE_HP_INITIALIZED_FLAG (1 << 0) /* HPC initialized */ 296*10923SEvan.Yan@Sun.COM 297*10923SEvan.Yan@Sun.COM /* PCIe hotplug friendly functions */ 298*10923SEvan.Yan@Sun.COM extern int pcie_hp_init(dev_info_t *dip, caddr_t arg); 299*10923SEvan.Yan@Sun.COM extern int pcie_hp_uninit(dev_info_t *dip); 300*10923SEvan.Yan@Sun.COM extern int pcie_hp_intr(dev_info_t *dip); 301*10923SEvan.Yan@Sun.COM extern int pcie_hp_probe(pcie_hp_slot_t *slot_p); 302*10923SEvan.Yan@Sun.COM extern int pcie_hp_unprobe(pcie_hp_slot_t *slot_p); 303*10923SEvan.Yan@Sun.COM extern int pcie_hp_common_ops(dev_info_t *dip, char *cn_name, ddi_hp_op_t op, 304*10923SEvan.Yan@Sun.COM void *arg, void *result); 305*10923SEvan.Yan@Sun.COM extern dev_info_t *pcie_hp_devi_find(dev_info_t *dip, uint_t device, 306*10923SEvan.Yan@Sun.COM uint_t function); 307*10923SEvan.Yan@Sun.COM extern void pcie_hp_create_occupant_props(dev_info_t *self, dev_t dev, 308*10923SEvan.Yan@Sun.COM int pci_dev); 309*10923SEvan.Yan@Sun.COM extern void pcie_hp_create_occupant_props(dev_info_t *self, dev_t dev, 310*10923SEvan.Yan@Sun.COM int pci_dev); 311*10923SEvan.Yan@Sun.COM extern void pcie_hp_delete_occupant_props(dev_info_t *dip, dev_t dev); 312*10923SEvan.Yan@Sun.COM extern int pcie_copyin_nvlist(char *packed_buf, size_t packed_sz, 313*10923SEvan.Yan@Sun.COM nvlist_t **nvlp); 314*10923SEvan.Yan@Sun.COM extern int pcie_copyout_nvlist(nvlist_t *nvl, char *packed_buf, 315*10923SEvan.Yan@Sun.COM size_t *packed_sz); 316*10923SEvan.Yan@Sun.COM extern char *pcie_led_state_text(pcie_hp_led_state_t state); 317*10923SEvan.Yan@Sun.COM extern char *pcie_slot_condition_text(ap_condition_t condition); 318*10923SEvan.Yan@Sun.COM extern int pcie_create_minor_node(pcie_hp_ctrl_t *, int); 319*10923SEvan.Yan@Sun.COM extern void pcie_remove_minor_node(pcie_hp_ctrl_t *, int); 320*10923SEvan.Yan@Sun.COM extern void pcie_hp_gen_sysevent_req(char *slot_name, int hint, 321*10923SEvan.Yan@Sun.COM dev_info_t *self, int kmflag); 322*10923SEvan.Yan@Sun.COM 323*10923SEvan.Yan@Sun.COM extern const struct pci_class_strings_s class_pci[]; 324*10923SEvan.Yan@Sun.COM extern int class_pci_items; 325*10923SEvan.Yan@Sun.COM 326*10923SEvan.Yan@Sun.COM #endif /* _KERNEL */ 327*10923SEvan.Yan@Sun.COM 328*10923SEvan.Yan@Sun.COM #ifdef __cplusplus 329*10923SEvan.Yan@Sun.COM } 330*10923SEvan.Yan@Sun.COM #endif 331*10923SEvan.Yan@Sun.COM 332*10923SEvan.Yan@Sun.COM #endif /* _SYS_PCIE_HP_H */ 333