diff options
author | Likun Gao <Likun.Gao@amd.com> | 2019-01-14 04:22:09 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-03-19 16:03:59 -0400 |
commit | c4d74f5372da05875b62f4089da5e77367c0c778 (patch) | |
tree | 660ed2baccf996217502a7ed407b2583b0f02f6e /drivers | |
parent | 6d7c830271ad5c54a3ee04fef0420ec89d6e37fd (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.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 99 |
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 | } |