Commit afbd8a72 authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Introduce crtc_state->update_planes bitmask



Keep track which planes need updating during the commit. For now
we set the bit for any plane that was or will be visible (including
icl+ nv12 slave planes). In the future I'll have need to update
invisible planes as well, for skl plane ddbs and for pre-skl pipe
gamma/csc control (which lives in the primary plane control register).

v2: Pimp the commit message to mention icl+ nv12 slave planes (Matt)

Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181127163742.30215-1-ville.syrjala@linux.intel.com
parent 019575a5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
	crtc_state->fifo_changed = false;
	crtc_state->wm.need_postvbl_update = false;
	crtc_state->fb_bits = 0;
	crtc_state->update_planes = 0;

	return &crtc_state->base;
}
+4 −4
Original line number Diff line number Diff line
@@ -139,6 +139,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
	if (state->visible && state->fb->format->format == DRM_FORMAT_NV12)
		crtc_state->nv12_planes |= BIT(intel_plane->id);

	if (state->visible || old_plane_state->base.visible)
		crtc_state->update_planes |= BIT(intel_plane->id);

	return intel_plane_atomic_calc_changes(old_crtc_state,
					       &crtc_state->base,
					       old_plane_state,
@@ -173,14 +176,11 @@ void intel_update_planes_on_crtc(struct intel_atomic_state *old_state,
				 struct intel_crtc_state *old_crtc_state,
				 struct intel_crtc_state *new_crtc_state)
{
	u32 update_mask = new_crtc_state->update_planes;
	struct intel_plane_state *new_plane_state;
	struct intel_plane *plane;
	u32 update_mask;
	int i;

	update_mask = old_crtc_state->active_planes;
	update_mask |= new_crtc_state->active_planes;

	for_each_new_intel_plane_in_state(old_state, plane, new_plane_state, i) {
		if (crtc->pipe != plane->pipe ||
		    !(update_mask & BIT(plane->id)))
+4 −1
Original line number Diff line number Diff line
@@ -10839,8 +10839,10 @@ static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
			continue;

		plane_state->linked_plane = NULL;
		if (plane_state->slave && !plane_state->base.visible)
		if (plane_state->slave && !plane_state->base.visible) {
			crtc_state->active_planes &= ~BIT(plane->id);
			crtc_state->update_planes |= BIT(plane->id);
		}

		plane_state->slave = false;
	}
@@ -10881,6 +10883,7 @@ static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
		linked_state->slave = true;
		linked_state->linked_plane = plane;
		crtc_state->active_planes |= BIT(linked->id);
		crtc_state->update_planes |= BIT(linked->id);
		DRM_DEBUG_KMS("Using %s as Y plane for %s\n", linked->base.name, plane->base.name);
	}

+3 −0
Original line number Diff line number Diff line
@@ -926,6 +926,9 @@ struct intel_crtc_state {
	u8 active_planes;
	u8 nv12_planes;

	/* bitmask of planes that will be updated during the commit */
	u8 update_planes;

	/* HDMI scrambling status */
	bool hdmi_scrambling;