diff mbox series

[v3,2/5] drm/msm/dp: Modify prototype of encoder based API

Message ID 20211001180058.1021913-3-bjorn.andersson@linaro.org
State Superseded
Headers show
Series drm/msm/dp: Support multiple DP instances and add sc8180x | expand

Commit Message

Bjorn Andersson Oct. 1, 2021, 6 p.m. UTC
Functions in the DisplayPort code that relates to individual instances
(encoders) are passed both the struct msm_dp and the struct drm_encoder. But
in a situation where multiple DP instances would exist this means that
the caller need to resolve which struct msm_dp relates to the struct
drm_encoder at hand.

Store a reference to the struct msm_dp associated with each
dpu_encoder_virt to allow the particular instance to be associate with
the encoder in the following patch.

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>

---

Changes since v2:
- None

 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 23 ++++++++++++---------
 1 file changed, 13 insertions(+), 10 deletions(-)

-- 
2.29.2

Comments

Abhinav Kumar Oct. 5, 2021, 8:13 p.m. UTC | #1
On 2021-10-01 11:00, Bjorn Andersson wrote:
> Functions in the DisplayPort code that relates to individual instances

> (encoders) are passed both the struct msm_dp and the struct 

> drm_encoder. But

> in a situation where multiple DP instances would exist this means that

> the caller need to resolve which struct msm_dp relates to the struct

> drm_encoder at hand.

> 

> Store a reference to the struct msm_dp associated with each

> dpu_encoder_virt to allow the particular instance to be associate with

> the encoder in the following patch.

> 

> Reviewed-by: Stephen Boyd <swboyd@chromium.org>

> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>

Reviewed-by: Abhinav Kumar <abhinavk@codeaurora.org>

> ---

> 

> Changes since v2:

> - None

> 

>  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 23 ++++++++++++---------

>  1 file changed, 13 insertions(+), 10 deletions(-)

> 

> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

> index 0e9d3fa1544b..b7f33da2799c 100644

> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

> @@ -168,6 +168,7 @@ enum dpu_enc_rc_states {

>   * @vsync_event_work:		worker to handle vsync event for autorefresh

>   * @topology:                   topology of the display

>   * @idle_timeout:		idle timeout duration in milliseconds

> + * @dp:				msm_dp pointer, for DP encoders

>   */

>  struct dpu_encoder_virt {

>  	struct drm_encoder base;

> @@ -206,6 +207,8 @@ struct dpu_encoder_virt {

>  	struct msm_display_topology topology;

> 

>  	u32 idle_timeout;

> +

> +	struct msm_dp *dp;

>  };

> 

>  #define to_dpu_encoder_virt(x) container_of(x, struct 

> dpu_encoder_virt, base)

> @@ -1000,8 +1003,8 @@ static void dpu_encoder_virt_mode_set(struct

> drm_encoder *drm_enc,

> 

>  	trace_dpu_enc_mode_set(DRMID(drm_enc));

> 

> -	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp)

> -		msm_dp_display_mode_set(priv->dp, drm_enc, mode, adj_mode);

> +	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS)

> +		msm_dp_display_mode_set(dpu_enc->dp, drm_enc, mode, adj_mode);

> 

>  	list_for_each_entry(conn_iter, connector_list, head)

>  		if (conn_iter->encoder == drm_enc)

> @@ -1182,9 +1185,8 @@ static void dpu_encoder_virt_enable(struct

> drm_encoder *drm_enc)

> 

>  	_dpu_encoder_virt_enable_helper(drm_enc);

> 

> -	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {

> -		ret = msm_dp_display_enable(priv->dp,

> -						drm_enc);

> +	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {

> +		ret = msm_dp_display_enable(dpu_enc->dp, drm_enc);

>  		if (ret) {

>  			DPU_ERROR_ENC(dpu_enc, "dp display enable failed: %d\n",

>  				ret);

> @@ -1224,8 +1226,8 @@ static void dpu_encoder_virt_disable(struct

> drm_encoder *drm_enc)

>  	/* wait for idle */

>  	dpu_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);

> 

> -	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {

> -		if (msm_dp_display_pre_disable(priv->dp, drm_enc))

> +	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {

> +		if (msm_dp_display_pre_disable(dpu_enc->dp, drm_enc))

>  			DPU_ERROR_ENC(dpu_enc, "dp display push idle failed\n");

>  	}

> 

> @@ -1253,8 +1255,8 @@ static void dpu_encoder_virt_disable(struct

> drm_encoder *drm_enc)

> 

>  	DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n");

> 

> -	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {

> -		if (msm_dp_display_disable(priv->dp, drm_enc))

> +	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {

> +		if (msm_dp_display_disable(dpu_enc->dp, drm_enc))

>  			DPU_ERROR_ENC(dpu_enc, "dp display disable failed\n");

>  	}

> 

> @@ -2170,7 +2172,8 @@ int dpu_encoder_setup(struct drm_device *dev,

> struct drm_encoder *enc,

>  		timer_setup(&dpu_enc->vsync_event_timer,

>  				dpu_encoder_vsync_event_handler,

>  				0);

> -

> +	else if (disp_info->intf_type == DRM_MODE_ENCODER_TMDS)

> +		dpu_enc->dp = priv->dp;

> 

>  	INIT_DELAYED_WORK(&dpu_enc->delayed_off_work,

>  			dpu_encoder_off_work);
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 0e9d3fa1544b..b7f33da2799c 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -168,6 +168,7 @@  enum dpu_enc_rc_states {
  * @vsync_event_work:		worker to handle vsync event for autorefresh
  * @topology:                   topology of the display
  * @idle_timeout:		idle timeout duration in milliseconds
+ * @dp:				msm_dp pointer, for DP encoders
  */
 struct dpu_encoder_virt {
 	struct drm_encoder base;
@@ -206,6 +207,8 @@  struct dpu_encoder_virt {
 	struct msm_display_topology topology;
 
 	u32 idle_timeout;
+
+	struct msm_dp *dp;
 };
 
 #define to_dpu_encoder_virt(x) container_of(x, struct dpu_encoder_virt, base)
@@ -1000,8 +1003,8 @@  static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc,
 
 	trace_dpu_enc_mode_set(DRMID(drm_enc));
 
-	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp)
-		msm_dp_display_mode_set(priv->dp, drm_enc, mode, adj_mode);
+	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS)
+		msm_dp_display_mode_set(dpu_enc->dp, drm_enc, mode, adj_mode);
 
 	list_for_each_entry(conn_iter, connector_list, head)
 		if (conn_iter->encoder == drm_enc)
@@ -1182,9 +1185,8 @@  static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc)
 
 	_dpu_encoder_virt_enable_helper(drm_enc);
 
-	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {
-		ret = msm_dp_display_enable(priv->dp,
-						drm_enc);
+	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {
+		ret = msm_dp_display_enable(dpu_enc->dp, drm_enc);
 		if (ret) {
 			DPU_ERROR_ENC(dpu_enc, "dp display enable failed: %d\n",
 				ret);
@@ -1224,8 +1226,8 @@  static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
 	/* wait for idle */
 	dpu_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
 
-	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {
-		if (msm_dp_display_pre_disable(priv->dp, drm_enc))
+	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {
+		if (msm_dp_display_pre_disable(dpu_enc->dp, drm_enc))
 			DPU_ERROR_ENC(dpu_enc, "dp display push idle failed\n");
 	}
 
@@ -1253,8 +1255,8 @@  static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc)
 
 	DPU_DEBUG_ENC(dpu_enc, "encoder disabled\n");
 
-	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS && priv->dp) {
-		if (msm_dp_display_disable(priv->dp, drm_enc))
+	if (drm_enc->encoder_type == DRM_MODE_ENCODER_TMDS) {
+		if (msm_dp_display_disable(dpu_enc->dp, drm_enc))
 			DPU_ERROR_ENC(dpu_enc, "dp display disable failed\n");
 	}
 
@@ -2170,7 +2172,8 @@  int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,
 		timer_setup(&dpu_enc->vsync_event_timer,
 				dpu_encoder_vsync_event_handler,
 				0);
-
+	else if (disp_info->intf_type == DRM_MODE_ENCODER_TMDS)
+		dpu_enc->dp = priv->dp;
 
 	INIT_DELAYED_WORK(&dpu_enc->delayed_off_work,
 			dpu_encoder_off_work);