Skip to content

Commit

Permalink
powerpc/cpufreq: Add pr_warn() on OPAL firmware failures
Browse files Browse the repository at this point in the history
Cpufreq depends on platform firmware to implement PStates.  In case of
platform firmware failure, cpufreq should not panic host kernel with
BUG_ON().  Less severe pr_warn() will suffice.

Add firmware_has_feature(FW_FEATURE_OPALv3) check to
skip probing for device-tree on non-powernv platforms.

Signed-off-by: Vaidyanathan Srinivasan <[email protected]>
Acked-by: Gautham R. Shenoy <[email protected]>
CC: <[email protected]>
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
  • Loading branch information
svaidy authored and ozbenh committed Aug 5, 2014
1 parent b00fc6e commit 6174bac
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions drivers/cpufreq/powernv-cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/of.h>

#include <asm/cputhreads.h>
#include <asm/firmware.h>
#include <asm/reg.h>
#include <asm/smp.h> /* Required for cpu_sibling_mask() in UP configs */

Expand Down Expand Up @@ -98,7 +99,11 @@ static int init_powernv_pstates(void)
return -ENODEV;
}

WARN_ON(len_ids != len_freqs);
if (len_ids != len_freqs) {
pr_warn("Entries in ibm,pstate-ids and "
"ibm,pstate-frequencies-mhz does not match\n");
}

nr_pstates = min(len_ids, len_freqs) / sizeof(u32);
if (!nr_pstates) {
pr_warn("No PStates found\n");
Expand Down Expand Up @@ -131,7 +136,12 @@ static unsigned int pstate_id_to_freq(int pstate_id)
int i;

i = powernv_pstate_info.max - pstate_id;
BUG_ON(i >= powernv_pstate_info.nr_pstates || i < 0);
if (i >= powernv_pstate_info.nr_pstates || i < 0) {
pr_warn("PState id %d outside of PState table, "
"reporting nominal id %d instead\n",
pstate_id, powernv_pstate_info.nominal);
i = powernv_pstate_info.max - powernv_pstate_info.nominal;
}

return powernv_freqs[i].frequency;
}
Expand Down Expand Up @@ -321,6 +331,10 @@ static int __init powernv_cpufreq_init(void)
{
int rc = 0;

/* Don't probe on pseries (guest) platforms */
if (!firmware_has_feature(FW_FEATURE_OPALv3))
return -ENODEV;

/* Discover pstates from device tree and init */
rc = init_powernv_pstates();
if (rc) {
Expand Down

0 comments on commit 6174bac

Please sign in to comment.