diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4547-drm-amdgpu-split-swSMU-baco_reset-into-enter-and-exi.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4547-drm-amdgpu-split-swSMU-baco_reset-into-enter-and-exi.patch | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4547-drm-amdgpu-split-swSMU-baco_reset-into-enter-and-exi.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4547-drm-amdgpu-split-swSMU-baco_reset-into-enter-and-exi.patch new file mode 100644 index 00000000..dc2324a2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4547-drm-amdgpu-split-swSMU-baco_reset-into-enter-and-exi.patch @@ -0,0 +1,210 @@ +From 35d91a87c879ace6c7a7936a0b11a9a319f0268e Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexander.deucher@amd.com> +Date: Mon, 28 Oct 2019 15:20:03 -0400 +Subject: [PATCH 4547/4736] drm/amdgpu: split swSMU baco_reset into enter and + exit + +BACO - Bus Active, Chip Off + +So we can use it for power savings rather than just reset. + +Reviewed-by: Evan Quan <evan.quan@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/nv.c | 7 ++++++- + drivers/gpu/drm/amd/amdgpu/soc15.c | 10 ++++++++-- + drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 20 ++++++++++++++++--- + drivers/gpu/drm/amd/powerplay/arcturus_ppt.c | 3 ++- + .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 ++++-- + drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 3 ++- + drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 3 ++- + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 9 ++++++++- + drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 3 ++- + 9 files changed, 51 insertions(+), 13 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c +index 5cdd6528f011..66af92e7dcdf 100644 +--- a/drivers/gpu/drm/amd/amdgpu/nv.c ++++ b/drivers/gpu/drm/amd/amdgpu/nv.c +@@ -352,7 +352,12 @@ static int nv_asic_reset(struct amdgpu_device *adev) + if (nv_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { + if (!adev->in_suspend) + amdgpu_inc_vram_lost(adev); +- ret = smu_baco_reset(smu); ++ ret = smu_baco_enter(smu); ++ if (ret) ++ return ret; ++ ret = smu_baco_exit(smu); ++ if (ret) ++ return ret; + } else { + if (!adev->in_suspend) + amdgpu_inc_vram_lost(adev); +diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c +index 92230f1af2dd..805a92f87bf3 100644 +--- a/drivers/gpu/drm/amd/amdgpu/soc15.c ++++ b/drivers/gpu/drm/amd/amdgpu/soc15.c +@@ -510,9 +510,15 @@ static int soc15_asic_baco_reset(struct amdgpu_device *adev) + + if (is_support_sw_smu(adev)) { + struct smu_context *smu = &adev->smu; ++ int ret; + +- if (smu_baco_reset(smu)) +- return -EIO; ++ ret = smu_baco_enter(smu); ++ if (ret) ++ return ret; ++ ++ ret = smu_baco_exit(smu); ++ if (ret) ++ return ret; + } else { + void *pp_handle = adev->powerplay.pp_handle; + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; +diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +index 9483f5ff64e7..acbbafeea01c 100644 +--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c ++++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c +@@ -2456,14 +2456,28 @@ int smu_baco_get_state(struct smu_context *smu, enum smu_baco_state *state) + return 0; + } + +-int smu_baco_reset(struct smu_context *smu) ++int smu_baco_enter(struct smu_context *smu) + { + int ret = 0; + + mutex_lock(&smu->mutex); + +- if (smu->ppt_funcs->baco_reset) +- ret = smu->ppt_funcs->baco_reset(smu); ++ if (smu->ppt_funcs->baco_enter) ++ ret = smu->ppt_funcs->baco_enter(smu); ++ ++ mutex_unlock(&smu->mutex); ++ ++ return ret; ++} ++ ++int smu_baco_exit(struct smu_context *smu) ++{ ++ int ret = 0; ++ ++ mutex_lock(&smu->mutex); ++ ++ if (smu->ppt_funcs->baco_exit) ++ ret = smu->ppt_funcs->baco_exit(smu); + + mutex_unlock(&smu->mutex); + +diff --git a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c +index 06c331d1e3e7..cf3c31b0524c 100644 +--- a/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/arcturus_ppt.c +@@ -2163,7 +2163,8 @@ static const struct pptable_funcs arcturus_ppt_funcs = { + .baco_is_support= smu_v11_0_baco_is_support, + .baco_get_state = smu_v11_0_baco_get_state, + .baco_set_state = smu_v11_0_baco_set_state, +- .baco_reset = smu_v11_0_baco_reset, ++ .baco_enter = smu_v11_0_baco_enter, ++ .baco_exit = smu_v11_0_baco_exit, + .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq, + .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range, + .override_pcie_parameters = smu_v11_0_override_pcie_parameters, +diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +index 5bac7efcd6ee..ada4a8dc4112 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +@@ -546,7 +546,8 @@ struct pptable_funcs { + bool (*baco_is_support)(struct smu_context *smu); + enum smu_baco_state (*baco_get_state)(struct smu_context *smu); + int (*baco_set_state)(struct smu_context *smu, enum smu_baco_state state); +- int (*baco_reset)(struct smu_context *smu); ++ int (*baco_enter)(struct smu_context *smu); ++ int (*baco_exit)(struct smu_context *smu); + int (*mode2_reset)(struct smu_context *smu); + int (*get_dpm_ultimate_freq)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t *min, uint32_t *max); + int (*set_soft_freq_limited_range)(struct smu_context *smu, enum smu_clk_type clk_type, uint32_t min, uint32_t max); +@@ -628,7 +629,8 @@ bool smu_baco_is_support(struct smu_context *smu); + + int smu_baco_get_state(struct smu_context *smu, enum smu_baco_state *state); + +-int smu_baco_reset(struct smu_context *smu); ++int smu_baco_enter(struct smu_context *smu); ++int smu_baco_exit(struct smu_context *smu); + + int smu_mode2_reset(struct smu_context *smu); + +diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h +index e71445548c6f..716fcb274191 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h +@@ -249,7 +249,8 @@ enum smu_baco_state smu_v11_0_baco_get_state(struct smu_context *smu); + + int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state); + +-int smu_v11_0_baco_reset(struct smu_context *smu); ++int smu_v11_0_baco_enter(struct smu_context *smu); ++int smu_v11_0_baco_exit(struct smu_context *smu); + + int smu_v11_0_get_dpm_ultimate_freq(struct smu_context *smu, enum smu_clk_type clk_type, + uint32_t *min, uint32_t *max); +diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +index 8d5f33baaa77..24765e813cc2 100644 +--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +@@ -2109,7 +2109,8 @@ static const struct pptable_funcs navi10_ppt_funcs = { + .baco_is_support= smu_v11_0_baco_is_support, + .baco_get_state = smu_v11_0_baco_get_state, + .baco_set_state = smu_v11_0_baco_set_state, +- .baco_reset = smu_v11_0_baco_reset, ++ .baco_enter = smu_v11_0_baco_enter, ++ .baco_exit = smu_v11_0_baco_exit, + .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq, + .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range, + .override_pcie_parameters = smu_v11_0_override_pcie_parameters, +diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +index 52aadbaaabda..dd4437a9b3d0 100644 +--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c ++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +@@ -1714,7 +1714,7 @@ int smu_v11_0_baco_set_state(struct smu_context *smu, enum smu_baco_state state) + return ret; + } + +-int smu_v11_0_baco_reset(struct smu_context *smu) ++int smu_v11_0_baco_enter(struct smu_context *smu) + { + struct amdgpu_device *adev = smu->adev; + int ret = 0; +@@ -1732,6 +1732,13 @@ int smu_v11_0_baco_reset(struct smu_context *smu) + + msleep(10); + ++ return ret; ++} ++ ++int smu_v11_0_baco_exit(struct smu_context *smu) ++{ ++ int ret = 0; ++ + ret = smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT); + if (ret) + return ret; +diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +index 399697a2ad7f..83862544a45c 100644 +--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +@@ -3257,7 +3257,8 @@ static const struct pptable_funcs vega20_ppt_funcs = { + .baco_is_support= smu_v11_0_baco_is_support, + .baco_get_state = smu_v11_0_baco_get_state, + .baco_set_state = smu_v11_0_baco_set_state, +- .baco_reset = smu_v11_0_baco_reset, ++ .baco_enter = smu_v11_0_baco_enter, ++ .baco_exit = smu_v11_0_baco_exit, + .get_dpm_ultimate_freq = smu_v11_0_get_dpm_ultimate_freq, + .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range, + .override_pcie_parameters = smu_v11_0_override_pcie_parameters, +-- +2.17.1 + |