Skip to content

Commit

Permalink
Revert "drm/mgag200: Add vblank support"
Browse files Browse the repository at this point in the history
This reverts commit 6c9e14e.
This reverts commit d5070c9.
This reverts commit 89c6ea2.

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
  • Loading branch information
Thomas Zimmermann committed Oct 17, 2024
1 parent eb0c062 commit e5a3c24
Show file tree
Hide file tree
Showing 11 changed files with 6 additions and 178 deletions.
38 changes: 0 additions & 38 deletions drivers/gpu/drm/mgag200/mgag200_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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;

Expand All @@ -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;
}
Expand Down
14 changes: 2 additions & 12 deletions drivers/gpu/drm/mgag200/mgag200_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -391,35 +391,25 @@ 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, \
.destroy = drm_crtc_cleanup, \
.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);
Expand Down
5 changes: 0 additions & 5 deletions drivers/gpu/drm/mgag200/mgag200_g200.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
5 changes: 0 additions & 5 deletions drivers/gpu/drm/mgag200/mgag200_g200eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
5 changes: 0 additions & 5 deletions drivers/gpu/drm/mgag200/mgag200_g200eh3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
10 changes: 1 addition & 9 deletions drivers/gpu/drm/mgag200/mgag200_g200er.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -206,17 +205,14 @@ 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 = {
.mode_valid = mgag200_crtc_helper_mode_valid,
.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 = {
Expand Down Expand Up @@ -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;
}
10 changes: 1 addition & 9 deletions drivers/gpu/drm/mgag200/mgag200_g200ev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -207,17 +206,14 @@ 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 = {
.mode_valid = mgag200_crtc_helper_mode_valid,
.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 = {
Expand Down Expand Up @@ -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;
}
5 changes: 0 additions & 5 deletions drivers/gpu/drm/mgag200/mgag200_g200ew3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
10 changes: 1 addition & 9 deletions drivers/gpu/drm/mgag200/mgag200_g200se.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -338,17 +337,14 @@ 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 = {
.mode_valid = mgag200_crtc_helper_mode_valid,
.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 = {
Expand Down Expand Up @@ -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;
}
5 changes: 0 additions & 5 deletions drivers/gpu/drm/mgag200/mgag200_g200wb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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;
}
Loading

0 comments on commit e5a3c24

Please sign in to comment.