On 04/05, Sumera Priyadarsini wrote: > Add a virtual hardware or vblank-less mode as a module to > enable VKMS to emulate virtual graphic drivers. > > Add a new drm_crtc_helper_funcs struct, > vkms_virtual_crtc_helper_funcs() which holds the atomic helpers > for virtual hardware mode. Change the existing > vkms_crtc_helper_funcs struct to vkms_vblank_crtc_helper_funcs > which holds atomic helpers for the vblank mode. I would say `rename' not `change' > This makes the code flow clearer and easier to test > virtual hardware mode. > > The first patch of this patchset added the function vkms_crtc_composer() > for plane composition which is used in case of vblank-less mode and > is directly called in the atomic hook in vkms_crtc_atomic_begin(). Probably this statement will change when you move the vkms_crtc_composer to here. > However, some crc captures still use vblanks which causes the crc-based > igt tests to crash. Currently, I am unsure about how to approach the > one-shot implementation of crc reads so I am still working on that. > > This patchset has been tested with the igt tests- kms_writeback, kms_atomic, > kms_lease, kms_flip, kms_pipe_get_crc and preserves results except for Although the test results remain the same, you should also check the log. In kms_flip, the substests flip-vs-panning-vs-hang and flip-vs-panning-interruptible raised an error: [drm:vkms_composer_common [vkms]] *ERROR* Cannot allocate memory for output frame. Please, also check for leak. > subtests related to crc reads and skips tests that rely on vertical > blanking. This patchset must be tested after incorporating the > igt-tests patch: > https://lists.freedesktop.org/archives/igt-dev/2021-February/029355.html . prefer to use the patckwork link > > 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@xxxxxxxxx> > --- > Changes in V3: > - Refactor patchset(Melissa) > Changes in V2: > - Add atomic helper functions in a separate struct for virtual hardware > mode (Daniel) > - Remove spinlock across 'vkms_output->lock' in vkms_crtc.c(Daniel) > - Add vkms_composer_common() (Daniel) > --- > drivers/gpu/drm/vkms/vkms_crtc.c | 51 +++++++++++++++++++++++--------- > drivers/gpu/drm/vkms/vkms_drv.c | 18 +++++++---- > drivers/gpu/drm/vkms/vkms_drv.h | 1 + > 3 files changed, 51 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c > index 57bbd32e9beb..e6286f98d5b6 100644 > --- a/drivers/gpu/drm/vkms/vkms_crtc.c > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c > @@ -222,20 +222,20 @@ static int vkms_crtc_atomic_check(struct drm_crtc *crtc, > return 0; > } > > -static void vkms_crtc_atomic_enable(struct drm_crtc *crtc, > - struct drm_atomic_state *state) > +static void vkms_vblank_crtc_atomic_enable(struct drm_crtc *crtc, > + struct drm_atomic_state *state) > { > drm_crtc_vblank_on(crtc); > } > > -static void vkms_crtc_atomic_disable(struct drm_crtc *crtc, > - struct drm_atomic_state *state) > +static void vkms_vblank_crtc_atomic_disable(struct drm_crtc *crtc, > + struct drm_atomic_state *state) > { > drm_crtc_vblank_off(crtc); > } > > -static void vkms_crtc_atomic_begin(struct drm_crtc *crtc, > - struct drm_atomic_state *state) > +static void vkms_vblank_crtc_atomic_begin(struct drm_crtc *crtc, > + struct drm_atomic_state *state) > { > struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc); > > @@ -245,8 +245,8 @@ static void vkms_crtc_atomic_begin(struct drm_crtc *crtc, > spin_lock_irq(&vkms_output->lock); > } > > -static void vkms_crtc_atomic_flush(struct drm_crtc *crtc, > - struct drm_atomic_state *state) > +static void vkms_vblank_crtc_atomic_flush(struct drm_crtc *crtc, > + struct drm_atomic_state *state) > { > struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc); > > @@ -268,18 +268,38 @@ static void vkms_crtc_atomic_flush(struct drm_crtc *crtc, > spin_unlock_irq(&vkms_output->lock); > } > > -static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs = { > +/* > + * Crtc functions for virtual hardware/vblankless mode > + */ > +static void vkms_virtual_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); > + > + vkms_crtc_composer(vkms_state); > + > + vkms_output->composer_state = to_vkms_crtc_state(crtc->state); > +} > + > +static const struct drm_crtc_helper_funcs vkms_vblank_crtc_helper_funcs = { > .atomic_check = vkms_crtc_atomic_check, > - .atomic_begin = vkms_crtc_atomic_begin, > - .atomic_flush = vkms_crtc_atomic_flush, > - .atomic_enable = vkms_crtc_atomic_enable, > - .atomic_disable = vkms_crtc_atomic_disable, > + .atomic_begin = vkms_vblank_crtc_atomic_begin, > + .atomic_flush = vkms_vblank_crtc_atomic_flush, > + .atomic_enable = vkms_vblank_crtc_atomic_enable, > + .atomic_disable = vkms_vblank_crtc_atomic_disable, > +}; > + > +static const struct drm_crtc_helper_funcs vkms_virtual_crtc_helper_funcs = { > + .atomic_check = vkms_crtc_atomic_check, > + .atomic_flush = vkms_virtual_crtc_atomic_flush, > }; > > int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, > struct drm_plane *primary, struct drm_plane *cursor) > { > struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc); > + struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev); > int ret; > > ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor, > @@ -289,7 +309,10 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, > return ret; > } > > - drm_crtc_helper_add(crtc, &vkms_crtc_helper_funcs); > + if (vkmsdev->config->virtual_hw) > + drm_crtc_helper_add(crtc, &vkms_virtual_crtc_helper_funcs); > + else > + drm_crtc_helper_add(crtc, &vkms_vblank_crtc_helper_funcs); > > spin_lock_init(&vkms_out->lock); > spin_lock_init(&vkms_out->composer_lock); > 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 538315140585..a44f530ffaf0 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; Checkpatch complained of several lines. Please, take a look at this too. Thanks, Melissa > }; > -- > 2.25.1 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel