[openwrt/openwrt] ipq806x: 5:15: fix dedicated krait cpufreq

LEDE Commits lede-commits at lists.infradead.org
Sun Mar 27 08:17:59 PDT 2022


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/876a49ca621f7d7b73134f7bf93f301508e38354

commit 876a49ca621f7d7b73134f7bf93f301508e38354
Author: Ansuel Smith <ansuelsmth at gmail.com>
AuthorDate: Fri Nov 5 03:32:30 2021 +0100

    ipq806x: 5:15: fix dedicated krait cpufreq
    
    Fix dedicated cpufreq for kernel 5.15 as they changed module
    order and now it can happen that cpufreq probe after cache driver.
    Also add lock between cache scaling in set_target as it's now required
    by opp functions.
    
    Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
---
 ...pufreq-add-Krait-dedicated-scaling-driver.patch | 76 +++++++++++++++-------
 ...98-3-add-fab-scaling-support-with-cpufreq.patch |  8 +--
 2 files changed, 55 insertions(+), 29 deletions(-)

diff --git a/target/linux/ipq806x/patches-5.15/098-1-cpufreq-add-Krait-dedicated-scaling-driver.patch b/target/linux/ipq806x/patches-5.15/098-1-cpufreq-add-Krait-dedicated-scaling-driver.patch
index f579b73b77..da91eb5b7c 100644
--- a/target/linux/ipq806x/patches-5.15/098-1-cpufreq-add-Krait-dedicated-scaling-driver.patch
+++ b/target/linux/ipq806x/patches-5.15/098-1-cpufreq-add-Krait-dedicated-scaling-driver.patch
@@ -75,7 +75,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
  ##################################################################################
 --- /dev/null
 +++ b/drivers/cpufreq/qcom-cpufreq-krait.c
-@@ -0,0 +1,603 @@
+@@ -0,0 +1,629 @@
 +// SPDX-License-Identifier: GPL-2.0
 +
 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@ -96,11 +96,13 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +
 +#include "cpufreq-dt.h"
 +
-+static struct platform_device *l2_pdev;
++static struct device *l2_dev;
++static struct mutex lock;
 +
 +struct private_data {
 +	struct opp_table *opp_table;
 +	struct device *cpu_dev;
++	struct device *l2_dev;
 +	const char *reg_name;
 +	bool have_static_opps;
 +};
@@ -114,9 +116,11 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	unsigned int level;
 +	int cpu, ret;
 +
-+	if (l2_pdev) {
++	if (l2_dev) {
 +		int policy_cpu = policy->cpu;
 +
++		mutex_lock(&lock);
++
 +		/* find the max freq across all core */
 +		for_each_present_cpu(cpu)
 +			if (cpu != policy_cpu)
@@ -127,9 +131,10 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +		opp = dev_pm_opp_find_freq_exact(priv->cpu_dev, target_freq,
 +						 true);
 +		if (IS_ERR(opp)) {
-+			dev_err(&l2_pdev->dev, "failed to find OPP for %ld\n",
++			dev_err(l2_dev, "failed to find OPP for %ld\n",
 +				target_freq);
-+			return PTR_ERR(opp);
++			ret = PTR_ERR(opp);
++			goto l2_scale_fail;
 +		}
 +		level = dev_pm_opp_get_level(opp);
 +		dev_pm_opp_put(opp);
@@ -143,21 +148,25 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +		 */
 +		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 = -EINVAL;
++			goto l2_scale_fail;
 +		}
 +
-+		opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level);
++		opp = dev_pm_opp_find_level_exact(l2_dev, level);
 +		if (IS_ERR(opp)) {
-+			dev_err(&l2_pdev->dev,
++			dev_err(l2_dev,
 +				"failed to find level OPP for %d\n", level);
-+			return PTR_ERR(opp);
++			ret = PTR_ERR(opp);
++			goto l2_scale_fail;
 +		}
 +		target_freq = dev_pm_opp_get_freq(opp);
 +		dev_pm_opp_put(opp);
 +
-+		ret = dev_pm_opp_set_rate(&l2_pdev->dev, target_freq);
++		ret = dev_pm_opp_set_rate(l2_dev, target_freq);
 +		if (ret)
-+			return ret;
++			goto l2_scale_fail;
++
++		mutex_unlock(&lock);
 +	}
 +
 +	ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000);
@@ -168,6 +177,10 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +			    policy->cpuinfo.max_freq);
 +
 +	return 0;
++l2_scale_fail:
++	mutex_unlock(&lock);
++
++	return ret;
 +}
 +
 +/*
@@ -346,7 +359,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	 * give platform code chance to provide it for us.
 +	 */
 +	ret = dev_pm_opp_get_opp_count(cpu_dev);
-+	if (ret <= 0) {
++	if (ret < 0) {
 +		dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n");
 +		ret = -EPROBE_DEFER;
 +		goto out_free_opp;
@@ -549,6 +562,19 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	dev_pm_opp_put(opp);
 +
 +	/*
++	 * Check if we have at least opp-level 1, 0 should always be set to
++	 * the idle freq
++	 */
++	opp = dev_pm_opp_find_level_exact(dev, 1);
++	if (IS_ERR(opp)) {
++		ret = PTR_ERR(opp);
++		dev_err(dev,
++			"Invalid configuration found of l2 opp. Can't find opp-level 1");
++		goto invalid_conf;
++	}
++	dev_pm_opp_put(opp);
++
++	/*
 +	 * Check opp-level configuration
 +	 * At least 2 level must be set or the cache will always be scaled
 +	 * the idle freq causing some performance problem
@@ -561,17 +587,12 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +		return -ENODEV;
 +	}
 +
-+	/*
-+	 * Check if we have at least opp-level 1, 0 should always be set to
-+	 * the idle freq
-+	 */
-+	opp = dev_pm_opp_find_level_exact(dev, 1);
-+	if (IS_ERR(opp)) {
-+		dev_err(dev,
-+			"Invalid configuration found of l2 opp. Can't find opp-level 1");
++	/* With opp error assume cpufreq still has to be registred. Defer probe. */
++	ret = dev_pm_opp_get_opp_count(cpu_dev);
++	if (ret < 0) {
++		ret = -EPROBE_DEFER;
 +		goto invalid_conf;
 +	}
-+	dev_pm_opp_put(opp);
 +
 +	/*
 +	 * Check if we have at least opp-level 1 in the cpu opp, 0 should always
@@ -579,16 +600,20 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	 */
 +	opp = dev_pm_opp_find_level_exact(cpu_dev, 1);
 +	if (IS_ERR(opp)) {
-+		dev_err(dev,
-+			"Invalid configuration found of cpu opp. Can't find opp-level 1");
++		ret = PTR_ERR(opp);
++		if (ret != -EPROBE_DEFER)
++			dev_err(dev,
++				"Invalid configuration found of cpu opp. Can't find opp-level 1");
 +		goto invalid_conf;
 +	}
 +	dev_pm_opp_put(opp);
 +
 +	platform_set_drvdata(pdev, data);
 +
++	mutex_init(&lock);
++
 +	/* The l2 scaling is enabled by linking the cpufreq driver */
-+	l2_pdev = pdev;
++	l2_dev = dev;
 +
 +	return 0;
 +
@@ -597,7 +622,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	dev_pm_opp_put_regulators(table);
 +	dev_pm_opp_unregister_set_opp_helper(table);
 +
-+	return -EINVAL;
++	return ret;
 +};
 +
 +static int krait_cache_remove(struct platform_device *pdev)
@@ -673,6 +698,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
 +	.probe		= krait_cpufreq_probe,
 +	.remove		= krait_cpufreq_remove,
 +};
++
 +module_platform_driver(krait_cpufreq_platdrv);
 +
 +MODULE_ALIAS("platform:krait-cpufreq");
diff --git a/target/linux/ipq806x/patches-5.15/098-3-add-fab-scaling-support-with-cpufreq.patch b/target/linux/ipq806x/patches-5.15/098-3-add-fab-scaling-support-with-cpufreq.patch
index 8ce3f062cf..28eb22d269 100644
--- a/target/linux/ipq806x/patches-5.15/098-3-add-fab-scaling-support-with-cpufreq.patch
+++ b/target/linux/ipq806x/patches-5.15/098-3-add-fab-scaling-support-with-cpufreq.patch
@@ -228,7 +228,7 @@
  #include "cpufreq-dt.h"
  
 @@ -68,6 +69,13 @@ static int set_target(struct cpufreq_pol
- 			return -EINVAL;
+ 			goto l2_scale_fail;
  		}
  
 +		/*
@@ -236,8 +236,8 @@
 +		 */
 +		ret = scale_fabrics(target_freq);
 +		if (ret)
-+			return ret;
++			goto l2_scale_fail;
 +
- 		opp = dev_pm_opp_find_level_exact(&l2_pdev->dev, level);
+ 		opp = dev_pm_opp_find_level_exact(l2_dev, level);
  		if (IS_ERR(opp)) {
- 			dev_err(&l2_pdev->dev,
+ 			dev_err(l2_dev,




More information about the lede-commits mailing list