aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/idle
diff options
context:
space:
mode:
authorDeepthi Dharwar <deepthi@linux.vnet.ibm.com>2011-10-28 06:50:33 -0400
committerLen Brown <len.brown@intel.com>2011-11-06 21:13:49 -0500
commit4202735e8ab6ecfb0381631a0d0b58fefe0bd4e2 (patch)
tree189e5aab466995128c5a9d5a2a4075a5db530674 /drivers/idle
parentb25edc42bfb9602f0503474b2c94701d5536ce60 (diff)
cpuidle: Split cpuidle_state structure and move per-cpu statistics fields
This is the first step towards global registration of cpuidle states. The statistics used primarily by the governor are per-cpu and have to be split from rest of the fields inside cpuidle_state, which would be made global i.e. single copy. The driver_data field is also per-cpu and moved. Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com> Signed-off-by: Trinabh Gupta <g.trinabh@gmail.com> Tested-by: Jean Pihet <j-pihet@ti.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Acked-by: Arjan van de Ven <arjan@linux.intel.com> Acked-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/idle')
-rw-r--r--drivers/idle/intel_idle.c46
1 files changed, 34 insertions, 12 deletions
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c
index a1c888d2216a..3aa8d4cb6dca 100644
--- a/drivers/idle/intel_idle.c
+++ b/drivers/idle/intel_idle.c
@@ -109,7 +109,6 @@ static struct cpuidle_state nehalem_cstates[MWAIT_MAX_NUM_CSTATES] = {
109 { /* MWAIT C1 */ 109 { /* MWAIT C1 */
110 .name = "C1-NHM", 110 .name = "C1-NHM",
111 .desc = "MWAIT 0x00", 111 .desc = "MWAIT 0x00",
112 .driver_data = (void *) 0x00,
113 .flags = CPUIDLE_FLAG_TIME_VALID, 112 .flags = CPUIDLE_FLAG_TIME_VALID,
114 .exit_latency = 3, 113 .exit_latency = 3,
115 .target_residency = 6, 114 .target_residency = 6,
@@ -117,7 +116,6 @@ static struct cpuidle_state nehalem_cstates[MWAIT_MAX_NUM_CSTATES] = {
117 { /* MWAIT C2 */ 116 { /* MWAIT C2 */
118 .name = "C3-NHM", 117 .name = "C3-NHM",
119 .desc = "MWAIT 0x10", 118 .desc = "MWAIT 0x10",
120 .driver_data = (void *) 0x10,
121 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 119 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
122 .exit_latency = 20, 120 .exit_latency = 20,
123 .target_residency = 80, 121 .target_residency = 80,
@@ -125,7 +123,6 @@ static struct cpuidle_state nehalem_cstates[MWAIT_MAX_NUM_CSTATES] = {
125 { /* MWAIT C3 */ 123 { /* MWAIT C3 */
126 .name = "C6-NHM", 124 .name = "C6-NHM",
127 .desc = "MWAIT 0x20", 125 .desc = "MWAIT 0x20",
128 .driver_data = (void *) 0x20,
129 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 126 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
130 .exit_latency = 200, 127 .exit_latency = 200,
131 .target_residency = 800, 128 .target_residency = 800,
@@ -137,7 +134,6 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = {
137 { /* MWAIT C1 */ 134 { /* MWAIT C1 */
138 .name = "C1-SNB", 135 .name = "C1-SNB",
139 .desc = "MWAIT 0x00", 136 .desc = "MWAIT 0x00",
140 .driver_data = (void *) 0x00,
141 .flags = CPUIDLE_FLAG_TIME_VALID, 137 .flags = CPUIDLE_FLAG_TIME_VALID,
142 .exit_latency = 1, 138 .exit_latency = 1,
143 .target_residency = 1, 139 .target_residency = 1,
@@ -145,7 +141,6 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = {
145 { /* MWAIT C2 */ 141 { /* MWAIT C2 */
146 .name = "C3-SNB", 142 .name = "C3-SNB",
147 .desc = "MWAIT 0x10", 143 .desc = "MWAIT 0x10",
148 .driver_data = (void *) 0x10,
149 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 144 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
150 .exit_latency = 80, 145 .exit_latency = 80,
151 .target_residency = 211, 146 .target_residency = 211,
@@ -153,7 +148,6 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = {
153 { /* MWAIT C3 */ 148 { /* MWAIT C3 */
154 .name = "C6-SNB", 149 .name = "C6-SNB",
155 .desc = "MWAIT 0x20", 150 .desc = "MWAIT 0x20",
156 .driver_data = (void *) 0x20,
157 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 151 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
158 .exit_latency = 104, 152 .exit_latency = 104,
159 .target_residency = 345, 153 .target_residency = 345,
@@ -161,7 +155,6 @@ static struct cpuidle_state snb_cstates[MWAIT_MAX_NUM_CSTATES] = {
161 { /* MWAIT C4 */ 155 { /* MWAIT C4 */
162 .name = "C7-SNB", 156 .name = "C7-SNB",
163 .desc = "MWAIT 0x30", 157 .desc = "MWAIT 0x30",
164 .driver_data = (void *) 0x30,
165 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 158 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
166 .exit_latency = 109, 159 .exit_latency = 109,
167 .target_residency = 345, 160 .target_residency = 345,
@@ -173,7 +166,6 @@ static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
173 { /* MWAIT C1 */ 166 { /* MWAIT C1 */
174 .name = "C1-ATM", 167 .name = "C1-ATM",
175 .desc = "MWAIT 0x00", 168 .desc = "MWAIT 0x00",
176 .driver_data = (void *) 0x00,
177 .flags = CPUIDLE_FLAG_TIME_VALID, 169 .flags = CPUIDLE_FLAG_TIME_VALID,
178 .exit_latency = 1, 170 .exit_latency = 1,
179 .target_residency = 4, 171 .target_residency = 4,
@@ -181,7 +173,6 @@ static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
181 { /* MWAIT C2 */ 173 { /* MWAIT C2 */
182 .name = "C2-ATM", 174 .name = "C2-ATM",
183 .desc = "MWAIT 0x10", 175 .desc = "MWAIT 0x10",
184 .driver_data = (void *) 0x10,
185 .flags = CPUIDLE_FLAG_TIME_VALID, 176 .flags = CPUIDLE_FLAG_TIME_VALID,
186 .exit_latency = 20, 177 .exit_latency = 20,
187 .target_residency = 80, 178 .target_residency = 80,
@@ -190,7 +181,6 @@ static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
190 { /* MWAIT C4 */ 181 { /* MWAIT C4 */
191 .name = "C4-ATM", 182 .name = "C4-ATM",
192 .desc = "MWAIT 0x30", 183 .desc = "MWAIT 0x30",
193 .driver_data = (void *) 0x30,
194 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 184 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
195 .exit_latency = 100, 185 .exit_latency = 100,
196 .target_residency = 400, 186 .target_residency = 400,
@@ -199,13 +189,41 @@ static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
199 { /* MWAIT C6 */ 189 { /* MWAIT C6 */
200 .name = "C6-ATM", 190 .name = "C6-ATM",
201 .desc = "MWAIT 0x52", 191 .desc = "MWAIT 0x52",
202 .driver_data = (void *) 0x52,
203 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 192 .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
204 .exit_latency = 140, 193 .exit_latency = 140,
205 .target_residency = 560, 194 .target_residency = 560,
206 .enter = &intel_idle }, 195 .enter = &intel_idle },
207}; 196};
208 197
198static int get_driver_data(int cstate)
199{
200 int driver_data;
201 switch (cstate) {
202
203 case 1: /* MWAIT C1 */
204 driver_data = 0x00;
205 break;
206 case 2: /* MWAIT C2 */
207 driver_data = 0x10;
208 break;
209 case 3: /* MWAIT C3 */
210 driver_data = 0x20;
211 break;
212 case 4: /* MWAIT C4 */
213 driver_data = 0x30;
214 break;
215 case 5: /* MWAIT C5 */
216 driver_data = 0x40;
217 break;
218 case 6: /* MWAIT C6 */
219 driver_data = 0x52;
220 break;
221 default:
222 driver_data = 0x00;
223 }
224 return driver_data;
225}
226
209/** 227/**
210 * intel_idle 228 * intel_idle
211 * @dev: cpuidle_device 229 * @dev: cpuidle_device
@@ -216,7 +234,8 @@ static int intel_idle(struct cpuidle_device *dev, int index)
216{ 234{
217 unsigned long ecx = 1; /* break on interrupt flag */ 235 unsigned long ecx = 1; /* break on interrupt flag */
218 struct cpuidle_state *state = &dev->states[index]; 236 struct cpuidle_state *state = &dev->states[index];
219 unsigned long eax = (unsigned long)cpuidle_get_statedata(state); 237 struct cpuidle_state_usage *state_usage = &dev->states_usage[index];
238 unsigned long eax = (unsigned long)cpuidle_get_statedata(state_usage);
220 unsigned int cstate; 239 unsigned int cstate;
221 ktime_t kt_before, kt_after; 240 ktime_t kt_before, kt_after;
222 s64 usec_delta; 241 s64 usec_delta;
@@ -451,6 +470,9 @@ static int intel_idle_cpuidle_devices_init(void)
451 dev->states[dev->state_count] = /* structure copy */ 470 dev->states[dev->state_count] = /* structure copy */
452 cpuidle_state_table[cstate]; 471 cpuidle_state_table[cstate];
453 472
473 dev->states_usage[dev->state_count].driver_data =
474 (void *)get_driver_data(cstate);
475
454 dev->state_count += 1; 476 dev->state_count += 1;
455 } 477 }
456 478