1 /*
2  * linux/arch/arm/mach-omap2/cpuidle34xx.c
3  *
4  * OMAP3 CPU IDLE Routines
5  *
6  * Copyright (C) 2008 Texas Instruments, Inc.
7  * Rajendra Nayak <rnayak@ti.com>
8  *
9  * Copyright (C) 2007 Texas Instruments, Inc.
10  * Karthik Dasu <karthik-dp@ti.com>
11  *
12  * Copyright (C) 2006 Nokia Corporation
13  * Tony Lindgren <tony@atomide.com>
14  *
15  * Copyright (C) 2005 Texas Instruments, Inc.
16  * Richard Woodruff <r-woodruff2@ti.com>
17  *
18  * Based on pm.c for omap2
19  *
20  * This program is free software; you can redistribute it and/or modify
21  * it under the terms of the GNU General Public License version 2 as
22  * published by the Free Software Foundation.
23  */
24 
25 #include <linux/sched.h>
26 #include <linux/cpuidle.h>
27 
28 #include <plat/prcm.h>
29 #include <plat/irqs.h>
30 #include "powerdomain.h"
31 #include "clockdomain.h"
32 #include <plat/serial.h>
33 
34 #include "pm.h"
35 #include "control.h"
36 
37 #ifdef CONFIG_CPU_IDLE
38 
39 #define OMAP3_MAX_STATES 7
40 #define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */
41 #define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */
42 #define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */
43 #define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */
44 #define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */
45 #define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */
46 #define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */
47 
48 #define OMAP3_STATE_MAX OMAP3_STATE_C7
49 
50 #define CPUIDLE_FLAG_CHECK_BM	0x10000	/* use omap3_enter_idle_bm() */
51 
52 struct omap3_processor_cx {
53 	u8 valid;
54 	u8 type;
55 	u32 sleep_latency;
56 	u32 wakeup_latency;
57 	u32 mpu_state;
58 	u32 core_state;
59 	u32 threshold;
60 	u32 flags;
61 };
62 
63 struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES];
64 struct omap3_processor_cx current_cx_state;
65 struct powerdomain *mpu_pd, *core_pd, *per_pd;
66 struct powerdomain *cam_pd;
67 
68 /*
69  * The latencies/thresholds for various C states have
70  * to be configured from the respective board files.
71  * These are some default values (which might not provide
72  * the best power savings) used on boards which do not
73  * pass these details from the board file.
74  */
75 static struct cpuidle_params cpuidle_params_table[] = {
76 	/* C1 */
77 	{1, 2, 2, 5},
78 	/* C2 */
79 	{1, 10, 10, 30},
80 	/* C3 */
81 	{1, 50, 50, 300},
82 	/* C4 */
83 	{1, 1500, 1800, 4000},
84 	/* C5 */
85 	{1, 2500, 7500, 12000},
86 	/* C6 */
87 	{1, 3000, 8500, 15000},
88 	/* C7 */
89 	{1, 10000, 30000, 300000},
90 };
91 
92 static int omap3_idle_bm_check(void)
93 {
94 	if (!omap3_can_sleep())
95 		return 1;
96 	return 0;
97 }
98 
99 static int _cpuidle_allow_idle(struct powerdomain *pwrdm,
100 				struct clockdomain *clkdm)
101 {
102 	omap2_clkdm_allow_idle(clkdm);
103 	return 0;
104 }
105 
106 static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
107 				struct clockdomain *clkdm)
108 {
109 	omap2_clkdm_deny_idle(clkdm);
110 	return 0;
111 }
112 
113 /**
114  * omap3_enter_idle - Programs OMAP3 to enter the specified state
115  * @dev: cpuidle device
116  * @state: The target state to be programmed
117  *
118  * Called from the CPUidle framework to program the device to the
119  * specified target state selected by the governor.
120  */
121 static int omap3_enter_idle(struct cpuidle_device *dev,
122 			struct cpuidle_state *state)
123 {
124 	struct omap3_processor_cx *cx = cpuidle_get_statedata(state);
125 	struct timespec ts_preidle, ts_postidle, ts_idle;
126 	u32 mpu_state = cx->mpu_state, core_state = cx->core_state;
127 
128 	current_cx_state = *cx;
129 
130 	/* Used to keep track of the total time in idle */
131 	getnstimeofday(&ts_preidle);
132 
133 	local_irq_disable();
134 	local_fiq_disable();
135 
136 	pwrdm_set_next_pwrst(mpu_pd, mpu_state);
137 	pwrdm_set_next_pwrst(core_pd, core_state);
138 
139 	if (omap_irq_pending() || need_resched())
140 		goto return_sleep_time;
141 
142 	if (cx->type == OMAP3_STATE_C1) {
143 		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle);
144 		pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle);
145 	}
146 
147 	/* Execute ARM wfi */
148 	omap_sram_idle();
149 
150 	if (cx->type == OMAP3_STATE_C1) {
151 		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle);
152 		pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle);
153 	}
154 
155 return_sleep_time:
156 	getnstimeofday(&ts_postidle);
157 	ts_idle = timespec_sub(ts_postidle, ts_preidle);
158 
159 	local_irq_enable();
160 	local_fiq_enable();
161 
162 	return ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * USEC_PER_SEC;
163 }
164 
165 /**
166  * next_valid_state - Find next valid c-state
167  * @dev: cpuidle device
168  * @state: Currently selected c-state
169  *
170  * If the current state is valid, it is returned back to the caller.
171  * Else, this function searches for a lower c-state which is still
172  * valid (as defined in omap3_power_states[]).
173  */
174 static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev,
175 						struct cpuidle_state *curr)
176 {
177 	struct cpuidle_state *next = NULL;
178 	struct omap3_processor_cx *cx;
179 
180 	cx = (struct omap3_processor_cx *)cpuidle_get_statedata(curr);
181 
182 	/* Check if current state is valid */
183 	if (cx->valid) {
184 		return curr;
185 	} else {
186 		u8 idx = OMAP3_STATE_MAX;
187 
188 		/*
189 		 * Reach the current state starting at highest C-state
190 		 */
191 		for (; idx >= OMAP3_STATE_C1; idx--) {
192 			if (&dev->states[idx] == curr) {
193 				next = &dev->states[idx];
194 				break;
195 			}
196 		}
197 
198 		/*
199 		 * Should never hit this condition.
200 		 */
201 		WARN_ON(next == NULL);
202 
203 		/*
204 		 * Drop to next valid state.
205 		 * Start search from the next (lower) state.
206 		 */
207 		idx--;
208 		for (; idx >= OMAP3_STATE_C1; idx--) {
209 			struct omap3_processor_cx *cx;
210 
211 			cx = cpuidle_get_statedata(&dev->states[idx]);
212 			if (cx->valid) {
213 				next = &dev->states[idx];
214 				break;
215 			}
216 		}
217 		/*
218 		 * C1 and C2 are always valid.
219 		 * So, no need to check for 'next==NULL' outside this loop.
220 		 */
221 	}
222 
223 	return next;
224 }
225 
226 /**
227  * omap3_enter_idle_bm - Checks for any bus activity
228  * @dev: cpuidle device
229  * @state: The target state to be programmed
230  *
231  * Used for C states with CPUIDLE_FLAG_CHECK_BM flag set. This
232  * function checks for any pending activity and then programs the
233  * device to the specified or a safer state.
234  */
235 static int omap3_enter_idle_bm(struct cpuidle_device *dev,
236 			       struct cpuidle_state *state)
237 {
238 	struct cpuidle_state *new_state = next_valid_state(dev, state);
239 	u32 core_next_state, per_next_state = 0, per_saved_state = 0;
240 	u32 cam_state;
241 	struct omap3_processor_cx *cx;
242 	int ret;
243 
244 	if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) {
245 		BUG_ON(!dev->safe_state);
246 		new_state = dev->safe_state;
247 		goto select_state;
248 	}
249 
250 	cx = cpuidle_get_statedata(state);
251 	core_next_state = cx->core_state;
252 
253 	/*
254 	 * FIXME: we currently manage device-specific idle states
255 	 *        for PER and CORE in combination with CPU-specific
256 	 *        idle states.  This is wrong, and device-specific
257 	 *        idle management needs to be separated out into
258 	 *        its own code.
259 	 */
260 
261 	/*
262 	 * Prevent idle completely if CAM is active.
263 	 * CAM does not have wakeup capability in OMAP3.
264 	 */
265 	cam_state = pwrdm_read_pwrst(cam_pd);
266 	if (cam_state == PWRDM_POWER_ON) {
267 		new_state = dev->safe_state;
268 		goto select_state;
269 	}
270 
271 	/*
272 	 * Prevent PER off if CORE is not in retention or off as this
273 	 * would disable PER wakeups completely.
274 	 */
275 	per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd);
276 	if ((per_next_state == PWRDM_POWER_OFF) &&
277 	    (core_next_state > PWRDM_POWER_RET))
278 		per_next_state = PWRDM_POWER_RET;
279 
280 	/* Are we changing PER target state? */
281 	if (per_next_state != per_saved_state)
282 		pwrdm_set_next_pwrst(per_pd, per_next_state);
283 
284 select_state:
285 	dev->last_state = new_state;
286 	ret = omap3_enter_idle(dev, new_state);
287 
288 	/* Restore original PER state if it was modified */
289 	if (per_next_state != per_saved_state)
290 		pwrdm_set_next_pwrst(per_pd, per_saved_state);
291 
292 	return ret;
293 }
294 
295 DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev);
296 
297 /**
298  * omap3_cpuidle_update_states() - Update the cpuidle states
299  * @mpu_deepest_state:	Enable states upto and including this for mpu domain
300  * @core_deepest_state:	Enable states upto and including this for core domain
301  *
302  * This goes through the list of states available and enables and disables the
303  * validity of C states based on deepest state that can be achieved for the
304  * variable domain
305  */
306 void omap3_cpuidle_update_states(u32 mpu_deepest_state, u32 core_deepest_state)
307 {
308 	int i;
309 
310 	for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
311 		struct omap3_processor_cx *cx = &omap3_power_states[i];
312 
313 		if ((cx->mpu_state >= mpu_deepest_state) &&
314 		    (cx->core_state >= core_deepest_state)) {
315 			cx->valid = 1;
316 		} else {
317 			cx->valid = 0;
318 		}
319 	}
320 }
321 
322 void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
323 {
324 	int i;
325 
326 	if (!cpuidle_board_params)
327 		return;
328 
329 	for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
330 		cpuidle_params_table[i].valid =
331 			cpuidle_board_params[i].valid;
332 		cpuidle_params_table[i].sleep_latency =
333 			cpuidle_board_params[i].sleep_latency;
334 		cpuidle_params_table[i].wake_latency =
335 			cpuidle_board_params[i].wake_latency;
336 		cpuidle_params_table[i].threshold =
337 			cpuidle_board_params[i].threshold;
338 	}
339 	return;
340 }
341 
342 /* omap3_init_power_states - Initialises the OMAP3 specific C states.
343  *
344  * Below is the desciption of each C state.
345  * 	C1 . MPU WFI + Core active
346  *	C2 . MPU WFI + Core inactive
347  *	C3 . MPU CSWR + Core inactive
348  *	C4 . MPU OFF + Core inactive
349  *	C5 . MPU CSWR + Core CSWR
350  *	C6 . MPU OFF + Core CSWR
351  *	C7 . MPU OFF + Core OFF
352  */
353 void omap_init_power_states(void)
354 {
355 	/* C1 . MPU WFI + Core active */
356 	omap3_power_states[OMAP3_STATE_C1].valid =
357 			cpuidle_params_table[OMAP3_STATE_C1].valid;
358 	omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1;
359 	omap3_power_states[OMAP3_STATE_C1].sleep_latency =
360 			cpuidle_params_table[OMAP3_STATE_C1].sleep_latency;
361 	omap3_power_states[OMAP3_STATE_C1].wakeup_latency =
362 			cpuidle_params_table[OMAP3_STATE_C1].wake_latency;
363 	omap3_power_states[OMAP3_STATE_C1].threshold =
364 			cpuidle_params_table[OMAP3_STATE_C1].threshold;
365 	omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON;
366 	omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON;
367 	omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID;
368 
369 	/* C2 . MPU WFI + Core inactive */
370 	omap3_power_states[OMAP3_STATE_C2].valid =
371 			cpuidle_params_table[OMAP3_STATE_C2].valid;
372 	omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2;
373 	omap3_power_states[OMAP3_STATE_C2].sleep_latency =
374 			cpuidle_params_table[OMAP3_STATE_C2].sleep_latency;
375 	omap3_power_states[OMAP3_STATE_C2].wakeup_latency =
376 			cpuidle_params_table[OMAP3_STATE_C2].wake_latency;
377 	omap3_power_states[OMAP3_STATE_C2].threshold =
378 			cpuidle_params_table[OMAP3_STATE_C2].threshold;
379 	omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON;
380 	omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;
381 	omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID |
382 				CPUIDLE_FLAG_CHECK_BM;
383 
384 	/* C3 . MPU CSWR + Core inactive */
385 	omap3_power_states[OMAP3_STATE_C3].valid =
386 			cpuidle_params_table[OMAP3_STATE_C3].valid;
387 	omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3;
388 	omap3_power_states[OMAP3_STATE_C3].sleep_latency =
389 			cpuidle_params_table[OMAP3_STATE_C3].sleep_latency;
390 	omap3_power_states[OMAP3_STATE_C3].wakeup_latency =
391 			cpuidle_params_table[OMAP3_STATE_C3].wake_latency;
392 	omap3_power_states[OMAP3_STATE_C3].threshold =
393 			cpuidle_params_table[OMAP3_STATE_C3].threshold;
394 	omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET;
395 	omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON;
396 	omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID |
397 				CPUIDLE_FLAG_CHECK_BM;
398 
399 	/* C4 . MPU OFF + Core inactive */
400 	omap3_power_states[OMAP3_STATE_C4].valid =
401 			cpuidle_params_table[OMAP3_STATE_C4].valid;
402 	omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4;
403 	omap3_power_states[OMAP3_STATE_C4].sleep_latency =
404 			cpuidle_params_table[OMAP3_STATE_C4].sleep_latency;
405 	omap3_power_states[OMAP3_STATE_C4].wakeup_latency =
406 			cpuidle_params_table[OMAP3_STATE_C4].wake_latency;
407 	omap3_power_states[OMAP3_STATE_C4].threshold =
408 			cpuidle_params_table[OMAP3_STATE_C4].threshold;
409 	omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF;
410 	omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON;
411 	omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID |
412 				CPUIDLE_FLAG_CHECK_BM;
413 
414 	/* C5 . MPU CSWR + Core CSWR*/
415 	omap3_power_states[OMAP3_STATE_C5].valid =
416 			cpuidle_params_table[OMAP3_STATE_C5].valid;
417 	omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5;
418 	omap3_power_states[OMAP3_STATE_C5].sleep_latency =
419 			cpuidle_params_table[OMAP3_STATE_C5].sleep_latency;
420 	omap3_power_states[OMAP3_STATE_C5].wakeup_latency =
421 			cpuidle_params_table[OMAP3_STATE_C5].wake_latency;
422 	omap3_power_states[OMAP3_STATE_C5].threshold =
423 			cpuidle_params_table[OMAP3_STATE_C5].threshold;
424 	omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET;
425 	omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET;
426 	omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID |
427 				CPUIDLE_FLAG_CHECK_BM;
428 
429 	/* C6 . MPU OFF + Core CSWR */
430 	omap3_power_states[OMAP3_STATE_C6].valid =
431 			cpuidle_params_table[OMAP3_STATE_C6].valid;
432 	omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6;
433 	omap3_power_states[OMAP3_STATE_C6].sleep_latency =
434 			cpuidle_params_table[OMAP3_STATE_C6].sleep_latency;
435 	omap3_power_states[OMAP3_STATE_C6].wakeup_latency =
436 			cpuidle_params_table[OMAP3_STATE_C6].wake_latency;
437 	omap3_power_states[OMAP3_STATE_C6].threshold =
438 			cpuidle_params_table[OMAP3_STATE_C6].threshold;
439 	omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF;
440 	omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET;
441 	omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID |
442 				CPUIDLE_FLAG_CHECK_BM;
443 
444 	/* C7 . MPU OFF + Core OFF */
445 	omap3_power_states[OMAP3_STATE_C7].valid =
446 			cpuidle_params_table[OMAP3_STATE_C7].valid;
447 	omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7;
448 	omap3_power_states[OMAP3_STATE_C7].sleep_latency =
449 			cpuidle_params_table[OMAP3_STATE_C7].sleep_latency;
450 	omap3_power_states[OMAP3_STATE_C7].wakeup_latency =
451 			cpuidle_params_table[OMAP3_STATE_C7].wake_latency;
452 	omap3_power_states[OMAP3_STATE_C7].threshold =
453 			cpuidle_params_table[OMAP3_STATE_C7].threshold;
454 	omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF;
455 	omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF;
456 	omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID |
457 				CPUIDLE_FLAG_CHECK_BM;
458 
459 	/*
460 	 * Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot
461 	 * enable OFF mode in a stable form for previous revisions.
462 	 * we disable C7 state as a result.
463 	 */
464 	if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) {
465 		omap3_power_states[OMAP3_STATE_C7].valid = 0;
466 		cpuidle_params_table[OMAP3_STATE_C7].valid = 0;
467 		WARN_ONCE(1, "%s: core off state C7 disabled due to i583\n",
468 				__func__);
469 	}
470 }
471 
472 struct cpuidle_driver omap3_idle_driver = {
473 	.name = 	"omap3_idle",
474 	.owner = 	THIS_MODULE,
475 };
476 
477 /**
478  * omap3_idle_init - Init routine for OMAP3 idle
479  *
480  * Registers the OMAP3 specific cpuidle driver with the cpuidle
481  * framework with the valid set of states.
482  */
483 int __init omap3_idle_init(void)
484 {
485 	int i, count = 0;
486 	struct omap3_processor_cx *cx;
487 	struct cpuidle_state *state;
488 	struct cpuidle_device *dev;
489 
490 	mpu_pd = pwrdm_lookup("mpu_pwrdm");
491 	core_pd = pwrdm_lookup("core_pwrdm");
492 	per_pd = pwrdm_lookup("per_pwrdm");
493 	cam_pd = pwrdm_lookup("cam_pwrdm");
494 
495 	omap_init_power_states();
496 	cpuidle_register_driver(&omap3_idle_driver);
497 
498 	dev = &per_cpu(omap3_idle_dev, smp_processor_id());
499 
500 	for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
501 		cx = &omap3_power_states[i];
502 		state = &dev->states[count];
503 
504 		if (!cx->valid)
505 			continue;
506 		cpuidle_set_statedata(state, cx);
507 		state->exit_latency = cx->sleep_latency + cx->wakeup_latency;
508 		state->target_residency = cx->threshold;
509 		state->flags = cx->flags;
510 		state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ?
511 			omap3_enter_idle_bm : omap3_enter_idle;
512 		if (cx->type == OMAP3_STATE_C1)
513 			dev->safe_state = state;
514 		sprintf(state->name, "C%d", count+1);
515 		count++;
516 	}
517 
518 	if (!count)
519 		return -EINVAL;
520 	dev->state_count = count;
521 
522 	if (enable_off_mode)
523 		omap3_cpuidle_update_states(PWRDM_POWER_OFF, PWRDM_POWER_OFF);
524 	else
525 		omap3_cpuidle_update_states(PWRDM_POWER_RET, PWRDM_POWER_RET);
526 
527 	if (cpuidle_register_device(dev)) {
528 		printk(KERN_ERR "%s: CPUidle register device failed\n",
529 		       __func__);
530 		return -EIO;
531 	}
532 
533 	return 0;
534 }
535 #else
536 int __init omap3_idle_init(void)
537 {
538 	return 0;
539 }
540 #endif /* CONFIG_CPU_IDLE */
541