xref: /illumos-gate/usr/src/uts/common/sys/sunpm.h (revision fc80c0dfb0c877aee828d778ea32b77fcf7b1ef4)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_SUNPM_H
27 #define	_SYS_SUNPM_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * Sun Specific Power Management definitions
33  */
34 
35 #include <sys/isa_defs.h>
36 #include <sys/dditypes.h>
37 #include <sys/ddipropdefs.h>
38 #include <sys/devops.h>
39 #include <sys/time.h>
40 #include <sys/cmn_err.h>
41 #include <sys/ddidevmap.h>
42 #include <sys/ddi_implfuncs.h>
43 #include <sys/ddi_isa.h>
44 #include <sys/model.h>
45 #include <sys/devctl.h>
46 
47 #ifdef	__cplusplus
48 extern "C" {
49 #endif
50 
51 #ifdef	_KERNEL
52 
53 /*
54  * Power cycle transition check is supported for these devices.
55  */
56 #define	DC_SCSI_FORMAT		0x1		/* SCSI */
57 
58 #define	DC_SCSI_MFR_LEN		6		/* YYYYWW */
59 
60 struct pm_scsi_cycles {
61 	int	lifemax;			/* lifetime max power cycles */
62 	int	ncycles;			/* number of cycles so far */
63 	char	svc_date[DC_SCSI_MFR_LEN];	/* service date YYYYWW */
64 	int	flag;				/* reserved for future */
65 };
66 
67 struct pm_trans_data {
68 	int	format;				/* data format */
69 	union {
70 		struct pm_scsi_cycles scsi_cycles;
71 	} un;
72 };
73 
74 /*
75  * Power levels for devices supporting ACPI based D0, D1, D2, D3 states.
76  *
77  * Note that 0 is off in Solaris PM framework but D0 is full power
78  * for these devices.
79  */
80 #define	PM_LEVEL_D3		0	/* D3 state - off */
81 #define	PM_LEVEL_D2		1	/* D2 state */
82 #define	PM_LEVEL_D1		2	/* D1 state */
83 #define	PM_LEVEL_D0		3	/* D0 state - fully on */
84 
85 /*
86  * Useful strings for creating pm-components property for these devices.
87  * If a device driver wishes to provide more specific description of power
88  * levels (highly recommended), it should NOT use following generic defines.
89  */
90 #define	PM_LEVEL_D3_STR		"0=Device D3 State"
91 #define	PM_LEVEL_D2_STR		"1=Device D2 State"
92 #define	PM_LEVEL_D1_STR		"2=Device D1 State"
93 #define	PM_LEVEL_D0_STR		"3=Device D0 State"
94 
95 /*
96  * If you add or remove a function or data reference, please
97  * remember to duplicate the action below the #else clause for
98  * __STDC__.
99  */
100 
101 #ifdef	__STDC__
102 
103 /*
104  * Generic Sun PM definitions.
105  */
106 
107 /*
108  * These are obsolete power management interfaces, they will be removed from
109  * a subsequent release.
110  */
111 int
112 pm_create_components(dev_info_t *dip, int num_components);
113 
114 void
115 pm_destroy_components(dev_info_t *dip);
116 
117 void
118 pm_set_normal_power(dev_info_t *dip, int component_number, int level);
119 
120 int
121 pm_get_normal_power(dev_info_t *dip, int component_number);
122 
123 /*
124  * These are power management interfaces.
125  */
126 
127 int
128 pm_busy_component(dev_info_t *dip, int component_number);
129 
130 int
131 pm_idle_component(dev_info_t *dip, int component_number);
132 
133 int
134 pm_get_current_power(dev_info_t *dip, int component, int *levelp);
135 
136 int
137 pm_power_has_changed(dev_info_t *, int, int);
138 
139 int
140 pm_trans_check(struct pm_trans_data *datap, time_t *intervalp);
141 
142 int
143 pm_lower_power(dev_info_t *dip, int comp, int level);
144 
145 int
146 pm_raise_power(dev_info_t *dip, int comp, int level);
147 
148 int
149 pm_update_maxpower(dev_info_t *dip, int comp, int level);
150 
151 #else	/* __STDC__ */
152 
153 /*
154  * Obsolete interfaces.
155  */
156 extern int pm_create_components();
157 extern void pm_destroy_components();
158 extern void pm_set_normal_power();
159 extern int pm_get_normal_power();
160 
161 /*
162  * PM interfaces
163  */
164 extern int pm_busy_component();
165 extern int pm_idle_component();
166 extern int pm_get_current_power();
167 extern int pm_power_has_changed();
168 extern int pm_trans_check();
169 extern int pm_lower_power();
170 extern int pm_raise_power();
171 extern int pm_update_maxpower();
172 
173 #endif	/* __STDC__ */
174 
175 #endif	/* _KERNEL */
176 
177 #ifdef	__cplusplus
178 }
179 #endif
180 
181 #endif	/* _SYS_SUNPM_H */
182