[PATCH 2/2] drm/amd/powerplay: set soc floor voltage on boot on vega10.

Alex Deucher alexdeucher at gmail.com
Tue May 2 14:02:32 UTC 2017


On Tue, May 2, 2017 at 4:56 AM, Rex Zhu <Rex.Zhu at amd.com> wrote:
> Send the VBIOS bootup VDDC as a SOC floor voltage to SMU
> before populating the PPTABLE. After DPM is enabled, This
> floor voltage will be removed. This will prevent SMC from
> going to Vmin upon receiving PPTable causing a violation.
>
> Change-Id: Ieff3c7ffe58b8ec83127d90ca2bb1761a5c71462
> Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>

Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c | 28 ++++++++++++++++++++++
>  drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h | 15 ++++++++++++
>  drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 25 +++++++++++++++++++
>  drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h |  3 +++
>  4 files changed, 71 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
> index de3d8f3..5602311 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
> @@ -387,3 +387,31 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
>
>         return 0;
>  }
> +
> +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;
> +       uint16_t ix;
> +
> +       ix = GetIndexIntoMasterDataTable(firmwareinfo);
> +       info = (struct atom_firmware_info_v3_1 *)
> +               cgs_atom_get_data_table(hwmgr->device,
> +                               ix, NULL, NULL, NULL);
> +
> +       if (!info) {
> +               pr_info("Error retrieving BIOS firmwareinfo!");
> +               return -EINVAL;
> +       }
> +
> +       boot_values->ulRevision = info->firmware_revision;
> +       boot_values->ulGfxClk   = info->bootup_sclk_in10khz;
> +       boot_values->ulUClk     = info->bootup_mclk_in10khz;
> +       boot_values->ulSocClk   = 0;
> +       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;
> +
> +       return 0;
> +}
> \ No newline at end of file
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
> index be1579e..43a6711 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
> @@ -119,6 +119,18 @@ struct pp_atomfwctrl_gpio_parameters {
>         uint8_t   ucFwCtfGpio;
>         uint8_t   ucFwCtfPolarity;
>  };
> +
> +struct pp_atomfwctrl_bios_boot_up_values {
> +       uint32_t   ulRevision;
> +       uint32_t   ulGfxClk;
> +       uint32_t   ulUClk;
> +       uint32_t   ulSocClk;
> +       uint16_t   usVddc;
> +       uint16_t   usVddci;
> +       uint16_t   usMvddc;
> +       uint16_t   usVddGfx;
> +};
> +
>  int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr,
>                 uint32_t clock_type, uint32_t clock_value,
>                 struct pp_atomfwctrl_clock_dividers_soc15 *dividers);
> @@ -136,5 +148,8 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
>  int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
>                 struct pp_atomfwctrl_gpio_parameters *param);
>
> +int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
> +                       struct pp_atomfwctrl_bios_boot_up_values *boot_values);
> +
>  #endif
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> index 68eae52..dbc1c03 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> @@ -2298,6 +2298,7 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
>                         (struct phm_ppt_v2_information *)(hwmgr->pptable);
>         PPTable_t *pp_table = &(data->smc_state_table.pp_table);
>         struct pp_atomfwctrl_voltage_table voltage_table;
> +       struct pp_atomfwctrl_bios_boot_up_values boot_up_values;
>
>         result = vega10_setup_default_dpm_tables(hwmgr);
>         PP_ASSERT_WITH_CODE(!result,
> @@ -2369,6 +2370,24 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
>                                 return result);
>         }
>
> +       result = pp_atomfwctrl_get_vbios_bootup_values(hwmgr, &boot_up_values);
> +       if (!result) {
> +               data->vbios_boot_state.vddc     = boot_up_values.usVddc;
> +               data->vbios_boot_state.vddci    = boot_up_values.usVddci;
> +               data->vbios_boot_state.mvddc    = boot_up_values.usMvddc;
> +               data->vbios_boot_state.gfx_clock = boot_up_values.ulGfxClk;
> +               data->vbios_boot_state.mem_clock = boot_up_values.ulUClk;
> +               data->vbios_boot_state.soc_clock = boot_up_values.ulSocClk;
> +               if (0 != boot_up_values.usVddc) {
> +                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
> +                                               PPSMC_MSG_SetFloorSocVoltage,
> +                                               (boot_up_values.usVddc * 4));
> +                       data->vbios_boot_state.bsoc_vddc_lock = true;
> +               } else {
> +                       data->vbios_boot_state.bsoc_vddc_lock = false;
> +               }
> +       }
> +
>         result = vega10_populate_avfs_parameters(hwmgr);
>         PP_ASSERT_WITH_CODE(!result,
>                         "Failed to initialize AVFS Parameters!",
> @@ -2590,6 +2609,12 @@ static int vega10_start_dpm(struct pp_hwmgr *hwmgr, uint32_t bitmap)
>                 data->smu_features[GNLD_LED_DISPLAY].enabled = true;
>         }
>
> +       if (data->vbios_boot_state.bsoc_vddc_lock) {
> +               smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
> +                                               PPSMC_MSG_SetFloorSocVoltage, 0);
> +               data->vbios_boot_state.bsoc_vddc_lock = false;
> +       }
> +
>         if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
>                         PHM_PlatformCaps_Falcon_QuickTransition)) {
>                 if (data->smu_features[GNLD_ACDC].supported) {
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
> index 83c67b9..1912e08 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
> @@ -177,8 +177,11 @@ struct vega10_dpmlevel_enable_mask {
>  };
>
>  struct vega10_vbios_boot_state {
> +       bool        bsoc_vddc_lock;
>         uint16_t    vddc;
>         uint16_t    vddci;
> +       uint16_t    mvddc;
> +       uint16_t    vdd_gfx;
>         uint32_t    gfx_clock;
>         uint32_t    mem_clock;
>         uint32_t    soc_clock;
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list