Revert "drm/mgag200: Add vblank support"
This reverts commit6c9e14ee9f
. This reverts commitd5070c9b29
. This reverts commit89c6ea2006
. 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
This commit is contained in:
parent
eb0c062161
commit
e5a3c24bca
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user