aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch')
-rw-r--r--common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch291
1 files changed, 291 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch b/common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch
new file mode 100644
index 00000000..41acf703
--- /dev/null
+++ b/common/recipes-kernel/linux/files/1023-drm-amd-amdgpu-Add-debugfs-entries-for-smc-didt-pcie.patch
@@ -0,0 +1,291 @@
+From c08b2057b33808ae9fc3942cb892f78b071379ba Mon Sep 17 00:00:00 2001
+From: Tom St Denis <tom.stdenis@amd.com>
+Date: Fri, 15 Apr 2016 13:08:44 -0400
+Subject: [PATCH 1023/1110] drm/amd/amdgpu: Add debugfs entries for
+ smc/didt/pcie
+
+This adds 3 new files that can be read/written to access
+GPU registers.
+
+Signed-off-by: Tom St Denis <tom.stdenis@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 230 ++++++++++++++++++++++++++++-
+ 2 files changed, 223 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index a8c59be..6079a39 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -1959,7 +1959,7 @@ struct amdgpu_device {
+ struct amdgpu_debugfs debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
+ unsigned debugfs_count;
+ #if defined(CONFIG_DEBUG_FS)
+- struct dentry *debugfs_regs;
++ struct dentry *debugfs_regs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
+ #endif
+ struct amdgpu_atif atif;
+ struct amdgpu_atcs atcs;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 8a5e3f7..56e4627 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -2186,32 +2186,246 @@ static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
+ return result;
+ }
+
++static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ value = RREG32_PCIE(*pos >> 2);
++ r = put_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ r = get_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ WREG32_PCIE(*pos >> 2, value);
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ value = RREG32_DIDT(*pos >> 2);
++ r = put_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ r = get_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ WREG32_DIDT(*pos >> 2, value);
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ value = RREG32_SMC(*pos >> 2);
++ r = put_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct amdgpu_device *adev = f->f_inode->i_private;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ uint32_t value;
++
++ r = get_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ WREG32_SMC(*pos >> 2, value);
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
+ static const struct file_operations amdgpu_debugfs_regs_fops = {
+ .owner = THIS_MODULE,
+ .read = amdgpu_debugfs_regs_read,
+ .write = amdgpu_debugfs_regs_write,
+ .llseek = default_llseek
+ };
++static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
++ .owner = THIS_MODULE,
++ .read = amdgpu_debugfs_regs_didt_read,
++ .write = amdgpu_debugfs_regs_didt_write,
++ .llseek = default_llseek
++};
++static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
++ .owner = THIS_MODULE,
++ .read = amdgpu_debugfs_regs_pcie_read,
++ .write = amdgpu_debugfs_regs_pcie_write,
++ .llseek = default_llseek
++};
++static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
++ .owner = THIS_MODULE,
++ .read = amdgpu_debugfs_regs_smc_read,
++ .write = amdgpu_debugfs_regs_smc_write,
++ .llseek = default_llseek
++};
++
++static const struct file_operations *debugfs_regs[] = {
++ &amdgpu_debugfs_regs_fops,
++ &amdgpu_debugfs_regs_didt_fops,
++ &amdgpu_debugfs_regs_pcie_fops,
++ &amdgpu_debugfs_regs_smc_fops,
++};
++
++static const char *debugfs_regs_names[] = {
++ "amdgpu_regs",
++ "amdgpu_regs_didt",
++ "amdgpu_regs_pcie",
++ "amdgpu_regs_smc",
++};
+
+ static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
+ {
+ struct drm_minor *minor = adev->ddev->primary;
+ struct dentry *ent, *root = minor->debugfs_root;
++ unsigned i, j;
++
++ for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
++ ent = debugfs_create_file(debugfs_regs_names[i],
++ S_IFREG | S_IRUGO, root,
++ adev, debugfs_regs[i]);
++ if (IS_ERR(ent)) {
++ for (j = 0; j < i; j++) {
++ debugfs_remove(adev->debugfs_regs[i]);
++ adev->debugfs_regs[i] = NULL;
++ }
++ return PTR_ERR(ent);
++ }
+
+- ent = debugfs_create_file("amdgpu_regs", S_IFREG | S_IRUGO, root,
+- adev, &amdgpu_debugfs_regs_fops);
+- if (IS_ERR(ent))
+- return PTR_ERR(ent);
+- i_size_write(ent->d_inode, adev->rmmio_size);
+- adev->debugfs_regs = ent;
++ if (!i)
++ i_size_write(ent->d_inode, adev->rmmio_size);
++ adev->debugfs_regs[i] = ent;
++ }
+
+ return 0;
+ }
+
+ static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
+ {
+- debugfs_remove(adev->debugfs_regs);
+- adev->debugfs_regs = NULL;
++ unsigned i;
++
++ for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
++ if (adev->debugfs_regs[i]) {
++ debugfs_remove(adev->debugfs_regs[i]);
++ adev->debugfs_regs[i] = NULL;
++ }
++ }
+ }
+
+ int amdgpu_debugfs_init(struct drm_minor *minor)
+--
+2.7.4
+