Skip to content

Commit 471c1dd

Browse files
Reza Aminialexdeucher
authored andcommitted
drm/amd/display: Allow asic specific FSFT timing optimization
[Why] Each asic can optimize best based on its capabilities [How] Optimizing timing for a new pixel clock Signed-off-by: Reza Amini <[email protected]> Reviewed-by: Anthony Koo <[email protected]> Acked-by: Eryk Brol <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 6b6352d commit 471c1dd

File tree

8 files changed

+57
-13
lines changed

8 files changed

+57
-13
lines changed

drivers/gpu/drm/amd/display/dc/core/dc_stream.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,20 +246,18 @@ struct dc_stream_status *dc_stream_get_status(
246246

247247
#ifndef TRIM_FSFT
248248
/**
249-
* dc_optimize_timing() - dc to optimize timing
249+
* dc_optimize_timing_for_fsft() - dc to optimize timing
250250
*/
251-
bool dc_optimize_timing(
252-
struct dc_crtc_timing *timing,
251+
bool dc_optimize_timing_for_fsft(
252+
struct dc_stream_state *pStream,
253253
unsigned int max_input_rate_in_khz)
254254
{
255-
//optimization is expected to assing a value to these:
256-
//timing->pix_clk_100hz
257-
//timing->v_front_porch
258-
//timing->v_total
259-
//timing->fast_transport_output_rate_100hz;
260-
timing->fast_transport_output_rate_100hz = timing->pix_clk_100hz;
255+
struct dc *dc;
261256

262-
return true;
257+
dc = pStream->ctx->dc;
258+
259+
return (dc->hwss.optimize_timing_for_fsft &&
260+
dc->hwss.optimize_timing_for_fsft(dc, &pStream->timing, max_input_rate_in_khz));
263261
}
264262
#endif
265263

drivers/gpu/drm/amd/display/dc/dc_stream.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,8 @@ struct dc_stream_status *dc_stream_get_status(
424424
struct dc_stream_state *dc_stream);
425425

426426
#ifndef TRIM_FSFT
427-
bool dc_optimize_timing(
428-
struct dc_crtc_timing *timing,
427+
bool dc_optimize_timing_for_fsft(
428+
struct dc_stream_state *pStream,
429429
unsigned int max_input_rate_in_khz);
430430
#endif
431431

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2498,3 +2498,30 @@ void dcn20_fpga_init_hw(struct dc *dc)
24982498
tg->funcs->tg_init(tg);
24992499
}
25002500
}
2501+
#ifndef TRIM_FSFT
2502+
bool dcn20_optimize_timing_for_fsft(struct dc *dc,
2503+
struct dc_crtc_timing *timing,
2504+
unsigned int max_input_rate_in_khz)
2505+
{
2506+
unsigned int old_v_front_porch;
2507+
unsigned int old_v_total;
2508+
unsigned int max_input_rate_in_100hz;
2509+
unsigned long long new_v_total;
2510+
2511+
max_input_rate_in_100hz = max_input_rate_in_khz * 10;
2512+
if (max_input_rate_in_100hz < timing->pix_clk_100hz)
2513+
return false;
2514+
2515+
old_v_total = timing->v_total;
2516+
old_v_front_porch = timing->v_front_porch;
2517+
2518+
timing->fast_transport_output_rate_100hz = timing->pix_clk_100hz;
2519+
timing->pix_clk_100hz = max_input_rate_in_100hz;
2520+
2521+
new_v_total = div_u64((unsigned long long)old_v_total * max_input_rate_in_100hz, timing->pix_clk_100hz);
2522+
2523+
timing->v_total = new_v_total;
2524+
timing->v_front_porch = old_v_front_porch + (timing->v_total - old_v_total);
2525+
return true;
2526+
}
2527+
#endif

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,10 @@ int dcn20_init_sys_ctx(struct dce_hwseq *hws,
132132
struct dc *dc,
133133
struct dc_phy_addr_space_config *pa_config);
134134

135+
#ifndef TRIM_FSFT
136+
bool dcn20_optimize_timing_for_fsft(struct dc *dc,
137+
struct dc_crtc_timing *timing,
138+
unsigned int max_input_rate_in_khz);
139+
#endif
135140
#endif /* __DC_HWSS_DCN20_H__ */
136141

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ static const struct hw_sequencer_funcs dcn20_funcs = {
8888
.set_backlight_level = dce110_set_backlight_level,
8989
.set_abm_immediate_disable = dce110_set_abm_immediate_disable,
9090
.set_pipe = dce110_set_pipe,
91+
#ifndef TRIM_FSFT
92+
.optimize_timing_for_fsft = dcn20_optimize_timing_for_fsft,
93+
#endif
9194
};
9295

9396
static const struct hwseq_private_funcs dcn20_private_funcs = {

drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ static const struct hw_sequencer_funcs dcn21_funcs = {
9292
.set_backlight_level = dcn21_set_backlight_level,
9393
.set_abm_immediate_disable = dcn21_set_abm_immediate_disable,
9494
.set_pipe = dcn21_set_pipe,
95+
#ifndef TRIM_FSFT
96+
.optimize_timing_for_fsft = dcn20_optimize_timing_for_fsft,
97+
#endif
9598
};
9699

97100
static const struct hwseq_private_funcs dcn21_private_funcs = {

drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ struct hw_sequencer_funcs {
116116
void (*set_static_screen_control)(struct pipe_ctx **pipe_ctx,
117117
int num_pipes,
118118
const struct dc_static_screen_params *events);
119+
#ifndef TRIM_FSFT
120+
bool (*optimize_timing_for_fsft)(struct dc *dc,
121+
struct dc_crtc_timing *timing,
122+
unsigned int max_input_rate_in_khz);
123+
#endif
119124

120125
/* Stream Related */
121126
void (*enable_stream)(struct pipe_ctx *pipe_ctx);

drivers/gpu/drm/amd/display/modules/freesync/freesync.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,10 +829,13 @@ void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync,
829829
switch (packet_type) {
830830
case PACKET_TYPE_FS_V3:
831831
#ifndef TRIM_FSFT
832+
// always populate with pixel rate.
832833
build_vrr_infopacket_v3(
833834
stream->signal, vrr,
834835
stream->timing.flags.FAST_TRANSPORT,
835-
stream->timing.fast_transport_output_rate_100hz,
836+
(stream->timing.flags.FAST_TRANSPORT) ?
837+
stream->timing.fast_transport_output_rate_100hz :
838+
stream->timing.pix_clk_100hz,
836839
app_tf, infopacket);
837840
#else
838841
build_vrr_infopacket_v3(stream->signal, vrr, app_tf, infopacket);

0 commit comments

Comments
 (0)