[PATCH 3/4] drm/amdgpu: use amdgpu_device_vram_access in amdgpu_ttm_vram_read

2020-02-06 Thread Christian König
This speeds up the access quite a bit from 2.2 MB/s to
2.9 MB/s on 32bit and 12,8 MB/s on 64bit.

Signed-off-by: Christian König 
Reviewed-by: Alex Deucher 
Acked-by: Jonathan Kim 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 27 ++---
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ae1b00def5d8..58d143b24ba0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -59,6 +59,8 @@
 #include "amdgpu_ras.h"
 #include "bif/bif_4_1_d.h"
 
+#define AMDGPU_TTM_VRAM_MAX_DW_READ(size_t)128
+
 static int amdgpu_map_buffer(struct ttm_buffer_object *bo,
 struct ttm_mem_reg *mem, unsigned num_pages,
 uint64_t offset, unsigned window,
@@ -2255,27 +2257,20 @@ static ssize_t amdgpu_ttm_vram_read(struct file *f, 
char __user *buf,
if (*pos >= adev->gmc.mc_vram_size)
return -ENXIO;
 
+   size = min(size, (size_t)(adev->gmc.mc_vram_size - *pos));
while (size) {
-   unsigned long flags;
-   uint32_t value;
-
-   if (*pos >= adev->gmc.mc_vram_size)
-   return result;
-
-   spin_lock_irqsave(>mmio_idx_lock, flags);
-   WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)*pos) | 0x8000);
-   WREG32_NO_KIQ(mmMM_INDEX_HI, *pos >> 31);
-   value = RREG32_NO_KIQ(mmMM_DATA);
-   spin_unlock_irqrestore(>mmio_idx_lock, flags);
+   size_t bytes = min(size, AMDGPU_TTM_VRAM_MAX_DW_READ * 4);
+   uint32_t value[AMDGPU_TTM_VRAM_MAX_DW_READ];
 
-   r = put_user(value, (uint32_t *)buf);
+   amdgpu_device_vram_access(adev, *pos, value, bytes, false);
+   r = copy_to_user(buf, value, bytes);
if (r)
return r;
 
-   result += 4;
-   buf += 4;
-   *pos += 4;
-   size -= 4;
+   result += bytes;
+   buf += bytes;
+   *pos += bytes;
+   size -= bytes;
}
 
return result;
-- 
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 3/4] drm/amdgpu: use amdgpu_device_vram_access in amdgpu_ttm_vram_read

2020-02-05 Thread Christian König
This speeds up the access quite a bit from 2.2 MB/s to
2.9 MB/s on 32bit and 12,8 MB/s on 64bit.

Signed-off-by: Christian König 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 27 ++---
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index ae1b00def5d8..58d143b24ba0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -59,6 +59,8 @@
 #include "amdgpu_ras.h"
 #include "bif/bif_4_1_d.h"
 
+#define AMDGPU_TTM_VRAM_MAX_DW_READ(size_t)128
+
 static int amdgpu_map_buffer(struct ttm_buffer_object *bo,
 struct ttm_mem_reg *mem, unsigned num_pages,
 uint64_t offset, unsigned window,
@@ -2255,27 +2257,20 @@ static ssize_t amdgpu_ttm_vram_read(struct file *f, 
char __user *buf,
if (*pos >= adev->gmc.mc_vram_size)
return -ENXIO;
 
+   size = min(size, (size_t)(adev->gmc.mc_vram_size - *pos));
while (size) {
-   unsigned long flags;
-   uint32_t value;
-
-   if (*pos >= adev->gmc.mc_vram_size)
-   return result;
-
-   spin_lock_irqsave(>mmio_idx_lock, flags);
-   WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)*pos) | 0x8000);
-   WREG32_NO_KIQ(mmMM_INDEX_HI, *pos >> 31);
-   value = RREG32_NO_KIQ(mmMM_DATA);
-   spin_unlock_irqrestore(>mmio_idx_lock, flags);
+   size_t bytes = min(size, AMDGPU_TTM_VRAM_MAX_DW_READ * 4);
+   uint32_t value[AMDGPU_TTM_VRAM_MAX_DW_READ];
 
-   r = put_user(value, (uint32_t *)buf);
+   amdgpu_device_vram_access(adev, *pos, value, bytes, false);
+   r = copy_to_user(buf, value, bytes);
if (r)
return r;
 
-   result += 4;
-   buf += 4;
-   *pos += 4;
-   size -= 4;
+   result += bytes;
+   buf += bytes;
+   *pos += bytes;
+   size -= bytes;
}
 
return result;
-- 
2.17.1

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx