mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-26 14:17:26 -04:00
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: Rob Clark <robdclark@chromium.org> Patchwork: https://patchwork.freedesktop.org/patch/517784/ Link: https://lore.kernel.org/r/20230110231447.1939101-2-robdclark@gmail.com Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
parent
3cba4a2cdf
commit
6563f60f14
6 changed files with 27 additions and 6 deletions
|
@ -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)
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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 @@
|
||||||
#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 {
|
||||||
*/
|
*/
|
||||||
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 {
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue