[PATCH 4/4] drm/amdgpu: use amdgpu_device_vram_access in amdgpu_ttm_access_memory v2
Felix Kuehling
felix.kuehling at amd.com
Thu Feb 6 15:46:43 UTC 2020
On 2020-02-06 9:30, Christian König wrote:
> Make use of the better performance here as well.
>
> This patch is only compile tested!
>
> v2: fix calculation bug pointed out by Felix
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> Acked-by: Jonathan Kim <Jonathan.Kim at amd.com>
The series is
Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 38 +++++++++++++++----------
> 1 file changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 58d143b24ba0..2c1d1eb1a7e1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1565,7 +1565,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
>
> while (len && pos < adev->gmc.mc_vram_size) {
> uint64_t aligned_pos = pos & ~(uint64_t)3;
> - uint32_t bytes = 4 - (pos & 3);
> + uint64_t bytes = 4 - (pos & 3);
> uint32_t shift = (pos & 3) * 8;
> uint32_t mask = 0xffffffff << shift;
>
> @@ -1574,20 +1574,28 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
> bytes = len;
> }
>
> - spin_lock_irqsave(&adev->mmio_idx_lock, flags);
> - WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)aligned_pos) | 0x80000000);
> - WREG32_NO_KIQ(mmMM_INDEX_HI, aligned_pos >> 31);
> - if (!write || mask != 0xffffffff)
> - value = RREG32_NO_KIQ(mmMM_DATA);
> - if (write) {
> - value &= ~mask;
> - value |= (*(uint32_t *)buf << shift) & mask;
> - WREG32_NO_KIQ(mmMM_DATA, value);
> - }
> - spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
> - if (!write) {
> - value = (value & mask) >> shift;
> - memcpy(buf, &value, bytes);
> + if (mask != 0xffffffff) {
> + spin_lock_irqsave(&adev->mmio_idx_lock, flags);
> + WREG32_NO_KIQ(mmMM_INDEX, ((uint32_t)aligned_pos) | 0x80000000);
> + WREG32_NO_KIQ(mmMM_INDEX_HI, aligned_pos >> 31);
> + if (!write || mask != 0xffffffff)
> + value = RREG32_NO_KIQ(mmMM_DATA);
> + if (write) {
> + value &= ~mask;
> + value |= (*(uint32_t *)buf << shift) & mask;
> + WREG32_NO_KIQ(mmMM_DATA, value);
> + }
> + spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
> + if (!write) {
> + value = (value & mask) >> shift;
> + memcpy(buf, &value, bytes);
> + }
> + } else {
> + bytes = (nodes->start + nodes->size) << PAGE_SHIFT;
> + bytes = min(bytes - pos, (uint64_t)len & ~0x3ull);
> +
> + amdgpu_device_vram_access(adev, pos, (uint32_t *)buf,
> + bytes, write);
> }
>
> ret += bytes;
More information about the amd-gfx
mailing list