Commit a712b307 authored by Rob Clark's avatar Rob Clark Committed by Maxime Ripard

drm/msm/dpu: Delete bonkers code

dpu_crtc_atomic_flush() was directly poking it's attached planes in a
code path that ended up in dpu_plane_atomic_update(), even if the plane
was not involved in the current atomic update.  While a bit dubious,
this worked before because plane->state would always point to something
valid.  But now using drm_atomic_get_new_plane_state() we could get a
NULL state pointer instead, leading to:

   [   20.873273] Call trace:
   [   20.875740]  dpu_plane_atomic_update+0x5c/0xed0
   [   20.880311]  dpu_plane_restore+0x40/0x88
   [   20.884266]  dpu_crtc_atomic_flush+0xf4/0x208
   [   20.888660]  drm_atomic_helper_commit_planes+0x150/0x238
   [   20.894014]  msm_atomic_commit_tail+0x1d4/0x7a0
   [   20.898579]  commit_tail+0xa4/0x168
   [   20.902102]  drm_atomic_helper_commit+0x164/0x178
   [   20.906841]  drm_atomic_commit+0x54/0x60
   [   20.910798]  drm_atomic_connector_commit_dpms+0x10c/0x118
   [   20.916236]  drm_mode_obj_set_property_ioctl+0x1e4/0x440
   [   20.921588]  drm_connector_property_set_ioctl+0x60/0x88
   [   20.926852]  drm_ioctl_kernel+0xd0/0x120
   [   20.930807]  drm_ioctl+0x21c/0x478
   [   20.934235]  __arm64_sys_ioctl+0xa8/0xe0
   [   20.938193]  invoke_syscall+0x64/0x130
   [   20.941977]  el0_svc_common.constprop.3+0x5c/0xe0
   [   20.946716]  do_el0_svc+0x80/0xa0
   [   20.950058]  el0_svc+0x20/0x30
   [   20.953145]  el0_sync_handler+0x88/0xb0
   [   20.957014]  el0_sync+0x13c/0x140

The reason for the codepath seems dubious, the atomic suspend/resume
heplers should handle the power-collapse case.  If not, the CRTC's
atomic_check() should be adding the planes to the atomic update.
Reported-by: default avatarStephen Boyd <swboyd@chromium.org>
Reported-by: default avatarJohn Stultz <john.stultz@linaro.org>
Fixes: 37418bf1 ("drm: Use state helper instead of the plane state pointer")
Tested-by: default avatarJohn Stultz <john.stultz@linaro.org>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20210430171744.1721408-1-robdclark@gmail.com
parent 74deef03
...@@ -566,16 +566,6 @@ static void dpu_crtc_atomic_flush(struct drm_crtc *crtc, ...@@ -566,16 +566,6 @@ static void dpu_crtc_atomic_flush(struct drm_crtc *crtc,
if (unlikely(!cstate->num_mixers)) if (unlikely(!cstate->num_mixers))
return; return;
/*
* For planes without commit update, drm framework will not add
* those planes to current state since hardware update is not
* required. However, if those planes were power collapsed since
* last commit cycle, driver has to restore the hardware state
* of those planes explicitly here prior to plane flush.
*/
drm_atomic_crtc_for_each_plane(plane, crtc)
dpu_plane_restore(plane, state);
/* update performance setting before crtc kickoff */ /* update performance setting before crtc kickoff */
dpu_core_perf_crtc_update(crtc, 1, false); dpu_core_perf_crtc_update(crtc, 1, false);
......
...@@ -1258,22 +1258,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane, ...@@ -1258,22 +1258,6 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,
} }
} }
void dpu_plane_restore(struct drm_plane *plane, struct drm_atomic_state *state)
{
struct dpu_plane *pdpu;
if (!plane || !plane->state) {
DPU_ERROR("invalid plane\n");
return;
}
pdpu = to_dpu_plane(plane);
DPU_DEBUG_PLANE(pdpu, "\n");
dpu_plane_atomic_update(plane, state);
}
static void dpu_plane_destroy(struct drm_plane *plane) static void dpu_plane_destroy(struct drm_plane *plane)
{ {
struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL;
......
...@@ -84,12 +84,6 @@ bool is_dpu_plane_virtual(struct drm_plane *plane); ...@@ -84,12 +84,6 @@ bool is_dpu_plane_virtual(struct drm_plane *plane);
void dpu_plane_get_ctl_flush(struct drm_plane *plane, struct dpu_hw_ctl *ctl, void dpu_plane_get_ctl_flush(struct drm_plane *plane, struct dpu_hw_ctl *ctl,
u32 *flush_sspp); u32 *flush_sspp);
/**
* dpu_plane_restore - restore hw state if previously power collapsed
* @plane: Pointer to drm plane structure
*/
void dpu_plane_restore(struct drm_plane *plane, struct drm_atomic_state *state);
/** /**
* dpu_plane_flush - final plane operations before commit flush * dpu_plane_flush - final plane operations before commit flush
* @plane: Pointer to drm plane structure * @plane: Pointer to drm plane structure
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment