[PATCH 0/5] drm/vblank: Enforce all-or-nothing vblank support
Jani Nikula
jani.nikula at linux.intel.com
Mon Aug 17 05:41:02 PDT 2026
On Fri, 14 Aug 2026, Lyude Paul <lyude at redhat.com> wrote:
> One of the oddities with DRM that is leftover from the old days is how
> vblank support is implemented by drivers. This has caused some minor
> issues for the rust bindings for KMS which could be worked around.
> However, it seems like a much better idea to fix this on the C side.
> Those oddities are mainly:
>
> * There's nothing in the vblank core that actually ensures that all
> CRTCs implement vblank support if one of them do. On Rust's side, we
> can't have this and have to ensure either the whole device has vblank
> support or not - otherwise it would be quite painful ensuring we don't
> expose vblank methods to drivers that can't use them.
> This additionally means such a situation would lead to UB.
> * There is a second variable for keeping track of the number of CRTCs
> and it's kind of broken and confusing. Even worse, we currently allow
> the vblank API to allow a driver to specify a different number of
> CRTCs then it actually has.
>
> So, let's just go ahead and fix this across the whole tree, and enforce
> that a driver must either implement hardware vblank support for all
> CRTCs or no CRTCs.
For i915, the relevant init order is currently:
- drm_vblank_init()
- drm_mode_config_init()
- drm_crtc_init_with_planes() for each CRTC
For the patch series to work, drm_vblank_init() would have to happen
after mode config and CRTC init. Off-hand, I couldn't say if there are
dependencies that make this change difficult.
I'd be surprised if i915 were the only driver like this.
BR,
Jani.
>
> Lyude Paul (5):
> drm/vblank: Add drm_device.has_hw_vblank
> drm/vblank: Remove drm->num_crtcs
> drm/vblank: Remove num_crtcs argument from drm_vblank_init()
> drm/vblank: Use drm_for_each_crtc() in drm_vblank_init()
> drm/vblank: Require all CRTCs implement vblank support in
> drm_vblank_init()
>
> drivers/gpu/drm/adp/adp_drv.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 2 +-
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
> .../gpu/drm/arm/display/komeda/komeda_kms.c | 2 +-
> drivers/gpu/drm/arm/hdlcd_drv.c | 2 +-
> drivers/gpu/drm/arm/malidp_drv.c | 2 +-
> drivers/gpu/drm/armada/armada_drv.c | 2 +-
> drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 2 +-
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 2 +-
> drivers/gpu/drm/drm_vblank.c | 60 ++++++++++++-------
> drivers/gpu/drm/exynos/exynos_drm_drv.c | 2 +-
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 2 +-
> drivers/gpu/drm/gma500/psb_drv.c | 2 +-
> drivers/gpu/drm/gma500/psb_irq.c | 4 +-
> .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 2 +-
> .../gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 2 +-
> drivers/gpu/drm/hyperv/hyperv_drm_modeset.c | 2 +-
> .../drm/i915/display/intel_display_driver.c | 3 +-
> drivers/gpu/drm/imx/dc/dc-kms.c | 2 +-
> drivers/gpu/drm/imx/dcss/dcss-kms.c | 2 +-
> drivers/gpu/drm/imx/ipuv3/imx-drm-core.c | 2 +-
> drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 2 +-
> drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 2 +-
> drivers/gpu/drm/kmb/kmb_drv.c | 2 +-
> drivers/gpu/drm/logicvc/logicvc_mode.c | 2 +-
> drivers/gpu/drm/loongson/lsdc_drv.c | 2 +-
> drivers/gpu/drm/mcde/mcde_drv.c | 2 +-
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 2 +-
> drivers/gpu/drm/meson/meson_drv.c | 2 +-
> drivers/gpu/drm/msm/msm_kms.c | 2 +-
> drivers/gpu/drm/mxsfb/lcdif_drv.c | 2 +-
> drivers/gpu/drm/mxsfb/mxsfb_drv.c | 2 +-
> drivers/gpu/drm/nouveau/nouveau_display.c | 2 +-
> drivers/gpu/drm/omapdrm/omap_drv.c | 2 +-
> drivers/gpu/drm/pl111/pl111_drv.c | 2 +-
> drivers/gpu/drm/qxl/qxl_display.c | 2 +-
> drivers/gpu/drm/radeon/atombios_crtc.c | 4 +-
> drivers/gpu/drm/radeon/radeon_irq_kms.c | 2 +-
> drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 4 +-
> drivers/gpu/drm/renesas/rcar-du/rcar_du_kms.c | 2 +-
> drivers/gpu/drm/renesas/rz-du/rzg2l_du_kms.c | 2 +-
> .../gpu/drm/renesas/shmobile/shmob_drm_drv.c | 2 +-
> drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 2 +-
> drivers/gpu/drm/sprd/sprd_drm.c | 2 +-
> drivers/gpu/drm/sti/sti_compositor.c | 2 +-
> drivers/gpu/drm/stm/ltdc.c | 2 +-
> drivers/gpu/drm/sun4i/sun4i_drv.c | 2 +-
> drivers/gpu/drm/tegra/drm.c | 2 +-
> drivers/gpu/drm/tidss/tidss_kms.c | 2 +-
> drivers/gpu/drm/tilcdc/tilcdc_drv.c | 2 +-
> drivers/gpu/drm/tiny/bochs.c | 2 +-
> drivers/gpu/drm/tiny/cirrus-qemu.c | 2 +-
> drivers/gpu/drm/tve200/tve200_drv.c | 2 +-
> drivers/gpu/drm/vc4/vc4_kms.c | 6 +-
> drivers/gpu/drm/verisilicon/vs_drm.c | 2 +-
> drivers/gpu/drm/virtio/virtgpu_display.c | 2 +-
> drivers/gpu/drm/vkms/vkms_drv.c | 3 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_vkms.c | 2 +-
> drivers/gpu/drm/xlnx/zynqmp_kms.c | 2 +-
> include/drm/drm_device.h | 10 +++-
> include/drm/drm_vblank.h | 2 +-
> 64 files changed, 114 insertions(+), 92 deletions(-)
>
>
> base-commit: 568d4cb5dcc5ec4e22975699b6ea67a30806884c
--
Jani Nikula, Intel
More information about the Linux-rockchip
mailing list