]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: move reset support type checks into the caller
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Jul 2025 15:55:05 +0000 (11:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 17 Jul 2025 16:36:56 +0000 (12:36 -0400)
Rather than checking in the callbacks, check if the reset
type is supported in the caller.

Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
25 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c
drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c

index 5cb7bf9420f70ba247edbc48c366cd1fe9de1353..32a08529307d58ca66f74215e16b590409e1644e 100644 (file)
@@ -112,6 +112,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
                amdgpu_job_core_dump(adev, job);
 
        if (amdgpu_gpu_recovery &&
+           amdgpu_ring_is_reset_type_supported(ring, AMDGPU_RESET_TYPE_SOFT_RESET) &&
            amdgpu_ring_soft_recovery(ring, job->vmid, s_job->s_fence->parent)) {
                dev_err(adev->dev, "ring %s timeout, but soft recovered\n",
                        s_job->sched->name);
@@ -131,7 +132,9 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
        /* attempt a per ring reset */
        if (unlikely(adev->debug_disable_gpu_ring_reset)) {
                dev_err(adev->dev, "Ring reset disabled by debug mask\n");
-       } else if (amdgpu_gpu_recovery && ring->funcs->reset) {
+       } else if (amdgpu_gpu_recovery &&
+                  amdgpu_ring_is_reset_type_supported(ring, AMDGPU_RESET_TYPE_PER_QUEUE) &&
+                  ring->funcs->reset) {
                dev_err(adev->dev, "Starting %s ring reset\n",
                        s_job->sched->name);
                r = amdgpu_ring_reset(ring, job->vmid, &job->hw_fence);
index acac646a4e4e9be317739ddeef43d29df6add6fc..a5c3f64cbce6288e78f73c2ca5b8359acb737b94 100644 (file)
@@ -825,3 +825,34 @@ int amdgpu_ring_reset_helper_end(struct amdgpu_ring *ring,
        drm_sched_wqueue_start(&ring->sched);
        return 0;
 }
+
+bool amdgpu_ring_is_reset_type_supported(struct amdgpu_ring *ring,
+                                        u32 reset_type)
+{
+       switch (ring->funcs->type) {
+       case AMDGPU_RING_TYPE_GFX:
+               if (ring->adev->gfx.gfx_supported_reset & reset_type)
+                       return true;
+               break;
+       case AMDGPU_RING_TYPE_COMPUTE:
+               if (ring->adev->gfx.compute_supported_reset & reset_type)
+                       return true;
+               break;
+       case AMDGPU_RING_TYPE_SDMA:
+               if (ring->adev->sdma.supported_reset & reset_type)
+                       return true;
+               break;
+       case AMDGPU_RING_TYPE_VCN_DEC:
+       case AMDGPU_RING_TYPE_VCN_ENC:
+               if (ring->adev->vcn.supported_reset & reset_type)
+                       return true;
+               break;
+       case AMDGPU_RING_TYPE_VCN_JPEG:
+               if (ring->adev->jpeg.supported_reset & reset_type)
+                       return true;
+               break;
+       default:
+               break;
+       }
+       return false;
+}
index 309e7bb6001bde62dbee0ffefa0b970c0cf79c43..7670f5d82b9e46c80d64ab148e18367cf14fc2ae 100644 (file)
@@ -568,4 +568,6 @@ void amdgpu_ring_reset_helper_begin(struct amdgpu_ring *ring,
                                    struct amdgpu_fence *guilty_fence);
 int amdgpu_ring_reset_helper_end(struct amdgpu_ring *ring,
                                 struct amdgpu_fence *guilty_fence);
+bool amdgpu_ring_is_reset_type_supported(struct amdgpu_ring *ring,
+                                        u32 reset_type);
 #endif
index d799bc74936c07ac09db15f474627e8669cfcccc..f1f67521c29cab315b2c09bfbcf37d5dda20a88a 100644 (file)
@@ -1522,9 +1522,6 @@ int amdgpu_vcn_ring_reset(struct amdgpu_ring *ring,
 {
        struct amdgpu_device *adev = ring->adev;
 
-       if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (adev->vcn.inst[ring->me].using_unified_queue)
                return -EINVAL;
 
index 744f51a6f522d5fee183f4026db604891d1a180f..7bd506f06eb155de7f2edb2c1c9d5ed7232b16fc 100644 (file)
@@ -9523,9 +9523,6 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring,
        u64 addr;
        int r;
 
-       if (!(adev->gfx.gfx_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
                return -EINVAL;
 
@@ -9591,9 +9588,6 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
        unsigned long flags;
        int i, r;
 
-       if (!(adev->gfx.compute_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
                return -EINVAL;
 
index 465fcd650373521967d42b5a97f37df501d84150..c01c241a1b06326ad5a6225bad14d5d2bd2cb4ca 100644 (file)
@@ -6808,9 +6808,6 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->gfx.gfx_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
 
        r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, false);
@@ -6974,9 +6971,6 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r = 0;
 
-       if (!(adev->gfx.compute_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
 
        r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, true);
index 5d32ae4b1a4c93d7e9c87c287ce7a25157596ea2..09bf72237d1d614044be8674853b85e8f505f8fa 100644 (file)
@@ -5303,9 +5303,6 @@ static int gfx_v12_0_reset_kgq(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->gfx.gfx_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
 
        r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, false);
@@ -5421,9 +5418,6 @@ static int gfx_v12_0_reset_kcq(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->gfx.compute_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
 
        r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, true);
index 9c0cdf4dde7140aaf0ed5bed6434f7c535126584..20b30f4b3c7d447b57ce0a07b10dae0ab86fd558 100644 (file)
@@ -7183,9 +7183,6 @@ static int gfx_v9_0_reset_kcq(struct amdgpu_ring *ring,
        unsigned long flags;
        int i, r;
 
-       if (!(adev->gfx.compute_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
                return -EINVAL;
 
index 2763817c225557dece39d5afdc9a8ecdd621fea9..51babf5c78c86c20ef806e31e9d0a4185ffda5b8 100644 (file)
@@ -3565,9 +3565,6 @@ static int gfx_v9_4_3_reset_kcq(struct amdgpu_ring *ring,
        unsigned long flags;
        int r;
 
-       if (!(adev->gfx.compute_supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
                return -EINVAL;
 
index b93d6af8f6e545d99415bbdae792a9790084a3ed..58239c405fda512ca9a0718bcd6644ca9721a9c9 100644 (file)
@@ -773,9 +773,6 @@ static int jpeg_v2_0_ring_reset(struct amdgpu_ring *ring,
 {
        int r;
 
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = jpeg_v2_0_stop(ring->adev);
        if (r)
index b6d5ba0bdc143a01d2e3a908319914373936b9a1..3e2c389242dbe91dee0f4fcffb43c72b348e29cd 100644 (file)
@@ -650,9 +650,6 @@ static int jpeg_v2_5_ring_reset(struct amdgpu_ring *ring,
                                unsigned int vmid,
                                struct amdgpu_fence *timedout_fence)
 {
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        jpeg_v2_5_stop_inst(ring->adev, ring->me);
        jpeg_v2_5_start_inst(ring->adev, ring->me);
index a229d7eb900c901eccb06f391395284c6ed0462f..a44eb2667664bbf1cb1edadb2a588dd60ba35425 100644 (file)
@@ -564,9 +564,6 @@ static int jpeg_v3_0_ring_reset(struct amdgpu_ring *ring,
 {
        int r;
 
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = jpeg_v3_0_stop(ring->adev);
        if (r)
index f3a9073b8b24315155c0d3a18583d90aacfbf3e3..da3ee69f1a3ba4ed4710d8db719a5492e5c2aa2f 100644 (file)
@@ -729,9 +729,6 @@ static int jpeg_v4_0_ring_reset(struct amdgpu_ring *ring,
 {
        int r;
 
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = jpeg_v4_0_stop(ring->adev);
        if (r)
index 1892c278ea3c4c1809078fe40dbe275869e844a7..481d1a2dbe5aaf549bf36b6c7d77597e7b71ab1b 100644 (file)
@@ -774,9 +774,6 @@ static int jpeg_v4_0_5_ring_reset(struct amdgpu_ring *ring,
 {
        int r;
 
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = jpeg_v4_0_5_stop(ring->adev);
        if (r)
index 0b4de0c6476ae844de8677f582b4060bc3f2523d..e0a71909252be5b6070445ef703434023e5a04a6 100644 (file)
@@ -650,9 +650,6 @@ static int jpeg_v5_0_0_ring_reset(struct amdgpu_ring *ring,
 {
        int r;
 
-       if (!(ring->adev->jpeg.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = jpeg_v5_0_0_stop(ring->adev);
        if (r)
index e622db1f818bf4876cf7e537384a84c2c13049b8..54523dc1f7026f6ef87863284033dc013d548a68 100644 (file)
@@ -836,9 +836,6 @@ static int jpeg_v5_0_1_ring_reset(struct amdgpu_ring *ring,
                                  unsigned int vmid,
                                  struct amdgpu_fence *timedout_fence)
 {
-       if (amdgpu_sriov_vf(ring->adev))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        jpeg_v5_0_1_core_stall_reset(ring);
        jpeg_v5_0_1_init_jrbc(ring);
index 20fad2525969b2d386fc37d62605c4604055809e..36b1ca73c2ed323a85b8bdbf3adb54bd0fecbcce 100644 (file)
@@ -1664,9 +1664,6 @@ static int sdma_v4_4_2_reset_queue(struct amdgpu_ring *ring,
        u32 id = ring->me;
        int r;
 
-       if (!(adev->sdma.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_amdkfd_suspend(adev, true);
        r = amdgpu_sdma_reset_engine(adev, id, false);
        amdgpu_amdkfd_resume(adev, true);
index d8c19601dd2e677f6e9e18599b3f14f69e5a80e3..7dc67a22a7a01d9df65cb93f91acdcbd7c1f85fa 100644 (file)
@@ -1547,9 +1547,6 @@ static int sdma_v5_0_reset_queue(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->sdma.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (ring->me >= adev->sdma.num_instances) {
                dev_err(adev->dev, "sdma instance not found\n");
                return -EINVAL;
index 5d56029e88a6239703700c7b8cceaab08bb15cce..3bd44c24f692dbe155353afc307cd0b14d780837 100644 (file)
@@ -1461,9 +1461,6 @@ static int sdma_v5_2_reset_queue(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->sdma.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (ring->me >= adev->sdma.num_instances) {
                dev_err(adev->dev, "sdma instance not found\n");
                return -EINVAL;
index 5d31f318cb3c77e51d4744cb6fa45f3515edbf1d..e6d8eddda2bfa6f50867e9bb49aeda5dfa3dcf64 100644 (file)
@@ -1578,9 +1578,6 @@ static int sdma_v6_0_reset_queue(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->sdma.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (ring->me >= adev->sdma.num_instances) {
                dev_err(adev->dev, "sdma instance not found\n");
                return -EINVAL;
index 13abc0c46eab0a19c3bf63eebe173cdb183721c7..b8b06d4c5882c8ecf5218c17c4182a027eafa2ff 100644 (file)
@@ -809,9 +809,6 @@ static int sdma_v7_0_reset_queue(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        int r;
 
-       if (!(adev->sdma.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        if (ring->me >= adev->sdma.num_instances) {
                dev_err(adev->dev, "sdma instance not found\n");
                return -EINVAL;
index f642a06a77b5616b6b76926d27bdb54efc49fcdd..1924e075b66f4173be08fdad3f5974b757e8bc67 100644 (file)
@@ -1976,9 +1976,6 @@ static int vcn_v4_0_ring_reset(struct amdgpu_ring *ring,
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
        int r;
 
-       if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = vcn_v4_0_stop(vinst);
        if (r)
index 3bda19b92cde789b0d3cc3652fce534bc6ab03b0..2a3663b551af94b103ffe73943951986c4a78fd4 100644 (file)
@@ -1603,12 +1603,6 @@ static int vcn_v4_0_3_ring_reset(struct amdgpu_ring *ring,
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
 
-       if (amdgpu_sriov_vf(ring->adev))
-               return -EOPNOTSUPP;
-
-       if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
 
        vcn_inst = GET_INST(VCN, ring->me);
index 039989ab452ad69e1f0e614391fb5d0c821c938f..caf2d95a85d433d45dcfa69e8fdc42d0356b861e 100644 (file)
@@ -1474,9 +1474,6 @@ static int vcn_v4_0_5_ring_reset(struct amdgpu_ring *ring,
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
        int r;
 
-       if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = vcn_v4_0_5_stop(vinst);
        if (r)
index ec0268b5666cc73c7367c06913d07407e053f4b8..07a6e95828808a391179bc62f935934e1d5a4617 100644 (file)
@@ -1201,9 +1201,6 @@ static int vcn_v5_0_0_ring_reset(struct amdgpu_ring *ring,
        struct amdgpu_vcn_inst *vinst = &adev->vcn.inst[ring->me];
        int r;
 
-       if (!(adev->vcn.supported_reset & AMDGPU_RESET_TYPE_PER_QUEUE))
-               return -EOPNOTSUPP;
-
        amdgpu_ring_reset_helper_begin(ring, timedout_fence);
        r = vcn_v5_0_0_stop(vinst);
        if (r)