Re: [PATCH 16/17] drm/msm/dpu: reserve CDM blocks for DP if mode is YUV420

2024-01-27 Thread Paloma Arellano



On 1/25/2024 2:01 PM, Dmitry Baryshkov wrote:

On 25/01/2024 21:38, Paloma Arellano wrote:

Reserve CDM blocks for DP if the mode format is YUV420. Currently this
reservation only works for writeback and DP if the format is YUV420. But
this can be easily extented to other YUV formats for DP.

Signed-off-by: Paloma Arellano 
---
  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 20 +---
  1 file changed, 13 insertions(+), 7 deletions(-)

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

index 99ec53446ad21..c7dcda3d54ae6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -613,6 +613,7 @@ static int dpu_encoder_virt_atomic_check(
  struct dpu_kms *dpu_kms;
  struct drm_display_mode *adj_mode;
  struct msm_display_topology topology;
+    struct msm_display_info *disp_info;
  struct dpu_global_state *global_state;
  struct drm_framebuffer *fb;
  struct drm_dsc_config *dsc;
@@ -629,6 +630,7 @@ static int dpu_encoder_virt_atomic_check(
  DPU_DEBUG_ENC(dpu_enc, "\n");
    priv = drm_enc->dev->dev_private;
+    disp_info = _enc->disp_info;
  dpu_kms = to_dpu_kms(priv->kms);
  adj_mode = _state->adjusted_mode;
  global_state = dpu_kms_get_global_state(crtc_state->state);
@@ -656,8 +658,8 @@ static int dpu_encoder_virt_atomic_check(
  topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode, 
crtc_state, dsc);

    /*
- * Use CDM only for writeback at the moment as other interfaces 
cannot handle it.
- * if writeback itself cannot handle cdm for some reason it will 
fail in its atomic_check()
+ * Use CDM only for writeback or DP at the moment as other 
interfaces cannot handle it.
+ * If writeback itself cannot handle cdm for some reason it will 
fail in its atomic_check()

   * earlier.
   */
  if (dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) {

@@ -665,12 +667,15 @@ static int dpu_encoder_virt_atomic_check(
    if (fb && 
DPU_FORMAT_IS_YUV(to_dpu_format(msm_framebuffer_format(fb

  topology.needs_cdm = true;
-    if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
-    crtc_state->mode_changed = true;
-    else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
-    crtc_state->mode_changed = true;
+    } else if (dpu_enc->disp_info.intf_type == INTF_DP) {


You can use disp_info directly here.

Ack


+    if 
(msm_dp_is_yuv_420_enabled(priv->dp[disp_info->h_tile_instance[0]], 
adj_mode))

+    topology.needs_cdm = true;
  }
  +    if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
+    crtc_state->mode_changed = true;
+    else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
+    crtc_state->mode_changed = true;
  /*
   * Release and Allocate resources on every modeset
   * Dont allocate when active is false.
@@ -,7 +1116,8 @@ static void 
dpu_encoder_virt_atomic_mode_set(struct drm_encoder *drm_enc,

    dpu_enc->dsc_mask = dsc_mask;
  -    if (dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) {
+    if ((dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) ||

+    dpu_enc->disp_info.intf_type == INTF_DP) {
  struct dpu_hw_blk *hw_cdm = NULL;
    dpu_rm_get_assigned_resources(_kms->rm, global_state,




Re: [PATCH 16/17] drm/msm/dpu: reserve CDM blocks for DP if mode is YUV420

2024-01-25 Thread Dmitry Baryshkov

On 25/01/2024 21:38, Paloma Arellano wrote:

Reserve CDM blocks for DP if the mode format is YUV420. Currently this
reservation only works for writeback and DP if the format is YUV420. But
this can be easily extented to other YUV formats for DP.

Signed-off-by: Paloma Arellano 
---
  drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 20 +---
  1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 99ec53446ad21..c7dcda3d54ae6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -613,6 +613,7 @@ static int dpu_encoder_virt_atomic_check(
struct dpu_kms *dpu_kms;
struct drm_display_mode *adj_mode;
struct msm_display_topology topology;
+   struct msm_display_info *disp_info;
struct dpu_global_state *global_state;
struct drm_framebuffer *fb;
struct drm_dsc_config *dsc;
@@ -629,6 +630,7 @@ static int dpu_encoder_virt_atomic_check(
DPU_DEBUG_ENC(dpu_enc, "\n");
  
  	priv = drm_enc->dev->dev_private;

+   disp_info = _enc->disp_info;
dpu_kms = to_dpu_kms(priv->kms);
adj_mode = _state->adjusted_mode;
global_state = dpu_kms_get_global_state(crtc_state->state);
@@ -656,8 +658,8 @@ static int dpu_encoder_virt_atomic_check(
topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode, 
crtc_state, dsc);
  
  	/*

-* Use CDM only for writeback at the moment as other interfaces cannot 
handle it.
-* if writeback itself cannot handle cdm for some reason it will fail 
in its atomic_check()
+* Use CDM only for writeback or DP at the moment as other interfaces 
cannot handle it.
+* If writeback itself cannot handle cdm for some reason it will fail 
in its atomic_check()
 * earlier.
 */
if (dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) {
@@ -665,12 +667,15 @@ static int dpu_encoder_virt_atomic_check(
  
  		if (fb && DPU_FORMAT_IS_YUV(to_dpu_format(msm_framebuffer_format(fb

topology.needs_cdm = true;
-   if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
-   crtc_state->mode_changed = true;
-   else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
-   crtc_state->mode_changed = true;
+   } else if (dpu_enc->disp_info.intf_type == INTF_DP) {


You can use disp_info directly here.


+   if 
(msm_dp_is_yuv_420_enabled(priv->dp[disp_info->h_tile_instance[0]], adj_mode))
+   topology.needs_cdm = true;
}
  
+	if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)

+   crtc_state->mode_changed = true;
+   else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
+   crtc_state->mode_changed = true;
/*
 * Release and Allocate resources on every modeset
 * Dont allocate when active is false.
@@ -,7 +1116,8 @@ static void dpu_encoder_virt_atomic_mode_set(struct 
drm_encoder *drm_enc,
  
  	dpu_enc->dsc_mask = dsc_mask;
  
-	if (dpu_enc->disp_info.intf_type == INTF_WB && conn_state->writeback_job) {

+   if ((dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) ||
+   dpu_enc->disp_info.intf_type == INTF_DP) {
struct dpu_hw_blk *hw_cdm = NULL;
  
  		dpu_rm_get_assigned_resources(_kms->rm, global_state,


--
With best wishes
Dmitry



[PATCH 16/17] drm/msm/dpu: reserve CDM blocks for DP if mode is YUV420

2024-01-25 Thread Paloma Arellano
Reserve CDM blocks for DP if the mode format is YUV420. Currently this
reservation only works for writeback and DP if the format is YUV420. But
this can be easily extented to other YUV formats for DP.

Signed-off-by: Paloma Arellano 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 20 +---
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
index 99ec53446ad21..c7dcda3d54ae6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
@@ -613,6 +613,7 @@ static int dpu_encoder_virt_atomic_check(
struct dpu_kms *dpu_kms;
struct drm_display_mode *adj_mode;
struct msm_display_topology topology;
+   struct msm_display_info *disp_info;
struct dpu_global_state *global_state;
struct drm_framebuffer *fb;
struct drm_dsc_config *dsc;
@@ -629,6 +630,7 @@ static int dpu_encoder_virt_atomic_check(
DPU_DEBUG_ENC(dpu_enc, "\n");
 
priv = drm_enc->dev->dev_private;
+   disp_info = _enc->disp_info;
dpu_kms = to_dpu_kms(priv->kms);
adj_mode = _state->adjusted_mode;
global_state = dpu_kms_get_global_state(crtc_state->state);
@@ -656,8 +658,8 @@ static int dpu_encoder_virt_atomic_check(
topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode, 
crtc_state, dsc);
 
/*
-* Use CDM only for writeback at the moment as other interfaces cannot 
handle it.
-* if writeback itself cannot handle cdm for some reason it will fail 
in its atomic_check()
+* Use CDM only for writeback or DP at the moment as other interfaces 
cannot handle it.
+* If writeback itself cannot handle cdm for some reason it will fail 
in its atomic_check()
 * earlier.
 */
if (dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) {
@@ -665,12 +667,15 @@ static int dpu_encoder_virt_atomic_check(
 
if (fb && 
DPU_FORMAT_IS_YUV(to_dpu_format(msm_framebuffer_format(fb
topology.needs_cdm = true;
-   if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
-   crtc_state->mode_changed = true;
-   else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
-   crtc_state->mode_changed = true;
+   } else if (dpu_enc->disp_info.intf_type == INTF_DP) {
+   if 
(msm_dp_is_yuv_420_enabled(priv->dp[disp_info->h_tile_instance[0]], adj_mode))
+   topology.needs_cdm = true;
}
 
+   if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
+   crtc_state->mode_changed = true;
+   else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
+   crtc_state->mode_changed = true;
/*
 * Release and Allocate resources on every modeset
 * Dont allocate when active is false.
@@ -,7 +1116,8 @@ static void dpu_encoder_virt_atomic_mode_set(struct 
drm_encoder *drm_enc,
 
dpu_enc->dsc_mask = dsc_mask;
 
-   if (dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) {
+   if ((dpu_enc->disp_info.intf_type == INTF_WB && 
conn_state->writeback_job) ||
+   dpu_enc->disp_info.intf_type == INTF_DP) {
struct dpu_hw_blk *hw_cdm = NULL;
 
dpu_rm_get_assigned_resources(_kms->rm, global_state,
-- 
2.39.2