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

Commit 7a7d85da authored by Dhaval Patel's avatar Dhaval Patel Committed by Narendra Muppalla
Browse files

drm/msm: use drm helper API for atomic check



Current msm atomic check tries atomic check first and
modeset later. That causes issue for crtc atomic check
because crtc mode is not updated so vdisplay/hdisplay
is "0" when atomic check happen before modeset. That leads
to atomic commit failure.

Originally, it was added for plane format checks before it
updates. That may not be correct with sde driver because
it handles all atomic checks independently of modeset changes.

Conflicts:
	drivers/gpu/drm/msm/msm_drv.h
Change-Id: Id8cbbcb2f520ac2956cf56cb959e120ae6f55855
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
[narendram@codeaurora.org: Resolve conflict in msm_drv.h]
Signed-off-by: default avatarNarendra Muppalla <narendram@codeaurora.org>
parent 11f3444c
Loading
Loading
Loading
Loading
+0 −20
Original line number Diff line number Diff line
@@ -447,26 +447,6 @@ static void commit_worker(struct work_struct *work)
	complete_commit(container_of(work, struct msm_commit, work), true);
}

int msm_atomic_check(struct drm_device *dev,
		     struct drm_atomic_state *state)
{
	int ret;

	/*
	 * msm ->atomic_check can update ->mode_changed for pixel format
	 * changes, hence must be run before we check the modeset changes.
	 */
	ret = drm_atomic_helper_check_planes(dev, state);
	if (ret)
		return ret;

	ret = drm_atomic_helper_check_modeset(dev, state);
	if (ret)
		return ret;

	return ret;
}

/**
 * drm_atomic_helper_commit - commit validated state object
 * @dev: DRM device
+1 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ static void msm_fb_output_poll_changed(struct drm_device *dev)
static const struct drm_mode_config_funcs mode_config_funcs = {
	.fb_create = msm_framebuffer_create,
	.output_poll_changed = msm_fb_output_poll_changed,
	.atomic_check = msm_atomic_check,
	.atomic_check = drm_atomic_helper_check,
	.atomic_commit = msm_atomic_commit,
};

+14 −0
Original line number Diff line number Diff line
@@ -314,6 +314,20 @@ struct msm_format {

int msm_atomic_check(struct drm_device *dev,
		     struct drm_atomic_state *state);
/* callback from wq once fence has passed: */
struct msm_fence_cb {
	struct work_struct work;
	uint32_t fence;
	void (*func)(struct msm_fence_cb *cb);
};

void __msm_fence_worker(struct work_struct *work);

#define INIT_FENCE_CB(_cb, _func)  do {                     \
		INIT_WORK(&(_cb)->work, __msm_fence_worker); \
		(_cb)->func = _func;                         \
	} while (0)

int msm_atomic_commit(struct drm_device *dev,
		struct drm_atomic_state *state, bool nonblock);