Commit 1f6cca40 authored by Akhil P Oommen's avatar Akhil P Oommen Committed by Rob Clark

drm/msm/a6xx: Ensure CX collapse during gpu recovery

Because there could be transient votes from other drivers/tz/hyp which
may keep the cx gdsc enabled, we should poll until cx gdsc collapses.
We can use the reset framework to poll for cx gdsc collapse from gpucc
clk driver.

This feature requires support from the platform's gpucc driver.
Signed-off-by: default avatarAkhil P Oommen <quic_akhilpo@quicinc.com>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Patchwork: https://patchwork.freedesktop.org/patch/498397/
Link: https://lore.kernel.org/r/20220819015030.v5.5.I176567525af2b9439a7e485d0ca130528666a55c@changeidSigned-off-by: default avatarRob Clark <robdclark@chromium.org>
parent f350bfb9
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/devfreq.h> #include <linux/devfreq.h>
#include <linux/reset.h>
#include <linux/soc/qcom/llcc-qcom.h> #include <linux/soc/qcom/llcc-qcom.h>
#define GPU_PAS_ID 13 #define GPU_PAS_ID 13
...@@ -1297,6 +1298,9 @@ static void a6xx_recover(struct msm_gpu *gpu) ...@@ -1297,6 +1298,9 @@ static void a6xx_recover(struct msm_gpu *gpu)
/* And the final one from recover worker */ /* And the final one from recover worker */
pm_runtime_put_sync(&gpu->pdev->dev); pm_runtime_put_sync(&gpu->pdev->dev);
/* Call into gpucc driver to poll for cx gdsc collapse */
reset_control_reset(gpu->cx_collapse);
pm_runtime_use_autosuspend(&gpu->pdev->dev); pm_runtime_use_autosuspend(&gpu->pdev->dev);
if (active_submits) if (active_submits)
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <generated/utsrelease.h> #include <generated/utsrelease.h>
#include <linux/string_helpers.h> #include <linux/string_helpers.h>
#include <linux/devcoredump.h> #include <linux/devcoredump.h>
#include <linux/reset.h>
#include <linux/sched/task.h> #include <linux/sched/task.h>
/* /*
...@@ -903,6 +904,9 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev, ...@@ -903,6 +904,9 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
if (IS_ERR(gpu->gpu_cx)) if (IS_ERR(gpu->gpu_cx))
gpu->gpu_cx = NULL; gpu->gpu_cx = NULL;
gpu->cx_collapse = devm_reset_control_get_optional_exclusive(&pdev->dev,
"cx_collapse");
gpu->pdev = pdev; gpu->pdev = pdev;
platform_set_drvdata(pdev, &gpu->adreno_smmu); platform_set_drvdata(pdev, &gpu->adreno_smmu);
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/interconnect.h> #include <linux/interconnect.h>
#include <linux/pm_opp.h> #include <linux/pm_opp.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include "msm_drv.h" #include "msm_drv.h"
#include "msm_fence.h" #include "msm_fence.h"
...@@ -271,6 +272,9 @@ struct msm_gpu { ...@@ -271,6 +272,9 @@ struct msm_gpu {
bool hw_apriv; bool hw_apriv;
struct thermal_cooling_device *cooling; struct thermal_cooling_device *cooling;
/* To poll for cx gdsc collapse during gpu recovery */
struct reset_control *cx_collapse;
}; };
static inline struct msm_gpu *dev_to_gpu(struct device *dev) static inline struct msm_gpu *dev_to_gpu(struct device *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment