mirror of https://github.com/torvalds/linux.git
Christian reports that 4K output using YUV420 encoding fails with the
following error:
Fatal Error, invalid HDMI vclk freq 593406
Modetest shows the following:
3840x2160 59.94 3840 4016 4104 4400 2160 2168 2178 2250 593407 flags: xxxx, xxxx,
drm calculated value -------------------------------------^
This indicates that there's a (1kHz) mismatch between the clock
calculated by the drm framework and the meson driver.
Relevant function call stack:
(drm framework)
-> meson_encoder_hdmi_atomic_enable()
-> meson_encoder_hdmi_set_vclk()
-> meson_vclk_setup()
The video clock requested by the drm framework is 593407kHz. This is
passed by meson_encoder_hdmi_atomic_enable() to
meson_encoder_hdmi_set_vclk() and the following formula is applied:
- the frequency is halved (which would be 296703.5kHz) and rounded down
to the next full integer, which is 296703kHz
- TMDS clock is calculated (296703kHz * 10)
- video encoder clock is calculated - this needs to match a table from
meson_vclk.c and so it doubles the previously halved value again
(resulting in 593406kHz)
- meson_vclk_setup() can't find (either directly, or by deriving it from
594000kHz * 1000 / 1001 and rounding to the closest integer value -
which is 593407kHz as originally requested by the drm framework) a
matching clock in it's internal table and errors out with "invalid
HDMI vclk freq"
Fix the division precision by switching the whole meson driver to use
unsigned long long (64-bit) Hz values for clock frequencies instead of
unsigned int (32-bit) kHz to fix the rouding error.
Fixes:
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| meson_crtc.c | ||
| meson_crtc.h | ||
| meson_drv.c | ||
| meson_drv.h | ||
| meson_dw_hdmi.c | ||
| meson_dw_hdmi.h | ||
| meson_dw_mipi_dsi.c | ||
| meson_dw_mipi_dsi.h | ||
| meson_encoder_cvbs.c | ||
| meson_encoder_cvbs.h | ||
| meson_encoder_dsi.c | ||
| meson_encoder_dsi.h | ||
| meson_encoder_hdmi.c | ||
| meson_encoder_hdmi.h | ||
| meson_osd_afbcd.c | ||
| meson_osd_afbcd.h | ||
| meson_overlay.c | ||
| meson_overlay.h | ||
| meson_plane.c | ||
| meson_plane.h | ||
| meson_rdma.c | ||
| meson_rdma.h | ||
| meson_registers.h | ||
| meson_vclk.c | ||
| meson_vclk.h | ||
| meson_venc.c | ||
| meson_venc.h | ||
| meson_viu.c | ||
| meson_viu.h | ||
| meson_vpp.c | ||
| meson_vpp.h | ||