Loading drivers/gpu/drm/msm/sde/sde_encoder.c +10 −5 Original line number Diff line number Diff line Loading @@ -3534,7 +3534,7 @@ static void sde_encoder_frame_done_callback( { struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); unsigned int i; bool trigger = true; bool trigger = true, is_cmd_mode; enum sde_rm_topology_name topology = SDE_RM_TOPOLOGY_NONE; if (!drm_enc || !sde_enc->cur_master) { Loading @@ -3545,10 +3545,12 @@ static void sde_encoder_frame_done_callback( sde_enc->crtc_frame_event_cb_data.connector = sde_enc->cur_master->connector; is_cmd_mode = sde_enc->disp_info.capabilities & MSM_DISPLAY_CAP_CMD_MODE; if (event & (SDE_ENCODER_FRAME_EVENT_DONE | SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD)) { | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD) && is_cmd_mode) { if (ready_phys->connector) topology = sde_connector_get_topology_name( Loading Loading @@ -3588,8 +3590,11 @@ static void sde_encoder_frame_done_callback( for (i = 0; i < sde_enc->num_phys_encs; i++) atomic_set(&sde_enc->frame_done_cnt[i], 0); } } else { if (sde_enc->crtc_frame_event_cb) } else if (sde_enc->crtc_frame_event_cb) { if (!is_cmd_mode) sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_FRAME_DONE); sde_enc->crtc_frame_event_cb( &sde_enc->crtc_frame_event_cb_data, event); } Loading drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c +13 −28 Original line number Diff line number Diff line Loading @@ -471,10 +471,9 @@ static void sde_encoder_phys_vid_vblank_irq(void *arg, int irq_idx) pend_ret_fence_cnt = atomic_read(&phys_enc->pending_retire_fence_cnt); /* signal only for master, where there is a pending kickoff */ if (sde_encoder_phys_vid_is_master(phys_enc)) { if (atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) event |= SDE_ENCODER_FRAME_EVENT_DONE | if (sde_encoder_phys_vid_is_master(phys_enc) && atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) { event = SDE_ENCODER_FRAME_EVENT_DONE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE; } Loading Loading @@ -823,20 +822,15 @@ static int _sde_encoder_phys_vid_wait_for_vblank( { struct sde_encoder_wait_info wait_info; int ret = 0; u32 event = 0, event_helper = 0; u32 event = SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE; if (!phys_enc) { pr_err("invalid encoder\n"); return -EINVAL; } if (!sde_encoder_phys_vid_is_master(phys_enc)) { /* signal done for slave video encoder, unless it is pp-split */ if (!_sde_encoder_phys_is_ppsplit(phys_enc) && notify) event = SDE_ENCODER_FRAME_EVENT_DONE; goto end; } wait_info.wq = &phys_enc->pending_kickoff_wq; wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt; wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; Loading @@ -845,23 +839,14 @@ static int _sde_encoder_phys_vid_wait_for_vblank( ret = sde_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_VSYNC, &wait_info); event_helper = SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE; if (notify && (ret == -ETIMEDOUT)) { event = SDE_ENCODER_FRAME_EVENT_ERROR; if (atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) event |= event_helper; } if (notify && (ret == -ETIMEDOUT) && atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0) && phys_enc->parent_ops.handle_frame_done) phys_enc->parent_ops.handle_frame_done( phys_enc->parent, phys_enc, event); end: SDE_EVT32(DRMID(phys_enc->parent), event, notify, ret, ret ? SDE_EVTLOG_FATAL : 0); if (phys_enc->parent_ops.handle_frame_done && event) phys_enc->parent_ops.handle_frame_done( phys_enc->parent, phys_enc, event); return ret; } Loading Loading
drivers/gpu/drm/msm/sde/sde_encoder.c +10 −5 Original line number Diff line number Diff line Loading @@ -3534,7 +3534,7 @@ static void sde_encoder_frame_done_callback( { struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); unsigned int i; bool trigger = true; bool trigger = true, is_cmd_mode; enum sde_rm_topology_name topology = SDE_RM_TOPOLOGY_NONE; if (!drm_enc || !sde_enc->cur_master) { Loading @@ -3545,10 +3545,12 @@ static void sde_encoder_frame_done_callback( sde_enc->crtc_frame_event_cb_data.connector = sde_enc->cur_master->connector; is_cmd_mode = sde_enc->disp_info.capabilities & MSM_DISPLAY_CAP_CMD_MODE; if (event & (SDE_ENCODER_FRAME_EVENT_DONE | SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD)) { | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD) && is_cmd_mode) { if (ready_phys->connector) topology = sde_connector_get_topology_name( Loading Loading @@ -3588,8 +3590,11 @@ static void sde_encoder_frame_done_callback( for (i = 0; i < sde_enc->num_phys_encs; i++) atomic_set(&sde_enc->frame_done_cnt[i], 0); } } else { if (sde_enc->crtc_frame_event_cb) } else if (sde_enc->crtc_frame_event_cb) { if (!is_cmd_mode) sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_FRAME_DONE); sde_enc->crtc_frame_event_cb( &sde_enc->crtc_frame_event_cb_data, event); } Loading
drivers/gpu/drm/msm/sde/sde_encoder_phys_vid.c +13 −28 Original line number Diff line number Diff line Loading @@ -471,10 +471,9 @@ static void sde_encoder_phys_vid_vblank_irq(void *arg, int irq_idx) pend_ret_fence_cnt = atomic_read(&phys_enc->pending_retire_fence_cnt); /* signal only for master, where there is a pending kickoff */ if (sde_encoder_phys_vid_is_master(phys_enc)) { if (atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) event |= SDE_ENCODER_FRAME_EVENT_DONE | if (sde_encoder_phys_vid_is_master(phys_enc) && atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) { event = SDE_ENCODER_FRAME_EVENT_DONE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE; } Loading Loading @@ -823,20 +822,15 @@ static int _sde_encoder_phys_vid_wait_for_vblank( { struct sde_encoder_wait_info wait_info; int ret = 0; u32 event = 0, event_helper = 0; u32 event = SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE; if (!phys_enc) { pr_err("invalid encoder\n"); return -EINVAL; } if (!sde_encoder_phys_vid_is_master(phys_enc)) { /* signal done for slave video encoder, unless it is pp-split */ if (!_sde_encoder_phys_is_ppsplit(phys_enc) && notify) event = SDE_ENCODER_FRAME_EVENT_DONE; goto end; } wait_info.wq = &phys_enc->pending_kickoff_wq; wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt; wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; Loading @@ -845,23 +839,14 @@ static int _sde_encoder_phys_vid_wait_for_vblank( ret = sde_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_VSYNC, &wait_info); event_helper = SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE | SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE; if (notify && (ret == -ETIMEDOUT)) { event = SDE_ENCODER_FRAME_EVENT_ERROR; if (atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0)) event |= event_helper; } if (notify && (ret == -ETIMEDOUT) && atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0) && phys_enc->parent_ops.handle_frame_done) phys_enc->parent_ops.handle_frame_done( phys_enc->parent, phys_enc, event); end: SDE_EVT32(DRMID(phys_enc->parent), event, notify, ret, ret ? SDE_EVTLOG_FATAL : 0); if (phys_enc->parent_ops.handle_frame_done && event) phys_enc->parent_ops.handle_frame_done( phys_enc->parent, phys_enc, event); return ret; } Loading