drm: msm: sde: kernel needs to monitor bootloader's flush done

Once kernel sends splash stop signal to bootloader, it
needs to listen to bootloader's cocurrent flush to
hardware is done, otherwise, one race condition issue
for mixer clear and setup messed may happen.

Change-Id: I7b603b9acc0dd0af07da3c5afee052007432b7fb
Signed-off-by: Guchun Chen <guchunc@codeaurora.org>
Signed-off-by: Rahul Sharma <rahsha@codeaurora.org>
This commit is contained in:
Rahul Sharma 2018-12-14 14:48:50 +05:30 committed by Gerrit - the friendly Code Review server
parent 361feeef4f
commit 4144ff0cf2

View file

@ -40,6 +40,8 @@
#define SDE_LK_RUNNING_VALUE 0xC001CAFE
#define SDE_LK_STOP_SPLASH_VALUE 0xDEADDEAD
#define SDE_LK_EXIT_VALUE 0xDEADBEEF
#define SDE_LK_INTERMEDIATE_STOP 0xBEEFBEEF
#define SDE_LK_KERNEL_SPLASH_TALK_LOOP 20
#define INTF_HDMI_SEL (BIT(25) | BIT(24))
#define INTF_DSI0_SEL BIT(8)
@ -152,7 +154,35 @@ static bool _sde_splash_lk_check(void)
*/
static inline void _sde_splash_notify_lk_stop_splash(void)
{
int i = 0;
int32_t *scratch_pad = NULL;
/* request Lk to stop splash */
request_early_service_shutdown(EARLY_DISPLAY);
/*
* Before next proceeding, kernel needs to check bootloader's
* intermediate status to ensure LK's concurrent flush is done.
*/
while (i++ < SDE_LK_KERNEL_SPLASH_TALK_LOOP) {
scratch_pad =
(int32_t *)get_service_shared_mem_start(EARLY_DISPLAY);
if (scratch_pad) {
if ((*scratch_pad != SDE_LK_INTERMEDIATE_STOP) &&
(_sde_splash_lk_check())) {
DRM_INFO("wait for LK's intermediate ack\n");
msleep(20);
} else {
SDE_DEBUG("received LK intermediate ack\n");
break;
}
}
}
if (i == SDE_LK_KERNEL_SPLASH_TALK_LOOP)
SDE_ERROR("Loop talk for LK and Kernel failed\n");
}
static int _sde_splash_gem_new(struct drm_device *dev,