drm/amdgpu: fix IB test MCBP bug
authorMonk Liu <Monk.Liu@amd.com>
Thu, 20 Feb 2020 03:05:36 +0000 (11:05 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 5 Mar 2020 05:28:11 +0000 (00:28 -0500)
1)for gfx IB test we shouldn't insert DE meta data

2)we should make sure IB test finished before we
send event 3 to hypervisor otherwise the IDLE from
event 3 will preempt IB test, which is not designed
as a compatible structure for MCBP

Signed-off-by: Monk Liu <Monk.Liu@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/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c

index 79a7cb6..7d4a11d 100644 (file)
@@ -3193,6 +3193,12 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
        flush_delayed_work(&adev->delayed_init_work);
        adev->shutdown = true;
 
+       /* make sure IB test finished before entering exclusive mode
+        * to avoid preemption on IB test
+        * */
+       if (amdgpu_sriov_vf(adev))
+               amdgpu_virt_request_full_gpu(adev, false);
+
        /* disable all interrupts */
        amdgpu_irq_disable_all(adev);
        if (adev->mode_info.mode_config_initialized){
index 6a1b62b..9f78725 100644 (file)
@@ -88,9 +88,6 @@ void amdgpu_driver_unload_kms(struct drm_device *dev)
        if (adev->rmmio == NULL)
                goto done_free;
 
-       if (amdgpu_sriov_vf(adev))
-               amdgpu_virt_request_full_gpu(adev, false);
-
        if (adev->runpm) {
                pm_runtime_get_sync(dev->dev);
                pm_runtime_forbid(dev->dev);
index 7b8d97d..74c616e 100644 (file)
@@ -4437,7 +4437,7 @@ static void gfx_v10_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
                if (flags & AMDGPU_IB_PREEMPTED)
                        control |= INDIRECT_BUFFER_PRE_RESUME(1);
 
-               if (!(ib->flags & AMDGPU_IB_FLAG_CE))
+               if (!(ib->flags & AMDGPU_IB_FLAG_CE) && vmid)
                        gfx_v10_0_ring_emit_de_meta(ring,
                                    (!amdgpu_sriov_vf(ring->adev) && flags & AMDGPU_IB_PREEMPTED) ? true : false);
        }
index 393a132..b14f46a 100644 (file)
@@ -6116,7 +6116,7 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        if (amdgpu_sriov_vf(ring->adev) && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) {
                control |= INDIRECT_BUFFER_PRE_ENB(1);
 
-               if (!(ib->flags & AMDGPU_IB_FLAG_CE))
+               if (!(ib->flags & AMDGPU_IB_FLAG_CE) && vmid)
                        gfx_v8_0_ring_emit_de_meta(ring);
        }
 
index 32eeb1b..0ad3597 100644 (file)
@@ -4985,7 +4985,7 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        if (amdgpu_sriov_vf(ring->adev) && (ib->flags & AMDGPU_IB_FLAG_PREEMPT)) {
                control |= INDIRECT_BUFFER_PRE_ENB(1);
 
-               if (!(ib->flags & AMDGPU_IB_FLAG_CE))
+               if (!(ib->flags & AMDGPU_IB_FLAG_CE) && vmid)
                        gfx_v9_0_ring_emit_de_meta(ring);
        }