Skip to content

Commit e8cd822

Browse files
Jessica Zhanglumag
authored andcommitted
drm/msm/dpu: Set possible clones for all encoders
Set writeback encoders as possible clones for DSI encoders and vice versa. Reviewed-by: Dmitry Baryshkov <[email protected]> Reviewed-by: Abhinav Kumar <[email protected]> Signed-off-by: Jessica Zhang <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/637498/ Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent ad06972 commit e8cd822

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2569,6 +2569,38 @@ static int dpu_encoder_virt_add_phys_encs(
25692569
return 0;
25702570
}
25712571

2572+
/**
2573+
* dpu_encoder_get_clones - Calculate the possible_clones for DPU encoder
2574+
* @drm_enc: DRM encoder pointer
2575+
* Returns: possible_clones mask
2576+
*/
2577+
uint32_t dpu_encoder_get_clones(struct drm_encoder *drm_enc)
2578+
{
2579+
struct drm_encoder *curr;
2580+
int type = drm_enc->encoder_type;
2581+
uint32_t clone_mask = drm_encoder_mask(drm_enc);
2582+
2583+
/*
2584+
* Set writeback as possible clones of real-time DSI encoders and vice
2585+
* versa
2586+
*
2587+
* Writeback encoders can't be clones of each other and DSI
2588+
* encoders can't be clones of each other.
2589+
*
2590+
* TODO: Add DP encoders as valid possible clones for writeback encoders
2591+
* (and vice versa) once concurrent writeback has been validated for DP
2592+
*/
2593+
drm_for_each_encoder(curr, drm_enc->dev) {
2594+
if ((type == DRM_MODE_ENCODER_VIRTUAL &&
2595+
curr->encoder_type == DRM_MODE_ENCODER_DSI) ||
2596+
(type == DRM_MODE_ENCODER_DSI &&
2597+
curr->encoder_type == DRM_MODE_ENCODER_VIRTUAL))
2598+
clone_mask |= drm_encoder_mask(curr);
2599+
}
2600+
2601+
return clone_mask;
2602+
}
2603+
25722604
static int dpu_encoder_setup_display(struct dpu_encoder_virt *dpu_enc,
25732605
struct dpu_kms *dpu_kms,
25742606
struct msm_display_info *disp_info)

drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ enum dpu_intf_mode dpu_encoder_get_intf_mode(struct drm_encoder *encoder);
6060

6161
void dpu_encoder_virt_runtime_resume(struct drm_encoder *encoder);
6262

63+
uint32_t dpu_encoder_get_clones(struct drm_encoder *drm_enc);
64+
6365
struct drm_encoder *dpu_encoder_init(struct drm_device *dev,
6466
int drm_enc_mode,
6567
struct msm_display_info *disp_info);

drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/*
33
* Copyright (C) 2013 Red Hat
44
* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
5-
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
5+
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
66
*
77
* Author: Rob Clark <[email protected]>
88
*/
@@ -824,8 +824,11 @@ static int _dpu_kms_drm_obj_init(struct dpu_kms *dpu_kms)
824824
return ret;
825825

826826
num_encoders = 0;
827-
drm_for_each_encoder(encoder, dev)
827+
drm_for_each_encoder(encoder, dev) {
828828
num_encoders++;
829+
if (catalog->cwb_count > 0)
830+
encoder->possible_clones = dpu_encoder_get_clones(encoder);
831+
}
829832

830833
max_crtc_count = min(catalog->mixer_count, num_encoders);
831834

0 commit comments

Comments
 (0)