Blame view

include/linux/cpuidle.h 5.28 KB
4f86d3a8e   Len Brown   cpuidle: consolid...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * cpuidle.h - a generic framework for CPU idle power management
   *
   * (C) 2007 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
   *          Shaohua Li <shaohua.li@intel.com>
   *          Adam Belay <abelay@novell.com>
   *
   * This code is licenced under the GPL.
   */
  
  #ifndef _LINUX_CPUIDLE_H
  #define _LINUX_CPUIDLE_H
  
  #include <linux/percpu.h>
  #include <linux/list.h>
4f86d3a8e   Len Brown   cpuidle: consolid...
16
17
18
19
20
  #include <linux/kobject.h>
  #include <linux/completion.h>
  
  #define CPUIDLE_STATE_MAX	8
  #define CPUIDLE_NAME_LEN	16
4fcb2fcd4   Venkatesh Pallipadi   ACPI, cpuidle: Cl...
21
  #define CPUIDLE_DESC_LEN	32
4f86d3a8e   Len Brown   cpuidle: consolid...
22

de4772542   Paul Gortmaker   include: replace ...
23
  struct module;
4f86d3a8e   Len Brown   cpuidle: consolid...
24
  struct cpuidle_device;
46bcfad7a   Deepthi Dharwar   cpuidle: Single/G...
25
  struct cpuidle_driver;
4f86d3a8e   Len Brown   cpuidle: consolid...
26
27
28
29
30
  
  
  /****************************
   * CPUIDLE DEVICE INTERFACE *
   ****************************/
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
31
32
33
34
35
36
  struct cpuidle_state_usage {
  	void		*driver_data;
  
  	unsigned long long	usage;
  	unsigned long long	time; /* in US */
  };
4f86d3a8e   Len Brown   cpuidle: consolid...
37
38
  struct cpuidle_state {
  	char		name[CPUIDLE_NAME_LEN];
4fcb2fcd4   Venkatesh Pallipadi   ACPI, cpuidle: Cl...
39
  	char		desc[CPUIDLE_DESC_LEN];
4f86d3a8e   Len Brown   cpuidle: consolid...
40
41
42
43
44
  
  	unsigned int	flags;
  	unsigned int	exit_latency; /* in US */
  	unsigned int	power_usage; /* in mW */
  	unsigned int	target_residency; /* in US */
4f86d3a8e   Len Brown   cpuidle: consolid...
45
  	int (*enter)	(struct cpuidle_device *dev,
46bcfad7a   Deepthi Dharwar   cpuidle: Single/G...
46
  			struct cpuidle_driver *drv,
e978aa7d7   Deepthi Dharwar   cpuidle: Move dev...
47
  			int index);
4f86d3a8e   Len Brown   cpuidle: consolid...
48
49
50
51
  };
  
  /* Idle State Flags */
  #define CPUIDLE_FLAG_TIME_VALID	(0x01) /* is residency time measurable? */
4f86d3a8e   Len Brown   cpuidle: consolid...
52
53
54
55
56
  
  #define CPUIDLE_DRIVER_FLAGS_MASK (0xFFFF0000)
  
  /**
   * cpuidle_get_statedata - retrieves private driver state data
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
57
   * @st_usage: the state usage statistics
4f86d3a8e   Len Brown   cpuidle: consolid...
58
   */
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
59
  static inline void *cpuidle_get_statedata(struct cpuidle_state_usage *st_usage)
4f86d3a8e   Len Brown   cpuidle: consolid...
60
  {
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
61
  	return st_usage->driver_data;
4f86d3a8e   Len Brown   cpuidle: consolid...
62
63
64
65
  }
  
  /**
   * cpuidle_set_statedata - stores private driver state data
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
66
   * @st_usage: the state usage statistics
4f86d3a8e   Len Brown   cpuidle: consolid...
67
68
69
   * @data: the private data
   */
  static inline void
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
70
  cpuidle_set_statedata(struct cpuidle_state_usage *st_usage, void *data)
4f86d3a8e   Len Brown   cpuidle: consolid...
71
  {
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
72
  	st_usage->driver_data = data;
4f86d3a8e   Len Brown   cpuidle: consolid...
73
74
75
76
  }
  
  struct cpuidle_state_kobj {
  	struct cpuidle_state *state;
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
77
  	struct cpuidle_state_usage *state_usage;
4f86d3a8e   Len Brown   cpuidle: consolid...
78
79
80
81
82
  	struct completion kobj_unregister;
  	struct kobject kobj;
  };
  
  struct cpuidle_device {
dcb84f335   Venkatesh Pallipadi   cpuidle acpi driv...
83
  	unsigned int		registered:1;
b5556a67f   Harvey Harrison   cpuidle: dubious ...
84
  	unsigned int		enabled:1;
4f86d3a8e   Len Brown   cpuidle: consolid...
85
86
87
88
  	unsigned int		cpu;
  
  	int			last_residency;
  	int			state_count;
4202735e8   Deepthi Dharwar   cpuidle: Split cp...
89
  	struct cpuidle_state_usage	states_usage[CPUIDLE_STATE_MAX];
4f86d3a8e   Len Brown   cpuidle: consolid...
90
  	struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
4f86d3a8e   Len Brown   cpuidle: consolid...
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  
  	struct list_head 	device_list;
  	struct kobject		kobj;
  	struct completion	kobj_unregister;
  	void			*governor_data;
  };
  
  DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
  
  /**
   * cpuidle_get_last_residency - retrieves the last state's residency time
   * @dev: the target CPU
   *
   * NOTE: this value is invalid if CPUIDLE_FLAG_TIME_VALID isn't set
   */
  static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
  {
  	return dev->last_residency;
  }
  
  
  /****************************
   * CPUIDLE DRIVER INTERFACE *
   ****************************/
  
  struct cpuidle_driver {
  	char			name[CPUIDLE_NAME_LEN];
  	struct module 		*owner;
46bcfad7a   Deepthi Dharwar   cpuidle: Single/G...
119
120
121
122
123
  
  	unsigned int		power_specified:1;
  	struct cpuidle_state	states[CPUIDLE_STATE_MAX];
  	int			state_count;
  	int			safe_state_index;
4f86d3a8e   Len Brown   cpuidle: consolid...
124
125
126
  };
  
  #ifdef CONFIG_CPU_IDLE
d91ee5863   Len Brown   cpuidle: replace ...
127
  extern void disable_cpuidle(void);
a0bfa1373   Len Brown   cpuidle: stop dep...
128
  extern int cpuidle_idle_call(void);
4f86d3a8e   Len Brown   cpuidle: consolid...
129
  extern int cpuidle_register_driver(struct cpuidle_driver *drv);
752138df0   Len Brown   cpuidle: make cpu...
130
  struct cpuidle_driver *cpuidle_get_driver(void);
4f86d3a8e   Len Brown   cpuidle: consolid...
131
132
133
134
135
136
137
138
139
140
  extern void cpuidle_unregister_driver(struct cpuidle_driver *drv);
  extern int cpuidle_register_device(struct cpuidle_device *dev);
  extern void cpuidle_unregister_device(struct cpuidle_device *dev);
  
  extern void cpuidle_pause_and_lock(void);
  extern void cpuidle_resume_and_unlock(void);
  extern int cpuidle_enable_device(struct cpuidle_device *dev);
  extern void cpuidle_disable_device(struct cpuidle_device *dev);
  
  #else
d91ee5863   Len Brown   cpuidle: replace ...
141
  static inline void disable_cpuidle(void) { }
a0bfa1373   Len Brown   cpuidle: stop dep...
142
  static inline int cpuidle_idle_call(void) { return -ENODEV; }
4f86d3a8e   Len Brown   cpuidle: consolid...
143
  static inline int cpuidle_register_driver(struct cpuidle_driver *drv)
6b2c676bf   Len Brown   cpuidle: fail to ...
144
  {return -ENODEV; }
752138df0   Len Brown   cpuidle: make cpu...
145
  static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; }
4f86d3a8e   Len Brown   cpuidle: consolid...
146
147
  static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { }
  static inline int cpuidle_register_device(struct cpuidle_device *dev)
6b2c676bf   Len Brown   cpuidle: fail to ...
148
  {return -ENODEV; }
4f86d3a8e   Len Brown   cpuidle: consolid...
149
150
151
152
153
  static inline void cpuidle_unregister_device(struct cpuidle_device *dev) { }
  
  static inline void cpuidle_pause_and_lock(void) { }
  static inline void cpuidle_resume_and_unlock(void) { }
  static inline int cpuidle_enable_device(struct cpuidle_device *dev)
6b2c676bf   Len Brown   cpuidle: fail to ...
154
  {return -ENODEV; }
4f86d3a8e   Len Brown   cpuidle: consolid...
155
156
157
158
159
160
161
162
163
164
165
166
  static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
  
  #endif
  
  /******************************
   * CPUIDLE GOVERNOR INTERFACE *
   ******************************/
  
  struct cpuidle_governor {
  	char			name[CPUIDLE_NAME_LEN];
  	struct list_head 	governor_list;
  	unsigned int		rating;
46bcfad7a   Deepthi Dharwar   cpuidle: Single/G...
167
168
169
170
  	int  (*enable)		(struct cpuidle_driver *drv,
  					struct cpuidle_device *dev);
  	void (*disable)		(struct cpuidle_driver *drv,
  					struct cpuidle_device *dev);
4f86d3a8e   Len Brown   cpuidle: consolid...
171

46bcfad7a   Deepthi Dharwar   cpuidle: Single/G...
172
173
  	int  (*select)		(struct cpuidle_driver *drv,
  					struct cpuidle_device *dev);
e978aa7d7   Deepthi Dharwar   cpuidle: Move dev...
174
  	void (*reflect)		(struct cpuidle_device *dev, int index);
4f86d3a8e   Len Brown   cpuidle: consolid...
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  
  	struct module 		*owner;
  };
  
  #ifdef CONFIG_CPU_IDLE
  
  extern int cpuidle_register_governor(struct cpuidle_governor *gov);
  extern void cpuidle_unregister_governor(struct cpuidle_governor *gov);
  
  #else
  
  static inline int cpuidle_register_governor(struct cpuidle_governor *gov)
  {return 0;}
  static inline void cpuidle_unregister_governor(struct cpuidle_governor *gov) { }
  
  #endif
9a0b84158   venkatesh.pallipadi@intel.com   cpuidle: Add a po...
191
192
193
194
195
  #ifdef CONFIG_ARCH_HAS_CPU_RELAX
  #define CPUIDLE_DRIVER_STATE_START	1
  #else
  #define CPUIDLE_DRIVER_STATE_START	0
  #endif
4f86d3a8e   Len Brown   cpuidle: consolid...
196
  #endif /* _LINUX_CPUIDLE_H */