aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Kconfig10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c35
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c9
4 files changed, 42 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index b30fcfa4b1f2..7335c0420c70 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -15,3 +15,13 @@ config DRM_AMDGPU_USERPTR
15 help 15 help
16 This option selects CONFIG_MMU_NOTIFIER if it isn't already 16 This option selects CONFIG_MMU_NOTIFIER if it isn't already
17 selected to enabled full userptr support. 17 selected to enabled full userptr support.
18
19config DRM_AMDGPU_GART_DEBUGFS
20 bool "Allow GART access through debugfs"
21 depends on DRM_AMDGPU
22 depends on DEBUG_FS
23 default n
24 help
25 Selecting this option creates a debugfs file to inspect the mapped
26 pages. Uses more memory for housekeeping, enable only for debugging.
27
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index e6f7bad735cc..b9a6fe9a2a31 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -611,7 +611,9 @@ struct amdgpu_gart {
611 unsigned num_gpu_pages; 611 unsigned num_gpu_pages;
612 unsigned num_cpu_pages; 612 unsigned num_cpu_pages;
613 unsigned table_size; 613 unsigned table_size;
614#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
614 struct page **pages; 615 struct page **pages;
616#endif
615 bool ready; 617 bool ready;
616 const struct amdgpu_gart_funcs *gart_funcs; 618 const struct amdgpu_gart_funcs *gart_funcs;
617}; 619};
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index a13603abed07..921bce2df0b0 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,
238 t = offset / AMDGPU_GPU_PAGE_SIZE; 238 t = offset / AMDGPU_GPU_PAGE_SIZE;
239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
240 for (i = 0; i < pages; i++, p++) { 240 for (i = 0; i < pages; i++, p++) {
241 if (adev->gart.pages[p]) { 241#ifdef CONFIG_AMDGPU_GART_DEBUGFS
242 adev->gart.pages[p] = NULL; 242 adev->gart.pages[p] = NULL;
243 page_base = adev->dummy_page.addr; 243#endif
244 if (!adev->gart.ptr) 244 page_base = adev->dummy_page.addr;
245 continue; 245 if (!adev->gart.ptr)
246 continue;
246 247
247 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 248 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
248 amdgpu_gart_set_pte_pde(adev, adev->gart.ptr, 249 amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
249 t, page_base, flags); 250 t, page_base, flags);
250 page_base += AMDGPU_GPU_PAGE_SIZE; 251 page_base += AMDGPU_GPU_PAGE_SIZE;
251 }
252 } 252 }
253 } 253 }
254 mb(); 254 mb();
@@ -286,7 +286,9 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
287 287
288 for (i = 0; i < pages; i++, p++) { 288 for (i = 0; i < pages; i++, p++) {
289#ifdef CONFIG_AMDGPU_GART_DEBUGFS
289 adev->gart.pages[p] = pagelist[i]; 290 adev->gart.pages[p] = pagelist[i];
291#endif
290 if (adev->gart.ptr) { 292 if (adev->gart.ptr) {
291 page_base = dma_addr[i]; 293 page_base = dma_addr[i];
292 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 294 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
@@ -312,9 +314,9 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
312{ 314{
313 int r; 315 int r;
314 316
315 if (adev->gart.pages) { 317 if (adev->dummy_page.page)
316 return 0; 318 return 0;
317 } 319
318 /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */ 320 /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */
319 if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) { 321 if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) {
320 DRM_ERROR("Page size is smaller than GPU page size!\n"); 322 DRM_ERROR("Page size is smaller than GPU page size!\n");
@@ -328,12 +330,16 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
328 adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE; 330 adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE;
329 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n", 331 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
330 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages); 332 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages);
333
334#ifdef CONFIG_AMDGPU_GART_DEBUGFS
331 /* Allocate pages table */ 335 /* Allocate pages table */
332 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages); 336 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
333 if (adev->gart.pages == NULL) { 337 if (adev->gart.pages == NULL) {
334 amdgpu_gart_fini(adev); 338 amdgpu_gart_fini(adev);
335 return -ENOMEM; 339 return -ENOMEM;
336 } 340 }
341#endif
342
337 return 0; 343 return 0;
338} 344}
339 345
@@ -346,13 +352,14 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
346 */ 352 */
347void amdgpu_gart_fini(struct amdgpu_device *adev) 353void amdgpu_gart_fini(struct amdgpu_device *adev)
348{ 354{
349 if (adev->gart.pages && adev->gart.ready) { 355 if (adev->gart.ready) {
350 /* unbind pages */ 356 /* unbind pages */
351 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages); 357 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
352 } 358 }
353 adev->gart.ready = false; 359 adev->gart.ready = false;
360#ifdef CONFIG_AMDGPU_GART_DEBUGFS
354 vfree(adev->gart.pages); 361 vfree(adev->gart.pages);
355 adev->gart.pages = NULL; 362 adev->gart.pages = NULL;
356 363#endif
357 amdgpu_dummy_page_fini(adev); 364 amdgpu_dummy_page_fini(adev);
358} 365}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 6f3369de232f..7a8bdfedff1d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1216,6 +1216,8 @@ static const struct file_operations amdgpu_ttm_vram_fops = {
1216 .llseek = default_llseek 1216 .llseek = default_llseek
1217}; 1217};
1218 1218
1219#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
1220
1219static ssize_t amdgpu_ttm_gtt_read(struct file *f, char __user *buf, 1221static ssize_t amdgpu_ttm_gtt_read(struct file *f, char __user *buf,
1220 size_t size, loff_t *pos) 1222 size_t size, loff_t *pos)
1221{ 1223{
@@ -1263,6 +1265,8 @@ static const struct file_operations amdgpu_ttm_gtt_fops = {
1263 1265
1264#endif 1266#endif
1265 1267
1268#endif
1269
1266static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev) 1270static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
1267{ 1271{
1268#if defined(CONFIG_DEBUG_FS) 1272#if defined(CONFIG_DEBUG_FS)
@@ -1278,6 +1282,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
1278 i_size_write(ent->d_inode, adev->mc.mc_vram_size); 1282 i_size_write(ent->d_inode, adev->mc.mc_vram_size);
1279 adev->mman.vram = ent; 1283 adev->mman.vram = ent;
1280 1284
1285#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
1281 ent = debugfs_create_file("amdgpu_gtt", S_IFREG | S_IRUGO, root, 1286 ent = debugfs_create_file("amdgpu_gtt", S_IFREG | S_IRUGO, root,
1282 adev, &amdgpu_ttm_gtt_fops); 1287 adev, &amdgpu_ttm_gtt_fops);
1283 if (IS_ERR(ent)) 1288 if (IS_ERR(ent))
@@ -1285,6 +1290,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
1285 i_size_write(ent->d_inode, adev->mc.gtt_size); 1290 i_size_write(ent->d_inode, adev->mc.gtt_size);
1286 adev->mman.gtt = ent; 1291 adev->mman.gtt = ent;
1287 1292
1293#endif
1288 count = ARRAY_SIZE(amdgpu_ttm_debugfs_list); 1294 count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
1289 1295
1290#ifdef CONFIG_SWIOTLB 1296#ifdef CONFIG_SWIOTLB
@@ -1306,7 +1312,10 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev)
1306 debugfs_remove(adev->mman.vram); 1312 debugfs_remove(adev->mman.vram);
1307 adev->mman.vram = NULL; 1313 adev->mman.vram = NULL;
1308 1314
1315#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
1309 debugfs_remove(adev->mman.gtt); 1316 debugfs_remove(adev->mman.gtt);
1310 adev->mman.gtt = NULL; 1317 adev->mman.gtt = NULL;
1311#endif 1318#endif
1319
1320#endif
1312} 1321}