Skip to content

Commit a8ad0d8

Browse files
mlankhorstdanvet
authored andcommitted
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>
1 parent ecce87e commit a8ad0d8

File tree

3 files changed

+44
-12
lines changed

3 files changed

+44
-12
lines changed

drivers/gpu/drm/i915/intel_display.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2694,7 +2694,7 @@ static void i9xx_update_primary_plane(struct drm_crtc *crtc,
26942694
u32 reg = DSPCNTR(plane);
26952695
int pixel_size;
26962696

2697-
if (!intel_crtc->primary_enabled) {
2697+
if (!intel_crtc->primary_enabled || !fb) {
26982698
I915_WRITE(reg, 0);
26992699
if (INTEL_INFO(dev)->gen >= 4)
27002700
I915_WRITE(DSPSURF(plane), 0);
@@ -2823,7 +2823,7 @@ static void ironlake_update_primary_plane(struct drm_crtc *crtc,
28232823
u32 reg = DSPCNTR(plane);
28242824
int pixel_size;
28252825

2826-
if (!intel_crtc->primary_enabled) {
2826+
if (!intel_crtc->primary_enabled || !fb) {
28272827
I915_WRITE(reg, 0);
28282828
I915_WRITE(DSPSURF(plane), 0);
28292829
POSTING_READ(reg);
@@ -3102,7 +3102,7 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
31023102
plane = crtc->primary;
31033103
plane_state = to_intel_plane_state(plane->state);
31043104

3105-
if (!intel_crtc->primary_enabled) {
3105+
if (!intel_crtc->primary_enabled || !fb) {
31063106
I915_WRITE(PLANE_CTL(pipe, 0), 0);
31073107
I915_WRITE(PLANE_SURF(pipe, 0), 0);
31083108
POSTING_READ(PLANE_CTL(pipe, 0));
@@ -13378,6 +13378,20 @@ intel_commit_primary_plane(struct drm_plane *plane,
1337813378
}
1337913379
}
1338013380

13381+
static void
13382+
intel_disable_primary_plane(struct drm_plane *plane,
13383+
struct drm_crtc *crtc,
13384+
bool force)
13385+
{
13386+
struct drm_device *dev = plane->dev;
13387+
struct drm_i915_private *dev_priv = dev->dev_private;
13388+
13389+
if (!force)
13390+
to_intel_crtc(crtc)->primary_enabled = false;
13391+
13392+
dev_priv->display.update_primary_plane(crtc, NULL, 0, 0);
13393+
}
13394+
1338113395
static void intel_begin_crtc_commit(struct drm_crtc *crtc)
1338213396
{
1338313397
struct drm_device *dev = crtc->dev;
@@ -13522,6 +13536,7 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
1352213536
primary->plane = pipe;
1352313537
primary->check_plane = intel_check_primary_plane;
1352413538
primary->commit_plane = intel_commit_primary_plane;
13539+
primary->disable_plane = intel_disable_primary_plane;
1352513540
primary->ckey.flags = I915_SET_COLORKEY_NONE;
1352613541
if (HAS_FBC(dev) && INTEL_INFO(dev)->gen < 4)
1352713542
primary->plane = !pipe;
@@ -13626,6 +13641,22 @@ intel_check_cursor_plane(struct drm_plane *plane,
1362613641
return ret;
1362713642
}
1362813643

13644+
static void
13645+
intel_disable_cursor_plane(struct drm_plane *plane,
13646+
struct drm_crtc *crtc,
13647+
bool force)
13648+
{
13649+
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
13650+
13651+
if (!force) {
13652+
plane->fb = NULL;
13653+
intel_crtc->cursor_bo = NULL;
13654+
intel_crtc->cursor_addr = 0;
13655+
}
13656+
13657+
intel_crtc_update_cursor(crtc, false);
13658+
}
13659+
1362913660
static void
1363013661
intel_commit_cursor_plane(struct drm_plane *plane,
1363113662
struct intel_plane_state *state)
@@ -13685,6 +13716,7 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
1368513716
state->scaler_id = -1;
1368613717
cursor->check_plane = intel_check_cursor_plane;
1368713718
cursor->commit_plane = intel_commit_cursor_plane;
13719+
cursor->disable_plane = intel_disable_cursor_plane;
1368813720

1368913721
drm_universal_plane_init(dev, &cursor->base, 0,
1369013722
&intel_plane_funcs,

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ struct intel_plane {
594594
uint32_t x, uint32_t y,
595595
uint32_t src_w, uint32_t src_h);
596596
void (*disable_plane)(struct drm_plane *plane,
597-
struct drm_crtc *crtc);
597+
struct drm_crtc *crtc, bool force);
598598
int (*check_plane)(struct drm_plane *plane,
599599
struct intel_plane_state *state);
600600
void (*commit_plane)(struct drm_plane *plane,

drivers/gpu/drm/i915/intel_sprite.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -272,11 +272,11 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc,
272272
}
273273

274274
static void
275-
skl_disable_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc)
275+
skl_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc, bool force)
276276
{
277-
struct drm_device *dev = drm_plane->dev;
277+
struct drm_device *dev = dplane->dev;
278278
struct drm_i915_private *dev_priv = dev->dev_private;
279-
struct intel_plane *intel_plane = to_intel_plane(drm_plane);
279+
struct intel_plane *intel_plane = to_intel_plane(dplane);
280280
const int pipe = intel_plane->pipe;
281281
const int plane = intel_plane->plane + 1;
282282

@@ -286,7 +286,7 @@ skl_disable_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc)
286286
I915_WRITE(PLANE_SURF(pipe, plane), 0);
287287
POSTING_READ(PLANE_SURF(pipe, plane));
288288

289-
intel_update_sprite_watermarks(drm_plane, crtc, 0, 0, 0, false, false);
289+
intel_update_sprite_watermarks(dplane, crtc, 0, 0, 0, false, false);
290290
}
291291

292292
static void
@@ -458,7 +458,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_crtc *crtc,
458458
}
459459

460460
static void
461-
vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
461+
vlv_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc, bool force)
462462
{
463463
struct drm_device *dev = dplane->dev;
464464
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -604,7 +604,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
604604
}
605605

606606
static void
607-
ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
607+
ivb_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc, bool force)
608608
{
609609
struct drm_device *dev = plane->dev;
610610
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -735,7 +735,7 @@ ilk_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
735735
}
736736

737737
static void
738-
ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc)
738+
ilk_disable_plane(struct drm_plane *plane, struct drm_crtc *crtc, bool force)
739739
{
740740
struct drm_device *dev = plane->dev;
741741
struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1053,7 +1053,7 @@ intel_commit_sprite_plane(struct drm_plane *plane,
10531053
crtc_x, crtc_y, crtc_w, crtc_h,
10541054
src_x, src_y, src_w, src_h);
10551055
} else {
1056-
intel_plane->disable_plane(plane, crtc);
1056+
intel_plane->disable_plane(plane, crtc, false);
10571057
}
10581058
}
10591059
}

0 commit comments

Comments
 (0)