]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/amdgpu: Move VCN reset mask setup to late_init for VCN 5.0.1
authorJesse.Zhang <Jesse.Zhang@amd.com>
Fri, 15 Aug 2025 15:44:11 +0000 (23:44 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 23 Sep 2025 14:41:37 +0000 (10:41 -0400)
This patch moves the initialization of the VCN supported_reset mask from
sw_init to a new late_init function for VCN 5.0.1. The change ensures
that all necessary hardware and firmware initialization is complete
before determining the supported reset types.

Key changes:
- Added vcn_v5_0_1_late_init() function to handle late initialization
- Moved supported_reset mask setup from sw_init to late_init
- Added check for per-queue reset support via amdgpu_dpm_reset_vcn_is_supported()
- Updated ip_funcs to use the new late_init function

This change helps ensure proper reset behavior by waiting until all
dependencies are initialized before determining available reset types.

Reviewed-by: Sonny Jiang <sonny.jiang@amd.com>
Signed-off-by: Jesse Zhang <Jesse.Zhang@amd.com>
Signed-off-by: Ruili Ji <ruiliji2@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c

index 11b931153ea1b0d308219aa2deb8d7c622ad0f9e..714350cabf2fc156ccb330e9964c314017a8186f 100644 (file)
@@ -113,6 +113,25 @@ static int vcn_v5_0_1_early_init(struct amdgpu_ip_block *ip_block)
        return 0;
 }
 
+static int vcn_v5_0_1_late_init(struct amdgpu_ip_block *ip_block)
+{
+       struct amdgpu_device *adev = ip_block->adev;
+
+       adev->vcn.supported_reset =
+               amdgpu_get_soft_full_reset_mask(&adev->vcn.inst[0].ring_enc[0]);
+
+       switch (amdgpu_ip_version(adev, MP0_HWIP, 0)) {
+       case IP_VERSION(13, 0, 12):
+               if ((adev->psp.sos.fw_version >= 0x00450025) && amdgpu_dpm_reset_vcn_is_supported(adev))
+                       adev->vcn.supported_reset |= AMDGPU_RESET_TYPE_PER_QUEUE;
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 static void vcn_v5_0_1_fw_shared_init(struct amdgpu_device *adev, int inst_idx)
 {
        struct amdgpu_vcn5_fw_shared *fw_shared;
@@ -187,10 +206,6 @@ static int vcn_v5_0_1_sw_init(struct amdgpu_ip_block *ip_block)
                vcn_v5_0_1_fw_shared_init(adev, i);
        }
 
-       /* TODO: Add queue reset mask when FW fully supports it */
-       adev->vcn.supported_reset =
-               amdgpu_get_soft_full_reset_mask(&adev->vcn.inst[0].ring_enc[0]);
-
        if (amdgpu_sriov_vf(adev)) {
                r = amdgpu_virt_alloc_mm_table(adev);
                if (r)
@@ -1541,7 +1556,7 @@ static void vcn_v5_0_1_set_irq_funcs(struct amdgpu_device *adev)
 static const struct amd_ip_funcs vcn_v5_0_1_ip_funcs = {
        .name = "vcn_v5_0_1",
        .early_init = vcn_v5_0_1_early_init,
-       .late_init = NULL,
+       .late_init = vcn_v5_0_1_late_init,
        .sw_init = vcn_v5_0_1_sw_init,
        .sw_fini = vcn_v5_0_1_sw_fini,
        .hw_init = vcn_v5_0_1_hw_init,