aboutsummaryrefslogtreecommitdiffstats
path: root/meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch')
-rw-r--r--meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch b/meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch
new file mode 100644
index 00000000..c8788bd6
--- /dev/null
+++ b/meta-steppeeagle/recipes-kernel/linux/linux-yocto/0009-yocto-amd-drm-radeon-add-VRAM-debugfs-access-v3.patch
@@ -0,0 +1,168 @@
+From c100632a7a63c7cc03b7c4ad391477c919c61666 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Tue, 10 Dec 2013 07:45:24 -0700
+Subject: [PATCH 09/44] drm/radeon: add VRAM debugfs access v3
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Not very fast, but makes it possible to access even the
+normally inaccessible parts of VRAM from userspace.
+
+v2: use MM_INDEX_HI for >2GB mem access, add default_llseek
+v3: set inode size in the open callback
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/radeon/evergreen_reg.h | 1 +
+ drivers/gpu/drm/radeon/radeon.h | 4 ++
+ drivers/gpu/drm/radeon/radeon_ttm.c | 77 +++++++++++++++++++++++++++++++-
+ 3 files changed, 81 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h b/drivers/gpu/drm/radeon/evergreen_reg.h
+index 8a4e641..a0f63ff 100644
+--- a/drivers/gpu/drm/radeon/evergreen_reg.h
++++ b/drivers/gpu/drm/radeon/evergreen_reg.h
+@@ -33,6 +33,7 @@
+ #define EVERGREEN_PIF_PHY0_DATA 0xc
+ #define EVERGREEN_PIF_PHY1_INDEX 0x10
+ #define EVERGREEN_PIF_PHY1_DATA 0x14
++#define EVERGREEN_MM_INDEX_HI 0x18
+
+ #define EVERGREEN_VGA_MEMORY_BASE_ADDRESS 0x310
+ #define EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH 0x324
+diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
+index c0d4230..14df551 100644
+--- a/drivers/gpu/drm/radeon/radeon.h
++++ b/drivers/gpu/drm/radeon/radeon.h
+@@ -413,6 +413,10 @@ struct radeon_mman {
+ struct ttm_bo_device bdev;
+ bool mem_global_referenced;
+ bool initialized;
++
++#if defined(CONFIG_DEBUG_FS)
++ struct dentry *vram;
++#endif
+ };
+
+ /* bo virtual address in a specific vm */
+diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
+index a2d6c4f..83ef24d 100644
+--- a/drivers/gpu/drm/radeon/radeon_ttm.c
++++ b/drivers/gpu/drm/radeon/radeon_ttm.c
+@@ -39,12 +39,14 @@
+ #include <linux/seq_file.h>
+ #include <linux/slab.h>
+ #include <linux/swiotlb.h>
++#include <linux/debugfs.h>
+ #include "radeon_reg.h"
+ #include "radeon.h"
+
+ #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
+
+ static int radeon_ttm_debugfs_init(struct radeon_device *rdev);
++static void radeon_ttm_debugfs_fini(struct radeon_device *rdev);
+
+ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
+ {
+@@ -753,6 +755,7 @@ void radeon_ttm_fini(struct radeon_device *rdev)
+
+ if (!rdev->mman.initialized)
+ return;
++ radeon_ttm_debugfs_fini(rdev);
+ if (rdev->stollen_vga_memory) {
+ r = radeon_bo_reserve(rdev->stollen_vga_memory, false);
+ if (r == 0) {
+@@ -862,12 +865,75 @@ static struct drm_info_list radeon_ttm_debugfs_list[] = {
+ #endif
+ };
+
++static int radeon_ttm_vram_open(struct inode *inode, struct file *filep)
++{
++ struct radeon_device *rdev = inode->i_private;
++ i_size_write(inode, rdev->mc.mc_vram_size);
++ filep->private_data = inode->i_private;
++ return 0;
++}
++
++static ssize_t radeon_ttm_vram_read(struct file *f, char __user *buf,
++ size_t size, loff_t *pos)
++{
++ struct radeon_device *rdev = f->private_data;
++ ssize_t result = 0;
++ int r;
++
++ if (size & 0x3 || *pos & 0x3)
++ return -EINVAL;
++
++ while (size) {
++ unsigned long flags;
++ uint32_t value;
++
++ if (*pos >= rdev->mc.mc_vram_size)
++ return result;
++
++ spin_lock_irqsave(&rdev->mmio_idx_lock, flags);
++ WREG32(RADEON_MM_INDEX, ((uint32_t)*pos) | 0x80000000);
++ if (rdev->family >= CHIP_CEDAR)
++ WREG32(EVERGREEN_MM_INDEX_HI, *pos >> 31);
++ value = RREG32(RADEON_MM_DATA);
++ spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags);
++
++ r = put_user(value, (uint32_t *)buf);
++ if (r)
++ return r;
++
++ result += 4;
++ buf += 4;
++ *pos += 4;
++ size -= 4;
++ }
++
++ return result;
++}
++
++static const struct file_operations radeon_ttm_vram_fops = {
++ .owner = THIS_MODULE,
++ .open = radeon_ttm_vram_open,
++ .read = radeon_ttm_vram_read,
++ .llseek = default_llseek
++};
++
+ #endif
+
+ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
+ {
+ #if defined(CONFIG_DEBUG_FS)
+- unsigned count = ARRAY_SIZE(radeon_ttm_debugfs_list);
++ unsigned count;
++
++ struct drm_minor *minor = rdev->ddev->primary;
++ struct dentry *ent, *root = minor->debugfs_root;
++
++ ent = debugfs_create_file("radeon_vram", S_IFREG | S_IRUGO, root,
++ rdev, &radeon_ttm_vram_fops);
++ if (IS_ERR(ent))
++ return PTR_ERR(ent);
++ rdev->mman.vram = ent;
++
++ count = ARRAY_SIZE(radeon_ttm_debugfs_list);
+
+ #ifdef CONFIG_SWIOTLB
+ if (!swiotlb_nr_tbl())
+@@ -880,3 +946,12 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
+ return 0;
+ #endif
+ }
++
++static void radeon_ttm_debugfs_fini(struct radeon_device *rdev)
++{
++#if defined(CONFIG_DEBUG_FS)
++
++ debugfs_remove(rdev->mman.vram);
++ rdev->mman.vram = NULL;
++#endif
++}
+--
+1.7.9.5
+