diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/Kconfig | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 35 | ||||
-rw-r--r-- | 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 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 | |||
19 | config 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 | */ |
347 | void amdgpu_gart_fini(struct amdgpu_device *adev) | 353 | void 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 | |||
1219 | static ssize_t amdgpu_ttm_gtt_read(struct file *f, char __user *buf, | 1221 | static 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 | |||
1266 | static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev) | 1270 | static 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 | } |