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 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_CPU_PM_H
27#define	_CPU_PM_H
28
29#ifdef	__cplusplus
30extern "C" {
31#endif
32
33#if (defined(_KERNEL) || defined(_KMEMUSER))
34#include <sys/cpuvar.h>
35#include <sys/processor.h>
36#include <sys/types.h>
37#include <sys/kstat.h>
38#include <sys/cmt.h>
39
40/*
41 * CPU Power Manager Policies
42 */
43typedef enum cpupm_policy {
44	CPUPM_POLICY_ELASTIC,
45	CPUPM_POLICY_DISABLED,
46	CPUPM_NUM_POLICIES
47} cpupm_policy_t;
48
49/*
50 * Power Managable CPU Domain Types
51 */
52typedef enum cpupm_dtype {
53	CPUPM_DTYPE_ACTIVE,	/* Active Power Domain */
54	CPUPM_DTYPE_IDLE	/* Idle Power Domain */
55} cpupm_dtype_t;
56
57/*
58 * CPUPM state names for policy implementation.
59 * The last element is used to size the enumeration.
60 */
61typedef enum cpupm_state_name {
62	CPUPM_STATE_LOW_POWER,
63	CPUPM_STATE_MAX_PERF,
64	CPUPM_STATE_NAMES
65} cpupm_state_name_t;
66
67/*
68 * Possible states for the domain's transience governor
69 */
70typedef enum cpupm_gov_state_t {
71	CPUPM_GOV_DISENGAGED,
72	CPUPM_GOV_TRANS_IDLE,	/* Transient idleness, lowerings disabled */
73	CPUPM_GOV_TRANS_WORK	/* Transient work, raises disabled */
74} cpupm_gov_state_t;
75
76/*
77 * Utilization events delivered by the dispatcher.
78 */
79typedef enum cpupm_util_event {
80	CPUPM_DOM_BUSY_FROM_IDLE,
81	CPUPM_DOM_IDLE_FROM_BUSY,
82	CPUPM_DOM_REMAIN_BUSY
83} cpupm_util_event_t;
84
85typedef uintptr_t	cpupm_handle_t;	/* Platform handle */
86
87/*
88 * CPU Power Domain State
89 */
90typedef struct cpupm_state {
91	uint32_t	cps_speed;
92	cpupm_handle_t	cps_handle;
93} cpupm_state_t;
94
95/*
96 * CPU Power Domain
97 */
98typedef struct cpupm_domain {
99	id_t			cpd_id;		/* Domain ID */
100	cpupm_dtype_t		cpd_type;	/* Active or Idle */
101	cpupm_state_t		*cpd_states;	/* Available Power States */
102	cpupm_state_t		*cpd_state;	/* Current State */
103	uint_t			cpd_nstates;	/* Number of States */
104	cpupm_state_t		*cpd_named_states[CPUPM_STATE_NAMES];
105	hrtime_t		cpd_last_raise;	/* Last raise request time */
106	hrtime_t		cpd_last_lower;	/* last lower request time */
107	int			cpd_ti;		/* transient idle history */
108	int			cpd_tw;		/* transient work history */
109	cpupm_gov_state_t	cpd_governor;   /* transience governor */
110	struct cpupm_domain	*cpd_next;
111} cpupm_domain_t;
112
113#define	CPUPM_NO_DOMAIN ((id_t)-1)
114
115/*
116 * CPU power manager domain management interfaces
117 */
118cpupm_domain_t		*cpupm_domain_init(struct cpu *, cpupm_dtype_t);
119id_t			cpupm_domain_id(struct cpu *, cpupm_dtype_t);
120int			cpupm_change_state(struct cpu *, cpupm_domain_t *,
121    cpupm_state_t *);
122extern void		cpupm_redefine_max_activepwr_state(struct cpu *, int);
123
124/*
125 * CPU power manager policy engine interfaces
126 */
127int			cpupm_set_policy(cpupm_policy_t);
128cpupm_policy_t		cpupm_get_policy(void);
129void			cpupm_utilization_event(struct cpu *, hrtime_t,
130			    cpupm_domain_t *, cpupm_util_event_t);
131
132/*
133 * CPU power platform driver interfaces
134 */
135id_t	cpupm_plat_domain_id(struct cpu *, cpupm_dtype_t);
136uint_t	cpupm_plat_state_enumerate(struct cpu *, cpupm_dtype_t,
137    cpupm_state_t *);
138int	cpupm_plat_change_state(struct cpu *, cpupm_state_t *);
139
140
141#endif	/* !_KERNEL && !_KMEMUSER */
142
143#ifdef	__cplusplus
144}
145#endif
146
147#endif /* _CPU_PM_H */
148