126947304SEvan Yan /* 226947304SEvan Yan * CDDL HEADER START 326947304SEvan Yan * 426947304SEvan Yan * The contents of this file are subject to the terms of the 526947304SEvan Yan * Common Development and Distribution License (the "License"). 626947304SEvan Yan * You may not use this file except in compliance with the License. 726947304SEvan Yan * 826947304SEvan Yan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 926947304SEvan Yan * or http://www.opensolaris.org/os/licensing. 1026947304SEvan Yan * See the License for the specific language governing permissions 1126947304SEvan Yan * and limitations under the License. 1226947304SEvan Yan * 1326947304SEvan Yan * When distributing Covered Code, include this CDDL HEADER in each 1426947304SEvan Yan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1526947304SEvan Yan * If applicable, add the following below this CDDL HEADER, with the 1626947304SEvan Yan * fields enclosed by brackets "[]" replaced with your own identifying 1726947304SEvan Yan * information: Portions Copyright [yyyy] [name of copyright owner] 1826947304SEvan Yan * 1926947304SEvan Yan * CDDL HEADER END 2026947304SEvan Yan */ 2126947304SEvan Yan /* 2226947304SEvan Yan * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2326947304SEvan Yan * Use is subject to license terms. 24*ffb64830SJordan Paige Hendricks * Copyright 2019 Joyent, Inc. 25*ffb64830SJordan Paige Hendricks */ 26*ffb64830SJordan Paige Hendricks 27*ffb64830SJordan Paige Hendricks /* 28*ffb64830SJordan Paige Hendricks * See the big theory statement in uts/common/os/ddi_hp_impl.c for more 29*ffb64830SJordan Paige Hendricks * information about the structures and functions defined here. 3026947304SEvan Yan */ 3126947304SEvan Yan 3226947304SEvan Yan #ifndef _SYS_DDI_HP_IMPL_H 3326947304SEvan Yan #define _SYS_DDI_HP_IMPL_H 3426947304SEvan Yan 3526947304SEvan Yan /* 3626947304SEvan Yan * Sun DDI hotplug implementation specific definitions 3726947304SEvan Yan */ 3826947304SEvan Yan 3926947304SEvan Yan #ifdef __cplusplus 4026947304SEvan Yan extern "C" { 4126947304SEvan Yan #endif 4226947304SEvan Yan 4326947304SEvan Yan #ifdef _KERNEL 4426947304SEvan Yan 4526947304SEvan Yan /* Flags for sync request and async hotplug request */ 4626947304SEvan Yan #define DDI_HP_REQ_SYNC 0x0001 4726947304SEvan Yan #define DDI_HP_REQ_ASYNC 0x0002 4826947304SEvan Yan 4926947304SEvan Yan /* Check if a handle represents a port or a connector */ 5026947304SEvan Yan #define DDI_HP_IS_VIRTUAL_PORT(hdlp) \ 5126947304SEvan Yan (hdlp->cn_info.cn_type == DDI_HP_CN_TYPE_VIRTUAL_PORT) 5226947304SEvan Yan 5326947304SEvan Yan /* 5426947304SEvan Yan * ddi_hp_cn_handle_t 5526947304SEvan Yan * 5626947304SEvan Yan * DDI handle for a registered Hotplug Connection (CN) 5726947304SEvan Yan */ 5826947304SEvan Yan typedef struct ddi_hp_cn_handle { 5926947304SEvan Yan dev_info_t *cn_dip; /* The dip that the handle is linked */ 6026947304SEvan Yan ddi_hp_cn_info_t cn_info; /* Connection info */ 6126947304SEvan Yan struct ddi_hp_cn_handle *next; /* Next Connector/Port. */ 6226947304SEvan Yan } ddi_hp_cn_handle_t; 6326947304SEvan Yan 6426947304SEvan Yan typedef struct ddi_hp_cn_async_event_entry { 6526947304SEvan Yan dev_info_t *dip; 6626947304SEvan Yan char *cn_name; 6726947304SEvan Yan ddi_hp_cn_state_t target_state; 6826947304SEvan Yan } ddi_hp_cn_async_event_entry_t; 6926947304SEvan Yan 7026947304SEvan Yan /* 7126947304SEvan Yan * ddi_hp_op_t 7226947304SEvan Yan * 7326947304SEvan Yan * Typedef for Hotplug OPS commands used with bus_hp_op() 7426947304SEvan Yan */ 7526947304SEvan Yan typedef enum { 7626947304SEvan Yan DDI_HPOP_CN_GET_STATE = 1, /* Get Connection state */ 7726947304SEvan Yan DDI_HPOP_CN_CHANGE_STATE, /* Change Connection state */ 7826947304SEvan Yan DDI_HPOP_CN_PROBE, /* Probe Connection */ 7926947304SEvan Yan DDI_HPOP_CN_UNPROBE, /* Unprobe Connection */ 8026947304SEvan Yan DDI_HPOP_CN_GET_PROPERTY, /* Get bus specific property */ 8126947304SEvan Yan DDI_HPOP_CN_SET_PROPERTY, /* Set bus specific property */ 8226947304SEvan Yan DDI_HPOP_CN_CREATE_PORT, /* Create a port for virtual hotplug */ 8326947304SEvan Yan DDI_HPOP_CN_REMOVE_PORT /* Remove an empty port */ 8426947304SEvan Yan } ddi_hp_op_t; 8526947304SEvan Yan 8626947304SEvan Yan #define DDIHP_CN_OPS(hdlp, op, arg, result, ret) \ 8726947304SEvan Yan if (DDI_HP_IS_VIRTUAL_PORT(hdlp)) \ 8826947304SEvan Yan ret = ddihp_port_ops(hdlp, op, arg, result); \ 8926947304SEvan Yan else \ 9026947304SEvan Yan ret = ddihp_connector_ops(hdlp, op, arg, result); 9126947304SEvan Yan 9226947304SEvan Yan #define NEXUS_HAS_HP_OP(dip) \ 9326947304SEvan Yan ((DEVI(dip)->devi_ops->devo_bus_ops) && \ 9426947304SEvan Yan (DEVI(dip)->devi_ops->devo_bus_ops->busops_rev >= BUSO_REV_10) && \ 9526947304SEvan Yan (DEVI(dip)->devi_ops->devo_bus_ops->bus_hp_op)) 9626947304SEvan Yan 9726947304SEvan Yan /* 9826947304SEvan Yan * ddi_hp_cn_sysevent_t 9926947304SEvan Yan * 10026947304SEvan Yan * The following correspond to sysevent defined subclasses 10126947304SEvan Yan */ 10226947304SEvan Yan typedef enum { 10326947304SEvan Yan DDI_HP_CN_STATE_CHANGE, 10426947304SEvan Yan DDI_HP_CN_REQ 10526947304SEvan Yan } ddi_hp_cn_sysevent_t; 10626947304SEvan Yan 10726947304SEvan Yan /* 10826947304SEvan Yan * Misc 10926947304SEvan Yan */ 11026947304SEvan Yan 11126947304SEvan Yan /* Append a node to list */ 11226947304SEvan Yan #define DDIHP_LIST_APPEND(type, head, node) \ 11326947304SEvan Yan if (node) { \ 11426947304SEvan Yan type *curr, *prev = NULL; \ 11526947304SEvan Yan (node)->next = NULL; \ 11626947304SEvan Yan for (curr = (head); curr; prev = curr, curr = curr->next); \ 11726947304SEvan Yan if (prev == NULL) \ 11826947304SEvan Yan (head) = (node); \ 11926947304SEvan Yan else \ 12026947304SEvan Yan prev->next = (node); \ 12126947304SEvan Yan } 12226947304SEvan Yan 12326947304SEvan Yan /* Remove a node from a list */ 12426947304SEvan Yan #define DDIHP_LIST_REMOVE(type, head, node) \ 12526947304SEvan Yan if (node) { \ 12626947304SEvan Yan type *curr, *prev = NULL; \ 12726947304SEvan Yan for (curr = (head); curr; prev = curr, curr = curr->next) { \ 12826947304SEvan Yan if (curr == (node)) \ 12926947304SEvan Yan break; \ 13026947304SEvan Yan } \ 13126947304SEvan Yan if (curr) { \ 13226947304SEvan Yan if (prev == NULL) \ 13326947304SEvan Yan (head) = (head)->next; \ 13426947304SEvan Yan else \ 13526947304SEvan Yan prev->next = curr->next; \ 13626947304SEvan Yan } \ 13726947304SEvan Yan } 13826947304SEvan Yan 13926947304SEvan Yan int ddihp_modctl(int hp_op, char *path, char *cn_name, uintptr_t arg, 14026947304SEvan Yan uintptr_t rval); 14126947304SEvan Yan ddi_hp_cn_handle_t *ddihp_cn_name_to_handle(dev_info_t *dip, char *cn_name); 14226947304SEvan Yan int ddihp_cn_getstate(ddi_hp_cn_handle_t *hdlp); 14326947304SEvan Yan int ddihp_port_ops(ddi_hp_cn_handle_t *hdlp, ddi_hp_op_t op, 14426947304SEvan Yan void *arg, void *result); 14526947304SEvan Yan int ddihp_connector_ops(ddi_hp_cn_handle_t *hdlp, 14626947304SEvan Yan ddi_hp_op_t op, void *arg, void *result); 14726947304SEvan Yan void ddihp_cn_gen_sysevent(ddi_hp_cn_handle_t *hdlp, 14826947304SEvan Yan ddi_hp_cn_sysevent_t event_sub_class, int hint, int kmflag); 14926947304SEvan Yan int ddihp_cn_unregister(ddi_hp_cn_handle_t *hdlp); 15026947304SEvan Yan 15126947304SEvan Yan #endif /* _KERNEL */ 15226947304SEvan Yan 15326947304SEvan Yan #ifdef __cplusplus 15426947304SEvan Yan } 15526947304SEvan Yan #endif 15626947304SEvan Yan 15726947304SEvan Yan #endif /* _SYS_DDI_HP_IMPL_H */ 158