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

Commit ff4609ec authored by Clarence Ip's avatar Clarence Ip
Browse files

drm/msm/sde: add xin halt api for vbif



This patch provides a new API call to selectively enable
and disable halting of a single VBIF port. This is needed
during recovery use cases to recover from VBIF errors and
prevent spurious requests from being serviced during
recovery operations.

Change-Id: I543cd25d9e2d9bceb2a22b5952c9123bc191fbe8
Signed-off-by: default avatarClarence Ip <cip@codeaurora.org>
parent 85f4f453
Loading
Loading
Loading
Loading
+56 −2
Original line number Diff line number Diff line
@@ -230,13 +230,15 @@ void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,

	for (i = 0; i < ARRAY_SIZE(sde_kms->hw_vbif); i++) {
		if (sde_kms->hw_vbif[i] &&
				sde_kms->hw_vbif[i]->idx == params->vbif_idx)
				sde_kms->hw_vbif[i]->idx == params->vbif_idx) {
			vbif = sde_kms->hw_vbif[i];
			break;
		}
	}

	if (!vbif || !mdp) {
		SDE_DEBUG("invalid arguments vbif %d mdp %d\n",
				vbif != 0, mdp != 0);
				vbif != NULL, mdp != NULL);
		return;
	}

@@ -275,6 +277,58 @@ void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
	return;
}

bool sde_vbif_set_xin_halt(struct sde_kms *sde_kms,
		struct sde_vbif_set_xin_halt_params *params)
{
	struct sde_hw_vbif *vbif = NULL;
	struct sde_hw_mdp *mdp;
	bool forced_on = false;
	int ret, i;

	if (!sde_kms || !params) {
		SDE_ERROR("invalid arguments\n");
		return false;
	}
	mdp = sde_kms->hw_mdp;

	for (i = 0; i < ARRAY_SIZE(sde_kms->hw_vbif); i++) {
		if (sde_kms->hw_vbif[i] &&
				sde_kms->hw_vbif[i]->idx == params->vbif_idx) {
			vbif = sde_kms->hw_vbif[i];
			break;
		}
	}

	if (!vbif || !mdp) {
		SDE_DEBUG("invalid arguments vbif %d mdp %d\n",
				vbif != NULL, mdp != NULL);
		return false;
	}

	if (!mdp->ops.setup_clk_force_ctrl ||
			!vbif->ops.set_halt_ctrl)
		return false;

	if (params->enable) {
		forced_on = mdp->ops.setup_clk_force_ctrl(mdp,
				params->clk_ctrl, true);

		vbif->ops.set_halt_ctrl(vbif, params->xin_id, true);

		ret = _sde_vbif_wait_for_xin_halt(vbif, params->xin_id);
		if (ret)
			SDE_EVT32(vbif->idx, params->xin_id, SDE_EVTLOG_ERROR);
	} else {
		vbif->ops.set_halt_ctrl(vbif, params->xin_id, false);

		if (params->forced_on)
			mdp->ops.setup_clk_force_ctrl(mdp,
					params->clk_ctrl, false);
	}

	return forced_on;
}

void sde_vbif_set_qos_remap(struct sde_kms *sde_kms,
		struct sde_vbif_set_qos_params *params)
{
+27 −0
Original line number Diff line number Diff line
@@ -34,6 +34,23 @@ struct sde_vbif_set_memtype_params {
	bool is_cacheable;
};

/**
 * struct sde_vbif_set_xin_halt_params - xin halt parameters
 * @vbif_idx: vbif identifier
 * @xin_id: client interface identifier
 * @clk_ctrl: clock control identifier of the xin
 * @forced_on: whether or not previous call to xin halt forced the clocks on,
 *	only applicable to xin halt disable calls
 * @enable: whether to enable/disable xin halts
 */
struct sde_vbif_set_xin_halt_params {
	u32 vbif_idx;
	u32 xin_id;
	u32 clk_ctrl;
	bool forced_on;
	bool enable;
};

/**
 * struct sde_vbif_set_qos_params - QoS remapper parameter
 * @vbif_idx: vbif identifier
@@ -58,6 +75,16 @@ struct sde_vbif_set_qos_params {
void sde_vbif_set_ot_limit(struct sde_kms *sde_kms,
		struct sde_vbif_set_ot_params *params);

/**
 * sde_vbif_set_xin_halt - halt one of the xin ports
 *	This function isn't thread safe.
 * @sde_kms:	SDE handler
 * @params:	Pointer to halt configuration parameters
 * Returns:	Whether or not VBIF clocks were forced on
 */
bool sde_vbif_set_xin_halt(struct sde_kms *sde_kms,
		struct sde_vbif_set_xin_halt_params *params);

/**
 * sde_vbif_set_qos_remap - set QoS priority level remap
 * @sde_kms:	SDE handler