From: Sumera Priyadarsini <sylphrenadin@gmail.com> To: melissa.srw@gmail.com Cc: daniel@ffwll.ch, rodrigosiqueiramelo@gmail.com, hamohammed.sa@gmail.com, airlied@linux.ie, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH] drm/vkms: Add support for virtual hardware mode Date: Wed, 24 Feb 2021 16:25:09 +0530 [thread overview] Message-ID: <20210224105509.yzdimgbu2jwe3auf@adolin> (raw) Add a virtual hardware or vblank-less mode as a module to enable VKMS to emulate virtual graphic drivers. This mode can be enabled by setting enable_virtual_hw=1 at the time of loading VKMS. A new function vkms_crtc_composer() has been added to bypass the vblank mode and is called directly in the atomic hook in vkms_atomic_begin(). However, some crc captures still use vblanks which causes the crc-based igt tests to crash. Currently, I am unsure about how to approach one-shot implementation of crc reads so I am still working on that. This patch has been tested with the igt tests, kms_writeback, kms_atomic, kms_lease, kms_flip, kms_pipe_get_crc and preserves results except for subtests related to crc reads and skips tests that rely on vertical blanking. This patch must be tested after incorporating the igt-tests patch: https://lists.freedesktop.org/archives/igt-dev/2021-February/029355.html . The patch is based on Rodrigo Siqueira's patch(https://patchwork.freedesktop.org/patch/316851/?series=48469&rev=3) and the ensuing review. Signed-off-by: Sumera Priyadarsini <sylphrenadin@gmail.com> --- drivers/gpu/drm/vkms/vkms_composer.c | 46 ++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_crtc.c | 17 ++++++++-- drivers/gpu/drm/vkms/vkms_drv.c | 18 ++++++++--- drivers/gpu/drm/vkms/vkms_drv.h | 2 ++ 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 66c6842d70db..7a8aaf5c5555 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -247,6 +247,52 @@ void vkms_composer_worker(struct work_struct *work) drm_crtc_add_crc_entry(crtc, true, frame_start++, &crc32); } +void vkms_crtc_composer(struct vkms_crtc_state *crtc_state) +{ + struct drm_crtc *crtc = crtc_state->base.crtc; + struct vkms_output *out = drm_crtc_to_vkms_output(crtc); + struct vkms_composer *primary_composer = NULL; + struct vkms_composer *cursor_composer = NULL; + void *vaddr_out = NULL; + u32 crc32 = 0; + int ret; + bool wb_pending; + + wb_pending = crtc_state->wb_pending; + + if (crtc_state->num_active_planes >= 1) + primary_composer = crtc_state->active_planes[0]->composer; + + if (crtc_state->num_active_planes == 2) + cursor_composer = crtc_state->active_planes[1]->composer; + + if (!primary_composer) + return; + + if (wb_pending) + vaddr_out = crtc_state->active_writeback; + + ret = compose_planes(&vaddr_out, primary_composer, cursor_composer); + if (ret) { + if (ret == -EINVAL && !wb_pending) + kfree(vaddr_out); + return; + } + + crc32 = compute_crc(vaddr_out, primary_composer); + + if (wb_pending) { + drm_writeback_signal_completion(&out->wb_connector, 0); + spin_lock_irq(&out->composer_lock); + crtc_state->wb_pending = false; + spin_unlock_irq(&out->composer_lock); + } else { + kfree(vaddr_out); + } + + drm_crtc_add_crc_entry(crtc, true, 0, &crc32); +} + static const char * const pipe_crc_sources[] = {"auto"}; const char *const *vkms_get_crc_sources(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 6164349cdf11..38de791a4882 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -224,13 +224,19 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc, static void vkms_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state) { - drm_crtc_vblank_on(crtc); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (!vkmsdev->config->virtual_hw) + drm_crtc_vblank_on(crtc); } static void vkms_crtc_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state) { - drm_crtc_vblank_off(crtc); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (!vkmsdev->config->virtual_hw) + drm_crtc_vblank_off(crtc); } static void vkms_crtc_atomic_begin(struct drm_crtc *crtc, @@ -248,8 +254,13 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state) { struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc); + struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(crtc->state); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (vkmsdev->config->virtual_hw) + vkms_crtc_composer(vkms_state); - if (crtc->state->event) { + if (crtc->state->event && !vkmsdev->config->virtual_hw) { spin_lock(&crtc->dev->event_lock); if (drm_crtc_vblank_get(crtc) != 0) diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c index 2173b82606f6..945c4495d62a 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -44,6 +44,11 @@ static bool enable_writeback = true; module_param_named(enable_writeback, enable_writeback, bool, 0444); MODULE_PARM_DESC(enable_writeback, "Enable/Disable writeback connector support"); +static bool enable_virtual_hw = false; +module_param_named(enable_virtual_hw, enable_virtual_hw, bool, 0444); +MODULE_PARM_DESC(enable_virtual_hw, "Enable/Disable virtual hardware mode(virtual \ +hardware mode disables vblank interrupts)"); + DEFINE_DRM_GEM_FOPS(vkms_driver_fops); static void vkms_release(struct drm_device *dev) @@ -159,12 +164,14 @@ static int vkms_create(struct vkms_config *config) goto out_devres; } - vkms_device->drm.irq_enabled = true; + vkms_device->drm.irq_enabled = !vkms_device->config->virtual_hw; - ret = drm_vblank_init(&vkms_device->drm, 1); - if (ret) { - DRM_ERROR("Failed to vblank\n"); - goto out_devres; + if (!vkms_device->config->virtual_hw) { + ret = drm_vblank_init(&vkms_device->drm, 1); + if (ret) { + DRM_ERROR("Failed to vblank\n"); + goto out_devres; + } } ret = vkms_modeset_init(vkms_device); @@ -198,6 +205,7 @@ static int __init vkms_init(void) config->cursor = enable_cursor; config->writeback = enable_writeback; + config->virtual_hw = enable_virtual_hw; return vkms_create(config); } diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 35540c7c4416..d4a45518639c 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -85,6 +85,7 @@ struct vkms_device; struct vkms_config { bool writeback; bool cursor; + bool virtual_hw; /* only set when instantiated */ struct vkms_device *dev; }; @@ -127,6 +128,7 @@ int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name, /* Composer Support */ void vkms_composer_worker(struct work_struct *work); void vkms_set_composer(struct vkms_output *out, bool enabled); +void vkms_crtc_composer(struct vkms_crtc_state *crtc_state); /* Writeback */ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev); -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Sumera Priyadarsini <sylphrenadin@gmail.com> To: melissa.srw@gmail.com Cc: hamohammed.sa@gmail.com, rodrigosiqueiramelo@gmail.com, airlied@linux.ie, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [RFC PATCH] drm/vkms: Add support for virtual hardware mode Date: Wed, 24 Feb 2021 16:25:09 +0530 [thread overview] Message-ID: <20210224105509.yzdimgbu2jwe3auf@adolin> (raw) Add a virtual hardware or vblank-less mode as a module to enable VKMS to emulate virtual graphic drivers. This mode can be enabled by setting enable_virtual_hw=1 at the time of loading VKMS. A new function vkms_crtc_composer() has been added to bypass the vblank mode and is called directly in the atomic hook in vkms_atomic_begin(). However, some crc captures still use vblanks which causes the crc-based igt tests to crash. Currently, I am unsure about how to approach one-shot implementation of crc reads so I am still working on that. This patch has been tested with the igt tests, kms_writeback, kms_atomic, kms_lease, kms_flip, kms_pipe_get_crc and preserves results except for subtests related to crc reads and skips tests that rely on vertical blanking. This patch must be tested after incorporating the igt-tests patch: https://lists.freedesktop.org/archives/igt-dev/2021-February/029355.html . The patch is based on Rodrigo Siqueira's patch(https://patchwork.freedesktop.org/patch/316851/?series=48469&rev=3) and the ensuing review. Signed-off-by: Sumera Priyadarsini <sylphrenadin@gmail.com> --- drivers/gpu/drm/vkms/vkms_composer.c | 46 ++++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_crtc.c | 17 ++++++++-- drivers/gpu/drm/vkms/vkms_drv.c | 18 ++++++++--- drivers/gpu/drm/vkms/vkms_drv.h | 2 ++ 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 66c6842d70db..7a8aaf5c5555 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -247,6 +247,52 @@ void vkms_composer_worker(struct work_struct *work) drm_crtc_add_crc_entry(crtc, true, frame_start++, &crc32); } +void vkms_crtc_composer(struct vkms_crtc_state *crtc_state) +{ + struct drm_crtc *crtc = crtc_state->base.crtc; + struct vkms_output *out = drm_crtc_to_vkms_output(crtc); + struct vkms_composer *primary_composer = NULL; + struct vkms_composer *cursor_composer = NULL; + void *vaddr_out = NULL; + u32 crc32 = 0; + int ret; + bool wb_pending; + + wb_pending = crtc_state->wb_pending; + + if (crtc_state->num_active_planes >= 1) + primary_composer = crtc_state->active_planes[0]->composer; + + if (crtc_state->num_active_planes == 2) + cursor_composer = crtc_state->active_planes[1]->composer; + + if (!primary_composer) + return; + + if (wb_pending) + vaddr_out = crtc_state->active_writeback; + + ret = compose_planes(&vaddr_out, primary_composer, cursor_composer); + if (ret) { + if (ret == -EINVAL && !wb_pending) + kfree(vaddr_out); + return; + } + + crc32 = compute_crc(vaddr_out, primary_composer); + + if (wb_pending) { + drm_writeback_signal_completion(&out->wb_connector, 0); + spin_lock_irq(&out->composer_lock); + crtc_state->wb_pending = false; + spin_unlock_irq(&out->composer_lock); + } else { + kfree(vaddr_out); + } + + drm_crtc_add_crc_entry(crtc, true, 0, &crc32); +} + static const char * const pipe_crc_sources[] = {"auto"}; const char *const *vkms_get_crc_sources(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 6164349cdf11..38de791a4882 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -224,13 +224,19 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc, static void vkms_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state) { - drm_crtc_vblank_on(crtc); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (!vkmsdev->config->virtual_hw) + drm_crtc_vblank_on(crtc); } static void vkms_crtc_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state) { - drm_crtc_vblank_off(crtc); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (!vkmsdev->config->virtual_hw) + drm_crtc_vblank_off(crtc); } static void vkms_crtc_atomic_begin(struct drm_crtc *crtc, @@ -248,8 +254,13 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state) { struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc); + struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(crtc->state); + struct vkms_device *vkmsdev = drm_device_to_vkms_device(crtc->dev); + + if (vkmsdev->config->virtual_hw) + vkms_crtc_composer(vkms_state); - if (crtc->state->event) { + if (crtc->state->event && !vkmsdev->config->virtual_hw) { spin_lock(&crtc->dev->event_lock); if (drm_crtc_vblank_get(crtc) != 0) diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c index 2173b82606f6..945c4495d62a 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -44,6 +44,11 @@ static bool enable_writeback = true; module_param_named(enable_writeback, enable_writeback, bool, 0444); MODULE_PARM_DESC(enable_writeback, "Enable/Disable writeback connector support"); +static bool enable_virtual_hw = false; +module_param_named(enable_virtual_hw, enable_virtual_hw, bool, 0444); +MODULE_PARM_DESC(enable_virtual_hw, "Enable/Disable virtual hardware mode(virtual \ +hardware mode disables vblank interrupts)"); + DEFINE_DRM_GEM_FOPS(vkms_driver_fops); static void vkms_release(struct drm_device *dev) @@ -159,12 +164,14 @@ static int vkms_create(struct vkms_config *config) goto out_devres; } - vkms_device->drm.irq_enabled = true; + vkms_device->drm.irq_enabled = !vkms_device->config->virtual_hw; - ret = drm_vblank_init(&vkms_device->drm, 1); - if (ret) { - DRM_ERROR("Failed to vblank\n"); - goto out_devres; + if (!vkms_device->config->virtual_hw) { + ret = drm_vblank_init(&vkms_device->drm, 1); + if (ret) { + DRM_ERROR("Failed to vblank\n"); + goto out_devres; + } } ret = vkms_modeset_init(vkms_device); @@ -198,6 +205,7 @@ static int __init vkms_init(void) config->cursor = enable_cursor; config->writeback = enable_writeback; + config->virtual_hw = enable_virtual_hw; return vkms_create(config); } diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 35540c7c4416..d4a45518639c 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -85,6 +85,7 @@ struct vkms_device; struct vkms_config { bool writeback; bool cursor; + bool virtual_hw; /* only set when instantiated */ struct vkms_device *dev; }; @@ -127,6 +128,7 @@ int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name, /* Composer Support */ void vkms_composer_worker(struct work_struct *work); void vkms_set_composer(struct vkms_output *out, bool enabled); +void vkms_crtc_composer(struct vkms_crtc_state *crtc_state); /* Writeback */ int vkms_enable_writeback_connector(struct vkms_device *vkmsdev); -- 2.25.1 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next reply other threads:[~2021-02-24 10:56 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-02-24 10:55 Sumera Priyadarsini [this message] 2021-02-24 10:55 ` [RFC PATCH] drm/vkms: Add support for virtual hardware mode Sumera Priyadarsini 2021-02-25 9:09 ` Daniel Vetter 2021-02-25 9:09 ` Daniel Vetter 2021-02-25 10:25 ` Gerd Hoffmann 2021-02-25 10:25 ` Gerd Hoffmann 2021-02-25 10:32 ` Daniel Vetter 2021-02-25 10:32 ` Daniel Vetter 2021-02-25 13:27 ` Gerd Hoffmann 2021-02-25 13:27 ` Gerd Hoffmann 2021-02-25 15:06 ` Daniel Vetter 2021-02-25 15:06 ` Daniel Vetter 2021-02-25 16:25 ` Zack Rusin 2021-02-25 16:25 ` Zack Rusin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210224105509.yzdimgbu2jwe3auf@adolin \ --to=sylphrenadin@gmail.com \ --cc=airlied@linux.ie \ --cc=daniel@ffwll.ch \ --cc=dri-devel@lists.freedesktop.org \ --cc=hamohammed.sa@gmail.com \ --cc=linux-kernel@vger.kernel.org \ --cc=melissa.srw@gmail.com \ --cc=rodrigosiqueiramelo@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.