From: Christian König <christian.koe...@amd.com>

When we need to find the mapping we need sysvm access anyway.

Signed-off-by: Christian König <christian.koe...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  8 ++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c  | 64 ++++++++++++---------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 16 ++++-----
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 11 +++---
 4 files changed, 36 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 4dc9744..6c37768 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -180,6 +180,7 @@ struct amdgpu_cs_parser;
 struct amdgpu_job;
 struct amdgpu_irq_src;
 struct amdgpu_fpriv;
+struct amdgpu_bo_va_mapping;
 
 enum amdgpu_cp_irq {
        AMDGPU_CP_IRQ_GFX_EOP = 0,
@@ -1900,10 +1901,9 @@ static inline int amdgpu_acpi_init(struct amdgpu_device 
*adev) { return 0; }
 static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { }
 #endif
 
-struct amdgpu_bo_va_mapping *
-amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
-                      uint64_t addr, struct amdgpu_bo **bo);
-int amdgpu_cs_sysvm_access_required(struct amdgpu_cs_parser *parser);
+int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
+                          uint64_t addr, struct amdgpu_bo **bo,
+                          struct amdgpu_bo_va_mapping **mapping);
 
 #if defined(CONFIG_DRM_AMD_DC)
 int amdgpu_dm_display_resume(struct amdgpu_device *adev );
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 4ab35db..bcb3548 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -914,11 +914,11 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
                        uint64_t offset;
                        uint8_t *kptr;
 
-                       m = amdgpu_cs_find_mapping(parser, chunk_ib->va_start,
-                                                  &aobj);
-                       if (!aobj) {
+                       r = amdgpu_cs_find_mapping(parser, chunk_ib->va_start,
+                                                  &aobj, &m);
+                       if (r) {
                                DRM_ERROR("IB va_start is invalid\n");
-                               return -EINVAL;
+                               return r;
                        }
 
                        if ((chunk_ib->va_start + chunk_ib->ib_bytes) >
@@ -1370,15 +1370,16 @@ int amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, 
void *data,
  * virtual memory address. Returns allocation structure when found, NULL
  * otherwise.
  */
-struct amdgpu_bo_va_mapping *
-amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
-                      uint64_t addr, struct amdgpu_bo **bo)
+int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
+                          uint64_t addr, struct amdgpu_bo **bo,
+                          struct amdgpu_bo_va_mapping **map)
 {
        struct amdgpu_bo_va_mapping *mapping;
        unsigned i;
+       int r;
 
        if (!parser->bo_list)
-               return NULL;
+               return 0;
 
        addr /= AMDGPU_GPU_PAGE_SIZE;
 
@@ -1395,7 +1396,8 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
                                continue;
 
                        *bo = lobj->bo_va->base.bo;
-                       return mapping;
+                       *map = mapping;
+                       goto found;
                }
 
                list_for_each_entry(mapping, &lobj->bo_va->invalids, list) {
@@ -1404,44 +1406,22 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
                                continue;
 
                        *bo = lobj->bo_va->base.bo;
-                       return mapping;
+                       *map = mapping;
+                       goto found;
                }
        }
 
-       return NULL;
-}
+       return -EINVAL;
 
-/**
- * amdgpu_cs_sysvm_access_required - make BOs accessible by the system VM
- *
- * @parser: command submission parser context
- *
- * Helper for UVD/VCE VM emulation, make sure BOs are accessible by the system 
VM.
- */
-int amdgpu_cs_sysvm_access_required(struct amdgpu_cs_parser *parser)
-{
-       unsigned i;
-       int r;
+found:
+       r = amdgpu_ttm_bind(&(*bo)->tbo, &(*bo)->tbo.mem);
+       if (unlikely(r))
+               return r;
 
-       if (!parser->bo_list)
+       if ((*bo)->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
                return 0;
 
-       for (i = 0; i < parser->bo_list->num_entries; i++) {
-               struct amdgpu_bo *bo = parser->bo_list->array[i].robj;
-
-               r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem);
-               if (unlikely(r))
-                       return r;
-
-               if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)
-                       continue;
-
-               bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
-               amdgpu_ttm_placement_from_domain(bo, bo->allowed_domains);
-               r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
-               if (unlikely(r))
-                       return r;
-       }
-
-       return 0;
+       (*bo)->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
+       amdgpu_ttm_placement_from_domain(*bo, (*bo)->allowed_domains);
+       return ttm_bo_validate(&(*bo)->tbo, &(*bo)->placement, false, false);
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index e19928d..331e34a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -410,10 +410,10 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx 
*ctx)
        uint64_t addr = amdgpu_uvd_get_addr_from_ctx(ctx);
        int r = 0;
 
-       mapping = amdgpu_cs_find_mapping(ctx->parser, addr, &bo);
-       if (mapping == NULL) {
+       r = amdgpu_cs_find_mapping(ctx->parser, addr, &bo, &mapping);
+       if (r) {
                DRM_ERROR("Can't find BO for addr 0x%08Lx\n", addr);
-               return -EINVAL;
+               return r;
        }
 
        if (!ctx->parser->adev->uvd.address_64_bit) {
@@ -737,10 +737,10 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx 
*ctx)
        uint64_t addr = amdgpu_uvd_get_addr_from_ctx(ctx);
        int r;
 
-       mapping = amdgpu_cs_find_mapping(ctx->parser, addr, &bo);
-       if (mapping == NULL) {
+       r = amdgpu_cs_find_mapping(ctx->parser, addr, &bo, &mapping);
+       if (r) {
                DRM_ERROR("Can't find BO for addr 0x%08Lx\n", addr);
-               return -EINVAL;
+               return r;
        }
 
        start = amdgpu_bo_gpu_offset(bo);
@@ -917,10 +917,6 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser 
*parser, uint32_t ib_idx)
                return -EINVAL;
        }
 
-       r = amdgpu_cs_sysvm_access_required(parser);
-       if (r)
-               return r;
-
        ctx.parser = parser;
        ctx.buf_sizes = buf_sizes;
        ctx.ib_idx = ib_idx;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index c855366..b46280c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -559,6 +559,7 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, 
uint32_t ib_idx,
        struct amdgpu_bo_va_mapping *mapping;
        struct amdgpu_bo *bo;
        uint64_t addr;
+       int r;
 
        if (index == 0xffffffff)
                index = 0;
@@ -567,11 +568,11 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser 
*p, uint32_t ib_idx,
               ((uint64_t)amdgpu_get_ib_value(p, ib_idx, hi)) << 32;
        addr += ((uint64_t)size) * ((uint64_t)index);
 
-       mapping = amdgpu_cs_find_mapping(p, addr, &bo);
-       if (mapping == NULL) {
+       r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping);
+       if (r) {
                DRM_ERROR("Can't find BO for addr 0x%010Lx %d %d %d %d\n",
                          addr, lo, hi, size, index);
-               return -EINVAL;
+               return r;
        }
 
        if ((addr + (uint64_t)size) >
@@ -652,10 +653,6 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, 
uint32_t ib_idx)
        p->job->vm = NULL;
        ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
 
-       r = amdgpu_cs_sysvm_access_required(p);
-       if (r)
-               return r;
-
        while (idx < ib->length_dw) {
                uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx);
                uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1);
-- 
2.7.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to