Commit e5a3c24b authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

Revert "drm/mgag200: Add vblank support"



This reverts commit 6c9e14ee.
This reverts commit d5070c9b.
This reverts commit 89c6ea20.

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: default avatarTony Luck <tony.luck@intel.com>
Closes: https://lore.kernel.org/dri-devel/Zvx6lSi7oq5xvTZb@agluck-desk3.sc.intel.com/raw


Tested-by: default avatarTony Luck <tony.luck@intel.com>
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241015063932.8620-1-tzimmermann@suse.de
parent eb0c0621
Loading
Loading
Loading
Loading
+0 −38
Original line number Diff line number Diff line
@@ -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;
}
+2 −12
Original line number Diff line number Diff line
@@ -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);
+0 −5
Original line number Diff line number Diff line
@@ -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;
}
+0 −5
Original line number Diff line number Diff line
@@ -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;
}
+0 −5
Original line number Diff line number Diff line
@@ -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;
}
Loading