diff options
Diffstat (limited to 'arch/powerpc/platforms/powernv/setup.c')
-rw-r--r-- | arch/powerpc/platforms/powernv/setup.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c index 30b1c3e298a6..88e579e62a73 100644 --- a/arch/powerpc/platforms/powernv/setup.c +++ b/arch/powerpc/platforms/powernv/setup.c | |||
@@ -288,6 +288,55 @@ static void __init pnv_setup_machdep_rtas(void) | |||
288 | } | 288 | } |
289 | #endif /* CONFIG_PPC_POWERNV_RTAS */ | 289 | #endif /* CONFIG_PPC_POWERNV_RTAS */ |
290 | 290 | ||
291 | static u32 supported_cpuidle_states; | ||
292 | |||
293 | u32 pnv_get_supported_cpuidle_states(void) | ||
294 | { | ||
295 | return supported_cpuidle_states; | ||
296 | } | ||
297 | |||
298 | static int __init pnv_init_idle_states(void) | ||
299 | { | ||
300 | struct device_node *power_mgt; | ||
301 | int dt_idle_states; | ||
302 | const __be32 *idle_state_flags; | ||
303 | u32 len_flags, flags; | ||
304 | int i; | ||
305 | |||
306 | supported_cpuidle_states = 0; | ||
307 | |||
308 | if (cpuidle_disable != IDLE_NO_OVERRIDE) | ||
309 | return 0; | ||
310 | |||
311 | if (!firmware_has_feature(FW_FEATURE_OPALv3)) | ||
312 | return 0; | ||
313 | |||
314 | power_mgt = of_find_node_by_path("/ibm,opal/power-mgt"); | ||
315 | if (!power_mgt) { | ||
316 | pr_warn("opal: PowerMgmt Node not found\n"); | ||
317 | return 0; | ||
318 | } | ||
319 | |||
320 | idle_state_flags = of_get_property(power_mgt, | ||
321 | "ibm,cpu-idle-state-flags", &len_flags); | ||
322 | if (!idle_state_flags) { | ||
323 | pr_warn("DT-PowerMgmt: missing ibm,cpu-idle-state-flags\n"); | ||
324 | return 0; | ||
325 | } | ||
326 | |||
327 | dt_idle_states = len_flags / sizeof(u32); | ||
328 | |||
329 | for (i = 0; i < dt_idle_states; i++) { | ||
330 | flags = be32_to_cpu(idle_state_flags[i]); | ||
331 | supported_cpuidle_states |= flags; | ||
332 | } | ||
333 | |||
334 | return 0; | ||
335 | } | ||
336 | |||
337 | subsys_initcall(pnv_init_idle_states); | ||
338 | |||
339 | |||
291 | static int __init pnv_probe(void) | 340 | static int __init pnv_probe(void) |
292 | { | 341 | { |
293 | unsigned long root = of_get_flat_dt_root(); | 342 | unsigned long root = of_get_flat_dt_root(); |