[PATCH 80/82] drm/amd/display: Adjust vblank_nom policy for HW SDP tranmission reqs
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <[email protected]> |
From: Nicholas Kazlauskas <[email protected]> [Why] The requirement is that VSTARTUP has to come before vsync, line 0. This means that the VSTARTUP has to be in the blank front porch. The current implementation in DML2.1 does meet this requirement by adjusting vblank_nom to the full vblank_avail but this has two undesirable side effects: 1. When vblank is nominal this pushes VUPDATE on the line after VBLANK start. For Replay this gives only 1 line worth of time to program the SDP and blank the DPG. If we miss this window then we have to wait an entire frame before we can retry IPX entry. Residency is impacted. 2. The prefetch schedule is suboptimal. Instead of leveraging a very long vblank for power we wake early and block c-state earlier. [How] Use the same policy as prior ASIC - clamp the vblank_nom adjustment to be the maximum of vblank_nom or the size of the back porch + 2 lines. The back porch includes the vsync width in it in the calculation. Reviewed-by: Dillon Varone <[email protected]> Signed-off-by: Nicholas Kazlauskas <[email protected]> Signed-off-by: Ivan Lipski <[email protected]> --- .../dml2_0/dml21/dml21_translation_helper.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_translation_helper.c b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_translation_helper.c index db78810f2b906..79da467ddb5d6 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_translation_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_translation_helper.c @@ -101,10 +101,22 @@ static unsigned int calc_vblank_nom_lines(const struct dc_stream_state *stream, unsigned int vblank_nom = (unsigned int)div64_u64((uint64_t)default_vblank_nom_us * 1000ULL, // vblank_nom_ns div64_u64((uint64_t)stream->timing.h_total * 10000000ULL, (uint64_t)stream->timing.pix_clk_100hz)); // line_time_ns - if (vblank_avail < vblank_nom || - stream->adaptive_sync_infopacket.valid || - (stream->link && stream->link->replay_settings.config.replay_supported)) - vblank_nom = vblank_avail; + /* + * HW requirement for SDP to be in FP ahead of vsync (line 0). + * TODO: Move this out of the translation layer into DC core as per-ASIC policy. + */ + if (stream->adaptive_sync_infopacket.valid || + (stream->link && stream->link->replay_settings.config.replay_supported)) { + const unsigned int v_active = stream->timing.v_border_top + stream->timing.v_addressable + + stream->timing.v_border_bottom; + const unsigned int blank_lines = stream->timing.v_total - v_active; + const unsigned int bp_lines = blank_lines - stream->timing.v_front_porch; + const unsigned int min_vblank_nom = bp_lines + 2; + + vblank_nom = max(vblank_nom, min_vblank_nom); + } + + vblank_nom = min(vblank_nom, vblank_avail); return vblank_nom; } -- 2.43.0