[PATCH] drm/amdgpu: Use signed arithmetic for overdrive clock calculations

2017-01-13 Thread Donny Yang
Signed-off-by: Donny Yang <w...@kota.moe>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 70 +++-
 1 file changed, 21 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index a74f60a5..f6c01e19 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -3349,7 +3349,8 @@ static int smu7_populate_and_upload_sclk_mclk_dpm_levels(
struct smu7_dpm_table *dpm_table = >dpm_table;
 
struct smu7_dpm_table *golden_dpm_table = >golden_dpm_table;
-   uint32_t dpm_count, clock_percent;
+   uint32_t dpm_count;
+   int32_t clock_percent;
uint32_t i;
 
if (0 == data->need_update_smu7_dpm_table)
@@ -3371,32 +3372,16 @@ static int 
smu7_populate_and_upload_sclk_mclk_dpm_levels(
return -EINVAL);
dpm_count = dpm_table->sclk_table.count < 2 ? 0 : 
dpm_table->sclk_table.count - 2;
 
+   clock_percent =
+   ((sclk
+   - 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value
+   ) * 100)
+   / 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
for (i = dpm_count; i > 1; i--) {
-   if (sclk > 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value)
 {
-   clock_percent =
- ((sclk
-   - 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value
-   ) * 100)
-   / 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
-
-   
dpm_table->sclk_table.dpm_levels[i].value =
-   
golden_dpm_table->sclk_table.dpm_levels[i].value +
-   
(golden_dpm_table->sclk_table.dpm_levels[i].value *
-   
clock_percent)/100;
-
-   } else if 
(golden_dpm_table->sclk_table.dpm_levels[dpm_table->sclk_table.count-1].value > 
sclk) {
-   clock_percent =
-   
((golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 
1].value
-   - sclk) * 100)
-   / 
golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
-
-   
dpm_table->sclk_table.dpm_levels[i].value =
-   
golden_dpm_table->sclk_table.dpm_levels[i].value -
-   
(golden_dpm_table->sclk_table.dpm_levels[i].value *
-   
clock_percent) / 100;
-   } else
-   
dpm_table->sclk_table.dpm_levels[i].value =
-   
golden_dpm_table->sclk_table.dpm_levels[i].value;
+   dpm_table->sclk_table.dpm_levels[i].value =
+   
golden_dpm_table->sclk_table.dpm_levels[i].value +
+   
(golden_dpm_table->sclk_table.dpm_levels[i].value *
+   clock_percent) 
/ 100;
}
}
}
@@ -3414,30 +3399,17 @@ static int 
smu7_populate_and_upload_sclk_mclk_dpm_levels(
"Divide by 0!",
return -EINVAL);
dpm_count = dpm_table->mclk_table.count < 2 ? 0 : 
dpm_table->mclk_table.count - 2;
+
+   clock_percent =
+   ((mclk
+   - 
golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value
+   ) * 100)
+   / 
golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value;
for (i = dpm_count; i > 1; i--) {
-   if 
(golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_

[PATCH 0/2] Report VDDC and MVDD over pp_dpm{sclk,mclk}

2017-01-13 Thread Donny Yang
Tested on a RX480.

I'm not sure whether to report VDDCI or MVDD for memory. MVDD felt "more"
correct, so that's what I've done.

Donny Yang (2):
  drm/amdgpu: Populate DPMv1 voltage tables
  drm/amdgpu: Report VDDC and MVDD over pp_dpm{sclk,mclk}

 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 54 +---
 1 file changed, 39 insertions(+), 15 deletions(-)

-- 
2.11.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 2/2] drm/amdgpu: Report VDDC and MVDD over pp_dpm{sclk,mclk}

2017-01-13 Thread Donny Yang
Signed-off-by: Donny Yang <w...@kota.moe>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 103e1330..4dd27c28 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -4065,6 +4065,8 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
struct smu7_single_dpm_table *sclk_table = 
&(data->dpm_table.sclk_table);
struct smu7_single_dpm_table *mclk_table = 
&(data->dpm_table.mclk_table);
struct smu7_single_dpm_table *pcie_table = 
&(data->dpm_table.pcie_speed_table);
+   struct smu7_single_dpm_table *vddc_table = 
&(data->dpm_table.vddc_table);
+   struct smu7_single_dpm_table *mvdd_table = 
&(data->dpm_table.mvdd_table);
int i, now, size = 0;
uint32_t clock, pcie_speed;
 
@@ -4081,8 +4083,9 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
now = i;
 
for (i = 0; i < sclk_table->count; i++)
-   size += sprintf(buf + size, "%d: %uMhz %s\n",
+   size += sprintf(buf + size, "%d: %uMhz %umV %s\n",
i, sclk_table->dpm_levels[i].value / 
100,
+   vddc_table->dpm_levels[i].value,
(i == now) ? "*" : "");
break;
case PP_MCLK:
@@ -4097,8 +4100,9 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
now = i;
 
for (i = 0; i < mclk_table->count; i++)
-   size += sprintf(buf + size, "%d: %uMhz %s\n",
+   size += sprintf(buf + size, "%d: %uMhz %umV %s\n",
i, mclk_table->dpm_levels[i].value / 
100,
+   mvdd_table->dpm_levels[i].value,
(i == now) ? "*" : "");
break;
case PP_PCIE:
-- 
2.11.0

___
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


[PATCH 1/2] drm/amdgpu: Populate DPMv1 voltage tables

2017-01-13 Thread Donny Yang
Signed-off-by: Donny Yang <w...@kota.moe>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 46 +---
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index f6c01e19..103e1330 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -705,7 +705,7 @@ static int smu7_setup_dpm_tables_v0(struct pp_hwmgr *hwmgr)
 
/* Initialize Vddc DPM table based on allow Vddc values.  And populate 
corresponding std values. */
for (i = 0; i < allowed_vdd_sclk_table->count; i++) {
-   data->dpm_table.vddc_table.dpm_levels[i].value = 
allowed_vdd_mclk_table->entries[i].v;
+   data->dpm_table.vddc_table.dpm_levels[i].value = 
allowed_vdd_sclk_table->entries[i].v;
data->dpm_table.vddc_table.dpm_levels[i].param1 = 
std_voltage_table->entries[i].Leakage;
/* param1 is for corresponding std voltage */
data->dpm_table.vddc_table.dpm_levels[i].enabled = 1;
@@ -749,12 +749,19 @@ static int smu7_setup_dpm_tables_v1(struct pp_hwmgr 
*hwmgr)
 
struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table;
struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table;
+   struct smu7_single_dpm_table *sclk_table, *mclk_table,
+   *vddc_table, *mvdd_table, *vddci_table;
 
if (table_info == NULL)
return -EINVAL;
 
dep_sclk_table = table_info->vdd_dep_on_sclk;
dep_mclk_table = table_info->vdd_dep_on_mclk;
+   sclk_table = >dpm_table.sclk_table;
+   mclk_table = >dpm_table.mclk_table;
+   vddc_table = >dpm_table.vddc_table;
+   mvdd_table = >dpm_table.mvdd_table;
+   vddci_table = >dpm_table.vddci_table;
 
PP_ASSERT_WITH_CODE(dep_sclk_table != NULL,
"SCLK dependency table is missing.",
@@ -770,32 +777,45 @@ static int smu7_setup_dpm_tables_v1(struct pp_hwmgr 
*hwmgr)
"MCLK dependency table count is 0",
return -EINVAL);
 
-   /* Initialize Sclk DPM table based on allow Sclk values */
+   /* Initialize Sclk and VDDC DPM table based on allow Sclk values */
data->dpm_table.sclk_table.count = 0;
+   data->dpm_table.vddc_table.count = 0;
for (i = 0; i < dep_sclk_table->count; i++) {
if (i == 0 || 
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count - 
1].value !=
dep_sclk_table->entries[i].clk) 
{
+   phm_ppt_v1_clock_voltage_dependency_record *entry = 
_sclk_table->entries[i];
 
-   
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].value =
-   dep_sclk_table->entries[i].clk;
+   sclk_table->dpm_levels[sclk_table->count].value = 
entry->clk;
+   sclk_table->dpm_levels[sclk_table->count].enabled = i 
== 0;
+   sclk_table->count++;
 
-   
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].enabled 
=
-   (i == 0) ? true : false;
-   data->dpm_table.sclk_table.count++;
+   vddc_table->dpm_levels[vddc_table->count].value = 
entry->vddc;
+   vddc_table->dpm_levels[vddc_table->count].enabled = i 
== 0;
+   vddc_table->count++;
}
}
 
-   /* Initialize Mclk DPM table based on allow Mclk values */
+   /* Initialize Mclk, VDDCI and MVDD DPM table based on allow Mclk values 
*/
data->dpm_table.mclk_table.count = 0;
+   data->dpm_table.mvdd_table.count = 0;
+   data->dpm_table.vddci_table.count = 0;
for (i = 0; i < dep_mclk_table->count; i++) {
if (i == 0 || data->dpm_table.mclk_table.dpm_levels
[data->dpm_table.mclk_table.count - 1].value !=
dep_mclk_table->entries[i].clk) 
{
-   
data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].value =
-   
dep_mclk_table->entries[i].clk;
-   
data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].enabled 
=
-   (i == 0) ? true : false;
-   data->dpm_table.mclk_table.count++;
+   phm_ppt_v1_clock_voltage_dependency_record *entry = 
_mclk_table->entries[i];
+
+