|
@@ -2733,6 +2733,65 @@ void sde_encoder_virt_restore(struct drm_encoder *drm_enc)
|
|
|
_sde_encoder_virt_enable_helper(drm_enc);
|
|
|
}
|
|
|
|
|
|
+static void sde_encoder_populate_encoder_phys(struct drm_encoder *drm_enc,
|
|
|
+ struct sde_encoder_virt *sde_enc, struct msm_display_mode *msm_mode)
|
|
|
+{
|
|
|
+ struct msm_compression_info *comp_info = &sde_enc->mode_info.comp_info;
|
|
|
+ struct msm_display_info *disp_info = &sde_enc->disp_info;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
|
+ struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
|
|
|
+
|
|
|
+ if (!phys)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ phys->comp_type = comp_info->comp_type;
|
|
|
+ phys->comp_ratio = comp_info->comp_ratio;
|
|
|
+ phys->frame_trigger_mode = sde_enc->frame_trigger_mode;
|
|
|
+ phys->poms_align_vsync = disp_info->poms_align_vsync;
|
|
|
+ if (phys->comp_type == MSM_DISPLAY_COMPRESSION_DSC) {
|
|
|
+ phys->dsc_extra_pclk_cycle_cnt =
|
|
|
+ comp_info->dsc_info.pclk_per_line;
|
|
|
+ phys->dsc_extra_disp_width =
|
|
|
+ comp_info->dsc_info.extra_width;
|
|
|
+ phys->dce_bytes_per_line =
|
|
|
+ comp_info->dsc_info.bytes_per_pkt *
|
|
|
+ comp_info->dsc_info.pkt_per_line;
|
|
|
+ } else if (phys->comp_type == MSM_DISPLAY_COMPRESSION_VDC) {
|
|
|
+ phys->dce_bytes_per_line =
|
|
|
+ comp_info->vdc_info.bytes_per_pkt *
|
|
|
+ comp_info->vdc_info.pkt_per_line;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (phys != sde_enc->cur_master) {
|
|
|
+ /**
|
|
|
+ * on DMS request, the encoder will be enabled
|
|
|
+ * already. Invoke restore to reconfigure the
|
|
|
+ * new mode.
|
|
|
+ */
|
|
|
+ if ((msm_is_mode_seamless_dms(msm_mode) ||
|
|
|
+ msm_is_mode_seamless_dyn_clk(msm_mode)) &&
|
|
|
+ phys->ops.restore)
|
|
|
+ phys->ops.restore(phys);
|
|
|
+ else if (phys->ops.enable)
|
|
|
+ phys->ops.enable(phys);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sde_enc->misr_enable && phys->ops.setup_misr &&
|
|
|
+ (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_VIDEO_MODE)))
|
|
|
+ phys->ops.setup_misr(phys, true,
|
|
|
+ sde_enc->misr_frame_count);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((msm_is_mode_seamless_dms(msm_mode) ||
|
|
|
+ msm_is_mode_seamless_dyn_clk(msm_mode)) &&
|
|
|
+ sde_enc->cur_master->ops.restore)
|
|
|
+ sde_enc->cur_master->ops.restore(sde_enc->cur_master);
|
|
|
+ else if (sde_enc->cur_master->ops.enable)
|
|
|
+ sde_enc->cur_master->ops.enable(sde_enc->cur_master);
|
|
|
+}
|
|
|
+
|
|
|
static void sde_encoder_off_work(struct kthread_work *work)
|
|
|
{
|
|
|
struct sde_encoder_virt *sde_enc = container_of(work,
|
|
@@ -2755,17 +2814,14 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|
|
struct sde_encoder_virt *sde_enc = NULL;
|
|
|
int i, ret = 0;
|
|
|
struct sde_connector_state *c_state;
|
|
|
- struct msm_compression_info *comp_info = NULL;
|
|
|
struct drm_display_mode *cur_mode = NULL;
|
|
|
struct msm_display_mode *msm_mode;
|
|
|
- struct msm_display_info *disp_info;
|
|
|
|
|
|
if (!drm_enc || !drm_enc->crtc) {
|
|
|
SDE_ERROR("invalid encoder\n");
|
|
|
return;
|
|
|
}
|
|
|
sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
- disp_info = &sde_enc->disp_info;
|
|
|
|
|
|
if (!sde_kms_power_resource_is_enabled(drm_enc->dev)) {
|
|
|
SDE_ERROR("power resource is not enabled\n");
|
|
@@ -2775,7 +2831,6 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|
|
if (!sde_enc->crtc)
|
|
|
sde_enc->crtc = drm_enc->crtc;
|
|
|
|
|
|
- comp_info = &sde_enc->mode_info.comp_info;
|
|
|
cur_mode = &sde_enc->base.crtc->state->adjusted_mode;
|
|
|
|
|
|
SDE_DEBUG_ENC(sde_enc, "\n");
|
|
@@ -2823,56 +2878,7 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
|
|
|
memset(&sde_enc->cur_master->intf_cfg_v1, 0,
|
|
|
sizeof(sde_enc->cur_master->intf_cfg_v1));
|
|
|
|
|
|
- for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
|
- struct sde_encoder_phys *phys = sde_enc->phys_encs[i];
|
|
|
-
|
|
|
- if (!phys)
|
|
|
- continue;
|
|
|
-
|
|
|
- phys->comp_type = comp_info->comp_type;
|
|
|
- phys->comp_ratio = comp_info->comp_ratio;
|
|
|
- phys->frame_trigger_mode = sde_enc->frame_trigger_mode;
|
|
|
- phys->poms_align_vsync = disp_info->poms_align_vsync;
|
|
|
- if (phys->comp_type == MSM_DISPLAY_COMPRESSION_DSC) {
|
|
|
- phys->dsc_extra_pclk_cycle_cnt =
|
|
|
- comp_info->dsc_info.pclk_per_line;
|
|
|
- phys->dsc_extra_disp_width =
|
|
|
- comp_info->dsc_info.extra_width;
|
|
|
- phys->dce_bytes_per_line =
|
|
|
- comp_info->dsc_info.bytes_per_pkt *
|
|
|
- comp_info->dsc_info.pkt_per_line;
|
|
|
- } else if (phys->comp_type == MSM_DISPLAY_COMPRESSION_VDC) {
|
|
|
- phys->dce_bytes_per_line =
|
|
|
- comp_info->vdc_info.bytes_per_pkt *
|
|
|
- comp_info->vdc_info.pkt_per_line;
|
|
|
- }
|
|
|
-
|
|
|
- if (phys != sde_enc->cur_master) {
|
|
|
- /**
|
|
|
- * on DMS request, the encoder will be enabled
|
|
|
- * already. Invoke restore to reconfigure the
|
|
|
- * new mode.
|
|
|
- */
|
|
|
- if ((msm_is_mode_seamless_dms(msm_mode) ||
|
|
|
- msm_is_mode_seamless_dyn_clk(msm_mode)) &&
|
|
|
- phys->ops.restore)
|
|
|
- phys->ops.restore(phys);
|
|
|
- else if (phys->ops.enable)
|
|
|
- phys->ops.enable(phys);
|
|
|
- }
|
|
|
-
|
|
|
- if (sde_enc->misr_enable && phys->ops.setup_misr &&
|
|
|
- (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_VIDEO_MODE)))
|
|
|
- phys->ops.setup_misr(phys, true,
|
|
|
- sde_enc->misr_frame_count);
|
|
|
- }
|
|
|
-
|
|
|
- if ((msm_is_mode_seamless_dms(msm_mode) ||
|
|
|
- msm_is_mode_seamless_dyn_clk(msm_mode)) &&
|
|
|
- sde_enc->cur_master->ops.restore)
|
|
|
- sde_enc->cur_master->ops.restore(sde_enc->cur_master);
|
|
|
- else if (sde_enc->cur_master->ops.enable)
|
|
|
- sde_enc->cur_master->ops.enable(sde_enc->cur_master);
|
|
|
+ sde_encoder_populate_encoder_phys(drm_enc, sde_enc, msm_mode);
|
|
|
|
|
|
_sde_encoder_virt_enable_helper(drm_enc);
|
|
|
}
|