All of lore.kernel.org
 help / color / mirror / Atom feed
From: Manasi Navare <manasi.d.navare@intel.com>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [RFC 2/2] [INCOMPLETE] drm/i915: Split up crtc_state into uapi and hw
Date: Mon, 17 Jun 2019 13:45:30 -0700	[thread overview]
Message-ID: <20190617204530.GA14321@intel.com> (raw)
In-Reply-To: <20190614202115.14098-3-maarten.lankhorst@linux.intel.com>

Here it looks like, we are changing all the helpers to accept intel_crtc_state as an argument
and then use the intel_crtc_state->hw and ->uapi whereever needed inside the function.

But with seperating the drm_crtc_state now into hw and uapi, wasnt one of the goals
to retain teh helpers taking drm_crtc_state as an argument and not having to change
that all through the i915 driver?

Manasi

On Fri, Jun 14, 2019 at 10:21:15PM +0200, Maarten Lankhorst wrote:
>  Use uapi for drm, and keep the internal state in hw.
>  
>  This patch is incomplete, just want feedback on the direction I'm going.
> ---
>  drivers/gpu/drm/i915/intel_atomic.c  | 13 ++--
>  drivers/gpu/drm/i915/intel_display.c | 88 +++++++++++++++-------------
>  drivers/gpu/drm/i915/intel_drv.h     |  2 +-
>  3 files changed, 57 insertions(+), 46 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
> index 1f891b554ead..36fbd408ba81 100644
> --- a/drivers/gpu/drm/i915/intel_atomic.c
> +++ b/drivers/gpu/drm/i915/intel_atomic.c
> @@ -185,12 +185,14 @@ struct drm_crtc_state *
>  intel_crtc_duplicate_state(struct drm_crtc *crtc)
>  {
>  	struct intel_crtc_state *crtc_state;
> +	const struct intel_crtc_state *old_crtc_state = to_intel_crtc_state(crtc->state);
>  
> -	crtc_state = kmemdup(crtc->state, sizeof(*crtc_state), GFP_KERNEL);
> +	crtc_state = kmemdup(old_crtc_state, sizeof(*crtc_state), GFP_KERNEL);
>  	if (!crtc_state)
>  		return NULL;
>  
> -	__drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->hw);
> +	__drm_atomic_helper_crtc_duplicate_state(crtc, &crtc_state->uapi);
> +	memset(&crtc_state->hw, 0, sizeof(crtc_state->hw));
>  
>  	crtc_state->update_pipe = false;
>  	crtc_state->disable_lp_wm = false;
> @@ -203,7 +205,7 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
>  	crtc_state->fb_bits = 0;
>  	crtc_state->update_planes = 0;
>  
> -	return &crtc_state->hw;
> +	return &crtc_state->uapi;
>  }
>  
>  /**
> @@ -218,7 +220,10 @@ void
>  intel_crtc_destroy_state(struct drm_crtc *crtc,
>  			 struct drm_crtc_state *state)
>  {
> -	drm_atomic_helper_crtc_destroy_state(crtc, state);
> +	struct intel_crtc_state *crtc_state = to_intel_crtc_state(state);
> +
> +	__drm_atomic_helper_crtc_destroy_state(crtc, &crtc_state->uapi);
> +	kfree(crtc_state);
>  }
>  
>  static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_state,
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 9aa273fb5415..2de978ab8fc2 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -514,9 +514,9 @@ icl_wa_scalerclkgating(struct drm_i915_private *dev_priv, enum pipe pipe,
>  }
>  
>  static bool
> -needs_modeset(const struct drm_crtc_state *state)
> +needs_modeset(const struct intel_crtc_state *state)
>  {
> -	return drm_atomic_crtc_needs_modeset(state);
> +	return drm_atomic_crtc_needs_modeset(&state->hw);
>  }
>  
>  /*
> @@ -5795,7 +5795,7 @@ static bool hsw_pre_update_disable_ips(const struct intel_crtc_state *old_crtc_s
>  	if (!old_crtc_state->ips_enabled)
>  		return false;
>  
> -	if (needs_modeset(&new_crtc_state->hw))
> +	if (needs_modeset(new_crtc_state))
>  		return true;
>  
>  	/*
> @@ -5822,7 +5822,7 @@ static bool hsw_post_update_enable_ips(const struct intel_crtc_state *old_crtc_s
>  	if (!new_crtc_state->ips_enabled)
>  		return false;
>  
> -	if (needs_modeset(&new_crtc_state->hw))
> +	if (needs_modeset(new_crtc_state))
>  		return true;
>  
>  	/*
> @@ -5899,7 +5899,7 @@ static void intel_post_plane_update(struct intel_crtc_state *old_crtc_state)
>  		intel_fbc_post_update(crtc);
>  
>  		if (new_primary_state->visible &&
> -		    (needs_modeset(&pipe_config->hw) ||
> +		    (needs_modeset(pipe_config) ||
>  		     !old_primary_state->visible))
>  			intel_post_enable_primary(&crtc->base, pipe_config);
>  	}
> @@ -5923,7 +5923,7 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state,
>  	struct drm_plane *primary = crtc->base.primary;
>  	struct drm_plane_state *old_primary_state =
>  		drm_atomic_get_old_plane_state(old_state, primary);
> -	bool modeset = needs_modeset(&pipe_config->hw);
> +	bool modeset = needs_modeset(pipe_config);
>  	struct intel_atomic_state *old_intel_state =
>  		to_intel_atomic_state(old_state);
>  
> @@ -5983,7 +5983,7 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state,
>  	 * If we're doing a modeset, we're done.  No need to do any pre-vblank
>  	 * watermark programming here.
>  	 */
> -	if (needs_modeset(&pipe_config->hw))
> +	if (needs_modeset(pipe_config))
>  		return;
>  
>  	/*
> @@ -11338,7 +11338,7 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
>  	struct intel_plane *plane = to_intel_plane(plane_state->plane);
>  	struct drm_device *dev = crtc->dev;
>  	struct drm_i915_private *dev_priv = to_i915(dev);
> -	bool mode_changed = needs_modeset(crtc_state);
> +	bool mode_changed = needs_modeset(pipe_config);
>  	bool was_crtc_enabled = old_crtc_state->hw.active;
>  	bool is_crtc_enabled = crtc_state->active;
>  	bool turn_off, turn_on, visible, was_visible;
> @@ -11607,7 +11607,7 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
>  	struct intel_crtc_state *pipe_config =
>  		to_intel_crtc_state(crtc_state);
>  	int ret;
> -	bool mode_changed = needs_modeset(crtc_state);
> +	bool mode_changed = needs_modeset(pipe_config);
>  
>  	if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv) &&
>  	    mode_changed && !crtc_state->active)
> @@ -13095,7 +13095,7 @@ intel_modeset_verify_crtc(struct drm_crtc *crtc,
>  			  struct drm_crtc_state *old_state,
>  			  struct drm_crtc_state *new_state)
>  {
> -	if (!needs_modeset(new_state) &&
> +	if (!needs_modeset(to_intel_crtc_state(new_state)) &&
>  	    !to_intel_crtc_state(new_state)->update_pipe)
>  		return;
>  
> @@ -13187,7 +13187,7 @@ static void intel_modeset_clear_plls(struct intel_atomic_state *state)
>  		struct intel_shared_dpll *old_dpll =
>  			old_crtc_state->shared_dpll;
>  
> -		if (!needs_modeset(&new_crtc_state->hw))
> +		if (!needs_modeset(new_crtc_state))
>  			continue;
>  
>  		new_crtc_state->shared_dpll = NULL;
> @@ -13217,7 +13217,7 @@ static int haswell_mode_set_planes_workaround(struct intel_atomic_state *state)
>  	/* look at all crtc's that are going to be enabled in during modeset */
>  	for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
>  		if (!crtc_state->hw.active ||
> -		    !needs_modeset(&crtc_state->hw))
> +		    !needs_modeset(crtc_state))
>  			continue;
>  
>  		if (first_crtc_state) {
> @@ -13242,7 +13242,7 @@ static int haswell_mode_set_planes_workaround(struct intel_atomic_state *state)
>  		crtc_state->hsw_workaround_pipe = INVALID_PIPE;
>  
>  		if (!crtc_state->hw.active ||
> -		    needs_modeset(&crtc_state->hw))
> +		    needs_modeset(crtc_state))
>  			continue;
>  
>  		/* 2 or more enabled crtcs means no need for w/a */
> @@ -13276,32 +13276,32 @@ static int intel_lock_all_pipes(struct drm_atomic_state *state)
>  	return 0;
>  }
>  
> -static int intel_modeset_all_pipes(struct drm_atomic_state *state)
> +static int intel_modeset_all_pipes(struct intel_atomic_state *state)
>  {
> -	struct drm_crtc *crtc;
> +	struct intel_crtc *crtc;
>  
>  	/*
>  	 * Add all pipes to the state, and force
>  	 * a modeset on all the active ones.
>  	 */
>  	for_each_crtc(state->dev, crtc) {
> -		struct drm_crtc_state *crtc_state;
> +		struct intel_crtc_state *crtc_state;
>  		int ret;
>  
> -		crtc_state = drm_atomic_get_crtc_state(state, crtc);
> +		crtc_state = intel_atomic_get_crtc_state(state, crtc);
>  		if (IS_ERR(crtc_state))
>  			return PTR_ERR(crtc_state);
>  
> -		if (!crtc_state->active || needs_modeset(crtc_state))
> +		if (!crtc_state->hw.active || needs_modeset(crtc_state))
>  			continue;
>  
>  		crtc_state->mode_changed = true;
>  
> -		ret = drm_atomic_add_affected_connectors(state, crtc);
> +		ret = drm_atomic_add_affected_connectors(&state->base, &crtc->base);
>  		if (ret)
>  			return ret;
>  
> -		ret = drm_atomic_add_affected_planes(state, crtc);
> +		ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
>  		if (ret)
>  			return ret;
>  	}
> @@ -13369,12 +13369,12 @@ static int intel_modeset_checks(struct intel_atomic_state *state)
>  		}
>  
>  		if (is_power_of_2(state->active_crtcs)) {
> -			struct drm_crtc *crtc;
> -			struct drm_crtc_state *crtc_state;
> +			struct intel_crtc *crtc;
> +			struct intel_crtc_state *crtc_state;
>  
>  			pipe = ilog2(state->active_crtcs);
> -			crtc = &intel_get_crtc_for_pipe(dev_priv, pipe)->base;
> -			crtc_state = drm_atomic_get_new_crtc_state(&state->base, crtc);
> +			crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
> +			crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
>  			if (crtc_state && needs_modeset(crtc_state))
>  				pipe = INVALID_PIPE;
>  		} else {
> @@ -13393,7 +13393,7 @@ static int intel_modeset_checks(struct intel_atomic_state *state)
>  			state->cdclk.pipe = pipe;
>  		} else if (intel_cdclk_needs_modeset(&dev_priv->cdclk.actual,
>  						     &state->cdclk.actual)) {
> -			ret = intel_modeset_all_pipes(&state->base);
> +			ret = intel_modeset_all_pipes(state);
>  			if (ret < 0)
>  				return ret;
>  
> @@ -13451,6 +13451,8 @@ static int intel_atomic_check(struct drm_device *dev,
>  	/* Catch I915_MODE_FLAG_INHERITED */
>  	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
>  					    new_crtc_state, i) {
> +		new_intel_crtc_state->hw = new_intel_crtc_state->uapi;
> +
>  		if (new_crtc_state->hw.mode.private_flags !=
>  		    old_crtc_state->hw.mode.private_flags)
>  			new_crtc_state->hw.mode_changed = true;
> @@ -13462,7 +13464,7 @@ static int intel_atomic_check(struct drm_device *dev,
>  
>  	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
>  					    new_crtc_state, i) {
> -		if (!needs_modeset(&new_crtc_state->hw))
> +		if (!needs_modeset(new_crtc_state))
>  			continue;
>  
>  		if (!new_crtc_state->hw.enable) {
> @@ -13480,7 +13482,7 @@ static int intel_atomic_check(struct drm_device *dev,
>  			new_crtc_state->update_pipe = true;
>  		}
>  
> -		if (needs_modeset(&new_crtc_state->hw))
> +		if (needs_modeset(new_crtc_state))
>  			any_ms = true;
>  	}
>  
> @@ -13515,12 +13517,12 @@ static int intel_atomic_check(struct drm_device *dev,
>  
>  	for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
>  					    new_crtc_state, i) {
> -		if (!needs_modeset(&new_crtc_state->hw) &&
> +		if (!needs_modeset(new_crtc_state) &&
>  		    !new_crtc_state->update_pipe)
>  			continue;
>  
>  		intel_dump_pipe_config(new_crtc_state, state,
> -				       needs_modeset(&new_crtc_state->hw) ?
> +				       needs_modeset(new_crtc_state) ?
>  				       "[modeset]" : "[fastset]");
>  	}
>  
> @@ -13567,7 +13569,7 @@ static void intel_update_crtc(struct drm_crtc *crtc,
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>  	struct intel_crtc_state *pipe_config = to_intel_crtc_state(new_crtc_state);
> -	bool modeset = needs_modeset(new_crtc_state);
> +	bool modeset = needs_modeset(pipe_config);
>  	struct intel_plane_state *new_plane_state =
>  		intel_atomic_get_new_plane_state(to_intel_atomic_state(state),
>  						 to_intel_plane(crtc->primary));
> @@ -13776,20 +13778,23 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
>  		new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
>  		intel_crtc = to_intel_crtc(crtc);
>  
> -		if (needs_modeset(new_crtc_state) ||
> -		    to_intel_crtc_state(new_crtc_state)->update_pipe) {
> +		/* Copy for drm_atomic_helper_setup_commit() */
> +		new_intel_crtc_state->hw = new_intel_crtc_state->uapi;
> +
> +		if (needs_modeset(new_intel_crtc_state) ||
> +		    new_intel_crtc_state->update_pipe) {
>  
>  			put_domains[intel_crtc->pipe] =
>  				modeset_get_crtc_power_domains(crtc,
>  					new_intel_crtc_state);
>  		}
>  
> -		if (!needs_modeset(new_crtc_state))
> +		if (!needs_modeset(new_intel_crtc_state))
>  			continue;
>  
>  		intel_pre_plane_update(old_intel_crtc_state, new_intel_crtc_state);
>  
> -		if (old_crtc_state->active) {
> +		if (new_intel_crtc_state->hw.active) {
>  			intel_crtc_disable_planes(intel_state, intel_crtc);
>  
>  			/*
> @@ -13878,8 +13883,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
>  	for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
>  		new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
>  
> -		if (new_crtc_state->active &&
> -		    !needs_modeset(new_crtc_state) &&
> +		if (new_intel_crtc_state->hw.active &&
> +		    !needs_modeset(new_intel_crtc_state) &&
>  		    (new_intel_crtc_state->hw.color_mgmt_changed ||
>  		     new_intel_crtc_state->update_pipe))
>  			intel_color_load_luts(new_intel_crtc_state);
> @@ -14238,9 +14243,9 @@ intel_prepare_plane_fb(struct drm_plane *plane,
>  	int ret;
>  
>  	if (old_obj) {
> -		struct drm_crtc_state *crtc_state =
> -			drm_atomic_get_new_crtc_state(new_state->state,
> -						      plane->state->crtc);
> +		struct intel_crtc_state *crtc_state =
> +			intel_atomic_get_new_crtc_state(intel_state,
> +							plane->state->crtc);
>  
>  		/* Big Hammer, we also need to ensure that any pending
>  		 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
> @@ -14401,7 +14406,7 @@ static void intel_begin_crtc_commit(struct intel_atomic_state *state,
>  		intel_atomic_get_old_crtc_state(state, crtc);
>  	struct intel_crtc_state *new_crtc_state =
>  		intel_atomic_get_new_crtc_state(state, crtc);
> -	bool modeset = needs_modeset(&new_crtc_state->hw);
> +	bool modeset = needs_modeset(new_crtc_state);
>  
>  	/* Perform vblank evasion around commit operation */
>  	intel_pipe_update_start(new_crtc_state);
> @@ -14454,7 +14459,7 @@ static void intel_finish_crtc_commit(struct intel_atomic_state *state,
>  	intel_pipe_update_end(new_crtc_state);
>  
>  	if (new_crtc_state->update_pipe &&
> -	    !needs_modeset(&new_crtc_state->hw) &&
> +	    !needs_modeset(new_crtc_state) &&
>  	    old_crtc_state->hw.mode.private_flags & I915_MODE_FLAG_INHERITED)
>  		intel_crtc_arm_fifo_underrun(crtc, new_crtc_state);
>  }
> @@ -14608,6 +14613,7 @@ intel_legacy_cursor_update(struct drm_plane *plane,
>  		ret = -ENOMEM;
>  		goto out_free;
>  	}
> +	new_crtc_state->hw = new_crtc_state->uapi;
>  
>  	drm_atomic_set_fb_for_plane(new_plane_state, fb);
>  
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index ec50f9167161..d39ef2443ce9 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -713,7 +713,7 @@ enum intel_output_format {
>  };
>  
>  struct intel_crtc_state {
> -	struct drm_crtc_state hw;
> +	struct drm_crtc_state uapi, hw;
>  
>  	/**
>  	 * quirks - bitfield with hw state readout quirks
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2019-06-17 20:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-14 20:21 [RFC 0/2] Split crtc_state in sw and hw state Maarten Lankhorst
2019-06-14 20:21 ` [RFC 1/2] drm/i915: Rename intel_crtc_state->base to hw Maarten Lankhorst
2019-06-14 20:21 ` [RFC 2/2] [INCOMPLETE] drm/i915: Split up crtc_state into uapi and hw Maarten Lankhorst
2019-06-17 20:45   ` Manasi Navare [this message]
2019-06-14 20:29 ` ✗ Fi.CI.BAT: failure for Split crtc_state in sw and hw state Patchwork

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=20190617204530.GA14321@intel.com \
    --to=manasi.d.navare@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.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.