mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
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:
parent
014aac7944
commit
5e52f96714
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user