Revert "drm/mgag200: Add vblank support"
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 15 Oct 2024 06:37:13 +0000 (08:37 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 17 Oct 2024 06:49:45 +0000 (08:49 +0200)
This reverts commit 6c9e14ee9f519ee605a3694fbfa4711284781d22.
This reverts commit d5070c9b29440c270b534bbacd636b8fa558e82b.
This reverts commit 89c6ea2006e2d39b125848fb0195c08fa0b354be.

The VLINE interrupt doesn't work correctly on G200SE-A (at least). We
have also seen missing interrupts on G200ER. So revert vblank support.
Fixes frozen displays and warnings about missed vblanks.

[   33.818362] [CRTC:34:crtc-0] vblank wait timed out

From the vblank code, the driver only keeps the register constants and
the line that disables all interrupts in mgag200_device_init(). Both
is still useful without vblank handling.

Reported-by: Tony Luck <tony.luck@intel.com>
Closes: https://lore.kernel.org/dri-devel/Zvx6lSi7oq5xvTZb@agluck-desk3.sc.intel.com/raw
Tested-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241015063932.8620-1-tzimmermann@suse.de
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_g200.c
drivers/gpu/drm/mgag200/mgag200_g200eh.c
drivers/gpu/drm/mgag200/mgag200_g200eh3.c
drivers/gpu/drm/mgag200/mgag200_g200er.c
drivers/gpu/drm/mgag200/mgag200_g200ev.c
drivers/gpu/drm/mgag200/mgag200_g200ew3.c
drivers/gpu/drm/mgag200/mgag200_g200se.c
drivers/gpu/drm/mgag200/mgag200_g200wb.c
drivers/gpu/drm/mgag200/mgag200_mode.c

index 6623ee4e3277dfecefdc1fb94f0713aa50192e5c..9f59256936864c0f9997a408f1b6788889576b8e 100644 (file)
@@ -18,7 +18,6 @@
 #include <drm/drm_managed.h>
 #include <drm/drm_module.h>
 #include <drm/drm_pciids.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -85,34 +84,6 @@ resource_size_t mgag200_probe_vram(void __iomem *mem, resource_size_t size)
        return offset - 65536;
 }
 
-static irqreturn_t mgag200_irq_handler(int irq, void *arg)
-{
-       struct drm_device *dev = arg;
-       struct mga_device *mdev = to_mga_device(dev);
-       struct drm_crtc *crtc;
-       u32 status, ien;
-
-       status = RREG32(MGAREG_STATUS);
-
-       if (status & MGAREG_STATUS_VLINEPEN) {
-               ien = RREG32(MGAREG_IEN);
-               if (!(ien & MGAREG_IEN_VLINEIEN))
-                       goto out;
-
-               crtc = drm_crtc_from_index(dev, 0);
-               if (WARN_ON_ONCE(!crtc))
-                       goto out;
-               drm_crtc_handle_vblank(crtc);
-
-               WREG32(MGAREG_ICLEAR, MGAREG_ICLEAR_VLINEICLR);
-
-               return IRQ_HANDLED;
-       }
-
-out:
-       return IRQ_NONE;
-}
-
 /*
  * DRM driver
  */
@@ -196,7 +167,6 @@ int mgag200_device_init(struct mga_device *mdev,
                        const struct mgag200_device_funcs *funcs)
 {
        struct drm_device *dev = &mdev->base;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
        u8 crtcext3, misc;
        int ret;
 
@@ -223,14 +193,6 @@ int mgag200_device_init(struct mga_device *mdev,
        mutex_unlock(&mdev->rmmio_lock);
 
        WREG32(MGAREG_IEN, 0);
-       WREG32(MGAREG_ICLEAR, MGAREG_ICLEAR_VLINEICLR);
-
-       ret = devm_request_irq(&pdev->dev, pdev->irq, mgag200_irq_handler, IRQF_SHARED,
-                              dev->driver->name, dev);
-       if (ret) {
-               drm_err(dev, "Failed to acquire interrupt, error %d\n", ret);
-               return ret;
-       }
 
        return 0;
 }
index 4760ba92871bb129c386411f327d611372771404..988967eafbf24e35a3c9206105279bea17c8de4f 100644 (file)
@@ -391,24 +391,17 @@ int mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_st
 void mgag200_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *old_state);
 void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *old_state);
 void mgag200_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *old_state);
-bool mgag200_crtc_helper_get_scanout_position(struct drm_crtc *crtc, bool in_vblank_irq,
-                                             int *vpos, int *hpos,
-                                             ktime_t *stime, ktime_t *etime,
-                                             const struct drm_display_mode *mode);
 
 #define MGAG200_CRTC_HELPER_FUNCS \
        .mode_valid = mgag200_crtc_helper_mode_valid, \
        .atomic_check = mgag200_crtc_helper_atomic_check, \
        .atomic_flush = mgag200_crtc_helper_atomic_flush, \
        .atomic_enable = mgag200_crtc_helper_atomic_enable, \
-       .atomic_disable = mgag200_crtc_helper_atomic_disable, \
-       .get_scanout_position = mgag200_crtc_helper_get_scanout_position
+       .atomic_disable = mgag200_crtc_helper_atomic_disable
 
 void mgag200_crtc_reset(struct drm_crtc *crtc);
 struct drm_crtc_state *mgag200_crtc_atomic_duplicate_state(struct drm_crtc *crtc);
 void mgag200_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state);
-int mgag200_crtc_enable_vblank(struct drm_crtc *crtc);
-void mgag200_crtc_disable_vblank(struct drm_crtc *crtc);
 
 #define MGAG200_CRTC_FUNCS \
        .reset = mgag200_crtc_reset, \
@@ -416,10 +409,7 @@ void mgag200_crtc_disable_vblank(struct drm_crtc *crtc);
        .set_config = drm_atomic_helper_set_config, \
        .page_flip = drm_atomic_helper_page_flip, \
        .atomic_duplicate_state = mgag200_crtc_atomic_duplicate_state, \
-       .atomic_destroy_state = mgag200_crtc_atomic_destroy_state, \
-       .enable_vblank = mgag200_crtc_enable_vblank, \
-       .disable_vblank = mgag200_crtc_disable_vblank, \
-       .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp
+       .atomic_destroy_state = mgag200_crtc_atomic_destroy_state
 
 void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mode *mode,
                           bool set_vidrst);
index 77ce8d36cef05488985d337adcdb608329247774..f874e2949840994cb5f9a545e2e4ff4e749e3e35 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -404,9 +403,5 @@ struct mga_device *mgag200_g200_device_create(struct pci_dev *pdev, const struct
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 09ced65c1d2fbb32febed5096aa892a1c756fe13..e2305f8e00f8de8af8912b2286673c3dc428849d 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -276,9 +275,5 @@ struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const stru
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 5daa469137bd30add967f790bd66dccc65e5fdd3..11ae76eb081daa3fcbc7fb604dd7d94b346c84a7 100644 (file)
@@ -7,7 +7,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -181,9 +180,5 @@ struct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev,
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 09cfffafe1306cb5ce5932b89742ca742fbef129..c20ed0ab50ec1f293b1647c1b43ff96d0d61323d 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -206,8 +205,6 @@ static void mgag200_g200er_crtc_helper_atomic_enable(struct drm_crtc *crtc,
                mgag200_crtc_set_gamma_linear(mdev, format);
 
        mgag200_enable_display(mdev);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 static const struct drm_crtc_helper_funcs mgag200_g200er_crtc_helper_funcs = {
@@ -215,8 +212,7 @@ static const struct drm_crtc_helper_funcs mgag200_g200er_crtc_helper_funcs = {
        .atomic_check = mgag200_crtc_helper_atomic_check,
        .atomic_flush = mgag200_crtc_helper_atomic_flush,
        .atomic_enable = mgag200_g200er_crtc_helper_atomic_enable,
-       .atomic_disable = mgag200_crtc_helper_atomic_disable,
-       .get_scanout_position = mgag200_crtc_helper_get_scanout_position,
+       .atomic_disable = mgag200_crtc_helper_atomic_disable
 };
 
 static const struct drm_crtc_funcs mgag200_g200er_crtc_funcs = {
@@ -312,9 +308,5 @@ struct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, const stru
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 3d48baa91d8b73ded496bd97abbabad147c222a6..78be964eb97c6af6b4a5dfefa2ffedce79fb85e4 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -207,8 +206,6 @@ static void mgag200_g200ev_crtc_helper_atomic_enable(struct drm_crtc *crtc,
                mgag200_crtc_set_gamma_linear(mdev, format);
 
        mgag200_enable_display(mdev);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 static const struct drm_crtc_helper_funcs mgag200_g200ev_crtc_helper_funcs = {
@@ -216,8 +213,7 @@ static const struct drm_crtc_helper_funcs mgag200_g200ev_crtc_helper_funcs = {
        .atomic_check = mgag200_crtc_helper_atomic_check,
        .atomic_flush = mgag200_crtc_helper_atomic_flush,
        .atomic_enable = mgag200_g200ev_crtc_helper_atomic_enable,
-       .atomic_disable = mgag200_crtc_helper_atomic_disable,
-       .get_scanout_position = mgag200_crtc_helper_get_scanout_position,
+       .atomic_disable = mgag200_crtc_helper_atomic_disable
 };
 
 static const struct drm_crtc_funcs mgag200_g200ev_crtc_funcs = {
@@ -317,9 +313,5 @@ struct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const stru
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index dabc778e64e8e5a9eb1bcc314e427948345c8d66..31624c9ab7b7e2d0c6cb5cc7ea6c59645f55856b 100644 (file)
@@ -7,7 +7,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -199,9 +198,5 @@ struct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev,
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 9dcbe830427180076ad5ae76ac6837f4dade0722..7a32d3b1d2260eaae3fa6e30774bbafea6671823 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -338,8 +337,6 @@ static void mgag200_g200se_crtc_helper_atomic_enable(struct drm_crtc *crtc,
                mgag200_crtc_set_gamma_linear(mdev, format);
 
        mgag200_enable_display(mdev);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 static const struct drm_crtc_helper_funcs mgag200_g200se_crtc_helper_funcs = {
@@ -347,8 +344,7 @@ static const struct drm_crtc_helper_funcs mgag200_g200se_crtc_helper_funcs = {
        .atomic_check = mgag200_crtc_helper_atomic_check,
        .atomic_flush = mgag200_crtc_helper_atomic_flush,
        .atomic_enable = mgag200_g200se_crtc_helper_atomic_enable,
-       .atomic_disable = mgag200_crtc_helper_atomic_disable,
-       .get_scanout_position = mgag200_crtc_helper_get_scanout_position,
+       .atomic_disable = mgag200_crtc_helper_atomic_disable
 };
 
 static const struct drm_crtc_funcs mgag200_g200se_crtc_funcs = {
@@ -517,9 +513,5 @@ struct mga_device *mgag200_g200se_device_create(struct pci_dev *pdev, const stru
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 83a24aedbf2f3bd477dc6e81dce5e0f341f6b1c3..a0e7b9ad46cd4120e6559e2a3983c7f61bc1db63 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_drv.h"
 
@@ -323,9 +322,5 @@ struct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const stru
        drm_mode_config_reset(dev);
        drm_kms_helper_poll_init(dev);
 
-       ret = drm_vblank_init(dev, 1);
-       if (ret)
-               return ERR_PTR(ret);
-
        return mdev;
 }
index 7159909aca1eb6581daa621b0829d7c51c040e13..fb71658c3117b25311f19276d6f4ffdee157ac17 100644 (file)
@@ -22,7 +22,6 @@
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_panic.h>
 #include <drm/drm_print.h>
-#include <drm/drm_vblank.h>
 
 #include "mgag200_ddc.h"
 #include "mgag200_drv.h"
@@ -227,14 +226,7 @@ void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mod
        vblkstr = mode->crtc_vblank_start;
        vblkend = vtotal + 1;
 
-       /*
-        * There's no VBLANK interrupt on Matrox chipsets, so we use
-        * the VLINE interrupt instead. It triggers when the current
-        * <linecomp> has been reached. For VBLANK, this is the first
-        * non-visible line at the bottom of the screen. Therefore,
-        * keep <linecomp> in sync with <vblkstr>.
-        */
-       linecomp = vblkstr;
+       linecomp = vdispend;
 
        misc = RREG8(MGA_MISC_IN);
 
@@ -645,8 +637,6 @@ void mgag200_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_s
        struct mgag200_crtc_state *mgag200_crtc_state = to_mgag200_crtc_state(crtc_state);
        struct drm_device *dev = crtc->dev;
        struct mga_device *mdev = to_mga_device(dev);
-       struct drm_pending_vblank_event *event;
-       unsigned long flags;
 
        if (crtc_state->enable && crtc_state->color_mgmt_changed) {
                const struct drm_format_info *format = mgag200_crtc_state->format;
@@ -656,18 +646,6 @@ void mgag200_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_s
                else
                        mgag200_crtc_set_gamma_linear(mdev, format);
        }
-
-       event = crtc->state->event;
-       if (event) {
-               crtc->state->event = NULL;
-
-               spin_lock_irqsave(&dev->event_lock, flags);
-               if (drm_crtc_vblank_get(crtc) != 0)
-                       drm_crtc_send_vblank_event(crtc, event);
-               else
-                       drm_crtc_arm_vblank_event(crtc, event);
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-       }
 }
 
 void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *old_state)
@@ -692,44 +670,15 @@ void mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_
                mgag200_crtc_set_gamma_linear(mdev, format);
 
        mgag200_enable_display(mdev);
-
-       drm_crtc_vblank_on(crtc);
 }
 
 void mgag200_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *old_state)
 {
        struct mga_device *mdev = to_mga_device(crtc->dev);
 
-       drm_crtc_vblank_off(crtc);
-
        mgag200_disable_display(mdev);
 }
 
-bool mgag200_crtc_helper_get_scanout_position(struct drm_crtc *crtc, bool in_vblank_irq,
-                                             int *vpos, int *hpos,
-                                             ktime_t *stime, ktime_t *etime,
-                                             const struct drm_display_mode *mode)
-{
-       struct mga_device *mdev = to_mga_device(crtc->dev);
-       u32 vcount;
-
-       if (stime)
-               *stime = ktime_get();
-
-       if (vpos) {
-               vcount = RREG32(MGAREG_VCOUNT);
-               *vpos = vcount & GENMASK(11, 0);
-       }
-
-       if (hpos)
-               *hpos = mode->htotal >> 1; // near middle of scanline on average
-
-       if (etime)
-               *etime = ktime_get();
-
-       return true;
-}
-
 void mgag200_crtc_reset(struct drm_crtc *crtc)
 {
        struct mgag200_crtc_state *mgag200_crtc_state;
@@ -774,30 +723,6 @@ void mgag200_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_st
        kfree(mgag200_crtc_state);
 }
 
-int mgag200_crtc_enable_vblank(struct drm_crtc *crtc)
-{
-       struct mga_device *mdev = to_mga_device(crtc->dev);
-       u32 ien;
-
-       WREG32(MGAREG_ICLEAR, MGAREG_ICLEAR_VLINEICLR);
-
-       ien = RREG32(MGAREG_IEN);
-       ien |= MGAREG_IEN_VLINEIEN;
-       WREG32(MGAREG_IEN, ien);
-
-       return 0;
-}
-
-void mgag200_crtc_disable_vblank(struct drm_crtc *crtc)
-{
-       struct mga_device *mdev = to_mga_device(crtc->dev);
-       u32 ien;
-
-       ien = RREG32(MGAREG_IEN);
-       ien &= ~(MGAREG_IEN_VLINEIEN);
-       WREG32(MGAREG_IEN, ien);
-}
-
 /*
  * Mode config
  */