winsys/amdgpu: Add R600_DEBUG flag to reserve VMID per ctx.
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Tue, 31 Oct 2017 15:40:12 +0000 (11:40 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 31 Oct 2017 15:55:24 +0000 (16:55 +0100)
Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
configure.ac
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h

index 9aa02f55ded7737830c7ce5ffb060e07dcf77150..efc653ad7fa2ea528a50a7e39a24ffea9a8211f0 100644 (file)
@@ -74,7 +74,7 @@ AC_SUBST([OPENCL_VERSION])
 # in the first entry.
 LIBDRM_REQUIRED=2.4.75
 LIBDRM_RADEON_REQUIRED=2.4.71
-LIBDRM_AMDGPU_REQUIRED=2.4.85
+LIBDRM_AMDGPU_REQUIRED=2.4.86
 LIBDRM_INTEL_REQUIRED=2.4.75
 LIBDRM_NVVIEUX_REQUIRED=2.4.66
 LIBDRM_NOUVEAU_REQUIRED=2.4.66
index b77d85901f0ebd5b3c8c7e65ced5d52eca53f2e7..71f3d6deb70e28e7066724481de40724ab91b16c 100644 (file)
@@ -851,6 +851,7 @@ static const struct debug_named_value common_debug_options[] = {
        { "dpbb", DBG(DPBB), "Enable DPBB." },
        { "dfsm", DBG(DFSM), "Enable DFSM." },
        { "nooutoforder", DBG(NO_OUT_OF_ORDER), "Disable out-of-order rasterization" },
+       { "reserve_vmid", DBG(RESERVE_VMID), "Force VMID reservation per context." },
 
        DEBUG_NAMED_VALUE_END /* must be last */
 };
index a7c91cb8a123d0b129145d4187c3f5409509eb57..94c8d4f8801603bf6f380834afe3614415eae296 100644 (file)
@@ -107,6 +107,7 @@ enum {
        DBG_NO_DISCARD_RANGE,
        DBG_NO_WC,
        DBG_CHECK_VM,
+       DBG_RESERVE_VMID,
 
        /* 3D engine options: */
        DBG_SWITCH_ON_EOP,
index 8f43e9364698d03cb3d8cbcb4bea76d3a45c6c77..37c28347e4e7c210453459a1a597732acdc07ecd 100644 (file)
@@ -256,6 +256,14 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws)
       goto error_create;
    }
 
+   if (ctx->ws->reserve_vmid) {
+          r = amdgpu_vm_reserve_vmid(ctx->ctx, 0);
+          if (r) {
+               fprintf(stderr, "amdgpu: amdgpu_vm_reserve_vmid failed. (%i)\n", r);
+               goto error_create;
+          }
+   }
+
    alloc_buffer.alloc_size = ctx->ws->info.gart_page_size;
    alloc_buffer.phys_alignment = ctx->ws->info.gart_page_size;
    alloc_buffer.preferred_heap = AMDGPU_GEM_DOMAIN_GTT;
index 1c3d0f0be1cfde42145a2534ffe9e92066d6b10a..d023841439a936e8777d6763ad075eaaf02999f4 100644 (file)
@@ -162,6 +162,9 @@ static inline bool amdgpu_fence_is_syncobj(struct amdgpu_fence *fence)
 static inline void amdgpu_ctx_unref(struct amdgpu_ctx *ctx)
 {
    if (p_atomic_dec_zero(&ctx->refcount)) {
+      if (ctx->ws->reserve_vmid)
+         amdgpu_vm_unreserve_vmid(ctx->ctx, 0);
+
       amdgpu_cs_ctx_free(ctx->ctx);
       amdgpu_bo_free(ctx->user_fence_bo);
       FREE(ctx);
index a210a270431082fd09b98d2847aa02b1e7bf4248..b80a988d6b65f60a0cb7ff49d3c13d730e77eddf 100644 (file)
@@ -73,6 +73,7 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd)
 
    ws->check_vm = strstr(debug_get_option("R600_DEBUG", ""), "check_vm") != NULL;
    ws->debug_all_bos = debug_get_option_all_bos();
+   ws->reserve_vmid = strstr(debug_get_option("R600_DEBUG", ""), "reserve_vmid") != NULL;
 
    return true;
 
index 8b62e2dbe34790813e5913aa2253a5eff0915ba0..b4a3422744f6408c6f43e6359cfb84f0242c0eb8 100644 (file)
@@ -81,6 +81,7 @@ struct amdgpu_winsys {
 
    bool check_vm;
    bool debug_all_bos;
+   bool reserve_vmid;
 
    /* List of all allocated buffers */
    mtx_t global_bo_list_lock;