aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLikun Gao <Likun.Gao@amd.com>2019-01-14 04:22:09 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-03-19 16:03:59 -0400
commitc4d74f5372da05875b62f4089da5e77367c0c778 (patch)
tree660ed2baccf996217502a7ed407b2583b0f02f6e /drivers
parent6d7c830271ad5c54a3ee04fef0420ec89d6e37fd (diff)
drm/amd/powerplay: get overdrive clock and voltage information
Add sys interface to get overdrive clock and voltage information for smu11. Signed-off-by: Likun Gao <Likun.Gao@amd.com> Reviewed-by: Kevin Wang <kevin1.wang@amd.com> Reviewed-by: Evan Quan <evan.quan@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c8
-rw-r--r--drivers/gpu/drm/amd/powerplay/vega20_ppt.c99
2 files changed, 106 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index ebe694594780..5b5a563169d6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -657,7 +657,13 @@ static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,
657 struct amdgpu_device *adev = ddev->dev_private; 657 struct amdgpu_device *adev = ddev->dev_private;
658 uint32_t size = 0; 658 uint32_t size = 0;
659 659
660 if (adev->powerplay.pp_funcs->print_clock_levels) { 660 if (is_support_sw_smu(adev)) {
661 size = smu_print_clk_levels(&adev->smu, OD_SCLK, buf);
662 size += smu_print_clk_levels(&adev->smu, OD_MCLK, buf+size);
663 size += smu_print_clk_levels(&adev->smu, OD_VDDC_CURVE, buf+size);
664 size += smu_print_clk_levels(&adev->smu, OD_RANGE, buf+size);
665 return size;
666 } else if (adev->powerplay.pp_funcs->print_clock_levels) {
661 size = amdgpu_dpm_print_clock_levels(adev, OD_SCLK, buf); 667 size = amdgpu_dpm_print_clock_levels(adev, OD_SCLK, buf);
662 size += amdgpu_dpm_print_clock_levels(adev, OD_MCLK, buf+size); 668 size += amdgpu_dpm_print_clock_levels(adev, OD_MCLK, buf+size);
663 size += amdgpu_dpm_print_clock_levels(adev, OD_VDDC_CURVE, buf+size); 669 size += amdgpu_dpm_print_clock_levels(adev, OD_VDDC_CURVE, buf+size);
diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
index 42eb82832b3e..b9f4e7b7b12b 100644
--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
+++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
@@ -678,8 +678,13 @@ static int vega20_print_clk_levels(struct smu_context *smu,
678 int ret = 0; 678 int ret = 0;
679 struct pp_clock_levels_with_latency clocks; 679 struct pp_clock_levels_with_latency clocks;
680 struct vega20_single_dpm_table *single_dpm_table; 680 struct vega20_single_dpm_table *single_dpm_table;
681 struct smu_table_context *table_context = &smu->smu_table;
681 struct smu_dpm_context *smu_dpm = &smu->smu_dpm; 682 struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
682 struct vega20_dpm_table *dpm_table = NULL; 683 struct vega20_dpm_table *dpm_table = NULL;
684 struct vega20_od8_settings *od8_settings =
685 (struct vega20_od8_settings *)table_context->od8_settings;
686 OverDriveTable_t *od_table =
687 (OverDriveTable_t *)(table_context->overdrive_table);
683 688
684 dpm_table = smu_dpm->dpm_context; 689 dpm_table = smu_dpm->dpm_context;
685 690
@@ -725,6 +730,100 @@ static int vega20_print_clk_levels(struct smu_context *smu,
725 (clocks.data[i].clocks_in_khz == now * 10) 730 (clocks.data[i].clocks_in_khz == now * 10)
726 ? "*" : ""); 731 ? "*" : "");
727 break; 732 break;
733
734 case OD_SCLK:
735 if (od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMIN].feature_id &&
736 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMAX].feature_id) {
737 size = sprintf(buf, "%s:\n", "OD_SCLK");
738 size += sprintf(buf + size, "0: %10uMhz\n",
739 od_table->GfxclkFmin);
740 size += sprintf(buf + size, "1: %10uMhz\n",
741 od_table->GfxclkFmax);
742 }
743
744 break;
745
746 case OD_MCLK:
747 if (od8_settings->od8_settings_array[OD8_SETTING_UCLK_FMAX].feature_id) {
748 size = sprintf(buf, "%s:\n", "OD_MCLK");
749 size += sprintf(buf + size, "1: %10uMhz\n",
750 od_table->UclkFmax);
751 }
752
753 break;
754
755 case OD_VDDC_CURVE:
756 if (od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ1].feature_id &&
757 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ2].feature_id &&
758 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ3].feature_id &&
759 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE1].feature_id &&
760 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE2].feature_id &&
761 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE3].feature_id) {
762 size = sprintf(buf, "%s:\n", "OD_VDDC_CURVE");
763 size += sprintf(buf + size, "0: %10uMhz %10dmV\n",
764 od_table->GfxclkFreq1,
765 od_table->GfxclkVolt1 / VOLTAGE_SCALE);
766 size += sprintf(buf + size, "1: %10uMhz %10dmV\n",
767 od_table->GfxclkFreq2,
768 od_table->GfxclkVolt2 / VOLTAGE_SCALE);
769 size += sprintf(buf + size, "2: %10uMhz %10dmV\n",
770 od_table->GfxclkFreq3,
771 od_table->GfxclkVolt3 / VOLTAGE_SCALE);
772 }
773
774 break;
775
776 case OD_RANGE:
777 size = sprintf(buf, "%s:\n", "OD_RANGE");
778
779 if (od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMIN].feature_id &&
780 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMAX].feature_id) {
781 size += sprintf(buf + size, "SCLK: %7uMhz %10uMhz\n",
782 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMIN].min_value,
783 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FMAX].max_value);
784 }
785
786 if (od8_settings->od8_settings_array[OD8_SETTING_UCLK_FMAX].feature_id) {
787 single_dpm_table = &(dpm_table->mem_table);
788 ret = vega20_get_clk_table(smu, &clocks, single_dpm_table);
789 if (ret) {
790 pr_err("Attempt to get memory clk levels Failed!");
791 return ret;
792 }
793
794 size += sprintf(buf + size, "MCLK: %7uMhz %10uMhz\n",
795 clocks.data[0].clocks_in_khz / 1000,
796 od8_settings->od8_settings_array[OD8_SETTING_UCLK_FMAX].max_value);
797 }
798
799 if (od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ1].feature_id &&
800 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ2].feature_id &&
801 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ3].feature_id &&
802 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE1].feature_id &&
803 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE2].feature_id &&
804 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE3].feature_id) {
805 size += sprintf(buf + size, "VDDC_CURVE_SCLK[0]: %7uMhz %10uMhz\n",
806 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ1].min_value,
807 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ1].max_value);
808 size += sprintf(buf + size, "VDDC_CURVE_VOLT[0]: %7dmV %11dmV\n",
809 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE1].min_value,
810 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE1].max_value);
811 size += sprintf(buf + size, "VDDC_CURVE_SCLK[1]: %7uMhz %10uMhz\n",
812 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ2].min_value,
813 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ2].max_value);
814 size += sprintf(buf + size, "VDDC_CURVE_VOLT[1]: %7dmV %11dmV\n",
815 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE2].min_value,
816 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE2].max_value);
817 size += sprintf(buf + size, "VDDC_CURVE_SCLK[2]: %7uMhz %10uMhz\n",
818 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ3].min_value,
819 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_FREQ3].max_value);
820 size += sprintf(buf + size, "VDDC_CURVE_VOLT[2]: %7dmV %11dmV\n",
821 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE3].min_value,
822 od8_settings->od8_settings_array[OD8_SETTING_GFXCLK_VOLTAGE3].max_value);
823 }
824
825 break;
826
728 default: 827 default:
729 break; 828 break;
730 } 829 }