Loading drivers/gpu/drm/msm/sde/sde_connector.c +10 −9 Original line number Diff line number Diff line Loading @@ -738,7 +738,7 @@ void sde_connector_destroy(struct drm_connector *connector) backlight_device_unregister(c_conn->bl_device); drm_connector_unregister(connector); mutex_destroy(&c_conn->lock); sde_fence_deinit(&c_conn->retire_fence); sde_fence_deinit(c_conn->retire_fence); drm_connector_cleanup(connector); msm_property_destroy(&c_conn->property_info); kfree(c_conn); Loading Loading @@ -1124,7 +1124,7 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, /* * update the the offset to a timeline for commit completion */ rc = sde_fence_create(&c_conn->retire_fence, &fence_fd, 1); rc = sde_fence_create(c_conn->retire_fence, &fence_fd, 1); if (rc) { SDE_ERROR("fence create failed rc:%d\n", rc); goto end; Loading Loading @@ -1234,7 +1234,7 @@ void sde_conn_timeline_status(struct drm_connector *conn) } c_conn = to_sde_connector(conn); sde_fence_timeline_status(&c_conn->retire_fence, &conn->base); sde_fence_timeline_status(c_conn->retire_fence, &conn->base); } void sde_connector_prepare_fence(struct drm_connector *connector) Loading @@ -1244,7 +1244,7 @@ void sde_connector_prepare_fence(struct drm_connector *connector) return; } sde_fence_prepare(&to_sde_connector(connector)->retire_fence); sde_fence_prepare(to_sde_connector(connector)->retire_fence); } void sde_connector_complete_commit(struct drm_connector *connector, Loading @@ -1256,7 +1256,7 @@ void sde_connector_complete_commit(struct drm_connector *connector, } /* signal connector's retire fence */ sde_fence_signal(&to_sde_connector(connector)->retire_fence, sde_fence_signal(to_sde_connector(connector)->retire_fence, ts, fence_event); } Loading @@ -1268,7 +1268,7 @@ void sde_connector_commit_reset(struct drm_connector *connector, ktime_t ts) } /* signal connector's retire fence */ sde_fence_signal(&to_sde_connector(connector)->retire_fence, sde_fence_signal(to_sde_connector(connector)->retire_fence, ts, SDE_FENCE_RESET_TIMELINE); } Loading Loading @@ -2135,9 +2135,10 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, "conn%u", c_conn->base.base.id); rc = sde_fence_init(&c_conn->retire_fence, c_conn->name, c_conn->retire_fence = sde_fence_init(c_conn->name, c_conn->base.base.id); if (rc) { if (IS_ERR(c_conn->retire_fence)) { rc = PTR_ERR(c_conn->retire_fence); SDE_ERROR("failed to init fence, %d\n", rc); goto error_cleanup_conn; } Loading Loading @@ -2312,7 +2313,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, msm_property_destroy(&c_conn->property_info); error_cleanup_fence: mutex_destroy(&c_conn->lock); sde_fence_deinit(&c_conn->retire_fence); sde_fence_deinit(c_conn->retire_fence); error_cleanup_conn: drm_connector_cleanup(&c_conn->base); error_free_conn: Loading drivers/gpu/drm/msm/sde/sde_connector.h +1 −1 Original line number Diff line number Diff line Loading @@ -394,7 +394,7 @@ struct sde_connector { char name[SDE_CONNECTOR_NAME_SIZE]; struct mutex lock; struct sde_fence_context retire_fence; struct sde_fence_context *retire_fence; struct sde_connector_ops ops; int dpms_mode; int lp_mode; Loading drivers/gpu/drm/msm/sde/sde_crtc.c +17 −9 Original line number Diff line number Diff line Loading @@ -736,7 +736,7 @@ static void sde_crtc_destroy(struct drm_crtc *crtc) msm_property_destroy(&sde_crtc->property_info); sde_cp_crtc_destroy_properties(crtc); sde_fence_deinit(&sde_crtc->output_fence); sde_fence_deinit(sde_crtc->output_fence); _sde_crtc_deinit_events(sde_crtc); drm_crtc_cleanup(crtc); Loading Loading @@ -2066,7 +2066,7 @@ void sde_crtc_timeline_status(struct drm_crtc *crtc) } sde_crtc = to_sde_crtc(crtc); sde_fence_timeline_status(&sde_crtc->output_fence, &crtc->base); sde_fence_timeline_status(sde_crtc->output_fence, &crtc->base); } static int _sde_validate_hw_resources(struct sde_crtc *sde_crtc) Loading Loading @@ -2312,7 +2312,7 @@ void sde_crtc_prepare_commit(struct drm_crtc *crtc, drm_connector_list_iter_end(&conn_iter); /* prepare main output fence */ sde_fence_prepare(&sde_crtc->output_fence); sde_fence_prepare(sde_crtc->output_fence); } /** Loading Loading @@ -2477,7 +2477,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE) { SDE_ATRACE_BEGIN("signal_release_fence"); sde_fence_signal(&sde_crtc->output_fence, fevent->ts, sde_fence_signal(sde_crtc->output_fence, fevent->ts, (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR) ? SDE_FENCE_SIGNAL_ERROR : SDE_FENCE_SIGNAL); SDE_ATRACE_END("signal_release_fence"); Loading Loading @@ -4294,7 +4294,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc) * reset the fence timeline if crtc will not be enabled for this commit */ if (!crtc->state->active || !crtc->state->enable) { sde_fence_signal(&sde_crtc->output_fence, sde_fence_signal(sde_crtc->output_fence, ktime_get(), SDE_FENCE_RESET_TIMELINE); for (i = 0; i < cstate->num_connectors; ++i) sde_connector_commit_reset(cstate->connectors[i], Loading Loading @@ -5319,7 +5319,7 @@ static int _sde_crtc_get_output_fence(struct drm_crtc *crtc, */ offset++; return sde_fence_create(&sde_crtc->output_fence, val, offset); return sde_fence_create(sde_crtc->output_fence, val, offset); } /** Loading Loading @@ -5914,7 +5914,7 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) /* Dump release fence info */ seq_puts(s, "\n"); seq_puts(s, "===Release fence===\n"); ctx = &sde_crtc->output_fence; ctx = sde_crtc->output_fence; drm_obj = &crtc->base; sde_debugfs_timeline_dump(ctx, drm_obj, &s); seq_puts(s, "\n"); Loading @@ -5928,7 +5928,7 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) struct sde_connector *c_conn; c_conn = to_sde_connector(conn); ctx = &c_conn->retire_fence; ctx = c_conn->retire_fence; drm_obj = &conn->base; sde_debugfs_timeline_dump(ctx, drm_obj, &s); } Loading Loading @@ -6228,7 +6228,15 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane) } /* initialize output fence support */ sde_fence_init(&sde_crtc->output_fence, sde_crtc->name, crtc->base.id); sde_crtc->output_fence = sde_fence_init(sde_crtc->name, crtc->base.id); if (IS_ERR(sde_crtc->output_fence)) { rc = PTR_ERR(sde_crtc->output_fence); SDE_ERROR("failed to init fence, %d\n", rc); drm_crtc_cleanup(crtc); kfree(sde_crtc); return ERR_PTR(rc); } /* create CRTC properties */ msm_property_init(&sde_crtc->property_info, &crtc->base, dev, Loading drivers/gpu/drm/msm/sde/sde_crtc.h +1 −1 Original line number Diff line number Diff line Loading @@ -232,7 +232,7 @@ struct sde_crtc { struct drm_property_blob *blob_info; /* output fence support */ struct sde_fence_context output_fence; struct sde_fence_context *output_fence; struct sde_hw_stage_cfg stage_cfg; struct dentry *debugfs_root; Loading drivers/gpu/drm/msm/sde/sde_fence.c +23 −7 Original line number Diff line number Diff line Loading @@ -98,6 +98,15 @@ struct sde_fence { static void sde_fence_destroy(struct kref *kref) { struct sde_fence_context *ctx; if (!kref) { SDE_ERROR("received invalid kref\n"); return; } ctx = container_of(kref, struct sde_fence_context, kref); kfree(ctx); } static inline struct sde_fence *to_sde_fence(struct dma_fence *fence) Loading Loading @@ -141,6 +150,7 @@ static void sde_fence_release(struct dma_fence *fence) if (fence) { f = to_sde_fence(fence); kref_put(&f->ctx->kref, sde_fence_destroy); kfree(f); } } Loading Loading @@ -235,14 +245,21 @@ static int _sde_fence_create_fd(void *fence_ctx, uint32_t val) return fd; } int sde_fence_init(struct sde_fence_context *ctx, const char *name, uint32_t drm_id) struct sde_fence_context *sde_fence_init(const char *name, uint32_t drm_id) { if (!ctx || !name) { struct sde_fence_context *ctx; if (!name) { SDE_ERROR("invalid argument(s)\n"); return -EINVAL; return ERR_PTR(-EINVAL); } ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) { SDE_ERROR("failed to alloc fence ctx\n"); return ERR_PTR(-ENOMEM); } memset(ctx, 0, sizeof(*ctx)); strlcpy(ctx->name, name, ARRAY_SIZE(ctx->name)); ctx->drm_id = drm_id; Loading @@ -253,7 +270,7 @@ int sde_fence_init(struct sde_fence_context *ctx, spin_lock_init(&ctx->list_lock); INIT_LIST_HEAD(&ctx->fence_list_head); return 0; return ctx; } void sde_fence_deinit(struct sde_fence_context *ctx) Loading Loading @@ -310,7 +327,6 @@ static void _sde_fence_trigger(struct sde_fence_context *ctx, if (is_signaled) { list_del_init(&fc->fence_list); dma_fence_put(&fc->base); kref_put(&ctx->kref, sde_fence_destroy); } else { spin_lock(&ctx->list_lock); list_move(&fc->fence_list, &ctx->fence_list_head); Loading Loading
drivers/gpu/drm/msm/sde/sde_connector.c +10 −9 Original line number Diff line number Diff line Loading @@ -738,7 +738,7 @@ void sde_connector_destroy(struct drm_connector *connector) backlight_device_unregister(c_conn->bl_device); drm_connector_unregister(connector); mutex_destroy(&c_conn->lock); sde_fence_deinit(&c_conn->retire_fence); sde_fence_deinit(c_conn->retire_fence); drm_connector_cleanup(connector); msm_property_destroy(&c_conn->property_info); kfree(c_conn); Loading Loading @@ -1124,7 +1124,7 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, /* * update the the offset to a timeline for commit completion */ rc = sde_fence_create(&c_conn->retire_fence, &fence_fd, 1); rc = sde_fence_create(c_conn->retire_fence, &fence_fd, 1); if (rc) { SDE_ERROR("fence create failed rc:%d\n", rc); goto end; Loading Loading @@ -1234,7 +1234,7 @@ void sde_conn_timeline_status(struct drm_connector *conn) } c_conn = to_sde_connector(conn); sde_fence_timeline_status(&c_conn->retire_fence, &conn->base); sde_fence_timeline_status(c_conn->retire_fence, &conn->base); } void sde_connector_prepare_fence(struct drm_connector *connector) Loading @@ -1244,7 +1244,7 @@ void sde_connector_prepare_fence(struct drm_connector *connector) return; } sde_fence_prepare(&to_sde_connector(connector)->retire_fence); sde_fence_prepare(to_sde_connector(connector)->retire_fence); } void sde_connector_complete_commit(struct drm_connector *connector, Loading @@ -1256,7 +1256,7 @@ void sde_connector_complete_commit(struct drm_connector *connector, } /* signal connector's retire fence */ sde_fence_signal(&to_sde_connector(connector)->retire_fence, sde_fence_signal(to_sde_connector(connector)->retire_fence, ts, fence_event); } Loading @@ -1268,7 +1268,7 @@ void sde_connector_commit_reset(struct drm_connector *connector, ktime_t ts) } /* signal connector's retire fence */ sde_fence_signal(&to_sde_connector(connector)->retire_fence, sde_fence_signal(to_sde_connector(connector)->retire_fence, ts, SDE_FENCE_RESET_TIMELINE); } Loading Loading @@ -2135,9 +2135,10 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, "conn%u", c_conn->base.base.id); rc = sde_fence_init(&c_conn->retire_fence, c_conn->name, c_conn->retire_fence = sde_fence_init(c_conn->name, c_conn->base.base.id); if (rc) { if (IS_ERR(c_conn->retire_fence)) { rc = PTR_ERR(c_conn->retire_fence); SDE_ERROR("failed to init fence, %d\n", rc); goto error_cleanup_conn; } Loading Loading @@ -2312,7 +2313,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, msm_property_destroy(&c_conn->property_info); error_cleanup_fence: mutex_destroy(&c_conn->lock); sde_fence_deinit(&c_conn->retire_fence); sde_fence_deinit(c_conn->retire_fence); error_cleanup_conn: drm_connector_cleanup(&c_conn->base); error_free_conn: Loading
drivers/gpu/drm/msm/sde/sde_connector.h +1 −1 Original line number Diff line number Diff line Loading @@ -394,7 +394,7 @@ struct sde_connector { char name[SDE_CONNECTOR_NAME_SIZE]; struct mutex lock; struct sde_fence_context retire_fence; struct sde_fence_context *retire_fence; struct sde_connector_ops ops; int dpms_mode; int lp_mode; Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +17 −9 Original line number Diff line number Diff line Loading @@ -736,7 +736,7 @@ static void sde_crtc_destroy(struct drm_crtc *crtc) msm_property_destroy(&sde_crtc->property_info); sde_cp_crtc_destroy_properties(crtc); sde_fence_deinit(&sde_crtc->output_fence); sde_fence_deinit(sde_crtc->output_fence); _sde_crtc_deinit_events(sde_crtc); drm_crtc_cleanup(crtc); Loading Loading @@ -2066,7 +2066,7 @@ void sde_crtc_timeline_status(struct drm_crtc *crtc) } sde_crtc = to_sde_crtc(crtc); sde_fence_timeline_status(&sde_crtc->output_fence, &crtc->base); sde_fence_timeline_status(sde_crtc->output_fence, &crtc->base); } static int _sde_validate_hw_resources(struct sde_crtc *sde_crtc) Loading Loading @@ -2312,7 +2312,7 @@ void sde_crtc_prepare_commit(struct drm_crtc *crtc, drm_connector_list_iter_end(&conn_iter); /* prepare main output fence */ sde_fence_prepare(&sde_crtc->output_fence); sde_fence_prepare(sde_crtc->output_fence); } /** Loading Loading @@ -2477,7 +2477,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE) { SDE_ATRACE_BEGIN("signal_release_fence"); sde_fence_signal(&sde_crtc->output_fence, fevent->ts, sde_fence_signal(sde_crtc->output_fence, fevent->ts, (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR) ? SDE_FENCE_SIGNAL_ERROR : SDE_FENCE_SIGNAL); SDE_ATRACE_END("signal_release_fence"); Loading Loading @@ -4294,7 +4294,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc) * reset the fence timeline if crtc will not be enabled for this commit */ if (!crtc->state->active || !crtc->state->enable) { sde_fence_signal(&sde_crtc->output_fence, sde_fence_signal(sde_crtc->output_fence, ktime_get(), SDE_FENCE_RESET_TIMELINE); for (i = 0; i < cstate->num_connectors; ++i) sde_connector_commit_reset(cstate->connectors[i], Loading Loading @@ -5319,7 +5319,7 @@ static int _sde_crtc_get_output_fence(struct drm_crtc *crtc, */ offset++; return sde_fence_create(&sde_crtc->output_fence, val, offset); return sde_fence_create(sde_crtc->output_fence, val, offset); } /** Loading Loading @@ -5914,7 +5914,7 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) /* Dump release fence info */ seq_puts(s, "\n"); seq_puts(s, "===Release fence===\n"); ctx = &sde_crtc->output_fence; ctx = sde_crtc->output_fence; drm_obj = &crtc->base; sde_debugfs_timeline_dump(ctx, drm_obj, &s); seq_puts(s, "\n"); Loading @@ -5928,7 +5928,7 @@ static int _sde_debugfs_fence_status_show(struct seq_file *s, void *data) struct sde_connector *c_conn; c_conn = to_sde_connector(conn); ctx = &c_conn->retire_fence; ctx = c_conn->retire_fence; drm_obj = &conn->base; sde_debugfs_timeline_dump(ctx, drm_obj, &s); } Loading Loading @@ -6228,7 +6228,15 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane) } /* initialize output fence support */ sde_fence_init(&sde_crtc->output_fence, sde_crtc->name, crtc->base.id); sde_crtc->output_fence = sde_fence_init(sde_crtc->name, crtc->base.id); if (IS_ERR(sde_crtc->output_fence)) { rc = PTR_ERR(sde_crtc->output_fence); SDE_ERROR("failed to init fence, %d\n", rc); drm_crtc_cleanup(crtc); kfree(sde_crtc); return ERR_PTR(rc); } /* create CRTC properties */ msm_property_init(&sde_crtc->property_info, &crtc->base, dev, Loading
drivers/gpu/drm/msm/sde/sde_crtc.h +1 −1 Original line number Diff line number Diff line Loading @@ -232,7 +232,7 @@ struct sde_crtc { struct drm_property_blob *blob_info; /* output fence support */ struct sde_fence_context output_fence; struct sde_fence_context *output_fence; struct sde_hw_stage_cfg stage_cfg; struct dentry *debugfs_root; Loading
drivers/gpu/drm/msm/sde/sde_fence.c +23 −7 Original line number Diff line number Diff line Loading @@ -98,6 +98,15 @@ struct sde_fence { static void sde_fence_destroy(struct kref *kref) { struct sde_fence_context *ctx; if (!kref) { SDE_ERROR("received invalid kref\n"); return; } ctx = container_of(kref, struct sde_fence_context, kref); kfree(ctx); } static inline struct sde_fence *to_sde_fence(struct dma_fence *fence) Loading Loading @@ -141,6 +150,7 @@ static void sde_fence_release(struct dma_fence *fence) if (fence) { f = to_sde_fence(fence); kref_put(&f->ctx->kref, sde_fence_destroy); kfree(f); } } Loading Loading @@ -235,14 +245,21 @@ static int _sde_fence_create_fd(void *fence_ctx, uint32_t val) return fd; } int sde_fence_init(struct sde_fence_context *ctx, const char *name, uint32_t drm_id) struct sde_fence_context *sde_fence_init(const char *name, uint32_t drm_id) { if (!ctx || !name) { struct sde_fence_context *ctx; if (!name) { SDE_ERROR("invalid argument(s)\n"); return -EINVAL; return ERR_PTR(-EINVAL); } ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) { SDE_ERROR("failed to alloc fence ctx\n"); return ERR_PTR(-ENOMEM); } memset(ctx, 0, sizeof(*ctx)); strlcpy(ctx->name, name, ARRAY_SIZE(ctx->name)); ctx->drm_id = drm_id; Loading @@ -253,7 +270,7 @@ int sde_fence_init(struct sde_fence_context *ctx, spin_lock_init(&ctx->list_lock); INIT_LIST_HEAD(&ctx->fence_list_head); return 0; return ctx; } void sde_fence_deinit(struct sde_fence_context *ctx) Loading Loading @@ -310,7 +327,6 @@ static void _sde_fence_trigger(struct sde_fence_context *ctx, if (is_signaled) { list_del_init(&fc->fence_list); dma_fence_put(&fc->base); kref_put(&ctx->kref, sde_fence_destroy); } else { spin_lock(&ctx->list_lock); list_move(&fc->fence_list, &ctx->fence_list_head); Loading