static void psp_set_funcs(struct amdgpu_device *adev);
 
+/*
+ * Due to DF Cstate management centralized to PMFW, the firmware
+ * loading sequence will be updated as below:
+ *   - Load KDB
+ *   - Load SYS_DRV
+ *   - Load tOS
+ *   - Load PMFW
+ *   - Setup TMR
+ *   - Load other non-psp fw
+ *   - Load ASD
+ *   - Load XGMI/RAS/HDCP/DTM TA if any
+ *
+ * This new sequence is required for
+ *   - Arcturus
+ *   - Navi12 and onwards
+ */
+static void psp_check_pmfw_centralized_cstate_management(struct psp_context *psp)
+{
+       struct amdgpu_device *adev = psp->adev;
+
+       psp->pmfw_centralized_cstate_management = false;
+
+       if (amdgpu_sriov_vf(adev))
+               return;
+
+       if (adev->flags & AMD_IS_APU)
+               return;
+
+       if ((adev->asic_type == CHIP_ARCTURUS) ||
+           (adev->asic_type >= CHIP_NAVI12))
+               psp->pmfw_centralized_cstate_management = true;
+}
+
 static int psp_early_init(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
        psp->adev = adev;
 
+       psp_check_pmfw_centralized_cstate_management(psp);
+
        return 0;
 }
 
                return ret;
        }
 
-       ret = psp_tmr_load(psp);
-       if (ret) {
-               DRM_ERROR("PSP load tmr failed!\n");
-               return ret;
+       /*
+        * For those ASICs with DF Cstate management centralized
+        * to PMFW, TMR setup should be performed after PMFW
+        * loaded and before other non-psp firmware loaded.
+        */
+       if (!psp->pmfw_centralized_cstate_management) {
+               ret = psp_tmr_load(psp);
+               if (ret) {
+                       DRM_ERROR("PSP load tmr failed!\n");
+                       return ret;
+               }
        }
 
        return 0;
        struct amdgpu_firmware_info *ucode;
        struct amdgpu_device* adev = psp->adev;
 
-       if (psp->autoload_supported) {
+       if (psp->autoload_supported ||
+           psp->pmfw_centralized_cstate_management) {
                ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC];
                if (!ucode->fw || amdgpu_sriov_vf(adev))
                        goto out;
                        return ret;
        }
 
+       if (psp->pmfw_centralized_cstate_management) {
+               ret = psp_tmr_load(psp);
+               if (ret) {
+                       DRM_ERROR("PSP load tmr failed!\n");
+                       return ret;
+               }
+       }
+
 out:
        for (i = 0; i < adev->firmware.max_ucodes; i++) {
                ucode = &adev->firmware.ucode[i];
                        continue;
 
                if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC &&
-                   (psp_smu_reload_quirk(psp) || psp->autoload_supported))
+                   (psp_smu_reload_quirk(psp) ||
+                    psp->autoload_supported ||
+                    psp->pmfw_centralized_cstate_management))
                        continue;
 
                if (amdgpu_sriov_vf(adev) &&