On Fri, 14 Aug 2026, Lyude Paul <[email protected]> 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
