Loading drivers/gpu/drm/msm/sde/sde_crtc.c +1 −2 Original line number Diff line number Diff line Loading @@ -1459,7 +1459,7 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc, continue; cstate->rsc_client = sde_encoder_update_rsc_client(encoder, true); sde_encoder_get_rsc_client(encoder); } cstate->rsc_update = true; } Loading Loading @@ -1796,7 +1796,6 @@ static void sde_crtc_disable(struct drm_crtc *crtc) if (encoder->crtc != crtc) continue; sde_encoder_register_frame_event_callback(encoder, NULL, NULL); sde_encoder_update_rsc_client(encoder, false); cstate->rsc_client = NULL; cstate->rsc_update = false; } Loading drivers/gpu/drm/msm/sde/sde_encoder.c +69 −51 Original line number Diff line number Diff line Loading @@ -656,6 +656,71 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc) return ret; } static int sde_encoder_update_rsc_client( struct drm_encoder *drm_enc, bool enable) { struct sde_encoder_virt *sde_enc; enum sde_rsc_state rsc_state; struct sde_rsc_cmd_config rsc_config; int ret; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return -EINVAL; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; /** * only primary command mode panel can request CMD state. * all other panels/displays can request for VID state including * secondary command mode panel. */ rsc_state = enable ? (((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) && disp_info->is_primary) ? SDE_RSC_CMD_STATE : SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE; if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update && disp_info->is_primary) { rsc_config.fps = disp_info->frame_rate; rsc_config.vtotal = disp_info->vtotal; rsc_config.prefill_lines = disp_info->prefill_lines; rsc_config.jitter = disp_info->jitter; /* update it only once */ sde_enc->rsc_state_update = true; ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, &rsc_config, drm_enc->crtc ? drm_enc->crtc->index : -1); } else { ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, NULL, drm_enc->crtc ? drm_enc->crtc->index : -1); } if (ret) SDE_ERROR("sde rsc client update failed ret:%d\n", ret); return ret; } struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct msm_display_info *disp_info; if (!drm_enc) return NULL; sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; return disp_info->is_primary ? sde_enc->rsc_client : NULL; } static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, struct drm_display_mode *mode, struct drm_display_mode *adj_mode) Loading Loading @@ -778,6 +843,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) } } sde_encoder_update_rsc_client(drm_enc, true); if (!sde_enc->cur_master) SDE_ERROR("virt encoder has no master! num_phys %d\n", i); else if (sde_enc->cur_master->ops.enable) Loading Loading @@ -833,6 +900,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) del_timer_sync(&sde_enc->frame_done_timer); } sde_encoder_update_rsc_client(drm_enc, false); if (sde_enc->cur_master && sde_enc->cur_master->ops.disable) sde_enc->cur_master->ops.disable(sde_enc->cur_master); Loading Loading @@ -927,57 +996,6 @@ void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc, } } struct sde_rsc_client *sde_encoder_update_rsc_client( struct drm_encoder *drm_enc, bool enable) { struct sde_encoder_virt *sde_enc; enum sde_rsc_state rsc_state; struct sde_rsc_cmd_config rsc_config; int ret; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return NULL; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; /** * only primary command mode panel can request CMD state. * all other panels/displays can request for VID state including * secondary command mode panel. */ rsc_state = enable ? (((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) && disp_info->is_primary) ? SDE_RSC_CMD_STATE : SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE; if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update && disp_info->is_primary) { rsc_config.fps = disp_info->frame_rate; rsc_config.vtotal = disp_info->vtotal; rsc_config.prefill_lines = disp_info->prefill_lines; rsc_config.jitter = disp_info->jitter; /* update it only once */ sde_enc->rsc_state_update = true; ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, &rsc_config, drm_enc->crtc ? drm_enc->crtc->index : -1); } else { ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, NULL, drm_enc->crtc ? drm_enc->crtc->index : -1); } if (ret) SDE_ERROR("sde rsc client update failed ret:%d\n", ret); return sde_enc->disp_info.is_primary ? sde_enc->rsc_client : NULL; } void sde_encoder_register_frame_event_callback(struct drm_encoder *drm_enc, void (*frame_event_cb)(void *, u32 event), void *frame_event_cb_data) Loading drivers/gpu/drm/msm/sde/sde_encoder.h +2 −4 Original line number Diff line number Diff line Loading @@ -83,13 +83,11 @@ void sde_encoder_register_frame_event_callback(struct drm_encoder *encoder, void (*cb)(void *, u32), void *data); /** * sde_encoder_update_rsc_client - updates the rsc client state for primary * sde_encoder_get_rsc_client - gets the rsc client state for primary * for primary display. * @encoder: encoder pointer * @enable: enable/disable the client */ struct sde_rsc_client *sde_encoder_update_rsc_client( struct drm_encoder *encoder, bool enable); struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *encoder); /** * sde_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl Loading Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +1 −2 Original line number Diff line number Diff line Loading @@ -1459,7 +1459,7 @@ static void sde_crtc_atomic_flush(struct drm_crtc *crtc, continue; cstate->rsc_client = sde_encoder_update_rsc_client(encoder, true); sde_encoder_get_rsc_client(encoder); } cstate->rsc_update = true; } Loading Loading @@ -1796,7 +1796,6 @@ static void sde_crtc_disable(struct drm_crtc *crtc) if (encoder->crtc != crtc) continue; sde_encoder_register_frame_event_callback(encoder, NULL, NULL); sde_encoder_update_rsc_client(encoder, false); cstate->rsc_client = NULL; cstate->rsc_update = false; } Loading
drivers/gpu/drm/msm/sde/sde_encoder.c +69 −51 Original line number Diff line number Diff line Loading @@ -656,6 +656,71 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc) return ret; } static int sde_encoder_update_rsc_client( struct drm_encoder *drm_enc, bool enable) { struct sde_encoder_virt *sde_enc; enum sde_rsc_state rsc_state; struct sde_rsc_cmd_config rsc_config; int ret; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return -EINVAL; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; /** * only primary command mode panel can request CMD state. * all other panels/displays can request for VID state including * secondary command mode panel. */ rsc_state = enable ? (((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) && disp_info->is_primary) ? SDE_RSC_CMD_STATE : SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE; if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update && disp_info->is_primary) { rsc_config.fps = disp_info->frame_rate; rsc_config.vtotal = disp_info->vtotal; rsc_config.prefill_lines = disp_info->prefill_lines; rsc_config.jitter = disp_info->jitter; /* update it only once */ sde_enc->rsc_state_update = true; ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, &rsc_config, drm_enc->crtc ? drm_enc->crtc->index : -1); } else { ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, NULL, drm_enc->crtc ? drm_enc->crtc->index : -1); } if (ret) SDE_ERROR("sde rsc client update failed ret:%d\n", ret); return ret; } struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct msm_display_info *disp_info; if (!drm_enc) return NULL; sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; return disp_info->is_primary ? sde_enc->rsc_client : NULL; } static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, struct drm_display_mode *mode, struct drm_display_mode *adj_mode) Loading Loading @@ -778,6 +843,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) } } sde_encoder_update_rsc_client(drm_enc, true); if (!sde_enc->cur_master) SDE_ERROR("virt encoder has no master! num_phys %d\n", i); else if (sde_enc->cur_master->ops.enable) Loading Loading @@ -833,6 +900,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) del_timer_sync(&sde_enc->frame_done_timer); } sde_encoder_update_rsc_client(drm_enc, false); if (sde_enc->cur_master && sde_enc->cur_master->ops.disable) sde_enc->cur_master->ops.disable(sde_enc->cur_master); Loading Loading @@ -927,57 +996,6 @@ void sde_encoder_register_vblank_callback(struct drm_encoder *drm_enc, } } struct sde_rsc_client *sde_encoder_update_rsc_client( struct drm_encoder *drm_enc, bool enable) { struct sde_encoder_virt *sde_enc; enum sde_rsc_state rsc_state; struct sde_rsc_cmd_config rsc_config; int ret; struct msm_display_info *disp_info; if (!drm_enc) { SDE_ERROR("invalid encoder\n"); return NULL; } sde_enc = to_sde_encoder_virt(drm_enc); disp_info = &sde_enc->disp_info; /** * only primary command mode panel can request CMD state. * all other panels/displays can request for VID state including * secondary command mode panel. */ rsc_state = enable ? (((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) && disp_info->is_primary) ? SDE_RSC_CMD_STATE : SDE_RSC_VID_STATE) : SDE_RSC_IDLE_STATE; if (rsc_state != SDE_RSC_IDLE_STATE && !sde_enc->rsc_state_update && disp_info->is_primary) { rsc_config.fps = disp_info->frame_rate; rsc_config.vtotal = disp_info->vtotal; rsc_config.prefill_lines = disp_info->prefill_lines; rsc_config.jitter = disp_info->jitter; /* update it only once */ sde_enc->rsc_state_update = true; ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, &rsc_config, drm_enc->crtc ? drm_enc->crtc->index : -1); } else { ret = sde_rsc_client_state_update(sde_enc->rsc_client, rsc_state, NULL, drm_enc->crtc ? drm_enc->crtc->index : -1); } if (ret) SDE_ERROR("sde rsc client update failed ret:%d\n", ret); return sde_enc->disp_info.is_primary ? sde_enc->rsc_client : NULL; } void sde_encoder_register_frame_event_callback(struct drm_encoder *drm_enc, void (*frame_event_cb)(void *, u32 event), void *frame_event_cb_data) Loading
drivers/gpu/drm/msm/sde/sde_encoder.h +2 −4 Original line number Diff line number Diff line Loading @@ -83,13 +83,11 @@ void sde_encoder_register_frame_event_callback(struct drm_encoder *encoder, void (*cb)(void *, u32), void *data); /** * sde_encoder_update_rsc_client - updates the rsc client state for primary * sde_encoder_get_rsc_client - gets the rsc client state for primary * for primary display. * @encoder: encoder pointer * @enable: enable/disable the client */ struct sde_rsc_client *sde_encoder_update_rsc_client( struct drm_encoder *encoder, bool enable); struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *encoder); /** * sde_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl Loading