Pārlūkot izejas kodu

Merge "disp: msm: sde: software override for fal10 in cwb enable"

qctecmdr 3 gadi atpakaļ
vecāks
revīzija
46849f2f19
4 mainītis faili ar 58 papildinājumiem un 1 dzēšanām
  1. 33 0
      msm/sde/sde_encoder.c
  2. 3 0
      msm/sde/sde_encoder.h
  3. 15 1
      msm/sde/sde_hw_uidle.c
  4. 7 0
      msm/sde/sde_hw_uidle.h

+ 33 - 0
msm/sde/sde_encoder.c

@@ -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;

+ 3 - 0
msm/sde/sde_encoder.h

@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
  * Copyright (C) 2013 Red Hat
  * Author: Rob Clark <[email protected]>
@@ -169,6 +170,7 @@ enum sde_enc_rc_states {
  * @cur_conn_roi:		current connector roi
  * @prv_conn_roi:		previous connector roi to optimize if unchanged
  * @crtc			pointer to drm_crtc
+ * @fal10_veto_override:	software override for micro idle fal10 veto
  * @recovery_events_enabled:	status of hw recovery feature enable by client
  * @elevated_ahb_vote:		increase AHB bus speed for the first frame
  *				after power collapse
@@ -241,6 +243,7 @@ struct sde_encoder_virt {
 	struct sde_rect prv_conn_roi;
 	struct drm_crtc *crtc;
 
+	bool fal10_veto_override;
 	bool recovery_events_enabled;
 	bool elevated_ahb_vote;
 	struct dev_pm_qos_request pm_qos_cpu_req[NR_CPUS];

+ 15 - 1
msm/sde/sde_hw_uidle.c

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  *
  */
@@ -202,6 +202,19 @@ static void sde_hw_uilde_active_override(struct sde_hw_uidle *uidle,
 	SDE_REG_WRITE(c, UIDLE_QACTIVE_HF_OVERRIDE, reg_val);
 }
 
+static void sde_hw_uidle_fal10_override(struct sde_hw_uidle *uidle,
+		bool enable)
+{
+	struct sde_hw_blk_reg_map *c = &uidle->hw;
+	u32 reg_val = 0;
+
+	if (enable)
+		reg_val = BIT(0) | BIT(31);
+
+	SDE_REG_WRITE(c, UIDLE_FAL10_VETO_OVERRIDE, reg_val);
+	wmb();
+}
+
 static inline void _setup_uidle_ops(struct sde_hw_uidle_ops *ops,
 		unsigned long cap)
 {
@@ -212,6 +225,7 @@ static inline void _setup_uidle_ops(struct sde_hw_uidle_ops *ops,
 	ops->uidle_get_status = sde_hw_uidle_get_status;
 	if (cap & BIT(SDE_UIDLE_QACTIVE_OVERRIDE))
 		ops->active_override_enable = sde_hw_uilde_active_override;
+	ops->uidle_fal10_override = sde_hw_uidle_fal10_override;
 }
 
 struct sde_hw_uidle *sde_hw_uidle_init(enum sde_uidle idx,

+ 7 - 0
msm/sde/sde_hw_uidle.h

@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /*
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  *
  */
@@ -118,6 +119,12 @@ struct sde_hw_uidle_ops {
 	 */
 	void (*active_override_enable)(struct sde_hw_uidle *uidle,
 			bool enable);
+	/**
+	 * uidle_fal10_overrride - enable/disable fal10 override
+	 * @uidle: uidle context driver
+	 * @enable: enable/disable
+	 */
+	void (*uidle_fal10_override)(struct sde_hw_uidle *uidle, bool enable);
 };
 
 struct sde_hw_uidle {