drm/msm/gpu: Convert the GPU show function to use the GPU state
Convert the existing GPU show function to use the GPU state to dump the information rather than reading it directly from the hardware. This will require an additional step to capture the state before dumping it for the existing nodes but it will greatly facilitate reusing the same code for dumping a previously captured state from a GPU hang. Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
@@ -16,26 +16,100 @@
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#include <linux/debugfs.h>
|
||||
#include "msm_drv.h"
|
||||
#include "msm_gpu.h"
|
||||
#include "msm_kms.h"
|
||||
#include "msm_debugfs.h"
|
||||
|
||||
static int msm_gpu_show(struct drm_device *dev, struct seq_file *m)
|
||||
{
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct msm_gpu *gpu = priv->gpu;
|
||||
struct msm_gpu_show_priv {
|
||||
struct msm_gpu_state *state;
|
||||
struct drm_device *dev;
|
||||
};
|
||||
|
||||
if (gpu) {
|
||||
seq_printf(m, "%s Status:\n", gpu->name);
|
||||
pm_runtime_get_sync(&gpu->pdev->dev);
|
||||
gpu->funcs->show(gpu, m);
|
||||
pm_runtime_put_sync(&gpu->pdev->dev);
|
||||
}
|
||||
static int msm_gpu_show(struct seq_file *m, void *arg)
|
||||
{
|
||||
struct msm_gpu_show_priv *show_priv = m->private;
|
||||
struct msm_drm_private *priv = show_priv->dev->dev_private;
|
||||
struct msm_gpu *gpu = priv->gpu;
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_interruptible(&show_priv->dev->struct_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
seq_printf(m, "%s Status:\n", gpu->name);
|
||||
gpu->funcs->show(gpu, show_priv->state, m);
|
||||
|
||||
mutex_unlock(&show_priv->dev->struct_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_gpu_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct msm_gpu_show_priv *show_priv = m->private;
|
||||
struct msm_drm_private *priv = show_priv->dev->dev_private;
|
||||
struct msm_gpu *gpu = priv->gpu;
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_interruptible(&show_priv->dev->struct_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gpu->funcs->gpu_state_put(show_priv->state);
|
||||
mutex_unlock(&show_priv->dev->struct_mutex);
|
||||
|
||||
kfree(show_priv);
|
||||
|
||||
return single_release(inode, file);
|
||||
}
|
||||
|
||||
static int msm_gpu_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct drm_device *dev = inode->i_private;
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct msm_gpu *gpu = priv->gpu;
|
||||
struct msm_gpu_show_priv *show_priv;
|
||||
int ret;
|
||||
|
||||
if (!gpu)
|
||||
return -ENODEV;
|
||||
|
||||
show_priv = kmalloc(sizeof(*show_priv), GFP_KERNEL);
|
||||
if (!show_priv)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mutex_lock_interruptible(&dev->struct_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pm_runtime_get_sync(&gpu->pdev->dev);
|
||||
show_priv->state = gpu->funcs->gpu_state_get(gpu);
|
||||
pm_runtime_put_sync(&gpu->pdev->dev);
|
||||
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
if (IS_ERR(show_priv->state)) {
|
||||
ret = PTR_ERR(show_priv->state);
|
||||
kfree(show_priv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
show_priv->dev = dev;
|
||||
|
||||
return single_open(file, msm_gpu_show, show_priv);
|
||||
}
|
||||
|
||||
static const struct file_operations msm_gpu_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = msm_gpu_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = msm_gpu_release,
|
||||
};
|
||||
|
||||
static int msm_gem_show(struct drm_device *dev, struct seq_file *m)
|
||||
{
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
@@ -105,7 +179,6 @@ static int show_locked(struct seq_file *m, void *arg)
|
||||
}
|
||||
|
||||
static struct drm_info_list msm_debugfs_list[] = {
|
||||
{"gpu", show_locked, 0, msm_gpu_show},
|
||||
{"gem", show_locked, 0, msm_gem_show},
|
||||
{ "mm", show_locked, 0, msm_mm_show },
|
||||
{ "fb", show_locked, 0, msm_fb_show },
|
||||
@@ -158,6 +231,9 @@ int msm_debugfs_init(struct drm_minor *minor)
|
||||
return ret;
|
||||
}
|
||||
|
||||
debugfs_create_file("gpu", S_IRUSR, minor->debugfs_root,
|
||||
dev, &msm_gpu_fops);
|
||||
|
||||
if (priv->kms->funcs->debugfs_init) {
|
||||
ret = priv->kms->funcs->debugfs_init(priv->kms, minor);
|
||||
if (ret)
|
||||
|
Reference in New Issue
Block a user