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

Commit e123c17f authored by Lloyd Atkinson's avatar Lloyd Atkinson
Browse files

drm/msm/sde: add prepare_commit callback to sde encoder



Allow the sde encoder to react to prepare_commit at the
beginning of an atomic commit sequence to support features like
autorefresh which need to be disabled before any other register
writes take place.

Change-Id: I2891eeba0cc9cdb6f3c6a5c2cc3542d74fa3ba1e
Signed-off-by: default avatarLloyd Atkinson <latkinso@codeaurora.org>
parent 45da92f9
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -2228,6 +2228,25 @@ int sde_encoder_helper_hw_release(struct sde_encoder_phys *phys_enc,
	return 0;
}

void sde_encoder_prepare_commit(struct drm_encoder *drm_enc)
{
	struct sde_encoder_virt *sde_enc;
	struct sde_encoder_phys *phys;
	int i;

	if (!drm_enc) {
		SDE_ERROR("invalid encoder\n");
		return;
	}
	sde_enc = to_sde_encoder_virt(drm_enc);

	for (i = 0; i < sde_enc->num_phys_encs; i++) {
		phys = sde_enc->phys_encs[i];
		if (phys && phys->ops.prepare_commit)
			phys->ops.prepare_commit(phys);
	}
}

#ifdef CONFIG_DEBUG_FS
static int _sde_encoder_status_show(struct seq_file *s, void *data)
{
+7 −0
Original line number Diff line number Diff line
@@ -179,4 +179,11 @@ struct drm_encoder *sde_encoder_init(
 */
void sde_encoder_destroy(struct drm_encoder *drm_enc);

/**
 * sde_encoder_prepare_commit - prepare encoder at the very beginning of an
 *	atomic commit, before any registers are written
 * @drm_enc:    Pointer to previously created drm encoder structure
 */
void sde_encoder_prepare_commit(struct drm_encoder *drm_enc);

#endif /* __SDE_ENCODER_H__ */
+2 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ struct sde_encoder_virt_ops {
 * struct sde_encoder_phys_ops - Interface the physical encoders provide to
 *	the containing virtual encoder.
 * @late_register:		DRM Call. Add Userspace interfaces, debugfs.
 * @prepare_commit:		MSM Atomic Call, start of atomic commit sequence
 * @is_master:			Whether this phys_enc is the current master
 *				encoder. Can be switched at enable time. Based
 *				on split_role and current mode (CMD/VID).
@@ -127,6 +128,7 @@ struct sde_encoder_virt_ops {
struct sde_encoder_phys_ops {
	int (*late_register)(struct sde_encoder_phys *encoder,
			struct dentry *debugfs_root);
	void (*prepare_commit)(struct sde_encoder_phys *encoder);
	bool (*is_master)(struct sde_encoder_phys *encoder);
	bool (*mode_fixup)(struct sde_encoder_phys *encoder,
			const struct drm_display_mode *mode,
+6 −0
Original line number Diff line number Diff line
@@ -864,9 +864,15 @@ static void sde_encoder_phys_cmd_update_split_role(
	_sde_encoder_phys_cmd_update_flush_mask(phys_enc);
}

static void sde_encoder_phys_cmd_prepare_commit(
		struct sde_encoder_phys *phys_enc)
{
}

static void sde_encoder_phys_cmd_init_ops(
		struct sde_encoder_phys_ops *ops)
{
	ops->prepare_commit = sde_encoder_phys_cmd_prepare_commit;
	ops->is_master = sde_encoder_phys_cmd_is_master;
	ops->mode_set = sde_encoder_phys_cmd_mode_set;
	ops->mode_fixup = sde_encoder_phys_cmd_mode_fixup;
+10 −2
Original line number Diff line number Diff line
@@ -353,16 +353,24 @@ static void sde_kms_prepare_commit(struct msm_kms *kms,
{
	struct sde_kms *sde_kms;
	struct msm_drm_private *priv;
	struct drm_device *dev;
	struct drm_encoder *encoder;

	if (!kms)
		return;
	sde_kms = to_sde_kms(kms);
	dev = sde_kms->dev;

	if (!sde_kms->dev || !sde_kms->dev->dev_private)
	if (!dev || !dev->dev_private)
		return;
	priv = sde_kms->dev->dev_private;
	priv = dev->dev_private;

	sde_power_resource_enable(&priv->phandle, sde_kms->core_client, true);

	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
		if (encoder->crtc != NULL)
			sde_encoder_prepare_commit(encoder);

}

static void sde_kms_commit(struct msm_kms *kms,