}
 
-static void nv_enable_doorbell_aperture(struct amdgpu_device *adev,
-                                       bool enable)
-{
-       adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
-       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
-}
-
 const struct amdgpu_ip_block_version nv_common_ip_block =
 {
        .type = AMD_IP_BLOCK_TYPE_COMMON,
                }
        }
 
+       /* Enable selfring doorbell aperture late because doorbell BAR
+        * aperture will change if resize BAR successfully in gmc sw_init.
+        */
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
+
        return 0;
 }
 
        if (adev->nbio.funcs->remap_hdp_registers && !amdgpu_sriov_vf(adev))
                adev->nbio.funcs->remap_hdp_registers(adev);
        /* enable the doorbell aperture */
-       nv_enable_doorbell_aperture(adev, true);
+       adev->nbio.funcs->enable_doorbell_aperture(adev, true);
 
        return 0;
 }
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       /* disable the doorbell aperture */
-       nv_enable_doorbell_aperture(adev, false);
+       /* Disable the doorbell aperture and selfring doorbell aperture
+        * separately in hw_fini because nv_enable_doorbell_aperture
+        * has been removed and there is no need to delay disabling
+        * selfring doorbell.
+        */
+       adev->nbio.funcs->enable_doorbell_aperture(adev, false);
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
 
        return 0;
 }
 
                adev->nbio.funcs->program_aspm(adev);
 }
 
-static void soc15_enable_doorbell_aperture(struct amdgpu_device *adev,
-                                          bool enable)
-{
-       adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
-       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
-}
-
 const struct amdgpu_ip_block_version vega10_common_ip_block =
 {
        .type = AMD_IP_BLOCK_TYPE_COMMON,
        if (amdgpu_sriov_vf(adev))
                xgpu_ai_mailbox_get_irq(adev);
 
+       /* Enable selfring doorbell aperture late because doorbell BAR
+        * aperture will change if resize BAR successfully in gmc sw_init.
+        */
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
+
        return 0;
 }
 
                adev->nbio.funcs->remap_hdp_registers(adev);
 
        /* enable the doorbell aperture */
-       soc15_enable_doorbell_aperture(adev, true);
+       adev->nbio.funcs->enable_doorbell_aperture(adev, true);
+
        /* HW doorbell routing policy: doorbell writing not
         * in SDMA/IH/MM/ACV range will be routed to CP. So
         * we need to init SDMA doorbell range prior
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       /* disable the doorbell aperture */
-       soc15_enable_doorbell_aperture(adev, false);
+       /* Disable the doorbell aperture and selfring doorbell aperture
+        * separately in hw_fini because soc15_enable_doorbell_aperture
+        * has been removed and there is no need to delay disabling
+        * selfring doorbell.
+        */
+       adev->nbio.funcs->enable_doorbell_aperture(adev, false);
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
+
        if (amdgpu_sriov_vf(adev))
                xgpu_ai_mailbox_put_irq(adev);
 
 
                adev->nbio.funcs->program_aspm(adev);
 }
 
-static void soc21_enable_doorbell_aperture(struct amdgpu_device *adev,
-                                       bool enable)
-{
-       adev->nbio.funcs->enable_doorbell_aperture(adev, enable);
-       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, enable);
-}
-
 const struct amdgpu_ip_block_version soc21_common_ip_block =
 {
        .type = AMD_IP_BLOCK_TYPE_COMMON,
                        amdgpu_irq_get(adev, &adev->nbio.ras_err_event_athub_irq, 0);
        }
 
+       /* Enable selfring doorbell aperture late because doorbell BAR
+        * aperture will change if resize BAR successfully in gmc sw_init.
+        */
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, true);
+
        return 0;
 }
 
        if (adev->nbio.funcs->remap_hdp_registers)
                adev->nbio.funcs->remap_hdp_registers(adev);
        /* enable the doorbell aperture */
-       soc21_enable_doorbell_aperture(adev, true);
+       adev->nbio.funcs->enable_doorbell_aperture(adev, true);
 
        return 0;
 }
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       /* disable the doorbell aperture */
-       soc21_enable_doorbell_aperture(adev, false);
+       /* Disable the doorbell aperture and selfring doorbell aperture
+        * separately in hw_fini because soc21_enable_doorbell_aperture
+        * has been removed and there is no need to delay disabling
+        * selfring doorbell.
+        */
+       adev->nbio.funcs->enable_doorbell_aperture(adev, false);
+       adev->nbio.funcs->enable_doorbell_selfring_aperture(adev, false);
 
        if (amdgpu_sriov_vf(adev)) {
                xgpu_nv_mailbox_put_irq(adev);