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

Commit a2a3c5e8 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: cache encoder_mask for vblank_work"

parents 318dfe07 aa064ada
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -156,7 +156,6 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
			old_conn_state, i) {
		const struct drm_encoder_helper_funcs *funcs;
		struct drm_encoder *encoder;
		struct drm_crtc_state *old_crtc_state;

		/*
		 * Shut down everything that's in the changeset and currently
+0 −3
Original line number Diff line number Diff line
@@ -366,7 +366,6 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
					int crtc_id, bool enable)
{
	struct vblank_work *cur_work;
	struct drm_crtc *crtc;
	struct kthread_worker *worker;

	if (!priv || crtc_id >= priv->num_crtcs)
@@ -376,8 +375,6 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
	if (!cur_work)
		return -ENOMEM;

	crtc = priv->crtcs[crtc_id];

	kthread_init_work(&cur_work->work, vblank_ctrl_worker);
	cur_work->crtc_id = crtc_id;
	cur_work->enable = enable;
+21 −21
Original line number Diff line number Diff line
@@ -3823,13 +3823,13 @@ void sde_crtc_commit_kickoff(struct drm_crtc *crtc,
}

/**
 * _sde_crtc_vblank_enable_no_lock - update power resource and vblank request
 * _sde_crtc_vblank_enable - update power resource and vblank request
 * @sde_crtc: Pointer to sde crtc structure
 * @enable: Whether to enable/disable vblanks
 *
 * @Return: error code
 */
static int _sde_crtc_vblank_enable_no_lock(
static int _sde_crtc_vblank_enable(
		struct sde_crtc *sde_crtc, bool enable)
{
	struct drm_crtc *crtc;
@@ -3841,38 +3841,38 @@ static int _sde_crtc_vblank_enable_no_lock(
	}

	crtc = &sde_crtc->base;
	SDE_EVT32(DRMID(crtc), enable, sde_crtc->enabled,
			crtc->state->encoder_mask,
			sde_crtc->cached_encoder_mask);

	if (enable) {
		int ret;

		/* drop lock since power crtc cb may try to re-acquire lock */
		mutex_unlock(&sde_crtc->crtc_lock);
		ret = pm_runtime_get_sync(crtc->dev->dev);
		mutex_lock(&sde_crtc->crtc_lock);
		if (ret < 0)
			return ret;

		mutex_lock(&sde_crtc->crtc_lock);
		drm_for_each_encoder_mask(enc, crtc->dev,
				crtc->state->encoder_mask) {
			SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable,
					sde_crtc->enabled);
				sde_crtc->cached_encoder_mask) {
			SDE_EVT32(DRMID(crtc), DRMID(enc));

			sde_encoder_register_vblank_callback(enc,
					sde_crtc_vblank_cb, (void *)crtc);
		}

		mutex_unlock(&sde_crtc->crtc_lock);
	} else {
		mutex_lock(&sde_crtc->crtc_lock);
		drm_for_each_encoder_mask(enc, crtc->dev,
				crtc->state->encoder_mask) {
			SDE_EVT32(DRMID(&sde_crtc->base), DRMID(enc), enable,
					sde_crtc->enabled);
				sde_crtc->cached_encoder_mask) {
			SDE_EVT32(DRMID(crtc), DRMID(enc));

			sde_encoder_register_vblank_callback(enc, NULL, NULL);
		}

		/* drop lock since power crtc cb may try to re-acquire lock */
		mutex_unlock(&sde_crtc->crtc_lock);
		pm_runtime_put_sync(crtc->dev->dev);
		mutex_lock(&sde_crtc->crtc_lock);
	}

	return 0;
@@ -4168,9 +4168,10 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
	kthread_cancel_delayed_work_sync(&sde_crtc->static_cache_read_work);
	kthread_cancel_delayed_work_sync(&sde_crtc->idle_notify_work);

	SDE_EVT32(DRMID(crtc), sde_crtc->enabled,
			crtc->state->active, crtc->state->enable);
	SDE_EVT32(DRMID(crtc), sde_crtc->enabled, crtc->state->active,
			crtc->state->enable, sde_crtc->cached_encoder_mask);
	sde_crtc->enabled = false;
	sde_crtc->cached_encoder_mask = 0;

	/* Try to disable uidle */
	sde_core_perf_crtc_update_uidle(crtc, false);
@@ -4279,8 +4280,11 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
	 * Avoid drm_crtc_vblank_on during seamless DMS case
	 * when CRTC is already in enabled state
	 */
	if (!sde_crtc->enabled)
	if (!sde_crtc->enabled) {
		/* cache the encoder mask now for vblank work */
		sde_crtc->cached_encoder_mask = crtc->state->encoder_mask;
		drm_crtc_vblank_on(crtc);
	}

	mutex_lock(&sde_crtc->crtc_lock);
	SDE_EVT32(DRMID(crtc), sde_crtc->enabled);
@@ -5119,15 +5123,11 @@ int sde_crtc_vblank(struct drm_crtc *crtc, bool en)
	}
	sde_crtc = to_sde_crtc(crtc);

	mutex_lock(&sde_crtc->crtc_lock);
	SDE_EVT32(DRMID(&sde_crtc->base), en, sde_crtc->enabled);
	ret = _sde_crtc_vblank_enable_no_lock(sde_crtc, en);
	ret = _sde_crtc_vblank_enable(sde_crtc, en);
	if (ret)
		SDE_ERROR("%s vblank enable failed: %d\n",
				sde_crtc->name, ret);

	mutex_unlock(&sde_crtc->crtc_lock);

	return 0;
}

+2 −0
Original line number Diff line number Diff line
@@ -291,6 +291,7 @@ struct sde_crtc_misr_info {
 * @static_cache_read_work: delayed worker to transition cache state to read
 * @cache_state     : Current static image cache state
 * @dspp_blob_info  : blob containing dspp hw capability information
 * @cached_encoder_mask : cached encoder_mask for vblank work
 */
struct sde_crtc {
	struct drm_crtc base;
@@ -381,6 +382,7 @@ struct sde_crtc {
	enum sde_crtc_cache_state cache_state;

	struct drm_property_blob *dspp_blob_info;
	u32 cached_encoder_mask;
};

enum sde_crtc_dirty_flags {