Commit 6563f60f authored by Rob Clark's avatar Rob Clark

drm/msm/gpu: Add devfreq tuning debugfs

Make the handful of tuning knobs available visible via debugfs.

v2: select DEVFREQ_GOV_SIMPLE_ONDEMAND because for some reason
    struct devfreq_simple_ondemand_data depends on this
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Patchwork: https://patchwork.freedesktop.org/patch/517784/
Link: https://lore.kernel.org/r/20230110231447.1939101-2-robdclark@gmail.comReviewed-by: default avatarChia-I Wu <olvaffe@gmail.com>
parent 3cba4a2c
...@@ -23,6 +23,7 @@ config DRM_MSM ...@@ -23,6 +23,7 @@ config DRM_MSM
select SHMEM select SHMEM
select TMPFS select TMPFS
select QCOM_SCM select QCOM_SCM
select DEVFREQ_GOV_SIMPLE_ONDEMAND
select WANT_DEV_COREDUMP select WANT_DEV_COREDUMP
select SND_SOC_HDMI_CODEC if SND_SOC select SND_SOC_HDMI_CODEC if SND_SOC
select SYNC_FILE select SYNC_FILE
......
...@@ -2021,7 +2021,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) ...@@ -2021,7 +2021,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)
* to cause power supply issues: * to cause power supply issues:
*/ */
if (adreno_is_a618(adreno_gpu) || adreno_is_7c3(adreno_gpu)) if (adreno_is_a618(adreno_gpu) || adreno_is_7c3(adreno_gpu))
gpu->clamp_to_idle = true; priv->gpu_clamp_to_idle = true;
/* Check if there is a GMU phandle and set it up */ /* Check if there is a GMU phandle and set it up */
node = of_parse_phandle(pdev->dev.of_node, "qcom,gmu", 0); node = of_parse_phandle(pdev->dev.of_node, "qcom,gmu", 0);
......
...@@ -305,6 +305,7 @@ void msm_debugfs_init(struct drm_minor *minor) ...@@ -305,6 +305,7 @@ void msm_debugfs_init(struct drm_minor *minor)
{ {
struct drm_device *dev = minor->dev; struct drm_device *dev = minor->dev;
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
struct dentry *gpu_devfreq;
drm_debugfs_create_files(msm_debugfs_list, drm_debugfs_create_files(msm_debugfs_list,
ARRAY_SIZE(msm_debugfs_list), ARRAY_SIZE(msm_debugfs_list),
...@@ -325,6 +326,17 @@ void msm_debugfs_init(struct drm_minor *minor) ...@@ -325,6 +326,17 @@ void msm_debugfs_init(struct drm_minor *minor)
debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root, debugfs_create_file("shrink", S_IRWXU, minor->debugfs_root,
dev, &shrink_fops); dev, &shrink_fops);
gpu_devfreq = debugfs_create_dir("devfreq", minor->debugfs_root);
debugfs_create_bool("idle_clamp",0600, gpu_devfreq,
&priv->gpu_clamp_to_idle);
debugfs_create_u32("upthreshold",0600, gpu_devfreq,
&priv->gpu_devfreq_config.upthreshold);
debugfs_create_u32("downdifferential",0600, gpu_devfreq,
&priv->gpu_devfreq_config.downdifferential);
if (priv->kms && priv->kms->funcs->debugfs_init) if (priv->kms && priv->kms->funcs->debugfs_init)
priv->kms->funcs->debugfs_init(priv->kms, minor); priv->kms->funcs->debugfs_init(priv->kms, minor);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/devfreq.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/component.h> #include <linux/component.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -233,6 +234,14 @@ struct msm_drm_private { ...@@ -233,6 +234,14 @@ struct msm_drm_private {
*/ */
unsigned int hangcheck_period; unsigned int hangcheck_period;
/** gpu_devfreq_config: Devfreq tuning config for the GPU. */
struct devfreq_simple_ondemand_data gpu_devfreq_config;
/**
* gpu_clamp_to_idle: Enable clamping to idle freq when inactive
*/
bool gpu_clamp_to_idle;
/** /**
* disable_err_irq: * disable_err_irq:
* *
......
...@@ -275,9 +275,6 @@ struct msm_gpu { ...@@ -275,9 +275,6 @@ struct msm_gpu {
struct msm_gpu_state *crashstate; struct msm_gpu_state *crashstate;
/* Enable clamping to idle freq when inactive: */
bool clamp_to_idle;
/* True if the hardware supports expanded apriv (a650 and newer) */ /* True if the hardware supports expanded apriv (a650 and newer) */
bool hw_apriv; bool hw_apriv;
......
...@@ -183,6 +183,7 @@ static bool has_devfreq(struct msm_gpu *gpu) ...@@ -183,6 +183,7 @@ static bool has_devfreq(struct msm_gpu *gpu)
void msm_devfreq_init(struct msm_gpu *gpu) void msm_devfreq_init(struct msm_gpu *gpu)
{ {
struct msm_gpu_devfreq *df = &gpu->devfreq; struct msm_gpu_devfreq *df = &gpu->devfreq;
struct msm_drm_private *priv = gpu->dev->dev_private;
/* We need target support to do devfreq */ /* We need target support to do devfreq */
if (!gpu->funcs->gpu_busy) if (!gpu->funcs->gpu_busy)
...@@ -209,7 +210,7 @@ void msm_devfreq_init(struct msm_gpu *gpu) ...@@ -209,7 +210,7 @@ void msm_devfreq_init(struct msm_gpu *gpu)
df->devfreq = devm_devfreq_add_device(&gpu->pdev->dev, df->devfreq = devm_devfreq_add_device(&gpu->pdev->dev,
&msm_devfreq_profile, DEVFREQ_GOV_SIMPLE_ONDEMAND, &msm_devfreq_profile, DEVFREQ_GOV_SIMPLE_ONDEMAND,
NULL); &priv->gpu_devfreq_config);
if (IS_ERR(df->devfreq)) { if (IS_ERR(df->devfreq)) {
DRM_DEV_ERROR(&gpu->pdev->dev, "Couldn't initialize GPU devfreq\n"); DRM_DEV_ERROR(&gpu->pdev->dev, "Couldn't initialize GPU devfreq\n");
...@@ -358,10 +359,11 @@ static void msm_devfreq_idle_work(struct kthread_work *work) ...@@ -358,10 +359,11 @@ static void msm_devfreq_idle_work(struct kthread_work *work)
struct msm_gpu_devfreq *df = container_of(work, struct msm_gpu_devfreq *df = container_of(work,
struct msm_gpu_devfreq, idle_work.work); struct msm_gpu_devfreq, idle_work.work);
struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq);
struct msm_drm_private *priv = gpu->dev->dev_private;
df->idle_time = ktime_get(); df->idle_time = ktime_get();
if (gpu->clamp_to_idle) if (priv->gpu_clamp_to_idle)
dev_pm_qos_update_request(&df->idle_freq, 0); dev_pm_qos_update_request(&df->idle_freq, 0);
} }
......
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