RE: [PATCH 37/40] drm/amd/pm: enable Polaris watermark table setting

2020-10-30 Thread Quan, Evan
[AMD Official Use Only - Internal Distribution Only]

Hi Christian,

Just sent out a patch which should be able to address this issue you saw.
https://lists.freedesktop.org/archives/amd-gfx/2020-October/055431.html

BR
Evan
-Original Message-
From: Christian König 
Sent: Thursday, October 29, 2020 5:46 PM
To: Quan, Evan ; amd-gfx@lists.freedesktop.org
Cc: Deucher, Alexander 
Subject: Re: [PATCH 37/40] drm/amd/pm: enable Polaris watermark table setting

Hi guys,

this commit here completely breaks Vega20.

Any idea why a change for Polaris should have that effect? Can we please fix 
this ASAP?

Thanks,
Christian.

Am 16.10.20 um 05:26 schrieb Evan Quan:
> Enable watermark table setting for Polaris.
>
> Change-Id: I395b74f2ce5b74e6d1c7659816ee386ba556e14c
> Signed-off-by: Evan Quan 
> Acked-by: Alex Deucher 
> ---
>   .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c  | 11 +++-
>   .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c   | 50 +++
>   2 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> index deb9164eb5fe..fd39dd67bfa4 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> @@ -458,7 +458,16 @@ bool dm_pp_notify_wm_clock_changes(
>   const struct dc_context *ctx,
>   struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges)
>   {
> -/* TODO: to be implemented */
> +struct amdgpu_device *adev = ctx->driver_context;
> +void *pp_handle = adev->powerplay.pp_handle;
> +const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
> +
> +if (pp_funcs && pp_funcs->set_watermarks_for_clocks_ranges) {
> +if (!pp_funcs->set_watermarks_for_clocks_ranges(pp_handle,
> +(void *)wm_with_clock_ranges))
> +return true;
> +}
> +
>   return false;
>   }
>
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> index 3700352286c5..ce8f368c0a8c 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> @@ -49,6 +49,8 @@
>   #include "processpptables.h"
>   #include "pp_thermal.h"
>   #include "smu7_baco.h"
> +#include "smu7_smumgr.h"
> +#include "polaris10_smumgr.h"
>
>   #include "ivsrcid/ivsrcid_vislands30.h"
>
> @@ -5107,6 +5109,53 @@ static int smu7_get_clock_by_type_with_latency(struct 
> pp_hwmgr *hwmgr,
>   return 0;
>   }
>
> +static int smu7_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr,
> + void *clock_range)
> +{
> +struct phm_ppt_v1_information *table_info =
> +(struct phm_ppt_v1_information *)hwmgr->pptable;
> +struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
> +table_info->vdd_dep_on_mclk;
> +struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table =
> +table_info->vdd_dep_on_sclk;
> +struct polaris10_smumgr *smu_data =
> +(struct polaris10_smumgr *)(hwmgr->smu_backend);
> +SMU74_Discrete_DpmTable  *table = &(smu_data->smc_state_table);
> +struct dm_pp_wm_sets_with_clock_ranges *watermarks =
> +(struct dm_pp_wm_sets_with_clock_ranges *)clock_range;
> +uint32_t i, j, k;
> +bool valid_entry;
> +
> +if (!(hwmgr->chip_id >= CHIP_POLARIS10 &&
> +  hwmgr->chip_id <= CHIP_VEGAM))
> +return -EINVAL;
> +
> +for (i = 0; i < dep_mclk_table->count; i++) {
> +for (j = 0; j < dep_sclk_table->count; j++) {
> +valid_entry = false;
> +for (k = 0; k < watermarks->num_wm_sets; k++) {
> +if (dep_sclk_table->entries[i].clk / 10 >= 
> watermarks->wm_clk_ranges[k].wm_min_eng_clk_in_khz &&
> +dep_sclk_table->entries[i].clk / 10 < 
> watermarks->wm_clk_ranges[k].wm_max_eng_clk_in_khz &&
> +dep_mclk_table->entries[i].clk / 10 >= 
> watermarks->wm_clk_ranges[k].wm_min_mem_clk_in_khz &&
> +dep_mclk_table->entries[i].clk / 10 < 
> watermarks->wm_clk_ranges[k].wm_max_mem_clk_in_khz) {
> +valid_entry = true;
> +table->DisplayWatermark[i][j] = watermarks->wm_clk_ranges[k].wm_set_id;
> +break;
> +}
> +}
> +PP_ASSERT_WITH_CODE(valid_entry,
> +"Clock is not in range of specified clock range for watermark from DAL!  
> Using highest water mark set.",
> +table->DisplayWatermark[i][j] = watermarks->wm_clk_ranges[k - 1].wm_set_id);
> +}
> +}
> +
> +return smu7_copy_bytes_to_smc(hwmgr,
> +  smu_data->smu7_data.dpm_table_start + 
> offsetof(SMU74_Discrete_DpmTable, DisplayWatermark),

Re: [PATCH 37/40] drm/amd/pm: enable Polaris watermark table setting

2020-10-29 Thread Alex Deucher
On Thu, Oct 29, 2020 at 5:46 AM Christian König
 wrote:
>
> Hi guys,
>
> this commit here completely breaks Vega20.
>
> Any idea why a change for Polaris should have that effect? Can we please
> fix this ASAP?
>
> Thanks,
> Christian.
>
> Am 16.10.20 um 05:26 schrieb Evan Quan:
> > Enable watermark table setting for Polaris.
> >
> > Change-Id: I395b74f2ce5b74e6d1c7659816ee386ba556e14c
> > Signed-off-by: Evan Quan 
> > Acked-by: Alex Deucher 
> > ---
> >   .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c  | 11 +++-
> >   .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c   | 50 +++
> >   2 files changed, 60 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c 
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> > index deb9164eb5fe..fd39dd67bfa4 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
> > @@ -458,7 +458,16 @@ bool dm_pp_notify_wm_clock_changes(
> >   const struct dc_context *ctx,
> >   struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges)
> >   {
> > - /* TODO: to be implemented */
> > + struct amdgpu_device *adev = ctx->driver_context;
> > + void *pp_handle = adev->powerplay.pp_handle;
> > + const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
> > +
> > + if (pp_funcs && pp_funcs->set_watermarks_for_clocks_ranges) {
> > + if (!pp_funcs->set_watermarks_for_clocks_ranges(pp_handle,
> > + (void *)wm_with_clock_ranges))
> > + return true;
> > + }
> > +

I suspect it's this hunk since it's common.  I'd guess there is some
problem with that functionality on vega20.

Alex

> >   return false;
> >   }
> >
> > diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c 
> > b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> > index 3700352286c5..ce8f368c0a8c 100644
> > --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> > +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
> > @@ -49,6 +49,8 @@
> >   #include "processpptables.h"
> >   #include "pp_thermal.h"
> >   #include "smu7_baco.h"
> > +#include "smu7_smumgr.h"
> > +#include "polaris10_smumgr.h"
> >
> >   #include "ivsrcid/ivsrcid_vislands30.h"
> >
> > @@ -5107,6 +5109,53 @@ static int 
> > smu7_get_clock_by_type_with_latency(struct pp_hwmgr *hwmgr,
> >   return 0;
> >   }
> >
> > +static int smu7_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr,
> > +  void *clock_range)
> > +{
> > + struct phm_ppt_v1_information *table_info =
> > + (struct phm_ppt_v1_information *)hwmgr->pptable;
> > + struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
> > + table_info->vdd_dep_on_mclk;
> > + struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table =
> > + table_info->vdd_dep_on_sclk;
> > + struct polaris10_smumgr *smu_data =
> > + (struct polaris10_smumgr *)(hwmgr->smu_backend);
> > + SMU74_Discrete_DpmTable  *table = &(smu_data->smc_state_table);
> > + struct dm_pp_wm_sets_with_clock_ranges *watermarks =
> > + (struct dm_pp_wm_sets_with_clock_ranges *)clock_range;
> > + uint32_t i, j, k;
> > + bool valid_entry;
> > +
> > + if (!(hwmgr->chip_id >= CHIP_POLARIS10 &&
> > +   hwmgr->chip_id <= CHIP_VEGAM))
> > + return -EINVAL;
> > +
> > + for (i = 0; i < dep_mclk_table->count; i++) {
> > + for (j = 0; j < dep_sclk_table->count; j++) {
> > + valid_entry = false;
> > + for (k = 0; k < watermarks->num_wm_sets; k++) {
> > + if (dep_sclk_table->entries[i].clk / 10 >= 
> > watermarks->wm_clk_ranges[k].wm_min_eng_clk_in_khz &&
> > + dep_sclk_table->entries[i].clk / 10 < 
> > watermarks->wm_clk_ranges[k].wm_max_eng_clk_in_khz &&
> > + dep_mclk_table->entries[i].clk / 10 >= 
> > watermarks->wm_clk_ranges[k].wm_min_mem_clk_in_khz &&
> > + dep_mclk_table->entries[i].clk / 10 < 
> > watermarks->wm_clk_ranges[k].wm_max_mem_clk_in_khz) {
> > + valid_entry = true;
> > + table->DisplayWatermark[i][j] = 
> > watermarks->wm_clk_ranges[k].wm_set_id;
> > + break;
> > + }
> > + }
> > + PP_ASSERT_WITH_CODE(valid_entry,
> > + "Clock is not in range of specified 
> > clock range for watermark from DAL!  Using highest water mark set.",
> > + table->DisplayWatermark[i][j] = 
> > watermarks->wm_clk_ranges[k - 1].wm_set_id);
> > + 

Re: [PATCH 37/40] drm/amd/pm: enable Polaris watermark table setting

2020-10-29 Thread Christian König

Hi guys,

this commit here completely breaks Vega20.

Any idea why a change for Polaris should have that effect? Can we please 
fix this ASAP?


Thanks,
Christian.

Am 16.10.20 um 05:26 schrieb Evan Quan:

Enable watermark table setting for Polaris.

Change-Id: I395b74f2ce5b74e6d1c7659816ee386ba556e14c
Signed-off-by: Evan Quan 
Acked-by: Alex Deucher 
---
  .../amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c  | 11 +++-
  .../drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c   | 50 +++
  2 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
index deb9164eb5fe..fd39dd67bfa4 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
@@ -458,7 +458,16 @@ bool dm_pp_notify_wm_clock_changes(
const struct dc_context *ctx,
struct dm_pp_wm_sets_with_clock_ranges *wm_with_clock_ranges)
  {
-   /* TODO: to be implemented */
+   struct amdgpu_device *adev = ctx->driver_context;
+   void *pp_handle = adev->powerplay.pp_handle;
+   const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
+
+   if (pp_funcs && pp_funcs->set_watermarks_for_clocks_ranges) {
+   if (!pp_funcs->set_watermarks_for_clocks_ranges(pp_handle,
+   (void *)wm_with_clock_ranges))
+   return true;
+   }
+
return false;
  }
  
diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c

index 3700352286c5..ce8f368c0a8c 100644
--- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
@@ -49,6 +49,8 @@
  #include "processpptables.h"
  #include "pp_thermal.h"
  #include "smu7_baco.h"
+#include "smu7_smumgr.h"
+#include "polaris10_smumgr.h"
  
  #include "ivsrcid/ivsrcid_vislands30.h"
  
@@ -5107,6 +5109,53 @@ static int smu7_get_clock_by_type_with_latency(struct pp_hwmgr *hwmgr,

return 0;
  }
  
+static int smu7_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr,

+void *clock_range)
+{
+   struct phm_ppt_v1_information *table_info =
+   (struct phm_ppt_v1_information *)hwmgr->pptable;
+   struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
+   table_info->vdd_dep_on_mclk;
+   struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table =
+   table_info->vdd_dep_on_sclk;
+   struct polaris10_smumgr *smu_data =
+   (struct polaris10_smumgr *)(hwmgr->smu_backend);
+   SMU74_Discrete_DpmTable  *table = &(smu_data->smc_state_table);
+   struct dm_pp_wm_sets_with_clock_ranges *watermarks =
+   (struct dm_pp_wm_sets_with_clock_ranges *)clock_range;
+   uint32_t i, j, k;
+   bool valid_entry;
+
+   if (!(hwmgr->chip_id >= CHIP_POLARIS10 &&
+ hwmgr->chip_id <= CHIP_VEGAM))
+   return -EINVAL;
+
+   for (i = 0; i < dep_mclk_table->count; i++) {
+   for (j = 0; j < dep_sclk_table->count; j++) {
+   valid_entry = false;
+   for (k = 0; k < watermarks->num_wm_sets; k++) {
+   if (dep_sclk_table->entries[i].clk / 10 >= 
watermarks->wm_clk_ranges[k].wm_min_eng_clk_in_khz &&
+   dep_sclk_table->entries[i].clk / 10 < 
watermarks->wm_clk_ranges[k].wm_max_eng_clk_in_khz &&
+   dep_mclk_table->entries[i].clk / 10 >= 
watermarks->wm_clk_ranges[k].wm_min_mem_clk_in_khz &&
+   dep_mclk_table->entries[i].clk / 10 < 
watermarks->wm_clk_ranges[k].wm_max_mem_clk_in_khz) {
+   valid_entry = true;
+   table->DisplayWatermark[i][j] = 
watermarks->wm_clk_ranges[k].wm_set_id;
+   break;
+   }
+   }
+   PP_ASSERT_WITH_CODE(valid_entry,
+   "Clock is not in range of specified clock 
range for watermark from DAL!  Using highest water mark set.",
+   table->DisplayWatermark[i][j] = 
watermarks->wm_clk_ranges[k - 1].wm_set_id);
+   }
+   }
+
+   return smu7_copy_bytes_to_smc(hwmgr,
+ smu_data->smu7_data.dpm_table_start + 
offsetof(SMU74_Discrete_DpmTable, DisplayWatermark),
+ (uint8_t *)table->DisplayWatermark,
+ sizeof(uint8_t) * SMU74_MAX_LEVELS_MEMORY 
* SMU74_MAX_LEVELS_GRAPHICS,
+ SMC_RAM_END);
+}
+
  static int