@@ -145,12 +145,22 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = {
static void vkms_crtc_atomic_enable(struct drm_crtc *crtc,
struct drm_crtc_state *old_state)
{
+ struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
+
+ if (vkms_out->disable_vblank)
+ return;
+
drm_crtc_vblank_on(crtc);
}
static void vkms_crtc_atomic_disable(struct drm_crtc *crtc,
struct drm_crtc_state *old_state)
{
+ struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
+
+ if (vkms_out->disable_vblank)
+ return;
+
drm_crtc_vblank_off(crtc);
}
@@ -21,6 +21,11 @@
static struct vkms_device *vkms_device;
+static bool virtual_hw;
+module_param_named(virtual_hw, virtual_hw, bool, 0444);
+MODULE_PARM_DESC(virtual_hw,
+ "Enable virtual hardware mode (disables vblanks and immediately completes flips)");
+
static const struct file_operations vkms_driver_fops = {
.owner = THIS_MODULE,
.open = drm_open,
@@ -105,9 +110,13 @@ static int __init vkms_init(void)
goto out_fini;
}
- vkms_device->drm.irq_enabled = true;
+ vkms_device->output.disable_vblank = virtual_hw;
+ vkms_device->drm.irq_enabled = !virtual_hw;
+
+ if (virtual_hw)
+ DRM_INFO("Virtual Hardware mode enabled");
- ret = drm_vblank_init(&vkms_device->drm, 1);
+ ret = (virtual_hw) ? 0 : drm_vblank_init(&vkms_device->drm, 1);
if (ret) {
DRM_ERROR("Failed to vblank\n");
goto out_fini;
@@ -52,6 +52,7 @@ struct vkms_output {
struct drm_encoder encoder;
struct drm_connector connector;
struct hrtimer vblank_hrtimer;
+ bool disable_vblank;
ktime_t period_ns;
struct drm_pending_vblank_event *event;
bool crc_enabled;
Currently, vkms needs VBlank to work well. This patch adds another operation model that make vkms works without VBlank support. In this scenario, vblank signaling is faked by calling drm_send_vblank_event() in vkms_crtc_atomic_flush(); this approach works due to the drm_vblank_get() == 0 verification. Changes since V1: Daniel Vetter: - Change module parameter name from disablevblank to virtual_hw - Improve parameter description - Improve commit message Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com> --- drivers/gpu/drm/vkms/vkms_crtc.c | 10 ++++++++++ drivers/gpu/drm/vkms/vkms_drv.c | 13 +++++++++++-- drivers/gpu/drm/vkms/vkms_drv.h | 1 + 3 files changed, 22 insertions(+), 2 deletions(-)