]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/amdgpu/vpe: add ring reset support
authorAlex Deucher <alexander.deucher@amd.com>
Mon, 18 Aug 2025 19:19:47 +0000 (15:19 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 27 Aug 2025 17:57:49 +0000 (13:57 -0400)
Implement ring reset for VPE.  Similar to VCN and JPEG,
just powergate the the IP to reset it.

v2: Properly set per queue reset flag

Reviewed-by: Jesse Zhang <jesse.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c

index 121ee17b522bd4fb1ed2cf25c9c8d22b27a86f8c..86573c8d9b91ea67d91f3e3bd10e863f38006474 100644 (file)
@@ -379,9 +379,10 @@ static int vpe_sw_init(struct amdgpu_ip_block *ip_block)
        if (ret)
                goto out;
 
-       /* TODO: Add queue reset mask when FW fully supports it */
        adev->vpe.supported_reset =
                 amdgpu_get_soft_full_reset_mask(&adev->vpe.ring);
+       if (!amdgpu_sriov_vf(adev))
+               adev->vpe.supported_reset |= AMDGPU_RESET_TYPE_PER_QUEUE;
        ret = amdgpu_vpe_sysfs_reset_mask_init(adev);
        if (ret)
                goto out;
@@ -874,6 +875,27 @@ static void vpe_ring_end_use(struct amdgpu_ring *ring)
        schedule_delayed_work(&adev->vpe.idle_work, VPE_IDLE_TIMEOUT);
 }
 
+static int vpe_ring_reset(struct amdgpu_ring *ring,
+                         unsigned int vmid,
+                         struct amdgpu_fence *timedout_fence)
+{
+       struct amdgpu_device *adev = ring->adev;
+       int r;
+
+       amdgpu_ring_reset_helper_begin(ring, timedout_fence);
+
+       r = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VPE,
+                                                  AMD_PG_STATE_GATE);
+       if (r)
+               return r;
+       r = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VPE,
+                                                  AMD_PG_STATE_UNGATE);
+       if (r)
+               return r;
+
+       return amdgpu_ring_reset_helper_end(ring, timedout_fence);
+}
+
 static ssize_t amdgpu_get_vpe_reset_mask(struct device *dev,
                                                struct device_attribute *attr,
                                                char *buf)
@@ -942,6 +964,7 @@ static const struct amdgpu_ring_funcs vpe_ring_funcs = {
        .preempt_ib = vpe_ring_preempt_ib,
        .begin_use = vpe_ring_begin_use,
        .end_use = vpe_ring_end_use,
+       .reset = vpe_ring_reset,
 };
 
 static void vpe_set_ring_funcs(struct amdgpu_device *adev)