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_DDI_HP_IMPL_H 27*10923SEvan.Yan@Sun.COM #define _SYS_DDI_HP_IMPL_H 28*10923SEvan.Yan@Sun.COM 29*10923SEvan.Yan@Sun.COM /* 30*10923SEvan.Yan@Sun.COM * Sun DDI hotplug implementation specific definitions 31*10923SEvan.Yan@Sun.COM */ 32*10923SEvan.Yan@Sun.COM 33*10923SEvan.Yan@Sun.COM #ifdef __cplusplus 34*10923SEvan.Yan@Sun.COM extern "C" { 35*10923SEvan.Yan@Sun.COM #endif 36*10923SEvan.Yan@Sun.COM 37*10923SEvan.Yan@Sun.COM #ifdef _KERNEL 38*10923SEvan.Yan@Sun.COM 39*10923SEvan.Yan@Sun.COM /* Flags for sync request and async hotplug request */ 40*10923SEvan.Yan@Sun.COM #define DDI_HP_REQ_SYNC 0x0001 41*10923SEvan.Yan@Sun.COM #define DDI_HP_REQ_ASYNC 0x0002 42*10923SEvan.Yan@Sun.COM 43*10923SEvan.Yan@Sun.COM /* Check if a handle represents a port or a connector */ 44*10923SEvan.Yan@Sun.COM #define DDI_HP_IS_VIRTUAL_PORT(hdlp) \ 45*10923SEvan.Yan@Sun.COM (hdlp->cn_info.cn_type == DDI_HP_CN_TYPE_VIRTUAL_PORT) 46*10923SEvan.Yan@Sun.COM 47*10923SEvan.Yan@Sun.COM /* 48*10923SEvan.Yan@Sun.COM * ddi_hp_cn_handle_t 49*10923SEvan.Yan@Sun.COM * 50*10923SEvan.Yan@Sun.COM * DDI handle for a registered Hotplug Connection (CN) 51*10923SEvan.Yan@Sun.COM */ 52*10923SEvan.Yan@Sun.COM typedef struct ddi_hp_cn_handle { 53*10923SEvan.Yan@Sun.COM dev_info_t *cn_dip; /* The dip that the handle is linked */ 54*10923SEvan.Yan@Sun.COM ddi_hp_cn_info_t cn_info; /* Connection info */ 55*10923SEvan.Yan@Sun.COM struct ddi_hp_cn_handle *next; /* Next Connector/Port. */ 56*10923SEvan.Yan@Sun.COM } ddi_hp_cn_handle_t; 57*10923SEvan.Yan@Sun.COM 58*10923SEvan.Yan@Sun.COM typedef struct ddi_hp_cn_async_event_entry { 59*10923SEvan.Yan@Sun.COM dev_info_t *dip; 60*10923SEvan.Yan@Sun.COM char *cn_name; 61*10923SEvan.Yan@Sun.COM ddi_hp_cn_state_t target_state; 62*10923SEvan.Yan@Sun.COM } ddi_hp_cn_async_event_entry_t; 63*10923SEvan.Yan@Sun.COM 64*10923SEvan.Yan@Sun.COM /* 65*10923SEvan.Yan@Sun.COM * ddi_hp_op_t 66*10923SEvan.Yan@Sun.COM * 67*10923SEvan.Yan@Sun.COM * Typedef for Hotplug OPS commands used with bus_hp_op() 68*10923SEvan.Yan@Sun.COM */ 69*10923SEvan.Yan@Sun.COM typedef enum { 70*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_GET_STATE = 1, /* Get Connection state */ 71*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_CHANGE_STATE, /* Change Connection state */ 72*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_PROBE, /* Probe Connection */ 73*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_UNPROBE, /* Unprobe Connection */ 74*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_GET_PROPERTY, /* Get bus specific property */ 75*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_SET_PROPERTY, /* Set bus specific property */ 76*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_CREATE_PORT, /* Create a port for virtual hotplug */ 77*10923SEvan.Yan@Sun.COM DDI_HPOP_CN_REMOVE_PORT /* Remove an empty port */ 78*10923SEvan.Yan@Sun.COM } ddi_hp_op_t; 79*10923SEvan.Yan@Sun.COM 80*10923SEvan.Yan@Sun.COM #define DDIHP_CN_OPS(hdlp, op, arg, result, ret) \ 81*10923SEvan.Yan@Sun.COM if (DDI_HP_IS_VIRTUAL_PORT(hdlp)) \ 82*10923SEvan.Yan@Sun.COM ret = ddihp_port_ops(hdlp, op, arg, result); \ 83*10923SEvan.Yan@Sun.COM else \ 84*10923SEvan.Yan@Sun.COM ret = ddihp_connector_ops(hdlp, op, arg, result); 85*10923SEvan.Yan@Sun.COM 86*10923SEvan.Yan@Sun.COM #define NEXUS_HAS_HP_OP(dip) \ 87*10923SEvan.Yan@Sun.COM ((DEVI(dip)->devi_ops->devo_bus_ops) && \ 88*10923SEvan.Yan@Sun.COM (DEVI(dip)->devi_ops->devo_bus_ops->busops_rev >= BUSO_REV_10) && \ 89*10923SEvan.Yan@Sun.COM (DEVI(dip)->devi_ops->devo_bus_ops->bus_hp_op)) 90*10923SEvan.Yan@Sun.COM 91*10923SEvan.Yan@Sun.COM /* 92*10923SEvan.Yan@Sun.COM * ddi_hp_cn_sysevent_t 93*10923SEvan.Yan@Sun.COM * 94*10923SEvan.Yan@Sun.COM * The following correspond to sysevent defined subclasses 95*10923SEvan.Yan@Sun.COM */ 96*10923SEvan.Yan@Sun.COM typedef enum { 97*10923SEvan.Yan@Sun.COM DDI_HP_CN_STATE_CHANGE, 98*10923SEvan.Yan@Sun.COM DDI_HP_CN_REQ 99*10923SEvan.Yan@Sun.COM } ddi_hp_cn_sysevent_t; 100*10923SEvan.Yan@Sun.COM 101*10923SEvan.Yan@Sun.COM /* 102*10923SEvan.Yan@Sun.COM * Misc 103*10923SEvan.Yan@Sun.COM */ 104*10923SEvan.Yan@Sun.COM 105*10923SEvan.Yan@Sun.COM /* Append a node to list */ 106*10923SEvan.Yan@Sun.COM #define DDIHP_LIST_APPEND(type, head, node) \ 107*10923SEvan.Yan@Sun.COM if (node) { \ 108*10923SEvan.Yan@Sun.COM type *curr, *prev = NULL; \ 109*10923SEvan.Yan@Sun.COM (node)->next = NULL; \ 110*10923SEvan.Yan@Sun.COM for (curr = (head); curr; prev = curr, curr = curr->next); \ 111*10923SEvan.Yan@Sun.COM if (prev == NULL) \ 112*10923SEvan.Yan@Sun.COM (head) = (node); \ 113*10923SEvan.Yan@Sun.COM else \ 114*10923SEvan.Yan@Sun.COM prev->next = (node); \ 115*10923SEvan.Yan@Sun.COM } 116*10923SEvan.Yan@Sun.COM 117*10923SEvan.Yan@Sun.COM /* Remove a node from a list */ 118*10923SEvan.Yan@Sun.COM #define DDIHP_LIST_REMOVE(type, head, node) \ 119*10923SEvan.Yan@Sun.COM if (node) { \ 120*10923SEvan.Yan@Sun.COM type *curr, *prev = NULL; \ 121*10923SEvan.Yan@Sun.COM for (curr = (head); curr; prev = curr, curr = curr->next) { \ 122*10923SEvan.Yan@Sun.COM if (curr == (node)) \ 123*10923SEvan.Yan@Sun.COM break; \ 124*10923SEvan.Yan@Sun.COM } \ 125*10923SEvan.Yan@Sun.COM if (curr) { \ 126*10923SEvan.Yan@Sun.COM if (prev == NULL) \ 127*10923SEvan.Yan@Sun.COM (head) = (head)->next; \ 128*10923SEvan.Yan@Sun.COM else \ 129*10923SEvan.Yan@Sun.COM prev->next = curr->next; \ 130*10923SEvan.Yan@Sun.COM } \ 131*10923SEvan.Yan@Sun.COM } 132*10923SEvan.Yan@Sun.COM 133*10923SEvan.Yan@Sun.COM int ddihp_modctl(int hp_op, char *path, char *cn_name, uintptr_t arg, 134*10923SEvan.Yan@Sun.COM uintptr_t rval); 135*10923SEvan.Yan@Sun.COM ddi_hp_cn_handle_t *ddihp_cn_name_to_handle(dev_info_t *dip, char *cn_name); 136*10923SEvan.Yan@Sun.COM int ddihp_cn_getstate(ddi_hp_cn_handle_t *hdlp); 137*10923SEvan.Yan@Sun.COM int ddihp_port_ops(ddi_hp_cn_handle_t *hdlp, ddi_hp_op_t op, 138*10923SEvan.Yan@Sun.COM void *arg, void *result); 139*10923SEvan.Yan@Sun.COM int ddihp_connector_ops(ddi_hp_cn_handle_t *hdlp, 140*10923SEvan.Yan@Sun.COM ddi_hp_op_t op, void *arg, void *result); 141*10923SEvan.Yan@Sun.COM void ddihp_cn_gen_sysevent(ddi_hp_cn_handle_t *hdlp, 142*10923SEvan.Yan@Sun.COM ddi_hp_cn_sysevent_t event_sub_class, int hint, int kmflag); 143*10923SEvan.Yan@Sun.COM int ddihp_cn_unregister(ddi_hp_cn_handle_t *hdlp); 144*10923SEvan.Yan@Sun.COM 145*10923SEvan.Yan@Sun.COM #endif /* _KERNEL */ 146*10923SEvan.Yan@Sun.COM 147*10923SEvan.Yan@Sun.COM #ifdef __cplusplus 148*10923SEvan.Yan@Sun.COM } 149*10923SEvan.Yan@Sun.COM #endif 150*10923SEvan.Yan@Sun.COM 151*10923SEvan.Yan@Sun.COM #endif /* _SYS_DDI_HP_IMPL_H */ 152