[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