summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder.c17
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys.h2
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c1
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c1
-rw-r--r--drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c23
-rw-r--r--drivers/gpu/drm/msm/sde/sde_kms.h7
6 files changed, 46 insertions, 5 deletions
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c
index 67190a3448d0..773bc02aac7f 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.c
@@ -837,6 +837,23 @@ int sde_encoder_wait_for_commit_done(struct drm_encoder *drm_enc)
return ret;
}
+enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder)
+{
+ struct sde_encoder_virt *sde_enc = NULL;
+ enum sde_intf_mode intf_mode = INTF_MODE_NONE;
+
+ if (!encoder) {
+ SDE_ERROR("invalid encoder\n");
+ return INTF_MODE_NONE;
+ }
+
+ sde_enc = to_sde_encoder_virt(encoder);
+ if (sde_enc->cur_master)
+ intf_mode = sde_enc->cur_master->intf_mode;
+
+ return intf_mode;
+}
+
/* encoders init,
* initialize encoder based on displays
*/
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
index e63c2b31f425..e17486c6e934 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys.h
@@ -136,6 +136,7 @@ enum sde_enc_enable_state {
* @cached_mode: DRM mode cached at mode_set time, acted on in enable
* @enabled: Whether the encoder has enabled and running a mode
* @split_role: Role to play in a split-panel configuration
+ * @intf_mode: Interface mode
* @spin_lock: Lock for IRQ purposes
* @mode_3d: 3D mux configuration
* @enable_state: Enable state tracking
@@ -152,6 +153,7 @@ struct sde_encoder_phys {
struct sde_kms *sde_kms;
struct drm_display_mode cached_mode;
enum sde_enc_split_role split_role;
+ enum sde_intf_mode intf_mode;
spinlock_t spin_lock;
enum sde_3d_blend_mode mode_3d;
enum sde_enc_enable_state enable_state;
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
index 64c69dabd862..9cb9ecf30600 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_cmd.c
@@ -499,6 +499,7 @@ struct sde_encoder_phys *sde_encoder_phys_cmd_init(
phys_enc->parent_ops = p->parent_ops;
phys_enc->sde_kms = p->sde_kms;
phys_enc->split_role = p->split_role;
+ phys_enc->intf_mode = INTF_MODE_CMD;
spin_lock_init(&phys_enc->spin_lock);
phys_enc->mode_3d = BLEND_3D_NONE;
cmd_enc->stream_sel = 0;
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c
index cb9f2c11c689..ee5d010a77e1 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c
@@ -668,6 +668,7 @@ struct sde_encoder_phys *sde_encoder_phys_vid_init(
phys_enc->parent_ops = p->parent_ops;
phys_enc->sde_kms = p->sde_kms;
phys_enc->split_role = p->split_role;
+ phys_enc->intf_mode = INTF_MODE_VIDEO;
spin_lock_init(&phys_enc->spin_lock);
init_completion(&vid_enc->vblank_completion);
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
index c94ee486d8b1..1adf5533ea87 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
@@ -154,14 +154,21 @@ static void sde_encoder_phys_wb_setup_fb(struct sde_encoder_phys *phys_enc,
struct drm_framebuffer *fb, struct sde_rect *wb_roi)
{
struct sde_encoder_phys_wb *wb_enc = to_sde_encoder_phys_wb(phys_enc);
- struct sde_hw_wb *hw_wb = wb_enc->hw_wb;
- struct sde_hw_wb_cfg *wb_cfg = &wb_enc->wb_cfg;
+ struct sde_hw_wb *hw_wb;
+ struct sde_hw_wb_cfg *wb_cfg;
const struct msm_format *format;
int ret, mmu_id;
+ if (!phys_enc) {
+ SDE_ERROR("invalid encoder\n");
+ return;
+ }
+
+ hw_wb = wb_enc->hw_wb;
+ wb_cfg = &wb_enc->wb_cfg;
memset(wb_cfg, 0, sizeof(struct sde_hw_wb_cfg));
- wb_cfg->intf_mode = INTF_MODE_WB_LINE;
+ wb_cfg->intf_mode = phys_enc->intf_mode;
wb_cfg->is_secure = (fb->flags & DRM_MODE_FB_SECURE) ? true : false;
mmu_id = (wb_cfg->is_secure) ?
wb_enc->mmu_id[SDE_IOMMU_DOMAIN_SECURE] :
@@ -806,10 +813,15 @@ static void sde_encoder_phys_wb_get_hw_resources(
struct drm_connector_state *conn_state)
{
struct sde_encoder_phys_wb *wb_enc = to_sde_encoder_phys_wb(phys_enc);
- struct sde_hw_wb *hw_wb = wb_enc->hw_wb;
+ struct sde_hw_wb *hw_wb;
+ if (!phys_enc) {
+ SDE_ERROR("invalid encoder\n");
+ return;
+ }
+ hw_wb = wb_enc->hw_wb;
SDE_DEBUG("[wb:%d]\n", hw_wb->idx - WB_0);
- hw_res->wbs[hw_wb->idx - WB_0] = INTF_MODE_WB_LINE;
+ hw_res->wbs[hw_wb->idx - WB_0] = phys_enc->intf_mode;
hw_res->needs_cdm = phys_enc->needs_cdm;
}
@@ -1006,6 +1018,7 @@ struct sde_encoder_phys *sde_encoder_phys_wb_init(
phys_enc->parent_ops = p->parent_ops;
phys_enc->sde_kms = p->sde_kms;
phys_enc->split_role = p->split_role;
+ phys_enc->intf_mode = INTF_MODE_WB_LINE;
spin_lock_init(&phys_enc->spin_lock);
ret = sde_encoder_phys_wb_init_debugfs(phys_enc, p->sde_kms);
diff --git a/drivers/gpu/drm/msm/sde/sde_kms.h b/drivers/gpu/drm/msm/sde/sde_kms.h
index 3e2d18fbdf86..6f1628151511 100644
--- a/drivers/gpu/drm/msm/sde/sde_kms.h
+++ b/drivers/gpu/drm/msm/sde/sde_kms.h
@@ -605,6 +605,13 @@ void sde_encoder_schedule_kickoff(struct drm_encoder *encoder,
int sde_encoder_wait_for_commit_done(struct drm_encoder *drm_encoder);
/**
+ * sde_encoder_get_intf_mode - returns current underlying interface mode
+ * @encoder: encoder pointer
+ * Returns: Interface mode of underlying physical master encoder
+ */
+enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder);
+
+/**
* sde_encoders_init - query platform, create all encoders and bridges,
* and register them with the drm_device
* @dev: drm device pointer