[PATCH] drm/amd/display: Fix null-deref on vega20 with xgmi

Kazlauskas, Nicholas Nicholas.Kazlauskas at amd.com
Wed Jun 19 18:43:08 UTC 2019


On 6/19/19 2:38 PM, Roman.Li at amd.com wrote:
> From: Roman Li <Roman.Li at amd.com>
> 
> [Why]
> After clkmgr rework it gets initialized after resource pool.
> The clkmgr is used in resource pool init for xgmi path.
> That causes driver crash on Vega20 with xgmi due to NULL deref.
> 
> [How]
> Move xgmi compensation code to dce121_clk_mgr_construct()
> That also allows to make dce121_clock_patch_xgmi_ss_info()
> internal static function.
> 
> Change-Id: Id3fa44bdeb2974b3580a535cc50692bfa8b01e27
> Signed-off-by: Roman Li <Roman.Li at amd.com>
> ---

Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>

>   .../gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c | 14 +++++++++++---
>   drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c    | 10 ----------
>   drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h            |  2 --
>   3 files changed, 11 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c
> index 08f2e25..906310c 100644
> --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c
> +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce120/dce120_clk_mgr.c
> @@ -30,6 +30,7 @@
>   #include "dce110/dce110_clk_mgr.h"
>   #include "dce120_clk_mgr.h"
>   #include "dce100/dce_clk_mgr.h"
> +#include "dce120/dce120_hw_sequencer.h"
>   
>   static const struct state_dependent_clocks dce120_max_clks_by_state[] = {
>   /*ClocksStateInvalid - should not be used*/
> @@ -45,16 +46,15 @@ static const struct state_dependent_clocks dce120_max_clks_by_state[] = {
>   
>   /**
>    * dce121_clock_patch_xgmi_ss_info() - Save XGMI spread spectrum info
> - * @clk_mgr: clock manager base structure
> + * @clk_mgr_dce: clock manager internal structure
>    *
>    * Reads from VBIOS the XGMI spread spectrum info and saves it within
>    * the dce clock manager. This operation will overwrite the existing dprefclk
>    * SS values if the vBIOS query succeeds. Otherwise, it does nothing. It also
>    * sets the ->xgmi_enabled flag.
>    */
> -void dce121_clock_patch_xgmi_ss_info(struct clk_mgr *clk_mgr_base)
> +static void dce121_clock_patch_xgmi_ss_info(struct clk_mgr_internal *clk_mgr_dce)
>   {
> -	struct clk_mgr_internal *clk_mgr_dce = TO_CLK_MGR_INTERNAL(clk_mgr_base);
>   	enum bp_result result;
>   	struct spread_spectrum_info info = { { 0 } };
>   	struct dc_bios *bp = clk_mgr_dce->base.ctx->dc_bios;
> @@ -141,5 +141,13 @@ void dce121_clk_mgr_construct(struct dc_context *ctx, struct clk_mgr_internal *c
>   {
>   	dce120_clk_mgr_construct(ctx, clk_mgr);
>   	clk_mgr->base.dprefclk_khz = 625000;
> +
> +	/*
> +	 * The xGMI enabled info is used to determine if audio and display
> +	 * clocks need to be adjusted with the WAFL link's SS info.
> +	 */
> +	if (dce121_xgmi_enabled(ctx->dc->hwseq))
> +		dce121_clock_patch_xgmi_ss_info(clk_mgr);
> +
>   }
>   
> diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
> index afa1c60..719c020 100644
> --- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
> @@ -1163,16 +1163,6 @@ static bool construct(
>   	if (!resource_construct(num_virtual_links, dc, &pool->base, res_funcs))
>   		goto res_create_fail;
>   
> -	/*
> -	 * This is a bit of a hack. The xGMI enabled info is used to determine
> -	 * if audio and display clocks need to be adjusted with the WAFL link's
> -	 * SS info. This is a responsiblity of the clk_mgr. But since MMHUB is
> -	 * under hwseq, and the relevant register is in MMHUB, we have to do it
> -	 * here.
> -	 */
> -	if (is_vg20 && dce121_xgmi_enabled(dc->hwseq))
> -		dce121_clock_patch_xgmi_ss_info(dc->clk_mgr);
> -
>   	/* Create hardware sequencer */
>   	if (!dce120_hw_sequencer_create(dc))
>   		goto controller_create_fail;
> diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
> index 721e131..36ebd5b 100644
> --- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
> +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
> @@ -53,8 +53,6 @@ struct clk_mgr_funcs {
>   	void (*enable_pme_wa) (struct clk_mgr *clk_mgr);
>   };
>   
> -void dce121_clock_patch_xgmi_ss_info(struct clk_mgr *clk_mgr_base);
> -
>   struct clk_mgr {
>   	struct dc_context *ctx;
>   	struct clk_mgr_funcs *funcs;
> 



More information about the amd-gfx mailing list