mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 20:53:53 +08:00
drm/meson: Fix atomic mode switching regression
Since commit2bcd3ecab7
when switching mode from X11 (ubuntu mate for example) the display gets blurry, looking like an invalid framebuffer width. This commit fixed atomic crtc modesetting in a totally wrong way and introduced a local unnecessary ->enabled crtc state. This commit reverts the crctc _begin() and _enable() changes and simply adds drm_atomic_helper_commit_tail_rpm as helper. Reported-by: Tony McKahan <tonymckahan@gmail.com> Suggested-by: Daniel Vetter <daniel@ffwll.ch> Fixes:2bcd3ecab7
("drm/meson: Fixes for drm_crtc_vblank_on/off support") Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> [narmstrong: fixed blank line issue from checkpatch] Link: https://patchwork.freedesktop.org/patch/msgid/20190114153118.8024-1-narmstrong@baylibre.com
This commit is contained in:
parent
f672b93e4a
commit
ce0210c124
@ -46,7 +46,6 @@ struct meson_crtc {
|
|||||||
struct drm_crtc base;
|
struct drm_crtc base;
|
||||||
struct drm_pending_vblank_event *event;
|
struct drm_pending_vblank_event *event;
|
||||||
struct meson_drm *priv;
|
struct meson_drm *priv;
|
||||||
bool enabled;
|
|
||||||
};
|
};
|
||||||
#define to_meson_crtc(x) container_of(x, struct meson_crtc, base)
|
#define to_meson_crtc(x) container_of(x, struct meson_crtc, base)
|
||||||
|
|
||||||
@ -82,7 +81,8 @@ static const struct drm_crtc_funcs meson_crtc_funcs = {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void meson_crtc_enable(struct drm_crtc *crtc)
|
static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||||
|
struct drm_crtc_state *old_state)
|
||||||
{
|
{
|
||||||
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
||||||
struct drm_crtc_state *crtc_state = crtc->state;
|
struct drm_crtc_state *crtc_state = crtc->state;
|
||||||
@ -108,20 +108,6 @@ static void meson_crtc_enable(struct drm_crtc *crtc)
|
|||||||
|
|
||||||
drm_crtc_vblank_on(crtc);
|
drm_crtc_vblank_on(crtc);
|
||||||
|
|
||||||
meson_crtc->enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
|
|
||||||
struct drm_crtc_state *old_state)
|
|
||||||
{
|
|
||||||
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
|
||||||
struct meson_drm *priv = meson_crtc->priv;
|
|
||||||
|
|
||||||
DRM_DEBUG_DRIVER("\n");
|
|
||||||
|
|
||||||
if (!meson_crtc->enabled)
|
|
||||||
meson_crtc_enable(crtc);
|
|
||||||
|
|
||||||
priv->viu.osd1_enabled = true;
|
priv->viu.osd1_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,8 +139,6 @@ static void meson_crtc_atomic_disable(struct drm_crtc *crtc,
|
|||||||
|
|
||||||
crtc->state->event = NULL;
|
crtc->state->event = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
meson_crtc->enabled = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
|
static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||||
@ -163,9 +147,6 @@ static void meson_crtc_atomic_begin(struct drm_crtc *crtc,
|
|||||||
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (crtc->state->enable && !meson_crtc->enabled)
|
|
||||||
meson_crtc_enable(crtc);
|
|
||||||
|
|
||||||
if (crtc->state->event) {
|
if (crtc->state->event) {
|
||||||
WARN_ON(drm_crtc_vblank_get(crtc) != 0);
|
WARN_ON(drm_crtc_vblank_get(crtc) != 0);
|
||||||
|
|
||||||
|
@ -75,6 +75,10 @@ static const struct drm_mode_config_funcs meson_mode_config_funcs = {
|
|||||||
.fb_create = drm_gem_fb_create,
|
.fb_create = drm_gem_fb_create,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct drm_mode_config_helper_funcs meson_mode_config_helpers = {
|
||||||
|
.atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
|
||||||
|
};
|
||||||
|
|
||||||
static irqreturn_t meson_irq(int irq, void *arg)
|
static irqreturn_t meson_irq(int irq, void *arg)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = arg;
|
struct drm_device *dev = arg;
|
||||||
@ -266,6 +270,7 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
|
|||||||
drm->mode_config.max_width = 3840;
|
drm->mode_config.max_width = 3840;
|
||||||
drm->mode_config.max_height = 2160;
|
drm->mode_config.max_height = 2160;
|
||||||
drm->mode_config.funcs = &meson_mode_config_funcs;
|
drm->mode_config.funcs = &meson_mode_config_funcs;
|
||||||
|
drm->mode_config.helper_private = &meson_mode_config_helpers;
|
||||||
|
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user