linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeykumar Sankaran <jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: Sean Paul <sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org>
Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org,
	hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org,
	freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: Re: [PATCH 10/14] drm/msm/dpu: move hw resource tracking to crtc state
Date: Fri, 31 Aug 2018 12:22:04 -0700	[thread overview]
Message-ID: <b09b0a69d6b72ae170c0b02f6acfb9d5@codeaurora.org> (raw)
In-Reply-To: <20180831145647.GB91962@art_vandelay>

On 2018-08-31 07:56, Sean Paul wrote:
> On Tue, Aug 28, 2018 at 05:39:59PM -0700, Jeykumar Sankaran wrote:
>> Prep changes for state based resource management.
>> 
>> Moves all the hw block tracking for the crtc to the state
>> object.
> 
> Changes in v4...
> 
>> 
>> Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
>> ---
>>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 60
> ++++++++++++++++++--------------
>>  drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 22 ++++++------
>>  2 files changed, 44 insertions(+), 38 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> index e061847..7ab320d 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
>> @@ -163,9 +163,9 @@ static void _dpu_crtc_program_lm_output_roi(struct
> drm_crtc *crtc)
>>  	crtc_state = to_dpu_crtc_state(crtc->state);
>> 
>>  	lm_horiz_position = 0;
>> -	for (lm_idx = 0; lm_idx < dpu_crtc->num_mixers; lm_idx++) {
>> +	for (lm_idx = 0; lm_idx < crtc_state->num_mixers; lm_idx++) {
>>  		const struct drm_rect *lm_roi =
> &crtc_state->lm_bounds[lm_idx];
>> -		struct dpu_hw_mixer *hw_lm =
> dpu_crtc->mixers[lm_idx].hw_lm;
>> +		struct dpu_hw_mixer *hw_lm =
> crtc_state->mixers[lm_idx].hw_lm;
>>  		struct dpu_hw_mixer_cfg cfg;
>> 
>>  		if (!lm_roi || !drm_rect_visible(lm_roi))
>> @@ -246,7 +246,7 @@ static void _dpu_crtc_blend_setup_mixer(struct
> drm_crtc *crtc,
>>  					   fb ? fb->modifier : 0);
>> 
>>  		/* blend config update */
>> -		for (lm_idx = 0; lm_idx < dpu_crtc->num_mixers; lm_idx++)
> {
>> +		for (lm_idx = 0; lm_idx < cstate->num_mixers; lm_idx++) {
>>  			_dpu_crtc_setup_blend_cfg(mixer + lm_idx,
>>  						pstate, format);
>> 
>> @@ -270,7 +270,7 @@ static void _dpu_crtc_blend_setup_mixer(struct
> drm_crtc *crtc,
>>  static void _dpu_crtc_blend_setup(struct drm_crtc *crtc)
>>  {
>>  	struct dpu_crtc *dpu_crtc;
>> -	struct dpu_crtc_state *dpu_crtc_state;
>> +	struct dpu_crtc_state *cstate;
>>  	struct dpu_crtc_mixer *mixer;
>>  	struct dpu_hw_ctl *ctl;
>>  	struct dpu_hw_mixer *lm;
>> @@ -281,17 +281,17 @@ static void _dpu_crtc_blend_setup(struct 
>> drm_crtc
> *crtc)
>>  		return;
>> 
>>  	dpu_crtc = to_dpu_crtc(crtc);
>> -	dpu_crtc_state = to_dpu_crtc_state(crtc->state);
>> -	mixer = dpu_crtc->mixers;
>> +	cstate = to_dpu_crtc_state(crtc->state);
>> +	mixer = cstate->mixers;
>> 
>>  	DPU_DEBUG("%s\n", dpu_crtc->name);
>> 
>> -	if (dpu_crtc->num_mixers > CRTC_DUAL_MIXERS) {
>> -		DPU_ERROR("invalid number mixers: %d\n",
> dpu_crtc->num_mixers);
>> +	if (cstate->num_mixers > CRTC_DUAL_MIXERS) {
> 
> This is not possible.
> 
>> +		DPU_ERROR("invalid number mixers: %d\n",
> cstate->num_mixers);
>>  		return;
>>  	}
>> 
>> -	for (i = 0; i < dpu_crtc->num_mixers; i++) {
>> +	for (i = 0; i < cstate->num_mixers; i++) {
>>  		if (!mixer[i].hw_lm || !mixer[i].hw_ctl) {
>>  			DPU_ERROR("invalid lm or ctl assigned to
> mixer\n");
>>  			return;
>> @@ -308,7 +308,7 @@ static void _dpu_crtc_blend_setup(struct drm_crtc
> *crtc)
>> 
>>  	_dpu_crtc_blend_setup_mixer(crtc, dpu_crtc, mixer);
>> 
>> -	for (i = 0; i < dpu_crtc->num_mixers; i++) {
>> +	for (i = 0; i < cstate->num_mixers; i++) {
>>  		ctl = mixer[i].hw_ctl;
>>  		lm = mixer[i].hw_lm;
>> 
>> @@ -530,7 +530,7 @@ static void _dpu_crtc_setup_mixer_for_encoder(
>>  		struct drm_crtc *crtc,
>>  		struct drm_encoder *enc)
>>  {
>> -	struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
>> +	struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
>>  	struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
>>  	struct dpu_rm *rm = &dpu_kms->rm;
>>  	struct dpu_crtc_mixer *mixer;
>> @@ -542,8 +542,8 @@ static void _dpu_crtc_setup_mixer_for_encoder(
>>  	dpu_rm_init_hw_iter(&ctl_iter, enc->base.id, DPU_HW_BLK_CTL);
>> 
>>  	/* Set up all the mixers and ctls reserved by this encoder */
>> -	for (i = dpu_crtc->num_mixers; i < ARRAY_SIZE(dpu_crtc->mixers);
> i++) {
>> -		mixer = &dpu_crtc->mixers[i];
>> +	for (i = cstate->num_mixers; i < ARRAY_SIZE(cstate->mixers); i++)
> {
>> +		mixer = &cstate->mixers[i];
>> 
>>  		if (!dpu_rm_get_hw(rm, &lm_iter))
>>  			break;
>> @@ -568,7 +568,7 @@ static void _dpu_crtc_setup_mixer_for_encoder(
>> 
>>  		mixer->encoder = enc;
>> 
>> -		dpu_crtc->num_mixers++;
>> +		cstate->num_mixers++;
>>  		DPU_DEBUG("setup mixer %d: lm %d\n",
>>  				i, mixer->hw_lm->idx - LM_0);
>>  		DPU_DEBUG("setup mixer %d: ctl %d\n",
>> @@ -579,11 +579,11 @@ static void _dpu_crtc_setup_mixer_for_encoder(
>>  static void _dpu_crtc_setup_mixers(struct drm_crtc *crtc)
>>  {
>>  	struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
>> +	struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
>>  	struct drm_encoder *enc;
>> 
>> -	dpu_crtc->num_mixers = 0;
>> -	dpu_crtc->mixers_swapped = false;
>> -	memset(dpu_crtc->mixers, 0, sizeof(dpu_crtc->mixers));
>> +	cstate->num_mixers = 0;
>> +	memset(cstate->mixers, 0, sizeof(cstate->mixers));
> 
> Why is this necessary?
> 
>> 
>>  	mutex_lock(&dpu_crtc->crtc_lock);
>>  	/* Check for mixers on all encoders attached to this crtc */
>> @@ -618,7 +618,7 @@ static void _dpu_crtc_setup_lm_bounds(struct
> drm_crtc *crtc,
>>  	crtc_split_width = _dpu_crtc_get_mixer_width(dpu_crtc, cstate,
>>  						    adj_mode);
>> 
>> -	for (i = 0; i < dpu_crtc->num_mixers; i++) {
>> +	for (i = 0; i < cstate->num_mixers; i++) {
>>  		struct drm_rect *r = &cstate->lm_bounds[i];
>>  		r->x1 = crtc_split_width * i;
>>  		r->y1 = 0;
>> @@ -635,6 +635,7 @@ static void dpu_crtc_atomic_begin(struct drm_crtc
> *crtc,
>>  		struct drm_crtc_state *old_state)
>>  {
>>  	struct dpu_crtc *dpu_crtc;
>> +	struct dpu_crtc_state *cstate;
>>  	struct drm_encoder *encoder;
>>  	struct drm_device *dev;
>>  	unsigned long flags;
>> @@ -654,10 +655,11 @@ static void dpu_crtc_atomic_begin(struct 
>> drm_crtc
> *crtc,
>>  	DPU_DEBUG("crtc%d\n", crtc->base.id);
>> 
>>  	dpu_crtc = to_dpu_crtc(crtc);
>> +	cstate = to_dpu_crtc_state(crtc->state);
>>  	dev = crtc->dev;
>>  	smmu_state = &dpu_crtc->smmu_state;
>> 
>> -	if (!dpu_crtc->num_mixers) {
>> +	if (!cstate->num_mixers) {
>>  		_dpu_crtc_setup_mixers(crtc);
>>  		_dpu_crtc_setup_lm_bounds(crtc, crtc->state);
>>  	}
>> @@ -684,7 +686,7 @@ static void dpu_crtc_atomic_begin(struct drm_crtc
> *crtc,
>>  	 * it means we are trying to flush a CRTC whose state is disabled:
>>  	 * nothing else needs to be done.
>>  	 */
>> -	if (unlikely(!dpu_crtc->num_mixers))
>> +	if (unlikely(!cstate->num_mixers))
>>  		return;
>> 
>>  	_dpu_crtc_blend_setup(crtc);
>> @@ -748,7 +750,7 @@ static void dpu_crtc_atomic_flush(struct drm_crtc
> *crtc,
>>  	 * it means we are trying to flush a CRTC whose state is disabled:
>>  	 * nothing else needs to be done.
>>  	 */
>> -	if (unlikely(!dpu_crtc->num_mixers))
>> +	if (unlikely(!cstate->num_mixers))
>>  		return;
>> 
>>  	/*
>> @@ -863,7 +865,7 @@ void dpu_crtc_commit_kickoff(struct drm_crtc 
>> *crtc)
>>  	 * it means we are trying to start a CRTC whose state is disabled:
>>  	 * nothing else needs to be done.
>>  	 */
>> -	if (unlikely(!dpu_crtc->num_mixers))
>> +	if (unlikely(!cstate->num_mixers))
>>  		return;
>> 
>>  	DPU_ATRACE_BEGIN("crtc_commit");
>> @@ -1097,12 +1099,14 @@ static void dpu_crtc_handle_power_event(u32
> event_type, void *arg)
>>  	struct drm_crtc *crtc = arg;
>>  	struct dpu_crtc *dpu_crtc;
>>  	struct drm_encoder *encoder;
>> +	struct dpu_crtc_state *cstate;
>> 
>>  	if (!crtc) {
>>  		DPU_ERROR("invalid crtc\n");
>>  		return;
>>  	}
>>  	dpu_crtc = to_dpu_crtc(crtc);
>> +	cstate = to_dpu_crtc_state(dpu_crtc->base.state);
>> 
>>  	mutex_lock(&dpu_crtc->crtc_lock);
>> 
>> @@ -1197,9 +1201,8 @@ static void dpu_crtc_disable(struct drm_crtc
> *crtc)
>>  		dpu_power_handle_unregister_event(dpu_crtc->phandle,
>>  				dpu_crtc->power_event);
>> 
>> -	memset(dpu_crtc->mixers, 0, sizeof(dpu_crtc->mixers));
>> -	dpu_crtc->num_mixers = 0;
>> -	dpu_crtc->mixers_swapped = false;
>> +	memset(cstate->mixers, 0, sizeof(cstate->mixers));
> 
> Same question here, why is this necessary?
> 
>> +	cstate->num_mixers = 0;
>> 
>>  	/* disable clk & bw control until clk & bw properties are set */
>>  	cstate->bw_control = false;
>> @@ -1547,6 +1550,8 @@ static int _dpu_debugfs_status_show(struct
> seq_file *s, void *data)
>> 
>>  	dpu_crtc = s->private;
>>  	crtc = &dpu_crtc->base;
>> +
>> +	drm_modeset_lock(&crtc->mutex, NULL);
> 
> When I suggested this, I was hoping you'd put it in a separate patch.
> Additionally, you'll probably want modeset_lock_all instead.

crtc state retrieval is introduced in this patch. So I thought it would 
make
sense to add the locking as well a part of this patch.

> 
>>  	cstate = to_dpu_crtc_state(crtc->state);
>> 
>>  	mutex_lock(&dpu_crtc->crtc_lock);
>> @@ -1558,8 +1563,8 @@ static int _dpu_debugfs_status_show(struct
> seq_file *s, void *data)
>> 
>>  	seq_puts(s, "\n");
>> 
>> -	for (i = 0; i < dpu_crtc->num_mixers; ++i) {
>> -		m = &dpu_crtc->mixers[i];
>> +	for (i = 0; i < cstate->num_mixers; ++i) {
>> +		m = &cstate->mixers[i];
>>  		if (!m->hw_lm)
>>  			seq_printf(s, "\tmixer[%d] has no lm\n", i);
>>  		else if (!m->hw_ctl)
>> @@ -1639,6 +1644,7 @@ static int _dpu_debugfs_status_show(struct
> seq_file *s, void *data)
>>  	seq_printf(s, "vblank_enable:%d\n", dpu_crtc->vblank_requested);
>> 
>>  	mutex_unlock(&dpu_crtc->crtc_lock);
>> +	drm_modeset_unlock(&crtc->mutex);
>> 
>>  	return 0;
>>  }
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
>> index 5e4dc5c..7aa772f 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h
>> @@ -121,11 +121,6 @@ struct dpu_crtc_frame_event {
>>   * struct dpu_crtc - virtualized CRTC data structure
>>   * @base          : Base drm crtc structure
>>   * @name          : ASCII description of this crtc
>> - * @num_ctls      : Number of ctl paths in use
>> - * @num_mixers    : Number of mixers in use
>> - * @mixers_swapped: Whether the mixers have been swapped for 
>> left/right
> update
>> - *                  especially in the case of DSC Merge.
>> - * @mixers        : List of active mixers
>>   * @event         : Pointer to last received drm vblank event. If 
>> there
> is a
>>   *                  pending vblank event, this will be non-null.
>>   * @vsync_count   : Running count of received vsync events
>> @@ -164,12 +159,6 @@ struct dpu_crtc {
>>  	struct drm_crtc base;
>>  	char name[DPU_CRTC_NAME_SIZE];
>> 
>> -	/* HW Resources reserved for the crtc */
>> -	u32 num_ctls;
>> -	u32 num_mixers;
>> -	bool mixers_swapped;
>> -	struct dpu_crtc_mixer mixers[CRTC_DUAL_MIXERS];
>> -
>>  	struct drm_pending_vblank_event *event;
>>  	u32 vsync_count;
>> 
>> @@ -221,6 +210,10 @@ struct dpu_crtc {
>>   * @property_values: Current crtc property values
>>   * @input_fence_timeout_ns : Cached input fence timeout, in ns
>>   * @new_perf: new performance state being requested
>> + * @num_mixers    : Number of mixers in use
>> + * @mixers        : List of active mixers
>> + * @num_ctls      : Number of ctl paths in use
>> + * @hw_ctls       : List of active ctl paths
>>   */
>>  struct dpu_crtc_state {
>>  	struct drm_crtc_state base;
>> @@ -232,6 +225,13 @@ struct dpu_crtc_state {
>>  	uint64_t input_fence_timeout_ns;
>> 
>>  	struct dpu_core_perf_params new_perf;
>> +
>> +	/* HW Resources reserved for the crtc */
>> +	u32 num_mixers;
>> +	struct dpu_crtc_mixer mixers[CRTC_DUAL_MIXERS];
>> +
>> +	u32 num_ctls;
>> +	struct dpu_hw_ctl *hw_ctls[CRTC_DUAL_MIXERS];
>>  };
>> 
>>  #define to_dpu_crtc_state(x) \
>> --
>> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora
> Forum,
>> a Linux Foundation Collaborative Project
>> 

-- 
Jeykumar S
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

  reply	other threads:[~2018-08-31 19:22 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-29  0:39 [PATCH 00/14] clean up DPU for RM refactor Jeykumar Sankaran
2018-08-29  0:39 ` [PATCH 01/14] drm/msm/dpu: remove debugfs support for misr Jeykumar Sankaran
     [not found]   ` <1535503203-22054-2-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-30 16:15     ` Sean Paul
     [not found] ` <1535503203-22054-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-29  0:39   ` [PATCH 02/14] drm/msm/dpu: remove scalar config definitions Jeykumar Sankaran
2018-08-29  0:39   ` [PATCH 03/14] drm/msm/dpu: remove resource pool manager Jeykumar Sankaran
2018-08-29  0:39   ` [PATCH 04/14] drm/msm/dpu: remove ping pong split topology variables Jeykumar Sankaran
2018-08-29  0:39   ` [PATCH 05/14] drm/msm/dpu: enable master-slave encoders explicitly Jeykumar Sankaran
2018-08-30 16:24     ` Sean Paul
2018-08-31 19:16       ` Jeykumar Sankaran
     [not found]         ` <3c3232c852b8f3a17955322c8ec3fbd8-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-31 20:12           ` Sean Paul
2018-08-29  0:39   ` [PATCH 06/14] drm/msm/dpu: use kms stored hw mdp block Jeykumar Sankaran
2018-08-29  0:39   ` [PATCH 07/14] drm/msm/dpu: iterate for assigned hw ctl in virtual encoder Jeykumar Sankaran
     [not found]     ` <1535503203-22054-8-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-30 16:28       ` Sean Paul
2018-08-29  0:39   ` [PATCH 08/14] drm/msm/dpu: avoid querying for hw intf before assignment Jeykumar Sankaran
     [not found]     ` <1535503203-22054-9-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-30 16:39       ` Sean Paul
2018-08-29  0:39   ` [PATCH 09/14] drm/msm/dpu: make crtc get_mixer_width helper static Jeykumar Sankaran
2018-08-31 14:40     ` Sean Paul
2018-08-29  0:39   ` [PATCH 10/14] drm/msm/dpu: move hw resource tracking to crtc state Jeykumar Sankaran
2018-08-31 14:56     ` Sean Paul
2018-08-31 19:22       ` Jeykumar Sankaran [this message]
     [not found]         ` <b09b0a69d6b72ae170c0b02f6acfb9d5-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-31 20:13           ` Sean Paul
2018-09-04 22:36       ` Jeykumar Sankaran
2018-08-29  0:40   ` [PATCH 11/14] drm/msm/dpu: rename hw_ctl to lm_ctl Jeykumar Sankaran
2018-08-31 15:54     ` Sean Paul
2018-08-29  0:40   ` [PATCH 12/14] drm/msm/dpu: remove topology name Jeykumar Sankaran
     [not found]     ` <1535503203-22054-13-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-31 16:08       ` Sean Paul
2018-09-04 23:03         ` Jeykumar Sankaran
     [not found]           ` <6e6b8dd4bbc3343c82b3e093db23b6f5-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-09-05 13:33             ` Sean Paul
2018-08-29  0:40   ` [PATCH 13/14] drm/msm/dpu: remove display H_TILE from encoder Jeykumar Sankaran
2018-08-31 16:10     ` Sean Paul
2018-08-29  0:40   ` [PATCH 14/14] drm/msm/dpu: remove cdm block support from resource manager Jeykumar Sankaran
     [not found]     ` <1535503203-22054-15-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-31 16:12       ` Sean Paul

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=b09b0a69d6b72ae170c0b02f6acfb9d5@codeaurora.org \
    --to=jsanka-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
    --cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
    --cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=sean-p7yTbzM4H96eqtR555YLDQ@public.gmane.org \
    --cc=seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).