All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: Paulo Zanoni <paulo.r.zanoni@intel.com>, Lyude <cpaul@redhat.com>,
	intel-gfx@lists.freedesktop.org
Cc: David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel.vetter@intel.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 4/6] drm/i915/gen9: Make skl_wm_level per-plane
Date: Thu, 6 Oct 2016 12:38:52 +0200	[thread overview]
Message-ID: <9f338dc6-98ce-cef8-e9bf-11ff0e49c262@linux.intel.com> (raw)
In-Reply-To: <1475699598.2381.64.camel@intel.com>

Op 05-10-16 om 22:33 schreef Paulo Zanoni:
> Em Qua, 2016-10-05 às 11:33 -0400, Lyude escreveu:
>> Having skl_wm_level contain all of the watermarks for each plane is
>> annoying since it prevents us from having any sort of object to
>> represent a single watermark level, something we take advantage of in
>> the next commit to cut down on all of the copy paste code in here.
> I'd like to start my review pointing that I really like this patch. I
> agree the current form is annoying.
>
> See below for some details.
>
>
>> Signed-off-by: Lyude <cpaul@redhat.com>
>> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> Cc: Matt Roper <matthew.d.roper@intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_drv.h  |   6 +-
>>  drivers/gpu/drm/i915/intel_drv.h |   6 +-
>>  drivers/gpu/drm/i915/intel_pm.c  | 208 +++++++++++++++++----------
>> ------------
>>  3 files changed, 100 insertions(+), 120 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h
>> b/drivers/gpu/drm/i915/i915_drv.h
>> index d26e5999..0f97d43 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -1648,9 +1648,9 @@ struct skl_wm_values {
>>  };
>>  
>>  struct skl_wm_level {
>> -	bool plane_en[I915_MAX_PLANES];
>> -	uint16_t plane_res_b[I915_MAX_PLANES];
>> -	uint8_t plane_res_l[I915_MAX_PLANES];
>> +	bool plane_en;
>> +	uint16_t plane_res_b;
>> +	uint8_t plane_res_l;
>>  };
>>  
>>  /*
>> diff --git a/drivers/gpu/drm/i915/intel_drv.h
>> b/drivers/gpu/drm/i915/intel_drv.h
>> index 35ba282..d684f4f 100644
>> --- a/drivers/gpu/drm/i915/intel_drv.h
>> +++ b/drivers/gpu/drm/i915/intel_drv.h
>> @@ -468,9 +468,13 @@ struct intel_pipe_wm {
>>  	bool sprites_scaled;
>>  };
>>  
>> -struct skl_pipe_wm {
>> +struct skl_plane_wm {
>>  	struct skl_wm_level wm[8];
>>  	struct skl_wm_level trans_wm;
>> +};
>> +
>> +struct skl_pipe_wm {
>> +	struct skl_plane_wm planes[I915_MAX_PLANES];
>>  	uint32_t linetime;
>>  };
>>  
>> diff --git a/drivers/gpu/drm/i915/intel_pm.c
>> b/drivers/gpu/drm/i915/intel_pm.c
>> index af96888..250f12d 100644
>> --- a/drivers/gpu/drm/i915/intel_pm.c
>> +++ b/drivers/gpu/drm/i915/intel_pm.c
>> @@ -3668,67 +3668,52 @@ static int
>>  skl_compute_wm_level(const struct drm_i915_private *dev_priv,
>>  		     struct skl_ddb_allocation *ddb,
>>  		     struct intel_crtc_state *cstate,
>> +		     struct intel_plane *intel_plane,
>>  		     int level,
>>  		     struct skl_wm_level *result)
>>  {
>>  	struct drm_atomic_state *state = cstate->base.state;
>>  	struct intel_crtc *intel_crtc = to_intel_crtc(cstate-
>>> base.crtc);
>> -	struct drm_plane *plane;
>> -	struct intel_plane *intel_plane;
>> -	struct intel_plane_state *intel_pstate;
>> +	struct drm_plane *plane = &intel_plane->base;
>> +	struct intel_plane_state *intel_pstate = NULL;
>>  	uint16_t ddb_blocks;
>>  	enum pipe pipe = intel_crtc->pipe;
>>  	int ret;
>> +	int i = skl_wm_plane_id(intel_plane);
>> +
>> +	if (state)
>> +		intel_pstate =
>> +			intel_atomic_get_existing_plane_state(state,
>> +							      intel_
>> plane);
>>  
>>  	/*
>> -	 * We'll only calculate watermarks for planes that are
>> actually
>> -	 * enabled, so make sure all other planes are set as
>> disabled.
>> +	 * Note: If we start supporting multiple pending atomic
>> commits against
>> +	 * the same planes/CRTC's in the future, plane->state will
>> no longer be
>> +	 * the correct pre-state to use for the calculations here
>> and we'll
>> +	 * need to change where we get the 'unchanged' plane data
>> from.
>> +	 *
>> +	 * For now this is fine because we only allow one queued
>> commit against
>> +	 * a CRTC.  Even if the plane isn't modified by this
>> transaction and we
>> +	 * don't have a plane lock, we still have the CRTC's lock,
>> so we know
>> +	 * that no other transactions are racing with us to update
>> it.
>>  	 */
>> -	memset(result, 0, sizeof(*result));
>> -
>> -	for_each_intel_plane_mask(&dev_priv->drm,
>> -				  intel_plane,
>> -				  cstate->base.plane_mask) {
>> -		int i = skl_wm_plane_id(intel_plane);
>> -
>> -		plane = &intel_plane->base;
>> -		intel_pstate = NULL;
>> -		if (state)
>> -			intel_pstate =
>> -				intel_atomic_get_existing_plane_stat
>> e(state,
>> -								    
>>   intel_plane);
>> +	if (!intel_pstate)
>> +		intel_pstate = to_intel_plane_state(plane->state);
>>  
>> -		/*
>> -		 * Note: If we start supporting multiple pending
>> atomic commits
>> -		 * against the same planes/CRTC's in the future,
>> plane->state
>> -		 * will no longer be the correct pre-state to use
>> for the
>> -		 * calculations here and we'll need to change where
>> we get the
>> -		 * 'unchanged' plane data from.
>> -		 *
>> -		 * For now this is fine because we only allow one
>> queued commit
>> -		 * against a CRTC.  Even if the plane isn't modified
>> by this
>> -		 * transaction and we don't have a plane lock, we
>> still have
>> -		 * the CRTC's lock, so we know that no other
>> transactions are
>> -		 * racing with us to update it.
>> -		 */
>> -		if (!intel_pstate)
>> -			intel_pstate = to_intel_plane_state(plane-
>>> state);
>> +	WARN_ON(!intel_pstate->base.fb);
>>  
>> -		WARN_ON(!intel_pstate->base.fb);
>> +	ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][i]);
>>  
>> -		ddb_blocks = skl_ddb_entry_size(&ddb-
>>> plane[pipe][i]);
>> -
>> -		ret = skl_compute_plane_wm(dev_priv,
>> -					   cstate,
>> -					   intel_pstate,
>> -					   ddb_blocks,
>> -					   level,
>> -					   &result->plane_res_b[i],
>> -					   &result->plane_res_l[i],
>> -					   &result->plane_en[i]);
>> -		if (ret)
>> -			return ret;
>> -	}
>> +	ret = skl_compute_plane_wm(dev_priv,
>> +				   cstate,
>> +				   intel_pstate,
>> +				   ddb_blocks,
>> +				   level,
>> +				   &result->plane_res_b,
>> +				   &result->plane_res_l,
>> +				   &result->plane_en);
>> +	if (ret)
>> +		return ret;
>>  
>>  	return 0;
>>  }
>> @@ -3749,19 +3734,11 @@ skl_compute_linetime_wm(struct
>> intel_crtc_state *cstate)
>>  static void skl_compute_transition_wm(struct intel_crtc_state
>> *cstate,
>>  				      struct skl_wm_level *trans_wm
>> /* out */)
>>  {
>> -	struct drm_crtc *crtc = cstate->base.crtc;
>> -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>> -	struct intel_plane *intel_plane;
>> -
>>  	if (!cstate->base.active)
>>  		return;
>>  
>>  	/* Until we know more, just disable transition WMs */
>> -	for_each_intel_plane_on_crtc(crtc->dev, intel_crtc,
>> intel_plane) {
>> -		int i = skl_wm_plane_id(intel_plane);
>> -
>> -		trans_wm->plane_en[i] = false;
>> -	}
>> +	trans_wm->plane_en = false;
>>  }
>>  
>>  static int skl_build_pipe_wm(struct intel_crtc_state *cstate,
>> @@ -3770,19 +3747,33 @@ static int skl_build_pipe_wm(struct
>> intel_crtc_state *cstate,
>>  {
>>  	struct drm_device *dev = cstate->base.crtc->dev;
>>  	const struct drm_i915_private *dev_priv = to_i915(dev);
>> +	struct intel_plane *intel_plane;
>> +	struct skl_plane_wm *wm;
>>  	int level, max_level = ilk_wm_max_level(dev);
>>  	int ret;
>>  
>> -	for (level = 0; level <= max_level; level++) {
>> -		ret = skl_compute_wm_level(dev_priv, ddb, cstate,
>> -					   level, &pipe_wm-
>>> wm[level]);
>> -		if (ret)
>> -			return ret;
>> +	/*
>> +	 * We'll only calculate watermarks for planes that are
>> actually
>> +	 * enabled, so make sure all other planes are set as
>> disabled.
>> +	 */
>> +	memset(pipe_wm->planes, 0, sizeof(pipe_wm->planes));
>> +
>> +	for_each_intel_plane_mask(&dev_priv->drm,
>> +				  intel_plane,
>> +				  cstate->base.plane_mask) {
>> +		wm = &pipe_wm->planes[skl_wm_plane_id(intel_plane)];
>> +
>> +		for (level = 0; level <= max_level; level++) {
>> +			ret = skl_compute_wm_level(dev_priv, ddb,
>> cstate,
>> +						   intel_plane,
>> level,
>> +						   &wm->wm[level]);
>> +			if (ret)
>> +				return ret;
>> +		}
>> +		skl_compute_transition_wm(cstate, &wm->trans_wm);
>>  	}
>>  	pipe_wm->linetime = skl_compute_linetime_wm(cstate);
>>  
>> -	skl_compute_transition_wm(cstate, &pipe_wm->trans_wm);
>> -
>>  	return 0;
>>  }
>>  
>> @@ -3792,50 +3783,56 @@ static void skl_compute_wm_results(struct
>> drm_device *dev,
>>  				   struct intel_crtc *intel_crtc)
>>  {
>>  	int level, max_level = ilk_wm_max_level(dev);
>> +	struct skl_plane_wm *plane_wm;
>>  	enum pipe pipe = intel_crtc->pipe;
>>  	uint32_t temp;
>>  	int i;
>>  
>> -	for (level = 0; level <= max_level; level++) {
>> -		for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +	for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +		plane_wm = &p_wm->planes[i];
>> +
>> +		for (level = 0; level <= max_level; level++) {
>>  			temp = 0;
>>  
>> -			temp |= p_wm->wm[level].plane_res_l[i] <<
>> +			temp |= plane_wm->wm[level].plane_res_l <<
>>  					PLANE_WM_LINES_SHIFT;
>> -			temp |= p_wm->wm[level].plane_res_b[i];
>> -			if (p_wm->wm[level].plane_en[i])
>> +			temp |= plane_wm->wm[level].plane_res_b;
>> +			if (plane_wm->wm[level].plane_en)
>>  				temp |= PLANE_WM_EN;
>>  
>>  			r->plane[pipe][i][level] = temp;
>>  		}
>>  
>> -		temp = 0;
>> -
>> -		temp |= p_wm->wm[level].plane_res_l[PLANE_CURSOR] <<
>> PLANE_WM_LINES_SHIFT;
>> -		temp |= p_wm->wm[level].plane_res_b[PLANE_CURSOR];
>> +	}
>>  
>> -		if (p_wm->wm[level].plane_en[PLANE_CURSOR])
>> +	for (level = 0; level <= max_level; level++) {
>> +		plane_wm = &p_wm->planes[PLANE_CURSOR];
>> +		temp = 0;
>> +		temp |= plane_wm->wm[level].plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +		temp |= plane_wm->wm[level].plane_res_b;
>> +		if (plane_wm->wm[level].plane_en)
>>  			temp |= PLANE_WM_EN;
>>  
>>  		r->plane[pipe][PLANE_CURSOR][level] = temp;
>> -
>>  	}
>>  
>>  	/* transition WMs */
>>  	for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +		plane_wm = &p_wm->planes[i];
>>  		temp = 0;
>> -		temp |= p_wm->trans_wm.plane_res_l[i] <<
>> PLANE_WM_LINES_SHIFT;
>> -		temp |= p_wm->trans_wm.plane_res_b[i];
>> -		if (p_wm->trans_wm.plane_en[i])
>> +		temp |= plane_wm->trans_wm.plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +		temp |= plane_wm->trans_wm.plane_res_b;
>> +		if (plane_wm->trans_wm.plane_en)
>>  			temp |= PLANE_WM_EN;
>>  
>>  		r->plane_trans[pipe][i] = temp;
>>  	}
>>  
>> +	plane_wm = &p_wm->planes[PLANE_CURSOR];
>>  	temp = 0;
>> -	temp |= p_wm->trans_wm.plane_res_l[PLANE_CURSOR] <<
>> PLANE_WM_LINES_SHIFT;
>> -	temp |= p_wm->trans_wm.plane_res_b[PLANE_CURSOR];
>> -	if (p_wm->trans_wm.plane_en[PLANE_CURSOR])
>> +	temp |= plane_wm->trans_wm.plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +	temp |= plane_wm->trans_wm.plane_res_b;
>> +	if (plane_wm->trans_wm.plane_en)
>>  		temp |= PLANE_WM_EN;
>>  
>>  	r->plane_trans[pipe][PLANE_CURSOR] = temp;
>> @@ -4262,44 +4259,24 @@ static void ilk_optimize_watermarks(struct
>> intel_crtc_state *cstate)
>>  static void skl_pipe_wm_active_state(uint32_t val,
>>  				     struct skl_pipe_wm *active,
>>  				     bool is_transwm,
>> -				     bool is_cursor,
>>  				     int i,
>>  				     int level)
>>  {
>> +	struct skl_plane_wm *plane_wm = &active->planes[i];
>>  	bool is_enabled = (val & PLANE_WM_EN) != 0;
>>  
>>  	if (!is_transwm) {
>> -		if (!is_cursor) {
>> -			active->wm[level].plane_en[i] = is_enabled;
>> -			active->wm[level].plane_res_b[i] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->wm[level].plane_res_l[i] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		} else {
>> -			active->wm[level].plane_en[PLANE_CURSOR] =
>> is_enabled;
>> -			active->wm[level].plane_res_b[PLANE_CURSOR]
>> =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->wm[level].plane_res_l[PLANE_CURSOR]
>> =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		}
>> +		plane_wm->wm[level].plane_en = is_enabled;
>> +		plane_wm->wm[level].plane_res_b = val &
>> PLANE_WM_BLOCKS_MASK;
>> +		plane_wm->wm[level].plane_res_l =
>> +			(val >> PLANE_WM_LINES_SHIFT) &
>> +			PLANE_WM_LINES_MASK;
> Nitpick: you can join the two lines above and still stay under 80
> columns.
>
>
>>  	} else {
>> -		if (!is_cursor) {
>> -			active->trans_wm.plane_en[i] = is_enabled;
>> -			active->trans_wm.plane_res_b[i] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->trans_wm.plane_res_l[i] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		} else {
>> -			active->trans_wm.plane_en[PLANE_CURSOR] =
>> is_enabled;
>> -			active->trans_wm.plane_res_b[PLANE_CURSOR] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->trans_wm.plane_res_l[PLANE_CURSOR] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		}
>> +		plane_wm->trans_wm.plane_en = is_enabled;
>> +		plane_wm->trans_wm.plane_res_b = val &
>> PLANE_WM_BLOCKS_MASK;
>> +		plane_wm->trans_wm.plane_res_l =
>> +			(val >> PLANE_WM_LINES_SHIFT) &
>> +			PLANE_WM_LINES_MASK;
> Same here.
>
>
>>  	}
>>  }
>>  
>> @@ -4338,20 +4315,19 @@ static void skl_pipe_wm_get_hw_state(struct
>> drm_crtc *crtc)
>>  	for (level = 0; level <= max_level; level++) {
>>  		for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>>  			temp = hw->plane[pipe][i][level];
>> -			skl_pipe_wm_active_state(temp, active,
>> false,
>> -						false, i, level);
>> +			skl_pipe_wm_active_state(temp, active,
>> false, i, level);
>>  		}
>>  		temp = hw->plane[pipe][PLANE_CURSOR][level];
>> -		skl_pipe_wm_active_state(temp, active, false, true,
>> i, level);
>> +		skl_pipe_wm_active_state(temp, active, false, i,
>> level);
> While this is not wrong today, history shows that the number of planes
> increases over time, so we may at some point in the future add PLANE_D
> and more, so the code will become wrong. Just pass PLANE_CURSOR instead
> of "i" here and below. Also, this simplification could have been a
> separate patch.
Agreed, but I want to note that PLANE_CURSOR is always supposed to be the last member.
Unless you have sprite planes covering the cursor, which doesn't ever happen.

~Maarten
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

WARNING: multiple messages have this Message-ID (diff)
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
To: Paulo Zanoni <paulo.r.zanoni@intel.com>, Lyude <cpaul@redhat.com>,
	intel-gfx@lists.freedesktop.org
Cc: David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel.vetter@intel.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 4/6] drm/i915/gen9: Make skl_wm_level per-plane
Date: Thu, 6 Oct 2016 12:38:52 +0200	[thread overview]
Message-ID: <9f338dc6-98ce-cef8-e9bf-11ff0e49c262@linux.intel.com> (raw)
In-Reply-To: <1475699598.2381.64.camel@intel.com>

Op 05-10-16 om 22:33 schreef Paulo Zanoni:
> Em Qua, 2016-10-05 às 11:33 -0400, Lyude escreveu:
>> Having skl_wm_level contain all of the watermarks for each plane is
>> annoying since it prevents us from having any sort of object to
>> represent a single watermark level, something we take advantage of in
>> the next commit to cut down on all of the copy paste code in here.
> I'd like to start my review pointing that I really like this patch. I
> agree the current form is annoying.
>
> See below for some details.
>
>
>> Signed-off-by: Lyude <cpaul@redhat.com>
>> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
>> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> Cc: Matt Roper <matthew.d.roper@intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_drv.h  |   6 +-
>>  drivers/gpu/drm/i915/intel_drv.h |   6 +-
>>  drivers/gpu/drm/i915/intel_pm.c  | 208 +++++++++++++++++----------
>> ------------
>>  3 files changed, 100 insertions(+), 120 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h
>> b/drivers/gpu/drm/i915/i915_drv.h
>> index d26e5999..0f97d43 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -1648,9 +1648,9 @@ struct skl_wm_values {
>>  };
>>  
>>  struct skl_wm_level {
>> -	bool plane_en[I915_MAX_PLANES];
>> -	uint16_t plane_res_b[I915_MAX_PLANES];
>> -	uint8_t plane_res_l[I915_MAX_PLANES];
>> +	bool plane_en;
>> +	uint16_t plane_res_b;
>> +	uint8_t plane_res_l;
>>  };
>>  
>>  /*
>> diff --git a/drivers/gpu/drm/i915/intel_drv.h
>> b/drivers/gpu/drm/i915/intel_drv.h
>> index 35ba282..d684f4f 100644
>> --- a/drivers/gpu/drm/i915/intel_drv.h
>> +++ b/drivers/gpu/drm/i915/intel_drv.h
>> @@ -468,9 +468,13 @@ struct intel_pipe_wm {
>>  	bool sprites_scaled;
>>  };
>>  
>> -struct skl_pipe_wm {
>> +struct skl_plane_wm {
>>  	struct skl_wm_level wm[8];
>>  	struct skl_wm_level trans_wm;
>> +};
>> +
>> +struct skl_pipe_wm {
>> +	struct skl_plane_wm planes[I915_MAX_PLANES];
>>  	uint32_t linetime;
>>  };
>>  
>> diff --git a/drivers/gpu/drm/i915/intel_pm.c
>> b/drivers/gpu/drm/i915/intel_pm.c
>> index af96888..250f12d 100644
>> --- a/drivers/gpu/drm/i915/intel_pm.c
>> +++ b/drivers/gpu/drm/i915/intel_pm.c
>> @@ -3668,67 +3668,52 @@ static int
>>  skl_compute_wm_level(const struct drm_i915_private *dev_priv,
>>  		     struct skl_ddb_allocation *ddb,
>>  		     struct intel_crtc_state *cstate,
>> +		     struct intel_plane *intel_plane,
>>  		     int level,
>>  		     struct skl_wm_level *result)
>>  {
>>  	struct drm_atomic_state *state = cstate->base.state;
>>  	struct intel_crtc *intel_crtc = to_intel_crtc(cstate-
>>> base.crtc);
>> -	struct drm_plane *plane;
>> -	struct intel_plane *intel_plane;
>> -	struct intel_plane_state *intel_pstate;
>> +	struct drm_plane *plane = &intel_plane->base;
>> +	struct intel_plane_state *intel_pstate = NULL;
>>  	uint16_t ddb_blocks;
>>  	enum pipe pipe = intel_crtc->pipe;
>>  	int ret;
>> +	int i = skl_wm_plane_id(intel_plane);
>> +
>> +	if (state)
>> +		intel_pstate =
>> +			intel_atomic_get_existing_plane_state(state,
>> +							      intel_
>> plane);
>>  
>>  	/*
>> -	 * We'll only calculate watermarks for planes that are
>> actually
>> -	 * enabled, so make sure all other planes are set as
>> disabled.
>> +	 * Note: If we start supporting multiple pending atomic
>> commits against
>> +	 * the same planes/CRTC's in the future, plane->state will
>> no longer be
>> +	 * the correct pre-state to use for the calculations here
>> and we'll
>> +	 * need to change where we get the 'unchanged' plane data
>> from.
>> +	 *
>> +	 * For now this is fine because we only allow one queued
>> commit against
>> +	 * a CRTC.  Even if the plane isn't modified by this
>> transaction and we
>> +	 * don't have a plane lock, we still have the CRTC's lock,
>> so we know
>> +	 * that no other transactions are racing with us to update
>> it.
>>  	 */
>> -	memset(result, 0, sizeof(*result));
>> -
>> -	for_each_intel_plane_mask(&dev_priv->drm,
>> -				  intel_plane,
>> -				  cstate->base.plane_mask) {
>> -		int i = skl_wm_plane_id(intel_plane);
>> -
>> -		plane = &intel_plane->base;
>> -		intel_pstate = NULL;
>> -		if (state)
>> -			intel_pstate =
>> -				intel_atomic_get_existing_plane_stat
>> e(state,
>> -								    
>>   intel_plane);
>> +	if (!intel_pstate)
>> +		intel_pstate = to_intel_plane_state(plane->state);
>>  
>> -		/*
>> -		 * Note: If we start supporting multiple pending
>> atomic commits
>> -		 * against the same planes/CRTC's in the future,
>> plane->state
>> -		 * will no longer be the correct pre-state to use
>> for the
>> -		 * calculations here and we'll need to change where
>> we get the
>> -		 * 'unchanged' plane data from.
>> -		 *
>> -		 * For now this is fine because we only allow one
>> queued commit
>> -		 * against a CRTC.  Even if the plane isn't modified
>> by this
>> -		 * transaction and we don't have a plane lock, we
>> still have
>> -		 * the CRTC's lock, so we know that no other
>> transactions are
>> -		 * racing with us to update it.
>> -		 */
>> -		if (!intel_pstate)
>> -			intel_pstate = to_intel_plane_state(plane-
>>> state);
>> +	WARN_ON(!intel_pstate->base.fb);
>>  
>> -		WARN_ON(!intel_pstate->base.fb);
>> +	ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][i]);
>>  
>> -		ddb_blocks = skl_ddb_entry_size(&ddb-
>>> plane[pipe][i]);
>> -
>> -		ret = skl_compute_plane_wm(dev_priv,
>> -					   cstate,
>> -					   intel_pstate,
>> -					   ddb_blocks,
>> -					   level,
>> -					   &result->plane_res_b[i],
>> -					   &result->plane_res_l[i],
>> -					   &result->plane_en[i]);
>> -		if (ret)
>> -			return ret;
>> -	}
>> +	ret = skl_compute_plane_wm(dev_priv,
>> +				   cstate,
>> +				   intel_pstate,
>> +				   ddb_blocks,
>> +				   level,
>> +				   &result->plane_res_b,
>> +				   &result->plane_res_l,
>> +				   &result->plane_en);
>> +	if (ret)
>> +		return ret;
>>  
>>  	return 0;
>>  }
>> @@ -3749,19 +3734,11 @@ skl_compute_linetime_wm(struct
>> intel_crtc_state *cstate)
>>  static void skl_compute_transition_wm(struct intel_crtc_state
>> *cstate,
>>  				      struct skl_wm_level *trans_wm
>> /* out */)
>>  {
>> -	struct drm_crtc *crtc = cstate->base.crtc;
>> -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>> -	struct intel_plane *intel_plane;
>> -
>>  	if (!cstate->base.active)
>>  		return;
>>  
>>  	/* Until we know more, just disable transition WMs */
>> -	for_each_intel_plane_on_crtc(crtc->dev, intel_crtc,
>> intel_plane) {
>> -		int i = skl_wm_plane_id(intel_plane);
>> -
>> -		trans_wm->plane_en[i] = false;
>> -	}
>> +	trans_wm->plane_en = false;
>>  }
>>  
>>  static int skl_build_pipe_wm(struct intel_crtc_state *cstate,
>> @@ -3770,19 +3747,33 @@ static int skl_build_pipe_wm(struct
>> intel_crtc_state *cstate,
>>  {
>>  	struct drm_device *dev = cstate->base.crtc->dev;
>>  	const struct drm_i915_private *dev_priv = to_i915(dev);
>> +	struct intel_plane *intel_plane;
>> +	struct skl_plane_wm *wm;
>>  	int level, max_level = ilk_wm_max_level(dev);
>>  	int ret;
>>  
>> -	for (level = 0; level <= max_level; level++) {
>> -		ret = skl_compute_wm_level(dev_priv, ddb, cstate,
>> -					   level, &pipe_wm-
>>> wm[level]);
>> -		if (ret)
>> -			return ret;
>> +	/*
>> +	 * We'll only calculate watermarks for planes that are
>> actually
>> +	 * enabled, so make sure all other planes are set as
>> disabled.
>> +	 */
>> +	memset(pipe_wm->planes, 0, sizeof(pipe_wm->planes));
>> +
>> +	for_each_intel_plane_mask(&dev_priv->drm,
>> +				  intel_plane,
>> +				  cstate->base.plane_mask) {
>> +		wm = &pipe_wm->planes[skl_wm_plane_id(intel_plane)];
>> +
>> +		for (level = 0; level <= max_level; level++) {
>> +			ret = skl_compute_wm_level(dev_priv, ddb,
>> cstate,
>> +						   intel_plane,
>> level,
>> +						   &wm->wm[level]);
>> +			if (ret)
>> +				return ret;
>> +		}
>> +		skl_compute_transition_wm(cstate, &wm->trans_wm);
>>  	}
>>  	pipe_wm->linetime = skl_compute_linetime_wm(cstate);
>>  
>> -	skl_compute_transition_wm(cstate, &pipe_wm->trans_wm);
>> -
>>  	return 0;
>>  }
>>  
>> @@ -3792,50 +3783,56 @@ static void skl_compute_wm_results(struct
>> drm_device *dev,
>>  				   struct intel_crtc *intel_crtc)
>>  {
>>  	int level, max_level = ilk_wm_max_level(dev);
>> +	struct skl_plane_wm *plane_wm;
>>  	enum pipe pipe = intel_crtc->pipe;
>>  	uint32_t temp;
>>  	int i;
>>  
>> -	for (level = 0; level <= max_level; level++) {
>> -		for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +	for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +		plane_wm = &p_wm->planes[i];
>> +
>> +		for (level = 0; level <= max_level; level++) {
>>  			temp = 0;
>>  
>> -			temp |= p_wm->wm[level].plane_res_l[i] <<
>> +			temp |= plane_wm->wm[level].plane_res_l <<
>>  					PLANE_WM_LINES_SHIFT;
>> -			temp |= p_wm->wm[level].plane_res_b[i];
>> -			if (p_wm->wm[level].plane_en[i])
>> +			temp |= plane_wm->wm[level].plane_res_b;
>> +			if (plane_wm->wm[level].plane_en)
>>  				temp |= PLANE_WM_EN;
>>  
>>  			r->plane[pipe][i][level] = temp;
>>  		}
>>  
>> -		temp = 0;
>> -
>> -		temp |= p_wm->wm[level].plane_res_l[PLANE_CURSOR] <<
>> PLANE_WM_LINES_SHIFT;
>> -		temp |= p_wm->wm[level].plane_res_b[PLANE_CURSOR];
>> +	}
>>  
>> -		if (p_wm->wm[level].plane_en[PLANE_CURSOR])
>> +	for (level = 0; level <= max_level; level++) {
>> +		plane_wm = &p_wm->planes[PLANE_CURSOR];
>> +		temp = 0;
>> +		temp |= plane_wm->wm[level].plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +		temp |= plane_wm->wm[level].plane_res_b;
>> +		if (plane_wm->wm[level].plane_en)
>>  			temp |= PLANE_WM_EN;
>>  
>>  		r->plane[pipe][PLANE_CURSOR][level] = temp;
>> -
>>  	}
>>  
>>  	/* transition WMs */
>>  	for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>> +		plane_wm = &p_wm->planes[i];
>>  		temp = 0;
>> -		temp |= p_wm->trans_wm.plane_res_l[i] <<
>> PLANE_WM_LINES_SHIFT;
>> -		temp |= p_wm->trans_wm.plane_res_b[i];
>> -		if (p_wm->trans_wm.plane_en[i])
>> +		temp |= plane_wm->trans_wm.plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +		temp |= plane_wm->trans_wm.plane_res_b;
>> +		if (plane_wm->trans_wm.plane_en)
>>  			temp |= PLANE_WM_EN;
>>  
>>  		r->plane_trans[pipe][i] = temp;
>>  	}
>>  
>> +	plane_wm = &p_wm->planes[PLANE_CURSOR];
>>  	temp = 0;
>> -	temp |= p_wm->trans_wm.plane_res_l[PLANE_CURSOR] <<
>> PLANE_WM_LINES_SHIFT;
>> -	temp |= p_wm->trans_wm.plane_res_b[PLANE_CURSOR];
>> -	if (p_wm->trans_wm.plane_en[PLANE_CURSOR])
>> +	temp |= plane_wm->trans_wm.plane_res_l <<
>> PLANE_WM_LINES_SHIFT;
>> +	temp |= plane_wm->trans_wm.plane_res_b;
>> +	if (plane_wm->trans_wm.plane_en)
>>  		temp |= PLANE_WM_EN;
>>  
>>  	r->plane_trans[pipe][PLANE_CURSOR] = temp;
>> @@ -4262,44 +4259,24 @@ static void ilk_optimize_watermarks(struct
>> intel_crtc_state *cstate)
>>  static void skl_pipe_wm_active_state(uint32_t val,
>>  				     struct skl_pipe_wm *active,
>>  				     bool is_transwm,
>> -				     bool is_cursor,
>>  				     int i,
>>  				     int level)
>>  {
>> +	struct skl_plane_wm *plane_wm = &active->planes[i];
>>  	bool is_enabled = (val & PLANE_WM_EN) != 0;
>>  
>>  	if (!is_transwm) {
>> -		if (!is_cursor) {
>> -			active->wm[level].plane_en[i] = is_enabled;
>> -			active->wm[level].plane_res_b[i] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->wm[level].plane_res_l[i] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		} else {
>> -			active->wm[level].plane_en[PLANE_CURSOR] =
>> is_enabled;
>> -			active->wm[level].plane_res_b[PLANE_CURSOR]
>> =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->wm[level].plane_res_l[PLANE_CURSOR]
>> =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		}
>> +		plane_wm->wm[level].plane_en = is_enabled;
>> +		plane_wm->wm[level].plane_res_b = val &
>> PLANE_WM_BLOCKS_MASK;
>> +		plane_wm->wm[level].plane_res_l =
>> +			(val >> PLANE_WM_LINES_SHIFT) &
>> +			PLANE_WM_LINES_MASK;
> Nitpick: you can join the two lines above and still stay under 80
> columns.
>
>
>>  	} else {
>> -		if (!is_cursor) {
>> -			active->trans_wm.plane_en[i] = is_enabled;
>> -			active->trans_wm.plane_res_b[i] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->trans_wm.plane_res_l[i] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		} else {
>> -			active->trans_wm.plane_en[PLANE_CURSOR] =
>> is_enabled;
>> -			active->trans_wm.plane_res_b[PLANE_CURSOR] =
>> -					val & PLANE_WM_BLOCKS_MASK;
>> -			active->trans_wm.plane_res_l[PLANE_CURSOR] =
>> -					(val >>
>> PLANE_WM_LINES_SHIFT) &
>> -						PLANE_WM_LINES_MASK;
>> -		}
>> +		plane_wm->trans_wm.plane_en = is_enabled;
>> +		plane_wm->trans_wm.plane_res_b = val &
>> PLANE_WM_BLOCKS_MASK;
>> +		plane_wm->trans_wm.plane_res_l =
>> +			(val >> PLANE_WM_LINES_SHIFT) &
>> +			PLANE_WM_LINES_MASK;
> Same here.
>
>
>>  	}
>>  }
>>  
>> @@ -4338,20 +4315,19 @@ static void skl_pipe_wm_get_hw_state(struct
>> drm_crtc *crtc)
>>  	for (level = 0; level <= max_level; level++) {
>>  		for (i = 0; i < intel_num_planes(intel_crtc); i++) {
>>  			temp = hw->plane[pipe][i][level];
>> -			skl_pipe_wm_active_state(temp, active,
>> false,
>> -						false, i, level);
>> +			skl_pipe_wm_active_state(temp, active,
>> false, i, level);
>>  		}
>>  		temp = hw->plane[pipe][PLANE_CURSOR][level];
>> -		skl_pipe_wm_active_state(temp, active, false, true,
>> i, level);
>> +		skl_pipe_wm_active_state(temp, active, false, i,
>> level);
> While this is not wrong today, history shows that the number of planes
> increases over time, so we may at some point in the future add PLANE_D
> and more, so the code will become wrong. Just pass PLANE_CURSOR instead
> of "i" here and below. Also, this simplification could have been a
> separate patch.
Agreed, but I want to note that PLANE_CURSOR is always supposed to be the last member.
Unless you have sprite planes covering the cursor, which doesn't ever happen.

~Maarten

  reply	other threads:[~2016-10-06 10:38 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-05 15:33 [PATCH 0/6] Start of skl watermark cleanup Lyude
2016-10-05 15:33 ` Lyude
2016-10-05 15:33 ` [PATCH 1/6] drm/i915/skl: Move per-pipe ddb allocations into crtc states Lyude
2016-10-05 15:33   ` Lyude
2016-10-05 20:23   ` Paulo Zanoni
2016-10-05 20:23     ` [Intel-gfx] " Paulo Zanoni
2016-10-05 15:33 ` [PATCH 2/6] drm/i915/skl: Remove linetime from skl_wm_values Lyude
2016-10-05 15:33   ` Lyude
2016-10-05 20:24   ` [Intel-gfx] " Paulo Zanoni
2016-10-05 15:33 ` [PATCH 3/6] drm/i915: Add enable_sagv option Lyude
2016-10-05 15:33   ` Lyude
2016-10-05 19:32   ` Paulo Zanoni
2016-10-05 19:32     ` [Intel-gfx] " Paulo Zanoni
2016-10-05 15:33 ` [PATCH 4/6] drm/i915/gen9: Make skl_wm_level per-plane Lyude
2016-10-05 15:33   ` Lyude
2016-10-05 20:33   ` Paulo Zanoni
2016-10-05 20:33     ` [Intel-gfx] " Paulo Zanoni
2016-10-06 10:38     ` Maarten Lankhorst [this message]
2016-10-06 10:38       ` Maarten Lankhorst
2016-10-05 15:33 ` [PATCH 5/6] drm/i915/gen9: Get rid of redundant watermark values Lyude
2016-10-05 21:44   ` Paulo Zanoni
2016-10-05 21:44     ` [Intel-gfx] " Paulo Zanoni
2016-10-05 21:53     ` Chris Wilson
2016-10-05 15:33 ` [PATCH 6/6] drm/i915/gen9: Add ddb changes to atomic debug output Lyude
2016-10-05 15:33   ` Lyude
2016-10-05 16:26 ` ✗ Fi.CI.BAT: warning for Start of skl watermark cleanup Patchwork
2016-10-06 11:25 ` [PATCH 0/6] " Maarten Lankhorst
2016-10-06 11:25   ` Maarten Lankhorst

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9f338dc6-98ce-cef8-e9bf-11ff0e49c262@linux.intel.com \
    --to=maarten.lankhorst@linux.intel.com \
    --cc=airlied@linux.ie \
    --cc=cpaul@redhat.com \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulo.r.zanoni@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.