drm/amdgpu: enable paging queue based on FW version (v2)
authorPhilip Yang <Philip.Yang@amd.com>
Mon, 19 Nov 2018 14:53:43 +0000 (09:53 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 21 Nov 2018 20:32:19 +0000 (15:32 -0500)
Based SDMA fw version to enable has_page_queue support. Have to move
sdma_v4_0_init_microcode from sw_init to early_init, to load firmware
and init fw_version before set_ring/buffer/vm_pte_funcs use it.

v2: don't enable on vega12, 20 until confirmed

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c

index 4d873fd..a973dea 100644 (file)
@@ -1447,23 +1447,46 @@ static void sdma_v4_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
        sdma_v4_0_wait_reg_mem(ring, 0, 0, reg, 0, val, mask, 10);
 }
 
+static bool sdma_v4_0_fw_support_paging_queue(struct amdgpu_device *adev)
+{
+       uint fw_version = adev->sdma.instance[0].fw_version;
+
+       switch (adev->asic_type) {
+       case CHIP_VEGA10:
+               return fw_version >= 430;
+       case CHIP_VEGA12:
+               /*return fw_version >= 31;*/
+               return false;
+       case CHIP_VEGA20:
+               /*return fw_version >= 115;*/
+               return false;
+       default:
+               return false;
+       }
+}
+
 static int sdma_v4_0_early_init(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+       int r;
 
-       if (adev->asic_type == CHIP_RAVEN) {
+       if (adev->asic_type == CHIP_RAVEN)
                adev->sdma.num_instances = 1;
-               adev->sdma.has_page_queue = false;
-       } else {
+       else
                adev->sdma.num_instances = 2;
-               /* TODO: Page queue breaks driver reload under SRIOV */
-               if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev)))
-                       adev->sdma.has_page_queue = false;
-               else if (adev->asic_type != CHIP_VEGA20 &&
-                               adev->asic_type != CHIP_VEGA12)
-                       adev->sdma.has_page_queue = true;
+
+       r = sdma_v4_0_init_microcode(adev);
+       if (r) {
+               DRM_ERROR("Failed to load sdma firmware!\n");
+               return r;
        }
 
+       /* TODO: Page queue breaks driver reload under SRIOV */
+       if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev)))
+               adev->sdma.has_page_queue = false;
+       else if (sdma_v4_0_fw_support_paging_queue(adev))
+               adev->sdma.has_page_queue = true;
+
        sdma_v4_0_set_ring_funcs(adev);
        sdma_v4_0_set_buffer_funcs(adev);
        sdma_v4_0_set_vm_pte_funcs(adev);
@@ -1472,7 +1495,6 @@ static int sdma_v4_0_early_init(void *handle)
        return 0;
 }
 
-
 static int sdma_v4_0_sw_init(void *handle)
 {
        struct amdgpu_ring *ring;
@@ -1491,12 +1513,6 @@ static int sdma_v4_0_sw_init(void *handle)
        if (r)
                return r;
 
-       r = sdma_v4_0_init_microcode(adev);
-       if (r) {
-               DRM_ERROR("Failed to load sdma firmware!\n");
-               return r;
-       }
-
        for (i = 0; i < adev->sdma.num_instances; i++) {
                ring = &adev->sdma.instance[i].ring;
                ring->ring_obj = NULL;