|
@@ -877,12 +877,15 @@ static int _sde_encoder_phys_vid_wait_for_vblank(
|
|
u32 event = SDE_ENCODER_FRAME_EVENT_ERROR |
|
|
u32 event = SDE_ENCODER_FRAME_EVENT_ERROR |
|
|
SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE |
|
|
SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE |
|
|
SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE;
|
|
SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE;
|
|
|
|
+ struct drm_connector *conn;
|
|
|
|
|
|
if (!phys_enc) {
|
|
if (!phys_enc) {
|
|
pr_err("invalid encoder\n");
|
|
pr_err("invalid encoder\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ conn = phys_enc->connector;
|
|
|
|
+
|
|
wait_info.wq = &phys_enc->pending_kickoff_wq;
|
|
wait_info.wq = &phys_enc->pending_kickoff_wq;
|
|
wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt;
|
|
wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt;
|
|
wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;
|
|
wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;
|
|
@@ -893,10 +896,16 @@ static int _sde_encoder_phys_vid_wait_for_vblank(
|
|
|
|
|
|
if (notify && (ret == -ETIMEDOUT) &&
|
|
if (notify && (ret == -ETIMEDOUT) &&
|
|
atomic_add_unless(&phys_enc->pending_retire_fence_cnt, -1, 0) &&
|
|
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_ops.handle_frame_done(
|
|
phys_enc->parent_ops.handle_frame_done(
|
|
phys_enc->parent, phys_enc, event);
|
|
phys_enc->parent, phys_enc, event);
|
|
|
|
|
|
|
|
+ if (sde_encoder_recovery_events_enabled(phys_enc->parent))
|
|
|
|
+ sde_connector_event_notify(conn,
|
|
|
|
+ DRM_EVENT_SDE_HW_RECOVERY,
|
|
|
|
+ sizeof(uint8_t), SDE_RECOVERY_HARD_RESET);
|
|
|
|
+ }
|
|
|
|
+
|
|
SDE_EVT32(DRMID(phys_enc->parent), event, notify, ret,
|
|
SDE_EVT32(DRMID(phys_enc->parent), event, notify, ret,
|
|
ret ? SDE_EVTLOG_FATAL : 0);
|
|
ret ? SDE_EVTLOG_FATAL : 0);
|
|
return ret;
|
|
return ret;
|