ipq806x: fix dedicated cpufreq driver

2 small fix for the dedicated cpufreq driver:
- Fix index wrongly used as the current cpu
- Exit early if a bad freq is detected. In the current state the freq
is applied anyway even with invalid state.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
This commit is contained in:
Ansuel Smith 2021-05-20 23:41:57 +02:00 committed by Hauke Mehrtens
parent 014aac7944
commit 5e52f96714
4 changed files with 38 additions and 34 deletions

View File

@ -75,7 +75,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
################################################################################## ##################################################################################
--- /dev/null --- /dev/null
+++ b/drivers/cpufreq/qcom-cpufreq-krait.c +++ b/drivers/cpufreq/qcom-cpufreq-krait.c
@@ -0,0 +1,601 @@ @@ -0,0 +1,603 @@
+// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0
+ +
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@ -115,9 +115,11 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ int cpu, ret; + int cpu, ret;
+ +
+ if (l2_pdev) { + if (l2_pdev) {
+ int policy_cpu = policy->cpu;
+
+ /* find the max freq across all core */ + /* find the max freq across all core */
+ for_each_present_cpu(cpu) + for_each_present_cpu(cpu)
+ if (cpu != index) + if (cpu != policy_cpu)
+ target_freq = max( + target_freq = max(
+ target_freq, + target_freq,
+ (unsigned long)cpufreq_quick_get(cpu)); + (unsigned long)cpufreq_quick_get(cpu));
@ -132,6 +134,18 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ level = dev_pm_opp_get_level(opp); + level = dev_pm_opp_get_level(opp);
+ dev_pm_opp_put(opp); + dev_pm_opp_put(opp);
+ +
+ /*
+ * Hardware constraint:
+ * Krait CPU cannot operate at 384MHz with L2 at 1Ghz.
+ * Assume index 0 with the idle freq and level > 0 as
+ * any L2 freq > 384MHz.
+ * Skip CPU freq change in this corner case.
+ */
+ if (unlikely(index == 0 && level != 0)) {
+ dev_err(priv->cpu_dev, "Krait CPU can't operate at idle freq with L2 at 1GHz");
+ return -EINVAL;
+ }
+
+ opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level); + opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level);
+ if (IS_ERR(opp)) { + if (IS_ERR(opp)) {
+ dev_err(&l2_pdev->dev, + dev_err(&l2_pdev->dev,
@ -144,18 +158,6 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ ret = dev_pm_opp_set_rate(&l2_pdev->dev, target_freq); + ret = dev_pm_opp_set_rate(&l2_pdev->dev, target_freq);
+ if (ret) + if (ret)
+ return ret; + return ret;
+
+ /*
+ * Hardware constraint:
+ * Krait CPU cannot operate at 384MHz with L2 at 1Ghz.
+ * Assume index 0 with the idle freq and level > 0 as
+ * any L2 freq > 384MHz.
+ * Skip CPU freq change in this corner case.
+ */
+ if (unlikely(index == 0 && level != 0)) {
+ dev_err(priv->cpu_dev, "Krait CPU can't operate at idle freq with L2 at 1GHz");
+ return -EINVAL;
+ }
+ } + }
+ +
+ ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); + ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000);

View File

@ -227,9 +227,9 @@
#include "cpufreq-dt.h" #include "cpufreq-dt.h"
@@ -54,6 +55,13 @@ static int set_target(struct cpufreq_pol @@ -68,6 +69,13 @@ static int set_target(struct cpufreq_pol
level = dev_pm_opp_get_level(opp); return -EINVAL;
dev_pm_opp_put(opp); }
+ /* + /*
+ * Scale fabrics with max freq across all cores + * Scale fabrics with max freq across all cores

View File

@ -75,7 +75,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
################################################################################## ##################################################################################
--- /dev/null --- /dev/null
+++ b/drivers/cpufreq/qcom-cpufreq-krait.c +++ b/drivers/cpufreq/qcom-cpufreq-krait.c
@@ -0,0 +1,601 @@ @@ -0,0 +1,603 @@
+// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0
+ +
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@ -115,9 +115,11 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ int cpu, ret; + int cpu, ret;
+ +
+ if (l2_pdev) { + if (l2_pdev) {
+ int policy_cpu = policy->cpu;
+
+ /* find the max freq across all core */ + /* find the max freq across all core */
+ for_each_present_cpu(cpu) + for_each_present_cpu(cpu)
+ if (cpu != index) + if (cpu != policy_cpu)
+ target_freq = max( + target_freq = max(
+ target_freq, + target_freq,
+ (unsigned long)cpufreq_quick_get(cpu)); + (unsigned long)cpufreq_quick_get(cpu));
@ -132,6 +134,18 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ level = dev_pm_opp_get_level(opp); + level = dev_pm_opp_get_level(opp);
+ dev_pm_opp_put(opp); + dev_pm_opp_put(opp);
+ +
+ /*
+ * Hardware constraint:
+ * Krait CPU cannot operate at 384MHz with L2 at 1Ghz.
+ * Assume index 0 with the idle freq and level > 0 as
+ * any L2 freq > 384MHz.
+ * Skip CPU freq change in this corner case.
+ */
+ if (unlikely(index == 0 && level != 0)) {
+ dev_err(priv->cpu_dev, "Krait CPU can't operate at idle freq with L2 at 1GHz");
+ return -EINVAL;
+ }
+
+ opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level); + opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level);
+ if (IS_ERR(opp)) { + if (IS_ERR(opp)) {
+ dev_err(&l2_pdev->dev, + dev_err(&l2_pdev->dev,
@ -144,18 +158,6 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+ ret = dev_pm_opp_set_rate(&l2_pdev->dev, target_freq); + ret = dev_pm_opp_set_rate(&l2_pdev->dev, target_freq);
+ if (ret) + if (ret)
+ return ret; + return ret;
+
+ /*
+ * Hardware constraint:
+ * Krait CPU cannot operate at 384MHz with L2 at 1Ghz.
+ * Assume index 0 with the idle freq and level > 0 as
+ * any L2 freq > 384MHz.
+ * Skip CPU freq change in this corner case.
+ */
+ if (unlikely(index == 0 && level != 0)) {
+ dev_err(priv->cpu_dev, "Krait CPU can't operate at idle freq with L2 at 1GHz");
+ return -EINVAL;
+ }
+ } + }
+ +
+ ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); + ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000);

View File

@ -227,9 +227,9 @@
#include "cpufreq-dt.h" #include "cpufreq-dt.h"
@@ -54,6 +55,13 @@ static int set_target(struct cpufreq_pol @@ -68,6 +69,13 @@ static int set_target(struct cpufreq_pol
level = dev_pm_opp_get_level(opp); return -EINVAL;
dev_pm_opp_put(opp); }
+ /* + /*
+ * Scale fabrics with max freq across all cores + * Scale fabrics with max freq across all cores