Commit 41401ac6 authored by Jan Kokemüller's avatar Jan Kokemüller Committed by Alex Deucher

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

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=206987Signed-off-by: default avatarJan Kokemüller <jan.kokemueller@gmail.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent f2d51b20
...@@ -3247,7 +3247,7 @@ static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc, ...@@ -3247,7 +3247,7 @@ static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc,
bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context,
bool fast_validate) bool fast_validate)
{ {
bool voltage_supported = false; bool voltage_supported;
DC_FP_START(); DC_FP_START();
voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate); voltage_supported = dcn20_validate_bandwidth_fp(dc, context, fast_validate);
DC_FP_END(); DC_FP_END();
......
...@@ -1329,8 +1329,8 @@ static bool dcn21_fast_validate_bw( ...@@ -1329,8 +1329,8 @@ static bool dcn21_fast_validate_bw(
return out; return out;
} }
bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context, static noinline bool dcn21_validate_bandwidth_fp(struct dc *dc,
bool fast_validate) struct dc_state *context, bool fast_validate)
{ {
bool out = false; bool out = false;
...@@ -1383,6 +1383,22 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context, ...@@ -1383,6 +1383,22 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
return out; 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) static void dcn21_destroy_resource_pool(struct resource_pool **pool)
{ {
struct dcn21_resource_pool *dcn21_pool = TO_DCN21_RES_POOL(*pool); struct dcn21_resource_pool *dcn21_pool = TO_DCN21_RES_POOL(*pool);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment