|
@@ -215,6 +215,36 @@ ktime_t sde_encoder_calc_last_vsync_timestamp(struct drm_encoder *drm_enc)
|
|
|
return tvblank;
|
|
|
}
|
|
|
|
|
|
+static void _sde_encoder_control_fal10_veto(struct drm_encoder *drm_enc, bool veto)
|
|
|
+{
|
|
|
+ bool clone_mode;
|
|
|
+ struct sde_kms *sde_kms = sde_encoder_get_kms(drm_enc);
|
|
|
+ struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
+ struct sde_uidle_cfg *uidle_cfg;
|
|
|
+
|
|
|
+ if (!sde_kms->catalog || !sde_kms->hw_uidle ||
|
|
|
+ !sde_kms->hw_uidle->ops.uidle_fal10_override) {
|
|
|
+ SDE_ERROR("invalid args\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * clone mode is the only scenario where we want to enable software override
|
|
|
+ * of fal10 veto.
|
|
|
+ */
|
|
|
+ uidle_cfg = &sde_kms->catalog->uidle_cfg;
|
|
|
+ clone_mode = sde_encoder_in_clone_mode(drm_enc);
|
|
|
+ SDE_EVT32(DRMID(drm_enc), clone_mode, veto);
|
|
|
+
|
|
|
+ if (clone_mode && veto) {
|
|
|
+ sde_kms->hw_uidle->ops.uidle_fal10_override(sde_kms->hw_uidle, veto);
|
|
|
+ sde_enc->fal10_veto_override = true;
|
|
|
+ } else if (sde_enc->fal10_veto_override && !veto) {
|
|
|
+ sde_kms->hw_uidle->ops.uidle_fal10_override(sde_kms->hw_uidle, veto);
|
|
|
+ sde_enc->fal10_veto_override = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void _sde_encoder_pm_qos_add_request(struct drm_encoder *drm_enc)
|
|
|
{
|
|
|
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
|
@@ -2802,6 +2832,7 @@ static void _sde_encoder_virt_enable_helper(struct drm_encoder *drm_enc)
|
|
|
|
|
|
memset(&sde_enc->prv_conn_roi, 0, sizeof(sde_enc->prv_conn_roi));
|
|
|
memset(&sde_enc->cur_conn_roi, 0, sizeof(sde_enc->cur_conn_roi));
|
|
|
+ _sde_encoder_control_fal10_veto(drm_enc, true);
|
|
|
}
|
|
|
|
|
|
static void _sde_encoder_setup_dither(struct sde_encoder_phys *phys)
|
|
@@ -3065,6 +3096,8 @@ void sde_encoder_virt_reset(struct drm_encoder *drm_enc)
|
|
|
struct sde_kms *sde_kms = sde_encoder_get_kms(drm_enc);
|
|
|
int i = 0;
|
|
|
|
|
|
+ _sde_encoder_control_fal10_veto(drm_enc, false);
|
|
|
+
|
|
|
for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
|
if (sde_enc->phys_encs[i]) {
|
|
|
sde_enc->phys_encs[i]->cont_splash_enabled = false;
|