Skip to content

Commit ad3167c

Browse files
committed
drm/vc4_hdmi: Force modeset when bcp changes
See: https://forum.libreelec.tv/thread/25427-le-10-0-2-on-rpi4-not-playing-files-that-10-0-1-had-no-problems-with/ The issue is that kodi changes hdmi mode to 3840x2160@24 initially with "max bcp=8" After decoding the first frame it does a modeset to same mode with "max bpc=12". Now vc4_hdmi_encoder_compute_config chooses vc4_state->output_bpc = 12 with output_format=VC4_HDMI_OUTPUT_RGB This requires scrambling as clock > 300MHz (and we have hdmi_enable_4kp60=1). vc4_hdmi_encoder_atomic_mode_set (without this PR's assignment to mode_changed) is currenly not called so we don't assign: vc4_hdmi->output_bpc = vc4_state->output_bpc which means vc4_hdmi_enable_scrambling never enables scrambling (as vc4_hdmi->output_bpc is still 8). But we do set the pixel clock in phy_init() to a clock frequency that requires scrambling. The inconsistency of changing pixel clock, but not changing related state that is needed to enable scambling seems wrong. I feel this PR works around the problem, rather than fixing it, so I'd be interested in hearing how it should work. Signed-off-by: Dom Cobley <popcornmix@gmail.com>
1 parent 6dafd55 commit ad3167c

1 file changed

Lines changed: 8 additions & 0 deletions

File tree

drivers/gpu/drm/vc4/vc4_hdmi.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,6 +1808,8 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
18081808
struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
18091809
struct drm_display_mode *mode = &crtc_state->adjusted_mode;
18101810
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
1811+
unsigned int output_bpc = vc4_state->output_bpc;
1812+
enum vc4_hdmi_output_format output_format = vc4_state->output_format;
18111813
unsigned long long pixel_rate = mode->clock * 1000;
18121814
unsigned long long tmds_rate;
18131815
int ret;
@@ -1832,10 +1834,16 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
18321834
pixel_rate = mode->clock * 1000;
18331835
}
18341836

1837+
18351838
ret = vc4_hdmi_encoder_compute_config(vc4_hdmi, vc4_state, mode);
18361839
if (ret)
18371840
return ret;
18381841

1842+
/* vc4_hdmi_encoder_compute_config may have changed output_bpc and/or output_format */
1843+
if (vc4_state->output_bpc != output_bpc ||
1844+
vc4_state->output_format != output_format)
1845+
crtc_state->mode_changed = true;
1846+
18391847
return 0;
18401848
}
18411849

0 commit comments

Comments
 (0)