[PATCH 1/1] drm/amd/display: work around fp code being emitted outside of DC_FP_START/END

Alex Deucher alexdeucher at gmail.com
Thu Apr 30 14:58:09 UTC 2020


On Wed, Apr 29, 2020 at 11:08 AM Daniel Kolesa <daniel at octaforge.org> wrote:
>
> The dcn20_validate_bandwidth function would have code touching the
> incorrect registers emitted outside of the boundaries of the
> DC_FP_START/END macros, at least on ppc64le. Work around the
> problem by wrapping the whole function instead.
>
> Signed-off-by: Daniel Kolesa <daniel at octaforge.org>

Applied.  Thanks!

Alex

> ---
>  .../drm/amd/display/dc/dcn20/dcn20_resource.c | 31 ++++++++++++++-----
>  1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
> index e310d67..1b0bca9 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
> @@ -3034,25 +3034,32 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co
>         return out;
>  }
>
> -
> -bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
> -               bool fast_validate)
> +/*
> + * This must be noinline to ensure anything that deals with FP registers
> + * is contained within this call; previously our compiling with hard-float
> + * would result in fp instructions being emitted outside of the boundaries
> + * of the DC_FP_START/END macros, which makes sense as the compiler has no
> + * idea about what is wrapped and what is not
> + *
> + * This is largely just a workaround to avoid breakage introduced with 5.6,
> + * ideally all fp-using code should be moved into its own file, only that
> + * should be compiled with hard-float, and all code exported from there
> + * should be strictly wrapped with DC_FP_START/END
> + */
> +static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc,
> +               struct dc_state *context, bool fast_validate)
>  {
>         bool voltage_supported = false;
>         bool full_pstate_supported = false;
>         bool dummy_pstate_supported = false;
>         double p_state_latency_us;
>
> -       DC_FP_START();
>         p_state_latency_us = context->bw_ctx.dml.soc.dram_clock_change_latency_us;
>         context->bw_ctx.dml.soc.disable_dram_clock_change_vactive_support =
>                 dc->debug.disable_dram_clock_change_vactive_support;
>
>         if (fast_validate) {
> -               voltage_supported = dcn20_validate_bandwidth_internal(dc, context, true);
> -
> -               DC_FP_END();
> -               return voltage_supported;
> +               return dcn20_validate_bandwidth_internal(dc, context, true);
>         }
>
>         // Best case, we support full UCLK switch latency
> @@ -3081,7 +3088,15 @@ bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
>
>  restore_dml_state:
>         context->bw_ctx.dml.soc.dram_clock_change_latency_us = p_state_latency_us;
> +       return voltage_supported;
> +}
>
> +bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
> +               bool fast_validate)
> +{
> +       bool voltage_supported = false;
> +       DC_FP_START();
> +       voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate);
>         DC_FP_END();
>         return voltage_supported;
>  }
> --
> 2.26.2
>
> _______________________________________________
> 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