aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch183
1 files changed, 183 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch
new file mode 100644
index 00000000..28c69fb2
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4708-drm-amd-powerplay-correct-vega12-bootup-values-setti.patch
@@ -0,0 +1,183 @@
+From 56c86885423448422d8491e631b8cd80c29a7b0d Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Mon, 28 May 2018 08:59:16 +0800
+Subject: [PATCH 4708/5725] drm/amd/powerplay: correct vega12 bootup values
+ settings
+
+The vbios firmware structure changed between v3_1 and v3_2. So,
+the code to setup bootup values needs different paths based
+on header version.
+
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c | 94 +++++++++++++++++++---
+ drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h | 3 +
+ drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c | 3 +
+ drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h | 3 +
+ 4 files changed, 91 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
+index 5325661..aa2faff 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
+@@ -512,14 +512,82 @@ int pp_atomfwctrl_get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLKI
+ return 0;
+ }
+
++static void pp_atomfwctrl_copy_vbios_bootup_values_3_2(struct pp_hwmgr *hwmgr,
++ struct pp_atomfwctrl_bios_boot_up_values *boot_values,
++ struct atom_firmware_info_v3_2 *fw_info)
++{
++ uint32_t frequency = 0;
++
++ boot_values->ulRevision = fw_info->firmware_revision;
++ boot_values->ulGfxClk = fw_info->bootup_sclk_in10khz;
++ boot_values->ulUClk = fw_info->bootup_mclk_in10khz;
++ boot_values->usVddc = fw_info->bootup_vddc_mv;
++ boot_values->usVddci = fw_info->bootup_vddci_mv;
++ boot_values->usMvddc = fw_info->bootup_mvddc_mv;
++ boot_values->usVddGfx = fw_info->bootup_vddgfx_mv;
++ boot_values->ucCoolingID = fw_info->coolingsolution_id;
++ boot_values->ulSocClk = 0;
++ boot_values->ulDCEFClk = 0;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_SOCCLK_ID, &frequency))
++ boot_values->ulSocClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_DCEFCLK_ID, &frequency))
++ boot_values->ulDCEFClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_ECLK_ID, &frequency))
++ boot_values->ulEClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_VCLK_ID, &frequency))
++ boot_values->ulVClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU11_SYSPLL0_DCLK_ID, &frequency))
++ boot_values->ulDClk = frequency;
++}
++
++static void pp_atomfwctrl_copy_vbios_bootup_values_3_1(struct pp_hwmgr *hwmgr,
++ struct pp_atomfwctrl_bios_boot_up_values *boot_values,
++ struct atom_firmware_info_v3_1 *fw_info)
++{
++ uint32_t frequency = 0;
++
++ boot_values->ulRevision = fw_info->firmware_revision;
++ boot_values->ulGfxClk = fw_info->bootup_sclk_in10khz;
++ boot_values->ulUClk = fw_info->bootup_mclk_in10khz;
++ boot_values->usVddc = fw_info->bootup_vddc_mv;
++ boot_values->usVddci = fw_info->bootup_vddci_mv;
++ boot_values->usMvddc = fw_info->bootup_mvddc_mv;
++ boot_values->usVddGfx = fw_info->bootup_vddgfx_mv;
++ boot_values->ucCoolingID = fw_info->coolingsolution_id;
++ boot_values->ulSocClk = 0;
++ boot_values->ulDCEFClk = 0;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_SOCCLK_ID, &frequency))
++ boot_values->ulSocClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_DCEFCLK_ID, &frequency))
++ boot_values->ulDCEFClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_ECLK_ID, &frequency))
++ boot_values->ulEClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_VCLK_ID, &frequency))
++ boot_values->ulVClk = frequency;
++
++ if (!pp_atomfwctrl_get_clk_information_by_clkid(hwmgr, SMU9_SYSPLL0_DCLK_ID, &frequency))
++ boot_values->ulDClk = frequency;
++}
++
+ int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
+ struct pp_atomfwctrl_bios_boot_up_values *boot_values)
+ {
+- struct atom_firmware_info_v3_1 *info = NULL;
++ struct atom_firmware_info_v3_2 *fwinfo_3_2;
++ struct atom_firmware_info_v3_1 *fwinfo_3_1;
++ struct atom_common_table_header *info = NULL;
+ uint16_t ix;
+
+ ix = GetIndexIntoMasterDataTable(firmwareinfo);
+- info = (struct atom_firmware_info_v3_1 *)
++ info = (struct atom_common_table_header *)
+ smu_atom_get_data_table(hwmgr->adev,
+ ix, NULL, NULL, NULL);
+
+@@ -528,16 +596,18 @@ int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
+ return -EINVAL;
+ }
+
+- boot_values->ulRevision = info->firmware_revision;
+- boot_values->ulGfxClk = info->bootup_sclk_in10khz;
+- boot_values->ulUClk = info->bootup_mclk_in10khz;
+- boot_values->usVddc = info->bootup_vddc_mv;
+- boot_values->usVddci = info->bootup_vddci_mv;
+- boot_values->usMvddc = info->bootup_mvddc_mv;
+- boot_values->usVddGfx = info->bootup_vddgfx_mv;
+- boot_values->ucCoolingID = info->coolingsolution_id;
+- boot_values->ulSocClk = 0;
+- boot_values->ulDCEFClk = 0;
++ if ((info->format_revision == 3) && (info->content_revision == 2)) {
++ fwinfo_3_2 = (struct atom_firmware_info_v3_2 *)info;
++ pp_atomfwctrl_copy_vbios_bootup_values_3_2(hwmgr,
++ boot_values, fwinfo_3_2);
++ } else if ((info->format_revision == 3) && (info->content_revision == 1)) {
++ fwinfo_3_1 = (struct atom_firmware_info_v3_1 *)info;
++ pp_atomfwctrl_copy_vbios_bootup_values_3_1(hwmgr,
++ boot_values, fwinfo_3_1);
++ } else {
++ pr_info("Fw info table revision does not match!");
++ return -EINVAL;
++ }
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
+index fe10aa4..745bd38 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
+@@ -136,6 +136,9 @@ struct pp_atomfwctrl_bios_boot_up_values {
+ uint32_t ulUClk;
+ uint32_t ulSocClk;
+ uint32_t ulDCEFClk;
++ uint32_t ulEClk;
++ uint32_t ulVClk;
++ uint32_t ulDClk;
+ uint16_t usVddc;
+ uint16_t usVddci;
+ uint16_t usMvddc;
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
+index b38b1d9..6e22cb3 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
+@@ -804,6 +804,9 @@ static int vega12_init_smc_table(struct pp_hwmgr *hwmgr)
+ data->vbios_boot_state.soc_clock = boot_up_values.ulSocClk;
+ data->vbios_boot_state.dcef_clock = boot_up_values.ulDCEFClk;
+ data->vbios_boot_state.uc_cooling_id = boot_up_values.ucCoolingID;
++ data->vbios_boot_state.eclock = boot_up_values.ulEClk;
++ data->vbios_boot_state.dclock = boot_up_values.ulDClk;
++ data->vbios_boot_state.vclock = boot_up_values.ulVClk;
+ smum_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetMinDeepSleepDcefclk,
+ (uint32_t)(data->vbios_boot_state.dcef_clock / 100));
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
+index e81ded1..49b38df 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.h
+@@ -167,6 +167,9 @@ struct vega12_vbios_boot_state {
+ uint32_t mem_clock;
+ uint32_t soc_clock;
+ uint32_t dcef_clock;
++ uint32_t eclock;
++ uint32_t dclock;
++ uint32_t vclock;
+ };
+
+ #define DPMTABLE_OD_UPDATE_SCLK 0x00000001
+--
+2.7.4
+