aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch')
-rw-r--r--common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch193
1 files changed, 193 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch b/common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch
new file mode 100644
index 00000000..e91b8105
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0464-drm-amdgpu-optionally-enable-GART-debugfs-file.patch
@@ -0,0 +1,193 @@
+From 18510c1c4a1505f2e79edc206b997bee011913f6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 30 Mar 2016 14:42:57 +0200
+Subject: [PATCH 0464/1110] drm/amdgpu: optionally enable GART debugfs file
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Keeping the pages array around can use a lot of system memory
+when you want a large GART.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/Kconfig | 10 +++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 35 +++++++++++++++++++-------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 9 ++++++++
+ 4 files changed, 42 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
+index b30fcfa..7335c04 100644
+--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
++++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
+@@ -15,3 +15,13 @@ config DRM_AMDGPU_USERPTR
+ help
+ This option selects CONFIG_MMU_NOTIFIER if it isn't already
+ selected to enabled full userptr support.
++
++config DRM_AMDGPU_GART_DEBUGFS
++ bool "Allow GART access through debugfs"
++ depends on DRM_AMDGPU
++ depends on DEBUG_FS
++ default n
++ help
++ Selecting this option creates a debugfs file to inspect the mapped
++ pages. Uses more memory for housekeeping, enable only for debugging.
++
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 35e07fb..993b574 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -612,7 +612,9 @@ struct amdgpu_gart {
+ unsigned num_gpu_pages;
+ unsigned num_cpu_pages;
+ unsigned table_size;
++#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
+ struct page **pages;
++#endif
+ bool ready;
+ const struct amdgpu_gart_funcs *gart_funcs;
+ };
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+index a13603a..921bce2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+@@ -238,17 +238,17 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, unsigned offset,
+ t = offset / AMDGPU_GPU_PAGE_SIZE;
+ p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
+ for (i = 0; i < pages; i++, p++) {
+- if (adev->gart.pages[p]) {
+- adev->gart.pages[p] = NULL;
+- page_base = adev->dummy_page.addr;
+- if (!adev->gart.ptr)
+- continue;
++#ifdef CONFIG_AMDGPU_GART_DEBUGFS
++ adev->gart.pages[p] = NULL;
++#endif
++ page_base = adev->dummy_page.addr;
++ if (!adev->gart.ptr)
++ continue;
+
+- for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
+- amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
+- t, page_base, flags);
+- page_base += AMDGPU_GPU_PAGE_SIZE;
+- }
++ for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
++ amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
++ t, page_base, flags);
++ page_base += AMDGPU_GPU_PAGE_SIZE;
+ }
+ }
+ mb();
+@@ -286,7 +286,9 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
+ p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
+
+ for (i = 0; i < pages; i++, p++) {
++#ifdef CONFIG_AMDGPU_GART_DEBUGFS
+ adev->gart.pages[p] = pagelist[i];
++#endif
+ if (adev->gart.ptr) {
+ page_base = dma_addr[i];
+ for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
+@@ -312,9 +314,9 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
+ {
+ int r;
+
+- if (adev->gart.pages) {
++ if (adev->dummy_page.page)
+ return 0;
+- }
++
+ /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */
+ if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) {
+ DRM_ERROR("Page size is smaller than GPU page size!\n");
+@@ -328,12 +330,16 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
+ adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE;
+ DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
+ adev->gart.num_cpu_pages, adev->gart.num_gpu_pages);
++
++#ifdef CONFIG_AMDGPU_GART_DEBUGFS
+ /* Allocate pages table */
+ adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
+ if (adev->gart.pages == NULL) {
+ amdgpu_gart_fini(adev);
+ return -ENOMEM;
+ }
++#endif
++
+ return 0;
+ }
+
+@@ -346,13 +352,14 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
+ */
+ void amdgpu_gart_fini(struct amdgpu_device *adev)
+ {
+- if (adev->gart.pages && adev->gart.ready) {
++ if (adev->gart.ready) {
+ /* unbind pages */
+ amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
+ }
+ adev->gart.ready = false;
++#ifdef CONFIG_AMDGPU_GART_DEBUGFS
+ vfree(adev->gart.pages);
+ adev->gart.pages = NULL;
+-
++#endif
+ amdgpu_dummy_page_fini(adev);
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+index fbc3c2b..228ccab 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+@@ -1226,6 +1226,8 @@ static const struct file_operations amdgpu_ttm_vram_fops = {
+ .llseek = default_llseek
+ };
+
++#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
++
+ static ssize_t amdgpu_ttm_gtt_read(struct file *f, char __user *buf,
+ size_t size, loff_t *pos)
+ {
+@@ -1273,6 +1275,8 @@ static const struct file_operations amdgpu_ttm_gtt_fops = {
+
+ #endif
+
++#endif
++
+ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
+ {
+ #if defined(CONFIG_DEBUG_FS)
+@@ -1288,6 +1292,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
+ i_size_write(ent->d_inode, adev->mc.mc_vram_size);
+ adev->mman.vram = ent;
+
++#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
+ ent = debugfs_create_file("amdgpu_gtt", S_IFREG | S_IRUGO, root,
+ adev, &amdgpu_ttm_gtt_fops);
+ if (IS_ERR(ent))
+@@ -1295,6 +1300,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
+ i_size_write(ent->d_inode, adev->mc.gtt_size);
+ adev->mman.gtt = ent;
+
++#endif
+ count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
+
+ #ifdef CONFIG_SWIOTLB
+@@ -1316,7 +1322,10 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev)
+ debugfs_remove(adev->mman.vram);
+ adev->mman.vram = NULL;
+
++#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
+ debugfs_remove(adev->mman.gtt);
+ adev->mman.gtt = NULL;
+ #endif
++
++#endif
+ }
+--
+2.7.4
+