[PATCH] drm/amd/display: Add FPU wrappers to dcn21_validate_bandwidth()

Alex Deucher alexdeucher at gmail.com
Mon Feb 15 19:05:06 UTC 2021


On Thu, Feb 11, 2021 at 3:34 PM Jan Kokemüller
<jan.kokemueller at gmail.com> wrote:
>
> dcn21_validate_bandwidth() calls functions that use floating point math.
> On my machine this sometimes results in simd exceptions when there are
> other FPU users such as KVM virtual machines running. The screen freezes
> completely in this case.
>
> Wrapping the function with DC_FP_START()/DC_FP_END() seems to solve the
> problem. This mirrors the approach used for dcn20_validate_bandwidth.
>
> Tested on a AMD Ryzen 7 PRO 4750U (Renoir).
>
> Bug: https://bugzilla.kernel.org/show_bug.cgi?id=206987
> Signed-off-by: Jan Kokemüller <jan.kokemueller at gmail.com>

Applied.  Thanks!

Alex


> ---
>  .../drm/amd/display/dc/dcn20/dcn20_resource.c |  2 +-
>  .../drm/amd/display/dc/dcn21/dcn21_resource.c | 20 +++++++++++++++++--
>  2 files changed, 19 insertions(+), 3 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 5ed18cac57e8..f9dabe225db7 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
> @@ -3245,7 +3245,7 @@ static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc,
>  bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
>                 bool fast_validate)
>  {
> -       bool voltage_supported = false;
> +       bool voltage_supported;
>         DC_FP_START();
>         voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate);
>         DC_FP_END();
> diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
> index 674376428916..072f8c880924 100644
> --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
> @@ -1329,8 +1329,8 @@ static bool dcn21_fast_validate_bw(
>         return out;
>  }
>
> -bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
> -               bool fast_validate)
> +static noinline bool dcn21_validate_bandwidth_fp(struct dc *dc,
> +               struct dc_state *context, bool fast_validate)
>  {
>         bool out = false;
>
> @@ -1383,6 +1383,22 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
>
>         return out;
>  }
> +
> +/*
> + * Some of the functions further below use the FPU, so we need to wrap this
> + * with DC_FP_START()/DC_FP_END(). Use the same approach as for
> + * dcn20_validate_bandwidth in dcn20_resource.c.
> + */
> +bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
> +               bool fast_validate)
> +{
> +       bool voltage_supported;
> +       DC_FP_START();
> +       voltage_supported = dcn21_validate_bandwidth_fp(dc, context, fast_validate);
> +       DC_FP_END();
> +       return voltage_supported;
> +}
> +
>  static void dcn21_destroy_resource_pool(struct resource_pool **pool)
>  {
>         struct dcn21_resource_pool *dcn21_pool = TO_DCN21_RES_POOL(*pool);
> --
> 2.30.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