if (amdgpu_sriov_vf(adev))
                adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
 
+       /* Read BIOS */
+       if (!amdgpu_get_bios(adev))
+               return -EINVAL;
+
+       r = amdgpu_atombios_init(adev);
+       if (r) {
+               dev_err(adev->dev, "amdgpu_atombios_init failed\n");
+               amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
+               return r;
+       }
+
        for (i = 0; i < adev->num_ip_blocks; i++) {
                if ((amdgpu_ip_block_mask & (1 << i)) == 0) {
                        DRM_ERROR("disabled ip block: %d <%s>\n",
                goto fence_driver_init;
        }
 
-       /* Read BIOS */
-       if (!amdgpu_get_bios(adev)) {
-               r = -EINVAL;
-               goto failed;
-       }
-
-       r = amdgpu_atombios_init(adev);
-       if (r) {
-               dev_err(adev->dev, "amdgpu_atombios_init failed\n");
-               amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0);
-               goto failed;
-       }
-
        /* detect if we are with an SRIOV vbios */
        amdgpu_device_detect_sriov_bios(adev);
 
 
        /* Just return false for soc15 GPUs.  Reset does not seem to
         * be necessary.
         */
-       return false;
+       if (!amdgpu_passthrough(adev))
+               return false;
 
        if (adev->flags & AMD_IS_APU)
                return false;
 
 
 int vega10_hwmgr_init(struct pp_hwmgr *hwmgr)
 {
+       struct amdgpu_device *adev = hwmgr->adev;
+
        hwmgr->hwmgr_func = &vega10_hwmgr_funcs;
        hwmgr->pptable_func = &vega10_pptable_funcs;
+       if (amdgpu_passthrough(adev))
+               return vega10_baco_set_cap(hwmgr);
 
        return 0;
 }
 
 
        return result;
 }
+
+int vega10_baco_set_cap(struct pp_hwmgr *hwmgr)
+{
+       int result = 0;
+
+       const ATOM_Vega10_POWERPLAYTABLE *powerplay_table;
+
+       powerplay_table = get_powerplay_table(hwmgr);
+
+       PP_ASSERT_WITH_CODE((powerplay_table != NULL),
+               "Missing PowerPlay Table!", return -1);
+
+       result = check_powerplay_tables(hwmgr, powerplay_table);
+
+       PP_ASSERT_WITH_CODE((result == 0),
+                           "check_powerplay_tables failed", return result);
+
+       set_hw_cap(
+                       hwmgr,
+                       0 != (le32_to_cpu(powerplay_table->ulPlatformCaps) & ATOM_VEGA10_PP_PLATFORM_CAP_BACO),
+                       PHM_PlatformCaps_BACO);
+       return result;
+}
+
 
 extern int vega10_get_powerplay_table_entry(struct pp_hwmgr *hwmgr, uint32_t entry_index,
                struct pp_power_state *power_state, int (*call_back_func)(struct pp_hwmgr *, void *,
                                struct pp_power_state *, void *, uint32_t));
+extern int vega10_baco_set_cap(struct pp_hwmgr *hwmgr);
 #endif