diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/0436-drm-amd-powerplay-helper-interfaces-for-MGPU-fan-boo.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/0436-drm-amd-powerplay-helper-interfaces-for-MGPU-fan-boo.patch | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/0436-drm-amd-powerplay-helper-interfaces-for-MGPU-fan-boo.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/0436-drm-amd-powerplay-helper-interfaces-for-MGPU-fan-boo.patch new file mode 100644 index 00000000..d94d6907 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/0436-drm-amd-powerplay-helper-interfaces-for-MGPU-fan-boo.patch @@ -0,0 +1,156 @@ +From 8216283ad748384b99ac59366867d3adf75c3e39 Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Thu, 27 Sep 2018 13:43:16 +0800 +Subject: [PATCH 0436/2940] drm/amd/powerplay: helper interfaces for MGPU fan + boost feature + +MGPU fan boost feature is enabled only when two or more dGPUs +in the system. + +Change-Id: Ie1baebb04c1dfa05a090ad8a59089f072b0b0f32 +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 41 +++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h | 4 ++ + .../gpu/drm/amd/include/kgd_pp_interface.h | 1 + + drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 19 +++++++++ + drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 1 + + 5 files changed, 66 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 8933c0c009d8..173cc1e74838 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -1881,6 +1881,43 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev) + return 0; + } + ++static int amdgpu_device_enable_mgpu_fan_boost(void) ++{ ++ struct amdgpu_gpu_instance *gpu_ins; ++ struct amdgpu_device *adev; ++ int i, ret = 0; ++ ++ mutex_lock(&mgpu_info.mutex); ++ ++ /* ++ * MGPU fan boost feature should be enabled ++ * only when there are two or more dGPUs in ++ * the system ++ */ ++ if (mgpu_info.num_dgpu < 2) ++ goto out; ++ ++ for (i = 0; i < mgpu_info.num_dgpu; i++) { ++ gpu_ins = &(mgpu_info.gpu_ins[i]); ++ adev = gpu_ins->adev; ++ if (!(adev->flags & AMD_IS_APU) && ++ !gpu_ins->mgpu_fan_enabled && ++ adev->powerplay.pp_funcs && ++ adev->powerplay.pp_funcs->enable_mgpu_fan_boost) { ++ ret = amdgpu_dpm_enable_mgpu_fan_boost(adev); ++ if (ret) ++ break; ++ ++ gpu_ins->mgpu_fan_enabled = 1; ++ } ++ } ++ ++out: ++ mutex_unlock(&mgpu_info.mutex); ++ ++ return ret; ++} ++ + /** + * amdgpu_device_ip_late_init_func_handler - work handler for ib test + * +@@ -1895,6 +1932,10 @@ static void amdgpu_device_ip_late_init_func_handler(struct work_struct *work) + r = amdgpu_ib_ring_tests(adev); + if (r) + DRM_ERROR("ib ring test failed (%d).\n", r); ++ ++ r = amdgpu_device_enable_mgpu_fan_boost(); ++ if (r) ++ DRM_ERROR("enable mgpu fan boost failed (%d).\n", r); + } + + static void amdgpu_device_delay_enable_gfx_off(struct work_struct *work) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h +index ff24e1cc5b65..42568ae6b9f4 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h +@@ -357,6 +357,10 @@ enum amdgpu_pcie_gen { + ((adev)->powerplay.pp_funcs->odn_edit_dpm_table(\ + (adev)->powerplay.pp_handle, type, parameter, size)) + ++#define amdgpu_dpm_enable_mgpu_fan_boost(adev) \ ++ ((adev)->powerplay.pp_funcs->enable_mgpu_fan_boost(\ ++ (adev)->powerplay.pp_handle)) ++ + struct amdgpu_dpm { + struct amdgpu_ps *ps; + /* number of valid power states */ +diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h +index bd7404532029..8593850920d6 100644 +--- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h +@@ -272,6 +272,7 @@ struct amd_pm_funcs { + int (*get_display_mode_validation_clocks)(void *handle, + struct amd_pp_simple_clock_info *clocks); + int (*notify_smu_enable_pwe)(void *handle); ++ int (*enable_mgpu_fan_boost)(void *handle); + }; + + #endif +diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +index da4ebff5b74d..c2e541266273 100644 +--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c ++++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +@@ -1243,6 +1243,24 @@ static int pp_notify_smu_enable_pwe(void *handle) + return 0; + } + ++static int pp_enable_mgpu_fan_boost(void *handle) ++{ ++ struct pp_hwmgr *hwmgr = handle; ++ ++ if (!hwmgr || !hwmgr->pm_en) ++ return -EINVAL; ++ ++ if (hwmgr->hwmgr_func->enable_mgpu_fan_boost == NULL) { ++ return 0; ++ } ++ ++ mutex_lock(&hwmgr->smu_lock); ++ hwmgr->hwmgr_func->enable_mgpu_fan_boost(hwmgr); ++ mutex_unlock(&hwmgr->smu_lock); ++ ++ return 0; ++} ++ + static const struct amd_pm_funcs pp_dpm_funcs = { + .load_firmware = pp_dpm_load_fw, + .wait_for_fw_loading_complete = pp_dpm_fw_loading_complete, +@@ -1287,4 +1305,5 @@ static const struct amd_pm_funcs pp_dpm_funcs = { + .display_clock_voltage_request = pp_display_clock_voltage_request, + .get_display_mode_validation_clocks = pp_get_display_mode_validation_clocks, + .notify_smu_enable_pwe = pp_notify_smu_enable_pwe, ++ .enable_mgpu_fan_boost = pp_enable_mgpu_fan_boost, + }; +diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +index a6d92128b19c..8484e2db2554 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +@@ -328,6 +328,7 @@ struct pp_hwmgr_func { + int (*set_power_limit)(struct pp_hwmgr *hwmgr, uint32_t n); + int (*powergate_mmhub)(struct pp_hwmgr *hwmgr); + int (*smus_notify_pwe)(struct pp_hwmgr *hwmgr); ++ int (*enable_mgpu_fan_boost)(struct pp_hwmgr *hwmgr); + }; + + struct pp_table_func { +-- +2.17.1 + |