Currently the way we check if a driver supports hardware vblanks or not is actually funny and cursed! Likely because it predates KMS.
As it turns out, we only check dev->num_crtcs to see if we have vblank support. Why? Because it doesn't actually represent the number of CRTCs on the device, unless drm_vblank_init() has been called - which sets dev->num_crtcs. And as it turns out, this is the second place we keep track of the number of CRTCs we have. Let's clean this up by starting with adding a variable specifically for tracking whether drm_vblank_init() has been called or not. Signed-off-by: Lyude Paul <[email protected]> --- drivers/gpu/drm/drm_vblank.c | 3 ++- include/drm/drm_device.h | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index f90fb2d13e423..d317148af8cb3 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -557,6 +557,7 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs) if (!dev->vblank) return -ENOMEM; + dev->has_hw_vblank = true; dev->num_crtcs = num_crtcs; for (i = 0; i < num_crtcs; i++) { @@ -600,7 +601,7 @@ EXPORT_SYMBOL(drm_vblank_init); */ bool drm_dev_has_vblank(const struct drm_device *dev) { - return dev->num_crtcs != 0; + return dev->has_hw_vblank; } EXPORT_SYMBOL(drm_dev_has_vblank); diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h index 768a8dae83c52..2df08c756afd3 100644 --- a/include/drm/drm_device.h +++ b/include/drm/drm_device.h @@ -287,6 +287,13 @@ struct drm_device { */ struct drm_vblank_crtc *vblank; + /** + * @has_hw_vblank: + * + * Has the driver called drm_vblank_init() to setup hardware vblank support? + */ + bool has_hw_vblank; + /** * @vblank_time_lock: * -- 2.55.0
