xref: /onnv-gate/usr/src/uts/common/sys/hotplug/pci/pcie_hp.h (revision 10923:df470fd79c3c)
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