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

Commit 7b29e484 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge ebb58746 on remote branch

Change-Id: Iaec94ffe9d0a2bbce672a63cb056930d440d07fd
parents cd79e021 ebb58746
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2022 The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -3194,6 +3194,7 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc,
		if (encoder->crtc != crtc)
			continue;

		sde_encoder_trigger_rsc_state_change(encoder);
		/* encoder will trigger pending mask now */
		sde_encoder_trigger_kickoff_pending(encoder);
	}
+41 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2022, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -4398,6 +4398,46 @@ bool sde_encoder_check_curr_mode(struct drm_encoder *drm_enc, u32 mode)
	return (disp_info->curr_panel_mode == mode);
}

void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc = NULL;
	int ret = 0;

	sde_enc = to_sde_encoder_virt(drm_enc);

	if (!sde_enc)
		return;

	mutex_lock(&sde_enc->rc_lock);
	/*
	 * In dual display case when secondary comes out of
	 * idle make sure RSC solver mode is disabled before
	 * setting CTL_PREPARE.
	 */
	if (!sde_enc->cur_master ||
		!sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE) ||
		sde_enc->disp_info.display_type == SDE_CONNECTOR_PRIMARY ||
		sde_enc->rc_state != SDE_ENC_RC_STATE_IDLE)
		goto end;

	/* enable all the clks and resources */
	ret = _sde_encoder_resource_control_helper(drm_enc, true);
	if (ret) {
		SDE_ERROR_ENC(sde_enc, "rc in state %d\n", sde_enc->rc_state);
		SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_EVTLOG_ERROR);
		goto end;
	}

	_sde_encoder_update_rsc_client(drm_enc, true);

	SDE_EVT32(DRMID(drm_enc), sde_enc->rc_state, SDE_ENC_RC_STATE_ON);
	sde_enc->rc_state = SDE_ENC_RC_STATE_ON;

end:
	mutex_unlock(&sde_enc->rc_lock);
}


void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc;
+7 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2022, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -96,6 +96,12 @@ void sde_encoder_get_hw_resources(struct drm_encoder *encoder,
		struct sde_encoder_hw_resources *hw_res,
		struct drm_connector_state *conn_state);

/**
 * sde_encoder_trigger_rsc_state_change - rsc state change.
 * @encoder:	encoder pointer
 */
void sde_encoder_trigger_rsc_state_change(struct drm_encoder *drm_enc);

/**
 * sde_encoder_register_vblank_callback - provide callback to encoder that
 *	will be called on the next vblank.
+5 −1
Original line number Diff line number Diff line
@@ -464,7 +464,11 @@ void *sde_debugfs_get_root(struct sde_kms *sde_kms);
 * These functions/definitions allow for building up a 'sde_info' structure
 * containing one or more "key=value\n" entries.
 */
#define SDE_KMS_INFO_MAX_SIZE	4096
#if IS_ENABLED(CONFIG_DRM_LOW_MSM_MEM_FOOTPRINT)
#define SDE_KMS_INFO_MAX_SIZE	(1 << 12)
#else
#define SDE_KMS_INFO_MAX_SIZE	(1 << 14)
#endif

/**
 * struct sde_kms_info - connector information structure container