diff options
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.patch | 291 |
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 + |