drm/i915: Add a way to disable planes without updating state
This is used by the next commit to disable all planes on a crtc without caring what type it is. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
ecce87ea3a
commit
a8ad0d8e17
@ -2694,7 +2694,7 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
|
|||||||
u32 reg = DSPCNTR(plane);
|
u32 reg = DSPCNTR(plane);
|
||||||
int pixel_size;
|
int pixel_size;
|
||||||
|
|
||||||
if (!intel_crtc->primary_enabled) {
|
if (!intel_crtc->primary_enabled || !fb) {
|
||||||
I915_WRITE(reg, 0);
|
I915_WRITE(reg, 0);
|
||||||
if (INTEL_INFO(dev)->gen >= 4)
|
if (INTEL_INFO(dev)->gen >= 4)
|
||||||
I915_WRITE(DSPSURF(plane), 0);
|
I915_WRITE(DSPSURF(plane), 0);
|
||||||
@ -2823,7 +2823,7 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
|
|||||||
u32 reg = DSPCNTR(plane);
|
u32 reg = DSPCNTR(plane);
|
||||||
int pixel_size;
|
int pixel_size;
|
||||||
|
|
||||||
if (!intel_crtc->primary_enabled) {
|
if (!intel_crtc->primary_enabled || !fb) {
|
||||||
I915_WRITE(reg, 0);
|
I915_WRITE(reg, 0);
|
||||||
I915_WRITE(DSPSURF(plane), 0);
|
I915_WRITE(DSPSURF(plane), 0);
|
||||||
POSTING_READ(reg);
|
POSTING_READ(reg);
|
||||||
@ -3102,7 +3102,7 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
|
|||||||
plane = crtc->primary;
|
plane = crtc->primary;
|
||||||
plane_state = to_intel_plane_state(plane->state);
|
plane_state = to_intel_plane_state(plane->state);
|
||||||
|
|
||||||
if (!intel_crtc->primary_enabled) {
|
if (!intel_crtc->primary_enabled || !fb) {
|
||||||
I915_WRITE(PLANE_CTL(pipe, 0), 0);
|
I915_WRITE(PLANE_CTL(pipe, 0), 0);
|
||||||
I915_WRITE(PLANE_SURF(pipe, 0), 0);
|
I915_WRITE(PLANE_SURF(pipe, 0), 0);
|
||||||
POSTING_READ(PLANE_CTL(pipe, 0));
|
POSTING_READ(PLANE_CTL(pipe, 0));
|
||||||
@ -13378,6 +13378,20 @@ intel_commit_primary_plane(struct drm_plane *plane,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
intel_disable_primary_plane(struct drm_plane *plane,
|
||||||
|
struct drm_crtc *crtc,
|
||||||
|
bool force)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = plane->dev;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
|
if (!force)
|
||||||
|
to_intel_crtc(crtc)->primary_enabled = false;
|
||||||
|
|
||||||
|
dev_priv->display.update_primary_plane(crtc, NULL, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void intel_begin_crtc_commit(struct drm_crtc *crtc)
|
static void intel_begin_crtc_commit(struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
@ -13522,6 +13536,7 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
|
|||||||
primary->plane = pipe;
|
primary->plane = pipe;
|
||||||
primary->check_plane = intel_check_primary_plane;
|
primary->check_plane = intel_check_primary_plane;
|
||||||
primary->commit_plane = intel_commit_primary_plane;
|
primary->commit_plane = intel_commit_primary_plane;
|
||||||
|
primary->disable_plane = intel_disable_primary_plane;
|
||||||
primary->ckey.flags = I915_SET_COLORKEY_NONE;
|
primary->ckey.flags = I915_SET_COLORKEY_NONE;
|
||||||
if (HAS_FBC(dev) && INTEL_INFO(dev)->gen < 4)
|
if (HAS_FBC(dev) && INTEL_INFO(dev)->gen < 4)
|
||||||
primary->plane = !pipe;
|
primary->plane = !pipe;
|
||||||
@ -13626,6 +13641,22 @@ finish:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
intel_disable_cursor_plane(struct drm_plane *plane,
|
||||||
|
struct drm_crtc *crtc,
|
||||||
|
bool force)
|
||||||
|
{
|
||||||
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
|
|
||||||
|
if (!force) {
|
||||||
|
plane->fb = NULL;
|
||||||
|
intel_crtc->cursor_bo = NULL;
|
||||||
|
intel_crtc->cursor_addr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
intel_crtc_update_cursor(crtc, false);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
intel_commit_cursor_plane(struct drm_plane *plane,
|
intel_commit_cursor_plane(struct drm_plane *plane,
|
||||||
struct intel_plane_state *state)
|
struct intel_plane_state *state)
|
||||||
@ -13685,6 +13716,7 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
|
|||||||
state->scaler_id = -1;
|
state->scaler_id = -1;
|
||||||
cursor->check_plane = intel_check_cursor_plane;
|
cursor->check_plane = intel_check_cursor_plane;
|
||||||
cursor->commit_plane = intel_commit_cursor_plane;
|
cursor->commit_plane = intel_commit_cursor_plane;
|
||||||
|
cursor->disable_plane = intel_disable_cursor_plane;
|
||||||
|
|
||||||
drm_universal_plane_init(dev, &cursor->base, 0,
|
drm_universal_plane_init(dev, &cursor->base, 0,
|
||||||
&intel_plane_funcs,
|
&intel_plane_funcs,
|
||||||
|
@ -594,7 +594,7 @@ struct intel_plane {
|
|||||||
uint32_t x, uint32_t y,
|
uint32_t x, uint32_t y,
|
||||||
uint32_t src_w, uint32_t src_h);
|
uint32_t src_w, uint32_t src_h);
|
||||||
void (*disable_plane)(struct drm_plane *plane,
|
void (*disable_plane)(struct drm_plane *plane,
|
||||||
struct drm_crtc *crtc);
|
struct drm_crtc *crtc, bool force);
|
||||||
int (*check_plane)(struct drm_plane *plane,
|
int (*check_plane)(struct drm_plane *plane,
|
||||||
struct intel_plane_state *state);
|
struct intel_plane_state *state);
|
||||||
void (*commit_plane)(struct drm_plane *plane,
|
void (*commit_plane)(struct drm_plane *plane,
|
||||||
|
@ -272,11 +272,11 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
skl_disable_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc)
|
skl_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc, bool force)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = drm_plane->dev;
|
struct drm_device *dev = dplane->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct intel_plane *intel_plane = to_intel_plane(drm_plane);
|
struct intel_plane *intel_plane = to_intel_plane(dplane);
|
||||||
const int pipe = intel_plane->pipe;
|
const int pipe = intel_plane->pipe;
|
||||||
const int plane = intel_plane->plane + 1;
|
const int plane = intel_plane->plane + 1;
|
||||||
|
|
||||||
@ -286,7 +286,7 @@ skl_disable_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc)
|
|||||||
I915_WRITE(PLANE_SURF(pipe, plane), 0);
|
I915_WRITE(PLANE_SURF(pipe, plane), 0);
|
||||||
POSTING_READ(PLANE_SURF(pipe, plane));
|
POSTING_READ(PLANE_SURF(pipe, plane));
|
||||||
|
|
||||||
intel_update_sprite_watermarks(drm_plane, crtc, 0, 0, 0, false, false);
|
intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -458,7 +458,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
|
vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc, bool force)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = dplane->dev;
|
struct drm_device *dev = dplane->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
@ -604,7 +604,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
|
ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc, bool force)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = plane->dev;
|
struct drm_device *dev = plane->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
@ -735,7 +735,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
|
ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc, bool force)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = plane->dev;
|
struct drm_device *dev = plane->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
@ -1053,7 +1053,7 @@ intel_commit_sprite_plane(struct drm_plane *plane,
|
|||||||
crtc_x, crtc_y, crtc_w, crtc_h,
|
crtc_x, crtc_y, crtc_w, crtc_h,
|
||||||
src_x, src_y, src_w, src_h);
|
src_x, src_y, src_w, src_h);
|
||||||
} else {
|
} else {
|
||||||
intel_plane->disable_plane(plane, crtc);
|
intel_plane->disable_plane(plane, crtc, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user