summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Zhang <zhangmax@google.com>2021-05-19 04:59:12 +0000
committerMax Zhang <zhangmax@google.com>2021-05-19 04:59:12 +0000
commitd35ab1313eb774c5371afc1ca5b14c1c2bd45aa4 (patch)
tree1690a3cb9821d80b05392e02faca884348b8e6f8
parent1918c9e4404aa64b64c26255a8088fd5754e23a6 (diff)
downloadmali-driver-android-tv-deadpool-4.9-android11.tar.gz
mali-driver: fix compile issue on RDK env for r25p0 [1/1]android-tv-deadpool-4.9-android11
commit bdc6b196f5730aaf160a9f173eb03b52f7ba1849 Author: Dezhi Kong <dezhi.kong@amlogic.com> Date: Thu Apr 8 11:01:29 2021 +0800 PD#SWPL-45731 Problem: compile fail on rdk Solution: fix the coding style problem Verify: rdk-pb Change-Id: Iaefe6d54112ffc7842b602a3e13f28f434e1bd7d Signed-off-by: Dezhi Kong <dezhi.kong@amlogic.com> mali-driver: add power on init when resume [1/1] commit c00e3d4e4b0f91c58fcdf164d489a2f2e78a5062 Author: Dezhi Kong <dezhi.kong@amlogic.com> Date: Tue Mar 30 21:37:10 2021 +0800 PD#SWPL-45731 Problem: t7 resume fail in gpu Solution: add gpu hw init when resume clean up the interface of pm_runtime in gpu driver Verify: t7_an400 Change-Id: Ie80fdada7e25745878b0ebb81f5c3d9a84098ce8 Signed-off-by: Dezhi Kong <dezhi.kong@amlogic.com>
-rw-r--r--dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c124
1 files changed, 64 insertions, 60 deletions
diff --git a/dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c b/dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c
index 3d0bfcc..ee18718 100644
--- a/dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c
+++ b/dvalin/kernel/drivers/gpu/arm/midgard/platform/devicetree/mali_kbase_runtime_pm.c
@@ -28,14 +28,6 @@
#include "mali_kbase_config_platform.h"
#include "mali_scaling.h"
-static void enable_gpu_power_control(struct kbase_device *kbdev)
-{
-}
-
-static void disable_gpu_power_control(struct kbase_device *kbdev)
-{
-}
-
void *reg_base_reset = NULL;
static int first = 1;
@@ -182,59 +174,52 @@ static void mali_reset(void)
Wr(pmali_plat->module_reset.reg_level, value);
}
+/*
+ * 1.mali-reset;2.init pwr_override1;3.pwr_on one core manully
+ */
+static void mali_hw_init(struct kbase_device *kbdev)
+{
+ mali_reset();
+ udelay(10); // OR POLL for reset done
+ Mali_WrReg(GPU_CONTROL_REG(PWR_KEY), 0x2968A819);
+ Mali_WrReg(GPU_CONTROL_REG(PWR_OVERRIDE1), 0xfff | (0x20<<16));
+ Mali_pwr_on_with_kdev(kbdev, 0x1);
+}
+
static int pm_callback_power_on(struct kbase_device *kbdev)
{
- int ret = 1; /* Assume GPU has been powered off */
- int error;
+ int ret = 0;
- /* remove this if sc2 worked fine. */
struct mali_plat_info_t *mpdata = (struct mali_plat_info_t *) kbdev->platform_context;
reg_base_reset = mpdata->reg_base_reset;
if (first == 0) goto out;
- pm_runtime_enable(kbdev->dev);
- error = pm_runtime_get_sync(kbdev->dev);
- if (error == 1) {
- /*
- * Let core know that the chip has not been
- * powered off, so we can save on re-initialization.
- */
- ret = 0;
+ if (!pm_runtime_enabled(kbdev->dev)) {
+ pm_runtime_enable(kbdev->dev);
+ dev_info(kbdev->dev, "pm_runtime not enabled, enable it here\n");
+ ret = pm_runtime_get_sync(kbdev->dev);
+ udelay(100);
+ dev_info(kbdev->dev, "pm_runtime_get_sync returned %d\n", ret);
+ } else {
+ dev_info(kbdev->dev, "pm_runtime enabled\n");
}
- udelay(100);
- dev_info(kbdev->dev, "pm_runtime_get_sync returned %d\n", error);
first = 0;
-
- mali_reset();
- udelay(10); // OR POLL for reset done
- dev_dbg(kbdev->dev, "delay 10us\n");
-
- Mali_WrReg(GPU_CONTROL_REG(PWR_KEY), 0x2968A819);
- Mali_WrReg(GPU_CONTROL_REG(PWR_OVERRIDE1), 0xfff | (0x20<<16));
- Mali_pwr_on_with_kdev(kbdev, 0x1);
- dev_dbg(kbdev->dev, "pm_callback_power_on %p\n",
- (void *)kbdev->dev->pm_domain);
-
- enable_gpu_power_control(kbdev);
+ mali_hw_init(kbdev);
out:
return ret;
}
+/*
+ * pm_callback_power_off will be called when gpu have no job todo.
+ * the pm_runtime_put_autosuspend will trigger gpu power reset
+ * which will affect gpu work on T7,so we can't do put here
+ * the out power of gpu on t7 will be power off by platform when suspend
+ */
static void pm_callback_power_off(struct kbase_device *kbdev)
{
dev_dbg(kbdev->dev, "pm_callback_power_off\n");
- /*
- * the pm_runtime is no use for ic before t7,
- * todo: add dynamic switch power on/off for t7 with external top gpu power domain
- */
- //pm_runtime_mark_last_busy(kbdev->dev);
- //pm_runtime_put_autosuspend(kbdev->dev);
-
-#ifndef KBASE_PM_RUNTIME
- //disable_gpu_power_control(kbdev);
-#endif
}
#ifdef KBASE_PM_RUNTIME
@@ -242,52 +227,71 @@ static int kbase_device_runtime_init(struct kbase_device *kbdev)
{
int ret = 0;
- pm_runtime_set_autosuspend_delay(kbdev->dev, AUTO_SUSPEND_DELAY);
- pm_runtime_use_autosuspend(kbdev->dev);
- pm_runtime_set_active(kbdev->dev);
- dev_dbg(kbdev->dev, "kbase_device_runtime_init\n");
+ dev_info(kbdev->dev, "kbase_device_runtime_init\n");
pm_runtime_enable(kbdev->dev);
-
- if (!pm_runtime_enabled(kbdev->dev)) {
- dev_warn(kbdev->dev, "pm_runtime not enabled");
- ret = -ENOSYS;
- }
+ ret = pm_runtime_get_sync(kbdev->dev);
+ dev_info(kbdev->dev, "pm_runtime_get_sync ret=%d\n", ret);
return ret;
}
static void kbase_device_runtime_disable(struct kbase_device *kbdev)
{
- dev_dbg(kbdev->dev, "kbase_device_runtime_disable\n");
+ dev_info(kbdev->dev, "kbase_device_runtime_disable\n");
pm_runtime_disable(kbdev->dev);
}
#endif
static int pm_callback_runtime_on(struct kbase_device *kbdev)
{
- dev_dbg(kbdev->dev, "pm_callback_runtime_on\n");
+ dev_info(kbdev->dev, "pm_callback_runtime_on\n");
- enable_gpu_power_control(kbdev);
return 0;
}
static void pm_callback_runtime_off(struct kbase_device *kbdev)
{
- dev_dbg(kbdev->dev, "pm_callback_runtime_off\n");
-
- disable_gpu_power_control(kbdev);
+ dev_info(kbdev->dev, "pm_callback_runtime_off\n");
}
+/*
+ * the out power of gpu on t7[vdd_gpu] will be power off by platform when suspend,
+ * which will result in the gpu internal register reset to default.
+ * all of the ic before t7 use the vdd_ee,which will never power down even suspend,
+ * so we need do once init and check by pwr_override1.
+ */
static void pm_callback_resume(struct kbase_device *kbdev)
{
- int ret = pm_callback_runtime_on(kbdev);
+ int ret;
+ u32 pwr_override1;
- WARN_ON(ret);
+ dev_info(kbdev->dev, "pm_callback_resume in\n");
+ if (!pm_runtime_enabled(kbdev->dev)) {
+ pm_runtime_enable(kbdev->dev);
+ dev_info(kbdev->dev, "pm_runtime not enable, enable here\n");
+ } else {
+ dev_info(kbdev->dev, "pm_runtime enabled already\n");
+ }
+ ret = pm_runtime_get_sync(kbdev->dev);
+ dev_info(kbdev->dev, "pm_runtime_get_sync ret=%d\n", ret);
+ Mali_WrReg(GPU_CONTROL_REG(PWR_KEY), 0x2968A819);
+ pwr_override1 = Mali_RdReg(GPU_CONTROL_REG(PWR_OVERRIDE1));
+ if (!pwr_override1) {
+ dev_info(kbdev->dev, "pwr_override1=0,need do once init\n");
+ mali_hw_init(kbdev);
+ }
+ ret = pm_callback_runtime_on(kbdev);
+ dev_info(kbdev->dev, "pm_callback_resume out\n");
}
+/* the out power of gpu on t7 will be power off by platform when suspend */
static void pm_callback_suspend(struct kbase_device *kbdev)
{
+ dev_info(kbdev->dev, "pm_callback_suspend in\n");
pm_callback_runtime_off(kbdev);
+ pm_runtime_put_sync(kbdev->dev);
+ pm_runtime_disable(kbdev->dev);
+ dev_info(kbdev->dev, "pm_callback_suspend out\n");
}
struct kbase_pm_callback_conf pm_callbacks = {