disp: msm: sde: cancel delayed work items during TUI transition
Delayed work items may touch HW registers. If these work items run while HW is not owned by this VM it will lead to invalid access. This happens in video mode as HAL does not disable idle power-collapse in this mode. It can also happen with ESD status if lastclose or TUI transition failure occurs. Although there is a contract with user mode to turn off certain features, kernel cannot rely on it to always do the right thing. Prevent potential crashes from certain corner cases by cancelling all delayed work items when the HW ownership is transferred. Change-Id: I08da17f2ce72bf2fddf71924c3e8edd2e2715be8 Signed-off-by: Steve Cohen <cohens@codeaurora.org>
This commit is contained in:
@@ -7102,6 +7102,24 @@ static void __sde_crtc_idle_notify_work(struct kthread_work *work)
|
||||
}
|
||||
}
|
||||
|
||||
void sde_crtc_cancel_delayed_work(struct drm_crtc *crtc)
|
||||
{
|
||||
struct sde_crtc *sde_crtc;
|
||||
struct sde_crtc_state *cstate;
|
||||
bool idle_status;
|
||||
bool cache_status;
|
||||
|
||||
if (!crtc || !crtc->state)
|
||||
return;
|
||||
|
||||
sde_crtc = to_sde_crtc(crtc);
|
||||
cstate = to_sde_crtc_state(crtc->state);
|
||||
|
||||
idle_status = kthread_cancel_delayed_work_sync(&sde_crtc->idle_notify_work);
|
||||
cache_status = kthread_cancel_delayed_work_sync(&sde_crtc->static_cache_read_work);
|
||||
SDE_EVT32(DRMID(crtc), idle_status, cache_status);
|
||||
}
|
||||
|
||||
/* initialize crtc */
|
||||
struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane)
|
||||
{
|
||||
|
Reference in New Issue
Block a user