Re: [PATCH] drm/amdgpu/powerplay: check vrefresh when when changing displays

2018-08-10 Thread Huang Rui
On Thu, Aug 09, 2018 at 03:16:23PM -0500, Alex Deucher wrote:
> Compare the current vrefresh in addition to the number of displays
> when determining whether or not the smu needs updates when changing
> modes. The SMU needs to be updated if the vbi timeout changes due
> to a different refresh rate.  Fixes flickering around mode changes
> in some cases on polaris parts.
> 
> Signed-off-by: Alex Deucher 

Reviewed-by: Huang Rui 

> ---
>  drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c| 3 +++
>  drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h| 1 +
>  drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c| 1 +
>  drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c  | 3 ++-
>  drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c   | 1 +
>  drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c | 1 +
>  drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c | 1 +
>  drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c | 1 +
>  8 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
> b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> index 380f282a64ba..ab759e38e4ea 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
> @@ -4132,6 +4132,9 @@ 
> smu7_check_smc_update_required_for_display_configuration(struct pp_hwmgr 
> *hwmgr)
>   if (data->display_timing.num_existing_displays != 
> hwmgr->display_config->num_display)
>   is_update_required = true;
>  
> + if (data->display_timing.vrefresh != hwmgr->display_config->vrefresh)
> + is_update_required = true;
> +
>   if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 
> PHM_PlatformCaps_SclkDeepSleep)) {
>   if (data->display_timing.min_clock_in_sr != 
> hwmgr->display_config->min_core_set_clock_in_sr &&
>   (data->display_timing.min_clock_in_sr >= 
> SMU7_MINIMUM_ENGINE_CLOCK ||
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h 
> b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
> index 3784ce6e50ab..69d361f8dfca 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
> @@ -156,6 +156,7 @@ struct smu7_vbios_boot_state {
>  struct smu7_display_timing {
>   uint32_t  min_clock_in_sr;
>   uint32_t  num_existing_displays;
> + uint32_t  vrefresh;
>  };
>  
>  struct smu7_dpmlevel_enable_mask {
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c 
> b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
> index fbe3ef4ee45c..18643e06bc6f 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
> @@ -1231,6 +1231,7 @@ static int ci_populate_single_memory_level(
>   memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
>  
>   data->display_timing.num_existing_displays = 
> hwmgr->display_config->num_display;
> + data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
>  
>   /* stutter mode not support on ci */
>  
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c 
> b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> index 18048f8e2f13..ec14798e87b6 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
> @@ -1210,7 +1210,8 @@ static int fiji_populate_single_memory_level(struct 
> pp_hwmgr *hwmgr,
>* PECI_GetNumberOfActiveDisplays(hwmgr->pPECI,
>* &(data->DisplayTiming.numExistingDisplays));
>*/
> - data->display_timing.num_existing_displays = 1;
> + data->display_timing.num_existing_displays = 
> hwmgr->display_config->num_display;
> + data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
>  
>   if (mclk_stutter_mode_threshold &&
>   (clock <= mclk_stutter_mode_threshold) &&
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c 
> b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
> index 9299b93aa09a..73aa368a454e 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
> @@ -1280,6 +1280,7 @@ static int iceland_populate_single_memory_level(
>   memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
>  
>   data->display_timing.num_existing_displays = 
> hwmgr->display_config->num_display;
> + data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
>  
>   /* stutter mode not support on iceland */
>  
> diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c 
> b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> index 1276f168ff68..872d3824337b 100644
> --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
> @@ -1103,6 +1103,7 @@ static int 
> 

Re: [PATCH] drm/amdgpu/powerplay: check vrefresh when when changing displays

2018-08-09 Thread Zhu, Rex
Patch is Reviewed-by: Rex Zhu 


Thanks.



Best Regards

Rex


From: amd-gfx  on behalf of Alex Deucher 

Sent: Friday, August 10, 2018 4:16:23 AM
To: amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander
Subject: [PATCH] drm/amdgpu/powerplay: check vrefresh when when changing 
displays

Compare the current vrefresh in addition to the number of displays
when determining whether or not the smu needs updates when changing
modes. The SMU needs to be updated if the vbi timeout changes due
to a different refresh rate.  Fixes flickering around mode changes
in some cases on polaris parts.

Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c| 3 +++
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h| 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c| 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c  | 3 ++-
 drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c   | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c | 1 +
 8 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 380f282a64ba..ab759e38e4ea 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -4132,6 +4132,9 @@ 
smu7_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmgr)
 if (data->display_timing.num_existing_displays != 
hwmgr->display_config->num_display)
 is_update_required = true;

+   if (data->display_timing.vrefresh != hwmgr->display_config->vrefresh)
+   is_update_required = true;
+
 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 
PHM_PlatformCaps_SclkDeepSleep)) {
 if (data->display_timing.min_clock_in_sr != 
hwmgr->display_config->min_core_set_clock_in_sr &&
 (data->display_timing.min_clock_in_sr >= 
SMU7_MINIMUM_ENGINE_CLOCK ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
index 3784ce6e50ab..69d361f8dfca 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
@@ -156,6 +156,7 @@ struct smu7_vbios_boot_state {
 struct smu7_display_timing {
 uint32_t  min_clock_in_sr;
 uint32_t  num_existing_displays;
+   uint32_t  vrefresh;
 };

 struct smu7_dpmlevel_enable_mask {
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
index fbe3ef4ee45c..18643e06bc6f 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
@@ -1231,6 +1231,7 @@ static int ci_populate_single_memory_level(
 memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;

 data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;

 /* stutter mode not support on ci */

diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
index 18048f8e2f13..ec14798e87b6 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
@@ -1210,7 +1210,8 @@ static int fiji_populate_single_memory_level(struct 
pp_hwmgr *hwmgr,
  * PECI_GetNumberOfActiveDisplays(hwmgr->pPECI,
  * &(data->DisplayTiming.numExistingDisplays));
  */
-   data->display_timing.num_existing_displays = 1;
+   data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;

 if (mclk_stutter_mode_threshold &&
 (clock <= mclk_stutter_mode_threshold) &&
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
index 9299b93aa09a..73aa368a454e 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
@@ -1280,6 +1280,7 @@ static int iceland_populate_single_memory_level(
 memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;

 data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;

 /* stutter mode not support on iceland */

diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
index 12

[PATCH] drm/amdgpu/powerplay: check vrefresh when when changing displays

2018-08-09 Thread Alex Deucher
Compare the current vrefresh in addition to the number of displays
when determining whether or not the smu needs updates when changing
modes. The SMU needs to be updated if the vbi timeout changes due
to a different refresh rate.  Fixes flickering around mode changes
in some cases on polaris parts.

Signed-off-by: Alex Deucher 
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c| 3 +++
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h| 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c| 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c  | 3 ++-
 drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c   | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c | 1 +
 drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c | 1 +
 8 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 380f282a64ba..ab759e38e4ea 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -4132,6 +4132,9 @@ 
smu7_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmgr)
if (data->display_timing.num_existing_displays != 
hwmgr->display_config->num_display)
is_update_required = true;
 
+   if (data->display_timing.vrefresh != hwmgr->display_config->vrefresh)
+   is_update_required = true;
+
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 
PHM_PlatformCaps_SclkDeepSleep)) {
if (data->display_timing.min_clock_in_sr != 
hwmgr->display_config->min_core_set_clock_in_sr &&
(data->display_timing.min_clock_in_sr >= 
SMU7_MINIMUM_ENGINE_CLOCK ||
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
index 3784ce6e50ab..69d361f8dfca 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
@@ -156,6 +156,7 @@ struct smu7_vbios_boot_state {
 struct smu7_display_timing {
uint32_t  min_clock_in_sr;
uint32_t  num_existing_displays;
+   uint32_t  vrefresh;
 };
 
 struct smu7_dpmlevel_enable_mask {
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
index fbe3ef4ee45c..18643e06bc6f 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/ci_smumgr.c
@@ -1231,6 +1231,7 @@ static int ci_populate_single_memory_level(
memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
 
data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
 
/* stutter mode not support on ci */
 
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
index 18048f8e2f13..ec14798e87b6 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
@@ -1210,7 +1210,8 @@ static int fiji_populate_single_memory_level(struct 
pp_hwmgr *hwmgr,
 * PECI_GetNumberOfActiveDisplays(hwmgr->pPECI,
 * &(data->DisplayTiming.numExistingDisplays));
 */
-   data->display_timing.num_existing_displays = 1;
+   data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
 
if (mclk_stutter_mode_threshold &&
(clock <= mclk_stutter_mode_threshold) &&
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
index 9299b93aa09a..73aa368a454e 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/iceland_smumgr.c
@@ -1280,6 +1280,7 @@ static int iceland_populate_single_memory_level(
memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
 
data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh = hwmgr->display_config->vrefresh;
 
/* stutter mode not support on iceland */
 
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c 
b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
index 1276f168ff68..872d3824337b 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
@@ -1103,6 +1103,7 @@ static int polaris10_populate_single_memory_level(struct 
pp_hwmgr *hwmgr,
mem_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
 
data->display_timing.num_existing_displays = 
hwmgr->display_config->num_display;
+   data->display_timing.vrefresh =