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