radeonsi: align command buffer starting address to fix some Raven hangs
authorMarek Olšák <marek.olsak@amd.com>
Wed, 7 Mar 2018 00:07:58 +0000 (19:07 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 8 Mar 2018 19:58:16 +0000 (14:58 -0500)
Cc: 17.3 18.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/amd/common/ac_gpu_info.c
src/amd/common/ac_gpu_info.h
src/gallium/drivers/radeonsi/si_pm4.c
src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c

index 146098baa0ce454ccd622b565e39d2e6c22b415c..7c13e5f70b7720b22463a5a98dcd6f0174881cd7 100644 (file)
@@ -98,7 +98,9 @@ bool ac_query_gpu_info(int fd, amdgpu_device_handle dev,
 {
        struct amdgpu_buffer_size_alignments alignment_info = {};
        struct amdgpu_heap_info vram, vram_vis, gtt;
-       struct drm_amdgpu_info_hw_ip dma = {}, compute = {}, uvd = {}, uvd_enc = {}, vce = {}, vcn_dec = {}, vcn_enc = {};
+       struct drm_amdgpu_info_hw_ip dma = {}, compute = {}, uvd = {};
+       struct drm_amdgpu_info_hw_ip uvd_enc = {}, vce = {}, vcn_dec = {};
+       struct drm_amdgpu_info_hw_ip vcn_enc = {}, gfx = {};
        uint32_t vce_version = 0, vce_feature = 0, uvd_version = 0, uvd_feature = 0;
        int r, i, j;
        drmDevicePtr devinfo;
@@ -154,6 +156,12 @@ bool ac_query_gpu_info(int fd, amdgpu_device_handle dev,
                return false;
        }
 
+       r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_GFX, 0, &gfx);
+       if (r) {
+               fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(gfx) failed.\n");
+               return false;
+       }
+
        r = amdgpu_query_hw_ip_info(dev, AMDGPU_HW_IP_COMPUTE, 0, &compute);
        if (r) {
                fprintf(stderr, "amdgpu: amdgpu_query_hw_ip_info(compute) failed.\n");
@@ -340,6 +348,17 @@ bool ac_query_gpu_info(int fd, amdgpu_device_handle dev,
        if (info->chip_class == SI)
                info->gfx_ib_pad_with_type2 = TRUE;
 
+       unsigned ib_align = 0;
+       ib_align = MAX2(ib_align, gfx.ib_start_alignment);
+       ib_align = MAX2(ib_align, compute.ib_start_alignment);
+       ib_align = MAX2(ib_align, dma.ib_start_alignment);
+       ib_align = MAX2(ib_align, uvd.ib_start_alignment);
+       ib_align = MAX2(ib_align, uvd_enc.ib_start_alignment);
+       ib_align = MAX2(ib_align, vce.ib_start_alignment);
+       ib_align = MAX2(ib_align, vcn_dec.ib_start_alignment);
+       ib_align = MAX2(ib_align, vcn_enc.ib_start_alignment);
+       info->ib_start_alignment = ib_align;
+
        return true;
 }
 
index 7c86dc1cb6f178b866011dfd4f7f1b8e1339d431..0beba9604a096976e4edae1741a410e94332ba2f 100644 (file)
@@ -62,6 +62,7 @@ struct radeon_info {
        bool                        has_virtual_memory;
        bool                        gfx_ib_pad_with_type2;
        bool                        has_hw_decode;
+       unsigned                    ib_start_alignment;
        uint32_t                    num_sdma_rings;
        uint32_t                    num_compute_rings;
        uint32_t                    uvd_fw_version;
index 96e4e1dd1a763ad37cb2982b030b76ae53e8da70..f4c41f5ffa575bf787fdb5d52db0f3cb778316c5 100644 (file)
@@ -167,8 +167,9 @@ void si_pm4_upload_indirect_buffer(struct si_context *sctx,
 
        r600_resource_reference(&state->indirect_buffer, NULL);
        state->indirect_buffer = (struct r600_resource*)
-               pipe_buffer_create(screen, 0,
-                                  PIPE_USAGE_DEFAULT, aligned_ndw * 4);
+               si_aligned_buffer_create(screen, 0,
+                                        PIPE_USAGE_DEFAULT, aligned_ndw * 4,
+                                        sctx->screen->info.ib_start_alignment);
        if (!state->indirect_buffer)
                return;
 
index 92d5394b1212d0860c14deb5bac2c5eefa287700..d9a95c05093a65ffc9e3aa898ae4763e016d1500 100644 (file)
@@ -800,10 +800,11 @@ static void amdgpu_set_ib_size(struct amdgpu_ib *ib)
    }
 }
 
-static void amdgpu_ib_finalize(struct amdgpu_ib *ib)
+static void amdgpu_ib_finalize(struct amdgpu_winsys *ws, struct amdgpu_ib *ib)
 {
    amdgpu_set_ib_size(ib);
    ib->used_ib_space += ib->base.current.cdw * 4;
+   ib->used_ib_space = align(ib->used_ib_space, ws->info.ib_start_alignment);
    ib->max_ib_size = MAX2(ib->max_ib_size, ib->base.prev_dw + ib->base.current.cdw);
 }
 
@@ -1561,7 +1562,7 @@ static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
       struct amdgpu_cs_context *cur = cs->csc;
 
       /* Set IB sizes. */
-      amdgpu_ib_finalize(&cs->main);
+      amdgpu_ib_finalize(ws, &cs->main);
 
       /* Create a fence. */
       amdgpu_fence_reference(&cur->fence, NULL);
index 85a186af97894ad0535723b5c53b525c41677200..036e9861f5fe25bad4c59250b0d58b9ea5479051 100644 (file)
@@ -527,6 +527,7 @@ static bool do_winsys_init(struct radeon_drm_winsys *ws)
                                     (ws->info.family == CHIP_HAWAII &&
                                      ws->accel_working2 < 3);
     ws->info.tcc_cache_line_size = 64; /* TC L2 line size on GCN */
+    ws->info.ib_start_alignment = 4096;
 
     ws->check_vm = strstr(debug_get_option("R600_DEBUG", ""), "check_vm") != NULL;