drm/vmwgfx: Remove explicit and broken vblank handling
authorZack Rusin <zackr@vmware.com>
Sat, 22 Oct 2022 04:02:33 +0000 (00:02 -0400)
committerZack Rusin <zackr@vmware.com>
Tue, 25 Oct 2022 16:42:29 +0000 (12:42 -0400)
The explicit vblank handling was never finished. The driver never had
the full implementation of vblank and what was there is emulated
by DRM when the driver doesn't pretend to be implementing it itself.

Let DRM handle the vblank emulation and stop pretending the driver is
doing anything special with vblank. In the future it would make sense
to implement helpers for full vblank handling because vkms and
amdgpu_vkms already have that code. Exporting it to common helpers and
having all three drivers share it would make sense (that would be largely
just to allow more of igt to run).

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Maaz Mombasawala <mombasawalam@vmware.com>
Reviewed-by: Martin Krastev <krastevm@vmware.com>
Reviewed-by: Michael Banack <banackm@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221022040236.616490-15-zack@kde.org
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c

index ad470e54d586fba64fa03063ffd7784b3e90dc3f..4eb7339dd121521b26e1905055825cd296cfb443 100644 (file)
@@ -1208,9 +1208,6 @@ int vmw_kms_write_svga(struct vmw_private *vmw_priv,
 bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
                                uint32_t pitch,
                                uint32_t height);
-u32 vmw_get_vblank_counter(struct drm_crtc *crtc);
-int vmw_enable_vblank(struct drm_crtc *crtc);
-void vmw_disable_vblank(struct drm_crtc *crtc);
 int vmw_kms_present(struct vmw_private *dev_priv,
                    struct drm_file *file_priv,
                    struct vmw_framebuffer *vfb,
index 36e7dc3736fe75d155f9800fff4c1712737a8559..0342efdf90637031f0bf0f291bb7e46b552c911e 100644 (file)
@@ -31,7 +31,6 @@
 #include <drm/drm_fourcc.h>
 #include <drm/drm_rect.h>
 #include <drm/drm_sysfs.h>
-#include <drm/drm_vblank.h>
 
 #include "vmwgfx_kms.h"
 
@@ -981,15 +980,6 @@ void vmw_du_crtc_atomic_begin(struct drm_crtc *crtc,
 void vmw_du_crtc_atomic_flush(struct drm_crtc *crtc,
                              struct drm_atomic_state *state)
 {
-       struct drm_pending_vblank_event *event = crtc->state->event;
-
-       if (event) {
-               crtc->state->event = NULL;
-
-               spin_lock_irq(&crtc->dev->event_lock);
-               drm_crtc_send_vblank_event(crtc, event);
-               spin_unlock_irq(&crtc->dev->event_lock);
-       }
 }
 
 
@@ -2307,30 +2297,6 @@ bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
                 dev_priv->max_primary_mem : dev_priv->vram_size);
 }
 
-
-/*
- * Function called by DRM code called with vbl_lock held.
- */
-u32 vmw_get_vblank_counter(struct drm_crtc *crtc)
-{
-       return 0;
-}
-
-/*
- * Function called by DRM code called with vbl_lock held.
- */
-int vmw_enable_vblank(struct drm_crtc *crtc)
-{
-       return -EINVAL;
-}
-
-/*
- * Function called by DRM code called with vbl_lock held.
- */
-void vmw_disable_vblank(struct drm_crtc *crtc)
-{
-}
-
 /**
  * vmw_du_update_layout - Update the display unit with topology from resolution
  * plugin and generate DRM uevent
index b8761f16dd78509b81a3067479e1eef6a1da5bd2..a56e5d0ca3c65c3a618709b9c7c8957c1754eb75 100644 (file)
@@ -28,7 +28,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fourcc.h>
-#include <drm/drm_vblank.h>
 
 #include "vmwgfx_kms.h"
 
@@ -235,9 +234,6 @@ static const struct drm_crtc_funcs vmw_legacy_crtc_funcs = {
        .atomic_duplicate_state = vmw_du_crtc_duplicate_state,
        .atomic_destroy_state = vmw_du_crtc_destroy_state,
        .set_config = drm_atomic_helper_set_config,
-       .get_vblank_counter = vmw_get_vblank_counter,
-       .enable_vblank = vmw_enable_vblank,
-       .disable_vblank = vmw_disable_vblank,
 };
 
 
@@ -507,10 +503,6 @@ int vmw_kms_ldu_init_display(struct vmw_private *dev_priv)
        dev_priv->ldu_priv->last_num_active = 0;
        dev_priv->ldu_priv->fb = NULL;
 
-       ret = drm_vblank_init(dev, num_display_units);
-       if (ret != 0)
-               goto err_free;
-
        vmw_kms_create_implicit_placement_property(dev_priv);
 
        for (i = 0; i < num_display_units; ++i) {
index ecd3c2fc978b2362d9fbff20d22f0d1e8da032a8..8db61c541a80515c4fd06ba3fb81d5003787a96c 100644 (file)
@@ -29,7 +29,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_fourcc.h>
-#include <drm/drm_vblank.h>
 
 #include "vmwgfx_kms.h"
 
@@ -320,9 +319,6 @@ static const struct drm_crtc_funcs vmw_screen_object_crtc_funcs = {
        .atomic_destroy_state = vmw_du_crtc_destroy_state,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
-       .get_vblank_counter = vmw_get_vblank_counter,
-       .enable_vblank = vmw_enable_vblank,
-       .disable_vblank = vmw_disable_vblank,
 };
 
 /*
@@ -730,7 +726,6 @@ vmw_sou_primary_plane_atomic_update(struct drm_plane *plane,
        struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state, plane);
        struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state, plane);
        struct drm_crtc *crtc = new_state->crtc;
-       struct drm_pending_vblank_event *event = NULL;
        struct vmw_fence_obj *fence = NULL;
        int ret;
 
@@ -754,24 +749,6 @@ vmw_sou_primary_plane_atomic_update(struct drm_plane *plane,
                return;
        }
 
-       /* For error case vblank event is send from vmw_du_crtc_atomic_flush */
-       event = crtc->state->event;
-       if (event && fence) {
-               struct drm_file *file_priv = event->base.file_priv;
-
-               ret = vmw_event_fence_action_queue(file_priv,
-                                                  fence,
-                                                  &event->base,
-                                                  &event->event.vbl.tv_sec,
-                                                  &event->event.vbl.tv_usec,
-                                                  true);
-
-               if (unlikely(ret != 0))
-                       DRM_ERROR("Failed to queue event on fence.\n");
-               else
-                       crtc->state->event = NULL;
-       }
-
        if (fence)
                vmw_fence_obj_unreference(&fence);
 }
@@ -947,18 +924,12 @@ err_free:
 int vmw_kms_sou_init_display(struct vmw_private *dev_priv)
 {
        struct drm_device *dev = &dev_priv->drm;
-       int i, ret;
+       int i;
 
        if (!(dev_priv->capabilities & SVGA_CAP_SCREEN_OBJECT_2)) {
                return -ENOSYS;
        }
 
-       ret = -ENOMEM;
-
-       ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS);
-       if (unlikely(ret != 0))
-               return ret;
-
        for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i)
                vmw_sou_init(dev_priv, i);
 
index 8650c3aea8f0a9bc6bdb3794826b74ba3d9719f8..0090abe8925484cbd27db98e45ae8678ec87d927 100644 (file)
@@ -29,7 +29,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_fourcc.h>
-#include <drm/drm_vblank.h>
 
 #include "vmwgfx_kms.h"
 #include "vmw_surface_cache.h"
@@ -925,9 +924,6 @@ static const struct drm_crtc_funcs vmw_stdu_crtc_funcs = {
        .atomic_destroy_state = vmw_du_crtc_destroy_state,
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
-       .get_vblank_counter = vmw_get_vblank_counter,
-       .enable_vblank = vmw_enable_vblank,
-       .disable_vblank = vmw_disable_vblank,
 };
 
 
@@ -1591,7 +1587,6 @@ vmw_stdu_primary_plane_atomic_update(struct drm_plane *plane,
        struct vmw_plane_state *vps = vmw_plane_state_to_vps(new_state);
        struct drm_crtc *crtc = new_state->crtc;
        struct vmw_screen_target_display_unit *stdu;
-       struct drm_pending_vblank_event *event;
        struct vmw_fence_obj *fence = NULL;
        struct vmw_private *dev_priv;
        int ret;
@@ -1640,23 +1635,6 @@ vmw_stdu_primary_plane_atomic_update(struct drm_plane *plane,
                return;
        }
 
-       /* In case of error, vblank event is send in vmw_du_crtc_atomic_flush */
-       event = crtc->state->event;
-       if (event && fence) {
-               struct drm_file *file_priv = event->base.file_priv;
-
-               ret = vmw_event_fence_action_queue(file_priv,
-                                                  fence,
-                                                  &event->base,
-                                                  &event->event.vbl.tv_sec,
-                                                  &event->event.vbl.tv_usec,
-                                                  true);
-               if (ret)
-                       DRM_ERROR("Failed to queue event on fence.\n");
-               else
-                       crtc->state->event = NULL;
-       }
-
        if (fence)
                vmw_fence_obj_unreference(&fence);
 }
@@ -1883,10 +1861,6 @@ int vmw_kms_stdu_init_display(struct vmw_private *dev_priv)
        if (!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS))
                return -ENOSYS;
 
-       ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS);
-       if (unlikely(ret != 0))
-               return ret;
-
        dev_priv->active_display_unit = vmw_du_screen_target;
 
        for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i) {