drm/amdgpu: Need to set the baco cap before baco reset
authorEmily Deng <Emily.Deng@amd.com>
Tue, 28 May 2019 02:17:04 +0000 (10:17 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 May 2019 19:47:42 +0000 (14:47 -0500)
For passthrough, after rebooted the VM, driver will do
a baco reset before doing other driver initialization during loading
 driver. For doing the baco reset, it will first
check the baco reset capability. So first need to set the
cap from the vbios information or baco reset won't be
enabled.

Signed-off-by: Emily Deng <Emily.Deng@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/soc15.c
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.h

index a7ff8d6dbc6cc830de0eee9938f439dfa6adca49..fe2708295867cf8bdf621d24fda2e5d608b1c269 100644 (file)
@@ -1541,6 +1541,17 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
        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",
@@ -2591,19 +2602,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                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);
 
index 78bd4fc07babc39cccfd71999d0cab1ae1cad9bf..d9fdd95fd6e6f07f3f2233cd61aa8e1c4eda6791 100644 (file)
@@ -764,7 +764,8 @@ static bool soc15_need_reset_on_init(struct amdgpu_device *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;
index ce6aeb5a03622f50d3bcabcb50a6e65be8b724a6..1d9bb29adaef5ffc24bbba4fb81371689aba1c9e 100644 (file)
@@ -5311,8 +5311,12 @@ static const struct pp_hwmgr_func vega10_hwmgr_funcs = {
 
 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;
 }
index b6767d74dc852aca70b10ab88052959f0a02c20c..83d22cdeaa29bb2cfbebd8a0c12bf956ad18ec89 100644 (file)
@@ -1371,3 +1371,27 @@ int vega10_get_powerplay_table_entry(struct pp_hwmgr *hwmgr,
 
        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;
+}
+
index d83ed2af7aa35305e829d3a5be76ed703bbbaf92..da5fbec9b0cdc55d10892cfec2f90a62d8f909a6 100644 (file)
@@ -59,4 +59,5 @@ extern int vega10_get_number_of_powerplay_table_entries(struct pp_hwmgr *hwmgr);
 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