From e636c8d336489bf3eed5878299e6cc045bbad077 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 20 Feb 2024 01:17:29 +0000
Subject: [PATCH] debug lk
---
kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c | 189 +++++++++++++++++++++++++++++------------------
1 files changed, 117 insertions(+), 72 deletions(-)
diff --git a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
index 9a012fd..2b412b5 100644
--- a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
@@ -35,6 +35,7 @@
#include <linux/pm_runtime.h>
#include <linux/delay.h>
#include <linux/rockchip/cpu.h>
+#include <soc/rockchip/rockchip_ipa.h>
#include <soc/rockchip/rockchip_opp_select.h>
#include <linux/mali/mali_utgard.h>
@@ -232,73 +233,7 @@
static u32 static_coefficient;
static s32 ts[4];
static struct thermal_zone_device *gpu_tz;
-
-static int power_model_simple_init(struct platform_device *pdev)
-{
- struct device_node *power_model_node;
- const char *tz_name;
- u32 static_power, dynamic_power;
- u32 voltage, voltage_squared, voltage_cubed, frequency;
-
- power_model_node = of_get_child_by_name(pdev->dev.of_node,
- "power_model");
- if (!power_model_node) {
- dev_err(&pdev->dev, "could not find power_model node\n");
- return -ENODEV;
- }
- if (!of_device_is_compatible(power_model_node,
- "arm,mali-simple-power-model")) {
- dev_err(&pdev->dev, "power_model incompatible with simple power model\n");
- return -ENODEV;
- }
-
- if (of_property_read_string(power_model_node, "thermal-zone",
- &tz_name)) {
- dev_err(&pdev->dev, "ts in power_model not available\n");
- return -EINVAL;
- }
-
- gpu_tz = thermal_zone_get_zone_by_name(tz_name);
- if (IS_ERR(gpu_tz)) {
- pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n",
- tz_name,
- PTR_ERR(gpu_tz));
- gpu_tz = NULL;
- }
-
- if (of_property_read_u32(power_model_node, "static-power",
- &static_power)) {
- dev_err(&pdev->dev, "static-power in power_model not available\n");
- return -EINVAL;
- }
- if (of_property_read_u32(power_model_node, "dynamic-power",
- &dynamic_power)) {
- dev_err(&pdev->dev, "dynamic-power in power_model not available\n");
- return -EINVAL;
- }
- if (of_property_read_u32(power_model_node, "voltage",
- &voltage)) {
- dev_err(&pdev->dev, "voltage in power_model not available\n");
- return -EINVAL;
- }
- if (of_property_read_u32(power_model_node, "frequency",
- &frequency)) {
- dev_err(&pdev->dev, "frequency in power_model not available\n");
- return -EINVAL;
- }
- voltage_squared = (voltage * voltage) / 1000;
- voltage_cubed = voltage * voltage * voltage;
- static_coefficient = (static_power << 20) / (voltage_cubed >> 10);
- dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared)
- * 1000) / frequency;
-
- if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) {
- dev_err(&pdev->dev, "ts in power_model not available\n");
- return -EINVAL;
- }
-
- return 0;
-}
+static struct ipa_power_model_data *model_data;
/* Calculate gpu static power example for reference */
static unsigned long rk_model_static_power(struct devfreq *devfreq,
@@ -360,10 +295,107 @@
return dynamic_power;
}
-struct devfreq_cooling_power rk_cooling_ops = {
+static struct devfreq_cooling_power rk_cooling_ops = {
.get_static_power = rk_model_static_power,
.get_dynamic_power = rk_model_dynamic_power,
};
+
+static unsigned long mali_devfreq_get_static_power(struct devfreq *devfreq,
+ unsigned long voltage)
+{
+ return rockchip_ipa_get_static_power(model_data, voltage);
+}
+
+static int power_model_simple_init(struct platform_device *pdev)
+{
+ struct device_node *power_model_node;
+ const char *tz_name;
+ u32 static_power, dynamic_power;
+ u32 voltage, voltage_squared, voltage_cubed, frequency;
+
+ if (of_find_compatible_node(pdev->dev.of_node, NULL, "simple-power-model")) {
+ of_property_read_u32(pdev->dev.of_node,
+ "dynamic-power-coefficient",
+ (u32 *)&rk_cooling_ops.dyn_power_coeff);
+ model_data = rockchip_ipa_power_model_init(&pdev->dev,
+ "gpu_leakage");
+ if (IS_ERR_OR_NULL(model_data)) {
+ model_data = NULL;
+ dev_err(&pdev->dev, "failed to initialize power model\n");
+ } else if (model_data->dynamic_coefficient) {
+ rk_cooling_ops.dyn_power_coeff =
+ model_data->dynamic_coefficient;
+ rk_cooling_ops.get_dynamic_power = NULL;
+ rk_cooling_ops.get_static_power = mali_devfreq_get_static_power;
+ }
+ if (!rk_cooling_ops.dyn_power_coeff) {
+ dev_err(&pdev->dev, "failed to get dynamic-coefficient\n");
+ return -EINVAL;
+ }
+
+ return 0;
+ }
+
+ power_model_node = of_get_child_by_name(pdev->dev.of_node,
+ "power_model");
+ if (!power_model_node) {
+ dev_err(&pdev->dev, "could not find power_model node\n");
+ return -ENODEV;
+ }
+ if (!of_device_is_compatible(power_model_node,
+ "arm,mali-simple-power-model")) {
+ dev_err(&pdev->dev, "power_model incompatible with simple power model\n");
+ return -ENODEV;
+ }
+
+ if (of_property_read_string(power_model_node, "thermal-zone",
+ &tz_name)) {
+ dev_err(&pdev->dev, "ts in power_model not available\n");
+ return -EINVAL;
+ }
+
+ gpu_tz = thermal_zone_get_zone_by_name(tz_name);
+ if (IS_ERR(gpu_tz)) {
+ pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n",
+ tz_name,
+ PTR_ERR(gpu_tz));
+ gpu_tz = NULL;
+ }
+
+ if (of_property_read_u32(power_model_node, "static-power",
+ &static_power)) {
+ dev_err(&pdev->dev, "static-power in power_model not available\n");
+ return -EINVAL;
+ }
+ if (of_property_read_u32(power_model_node, "dynamic-power",
+ &dynamic_power)) {
+ dev_err(&pdev->dev, "dynamic-power in power_model not available\n");
+ return -EINVAL;
+ }
+ if (of_property_read_u32(power_model_node, "voltage",
+ &voltage)) {
+ dev_err(&pdev->dev, "voltage in power_model not available\n");
+ return -EINVAL;
+ }
+ if (of_property_read_u32(power_model_node, "frequency",
+ &frequency)) {
+ dev_err(&pdev->dev, "frequency in power_model not available\n");
+ return -EINVAL;
+ }
+ voltage_squared = (voltage * voltage) / 1000;
+ voltage_cubed = voltage * voltage * voltage;
+ static_coefficient = (static_power << 20) / (voltage_cubed >> 10);
+ dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared)
+ * 1000) / frequency;
+
+ if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) {
+ dev_err(&pdev->dev, "ts in power_model not available\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
#endif
/*---------------------------------------------------------------------------*/
@@ -376,8 +408,7 @@
#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
struct mali_device *mdev = dev_get_drvdata(dev);
- if (mdev->clock)
- ret = clk_enable(mdev->clock);
+ ret = clk_bulk_enable(mdev->num_clks, mdev->clks);
#endif
return ret;
}
@@ -387,8 +418,7 @@
#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
struct mali_device *mdev = dev_get_drvdata(dev);
- if (mdev->clock)
- clk_disable(mdev->clock);
+ clk_bulk_disable(mdev->num_clks, mdev->clks);
#endif
}
@@ -432,6 +462,13 @@
goto fail_to_enable_regulator;
}
+ if (cpu_is_rk3528()) {
+#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
+ struct mali_device *mdev = dev_get_drvdata(dev);
+
+ clk_set_rate(mdev->clock, mdev->current_freq);
+#endif
+ }
platform->is_powered = true;
}
@@ -449,6 +486,14 @@
struct rk_context *platform = s_rk_context;
if (platform->is_powered) {
+ if (cpu_is_rk3528()) {
+#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
+ struct mali_device *mdev = dev_get_drvdata(dev);
+
+ //use normal pll 200M for gpu when suspend
+ clk_set_rate(mdev->clock, 200000000);
+#endif
+ }
rk_platform_disable_clk_gpu(dev);
rk_platform_disable_gpu_regulator(dev);
--
Gitblit v1.6.2