Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dba5a82b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: decouple sde_fence_context from sde_connector" into dev/msm-4.14-display

parents 6bb37305 b34bfab8
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -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);
@@ -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;
@@ -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)
@@ -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,
@@ -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);
}

@@ -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);
}

@@ -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;
	}
@@ -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:
+1 −1
Original line number Diff line number Diff line
@@ -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;
+17 −9
Original line number Diff line number Diff line
@@ -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);
@@ -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)
@@ -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);
}

/**
@@ -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");
@@ -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],
@@ -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);
}

/**
@@ -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");
@@ -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);
		}
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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;
+23 −7
Original line number Diff line number Diff line
@@ -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)
@@ -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);
	}
}
@@ -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;
@@ -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)
@@ -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