Skip to content

Commit

Permalink
cpufreq: powernv: Restore cpu frequency to policy->cur on unthrottling
Browse files Browse the repository at this point in the history
If frequency is throttled due to OCC reset then cpus will be in Psafe
frequency, so restore the frequency on all cpus to policy->cur when
OCCs are active again. And if frequency is throttled due to Pmax
capping then restore the frequency of all the cpus  in the chip on
unthrottling.

Signed-off-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Shilpasri G Bhat authored and Rafael J. Wysocki committed Jul 28, 2015
1 parent 3dd3ebe commit 2279428
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions drivers/cpufreq/powernv-cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ static struct chip {
bool throttled;
cpumask_t mask;
struct work_struct throttle;
bool restore;
} *chips;

static int nr_chips;
Expand Down Expand Up @@ -415,9 +416,29 @@ static struct notifier_block powernv_cpufreq_reboot_nb = {
void powernv_cpufreq_work_fn(struct work_struct *work)
{
struct chip *chip = container_of(work, struct chip, throttle);
unsigned int cpu;
cpumask_var_t mask;

smp_call_function_any(&chip->mask,
powernv_cpufreq_throttle_check, NULL, 0);

if (!chip->restore)
return;

chip->restore = false;
cpumask_copy(mask, &chip->mask);
for_each_cpu_and(cpu, mask, cpu_online_mask) {
int index, tcpu;
struct cpufreq_policy policy;

cpufreq_get_policy(&policy, cpu);
cpufreq_frequency_table_target(&policy, policy.freq_table,
policy.cur,
CPUFREQ_RELATION_C, &index);
powernv_cpufreq_target_index(&policy, index);
for_each_cpu(tcpu, policy.cpus)
cpumask_clear_cpu(tcpu, mask);
}
}

static char throttle_reason[][30] = {
Expand Down Expand Up @@ -469,8 +490,10 @@ static int powernv_cpufreq_occ_msg(struct notifier_block *nb,
throttled = false;
pr_info("OCC: Active\n");

for (i = 0; i < nr_chips; i++)
for (i = 0; i < nr_chips; i++) {
chips[i].restore = true;
schedule_work(&chips[i].throttle);
}

return 0;
}
Expand All @@ -487,8 +510,11 @@ static int powernv_cpufreq_occ_msg(struct notifier_block *nb,
return 0;

for (i = 0; i < nr_chips; i++)
if (chips[i].id == omsg.chip)
if (chips[i].id == omsg.chip) {
if (!omsg.throttle_status)
chips[i].restore = true;
schedule_work(&chips[i].throttle);
}
}
return 0;
}
Expand Down Expand Up @@ -542,6 +568,7 @@ static int init_chip_info(void)
chips[i].throttled = false;
cpumask_copy(&chips[i].mask, cpumask_of_node(chip[i]));
INIT_WORK(&chips[i].throttle, powernv_cpufreq_work_fn);
chips[i].restore = false;
}

return 0;
Expand Down

0 comments on commit 2279428

Please sign in to comment.