Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e6719f4 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: remove frame done wait from sde_crtc"

parents 1fec8757 cfb6064e
Loading
Loading
Loading
Loading
+9 −42
Original line number Diff line number Diff line
@@ -2380,7 +2380,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
	struct sde_crtc *sde_crtc;
	struct sde_kms *sde_kms;
	unsigned long flags;
	bool frame_done = false;
	bool in_clone_mode = false;

	if (!work) {
@@ -2435,10 +2434,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
			SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event,
							SDE_EVTLOG_FUNC_CASE3);
		}

		if (fevent->event & (SDE_ENCODER_FRAME_EVENT_DONE
					| SDE_ENCODER_FRAME_EVENT_ERROR))
			frame_done = true;
	}

	if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE) {
@@ -2459,9 +2454,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
		SDE_ERROR("crtc%d ts:%lld received panel dead event\n",
				crtc->base.id, ktime_to_ns(fevent->ts));

	if (frame_done)
		complete_all(&sde_crtc->frame_done_comp);

	spin_lock_irqsave(&sde_crtc->spin_lock, flags);
	list_add_tail(&fevent->list, &sde_crtc->frame_event_list);
	spin_unlock_irqrestore(&sde_crtc->spin_lock, flags);
@@ -3341,10 +3333,10 @@ static void sde_crtc_destroy_state(struct drm_crtc *crtc,
			&cstate->property_state);
}

static int _sde_crtc_wait_for_frame_done(struct drm_crtc *crtc)
static int _sde_crtc_flush_event_thread(struct drm_crtc *crtc)
{
	struct sde_crtc *sde_crtc;
	int ret, rc = 0, i;
	int i;

	if (!crtc) {
		SDE_ERROR("invalid argument\n");
@@ -3368,17 +3360,9 @@ static int _sde_crtc_wait_for_frame_done(struct drm_crtc *crtc)
			kthread_flush_work(&sde_crtc->frame_events[i].work);
	}

	ret = wait_for_completion_timeout(&sde_crtc->frame_done_comp,
			msecs_to_jiffies(SDE_FRAME_DONE_TIMEOUT));
	if (!ret) {
		SDE_ERROR("frame done completion wait timed out, ret:%d\n",
				ret);
		SDE_EVT32(DRMID(crtc), SDE_EVTLOG_FATAL);
		rc = -ETIMEDOUT;
	}
	SDE_EVT32_VERBOSE(DRMID(crtc), SDE_EVTLOG_FUNC_EXIT);

	return rc;
	return 0;
}

static int _sde_crtc_commit_kickoff_rot(struct drm_crtc *crtc,
@@ -3705,7 +3689,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
	struct sde_kms *sde_kms;
	struct sde_crtc_state *cstate;
	bool is_error, reset_req;
	int ret;

	if (!crtc) {
		SDE_ERROR("invalid argument\n");
@@ -3764,23 +3747,11 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
	}
	sde_crtc->reset_request = reset_req;

	/* wait for frame_event_done completion */
	SDE_ATRACE_BEGIN("wait_for_frame_done_event");
	ret = _sde_crtc_wait_for_frame_done(crtc);
	SDE_ATRACE_END("wait_for_frame_done_event");
	SDE_ATRACE_BEGIN("flush_event_thread");
	_sde_crtc_flush_event_thread(crtc);
	SDE_ATRACE_END("flush_event_thread");
	sde_crtc_calc_fps(sde_crtc);

	if (ret) {
		SDE_ERROR("crtc%d wait for frame done failed;frame_pending%d\n",
				crtc->base.id,
				atomic_read(&sde_crtc->frame_pending));

		is_error = true;

		/* force offline rotation mode since the commit has no pipes */
		cstate->sbuf_cfg.rot_op_mode = SDE_CTL_ROT_OP_MODE_OFFLINE;
	}

	if (atomic_inc_return(&sde_crtc->frame_pending) == 1) {
		/* acquire bandwidth and other resources */
		SDE_DEBUG("crtc%d first commit\n", crtc->base.id);
@@ -3818,7 +3789,6 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
		sde_encoder_kickoff(encoder, false);
	}

	reinit_completion(&sde_crtc->frame_done_comp);
	SDE_ATRACE_END("crtc_commit");
	return;
}
@@ -4219,11 +4189,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
	if (cstate->num_ds_enabled)
		sde_crtc->ds_reconfig = true;

	/* wait for frame_event_done completion */
	if (_sde_crtc_wait_for_frame_done(crtc))
		SDE_ERROR("crtc%d wait for frame done failed;frame_pending%d\n",
				crtc->base.id,
				atomic_read(&sde_crtc->frame_pending));
	_sde_crtc_flush_event_thread(crtc);

	SDE_EVT32(DRMID(crtc), sde_crtc->enabled, sde_crtc->suspend,
			sde_crtc->vblank_requested,
@@ -4238,6 +4204,8 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
	sde_crtc->enabled = false;

	if (atomic_read(&sde_crtc->frame_pending)) {
		SDE_ERROR("crtc%d frame_pending%d\n", crtc->base.id,
				atomic_read(&sde_crtc->frame_pending));
		SDE_EVT32(DRMID(crtc), atomic_read(&sde_crtc->frame_pending),
							SDE_EVTLOG_FUNC_CASE2);
		sde_core_perf_crtc_release_bw(crtc);
@@ -6097,7 +6065,6 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane)
	mutex_init(&sde_crtc->rp_lock);
	INIT_LIST_HEAD(&sde_crtc->rp_head);

	init_completion(&sde_crtc->frame_done_comp);
	sde_crtc->enabled = false;

	INIT_LIST_HEAD(&sde_crtc->frame_event_list);
+0 −2
Original line number Diff line number Diff line
@@ -190,7 +190,6 @@ struct sde_crtc_fps_info {
 * @frame_events  : static allocation of in-flight frame events
 * @frame_event_list : available frame event list
 * @spin_lock     : spin lock for frame event, transaction status, etc...
 * @frame_done_comp    : for frame_event_done synchronization
 * @event_thread  : Pointer to event handler thread
 * @event_worker  : Event worker queue
 * @event_cache   : Local cache of event worker structures
@@ -262,7 +261,6 @@ struct sde_crtc {
	struct sde_crtc_frame_event frame_events[SDE_CRTC_FRAME_EVENT_SIZE];
	struct list_head frame_event_list;
	spinlock_t spin_lock;
	struct completion frame_done_comp;

	/* for handling internal event thread */
	struct sde_crtc_event event_cache[SDE_CRTC_MAX_EVENT_COUNT];