drm/amdgpu: optionally enable GART debugfs file
authorChristian König <christian.koenig@amd.com>
Wed, 30 Mar 2016 12:42:57 +0000 (14:42 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 2 May 2016 19:26:57 +0000 (15:26 -0400)
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
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c

index b30fcfa4b1f2c8074b8dcfb1c3bcf92b221b38a5..7335c0420c7034d1d66aa4a52946d79ddd25aba7 100644 (file)
@@ -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.
+
index e6f7bad735cc72108c2e224ba3d441d3d304673c..b9a6fe9a2a31b2c4b6bd447698c161c8928bb179 100644 (file)
@@ -611,7 +611,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;
 };
index a13603abed07f871345531edff6b00c3333c6232..921bce2df0b07cced181e9cb68693f989b7839fa 100644 (file)
@@ -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);
 }
index 6f3369de232fe5f545382a6cc2ca528bdf8c1026..7a8bdfedff1d51213701dcab29988002e59930cb 100644 (file)
@@ -1216,6 +1216,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)
 {
@@ -1263,6 +1265,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)
@@ -1278,6 +1282,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))
@@ -1285,6 +1290,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
@@ -1306,7 +1312,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
 }