[PATCH] drm/vkms: Add support for vkms work without vblank
Rodrigo Siqueira
rodrigosiqueiramelo at gmail.com
Mon Aug 20 23:55:44 UTC 2018
Currently, vkms needs VBlank to work well. This patch adds another
operation model that make vkms works without VBlank support.
Signed-off-by: Rodrigo Siqueira <rodrigosiqueiramelo at gmail.com>
---
drivers/gpu/drm/vkms/vkms_crtc.c | 10 ++++++++++
drivers/gpu/drm/vkms/vkms_drv.c | 12 ++++++++++--
drivers/gpu/drm/vkms/vkms_drv.h | 1 +
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index bfe6e0312cc4..001fa5c1d326 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -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);
}
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 5d78bd97e69c..f30c4113d4c4 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -21,6 +21,10 @@
static struct vkms_device *vkms_device;
+static bool disable_vblank;
+module_param_named(disablevblank, disable_vblank, bool, 0444);
+MODULE_PARM_DESC(disablevblank, "Disable vblank interrupt");
+
static const struct file_operations vkms_driver_fops = {
.owner = THIS_MODULE,
.open = drm_open,
@@ -105,9 +109,13 @@ static int __init vkms_init(void)
goto out_fini;
}
- vkms_device->drm.irq_enabled = true;
+ vkms_device->output.disable_vblank = disable_vblank;
+ vkms_device->drm.irq_enabled = !disable_vblank ? true : false;
+
+ if (disable_vblank)
+ DRM_INFO("Virtual Hardware mode enabled");
- ret = drm_vblank_init(&vkms_device->drm, 1);
+ ret = (disable_vblank) ? 0 : drm_vblank_init(&vkms_device->drm, 1);
if (ret) {
DRM_ERROR("Failed to vblank\n");
goto out_fini;
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index f156c930366a..9ee862e6f7e5 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -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;
--
2.18.0
More information about the dri-devel
mailing list