disp: msm: sde: update sspp multi rect programming
Current SDE driver allows staging of rect1 only configuration. When a real plane is disabled sspp multi rect configuration is not updated. This can lead to iommu faults and ping pong timeouts as framebuffer of disabled plane is unmapped. This change fixes it by updating multi rect config accordingly when a plane is disabled. Change-Id: I67ae45ad0e607184c7fc49f4b220220ba1d8a2ae Signed-off-by: Prabhanjan Kandula <pkandula@codeaurora.org>
此提交包含在:
@@ -3026,9 +3026,11 @@ static void _sde_plane_update_roi_config(struct drm_plane *plane,
|
||||
&pstate->excl_rect,
|
||||
pstate->multirect_index);
|
||||
|
||||
if (psde->pipe_hw->ops.setup_multirect)
|
||||
psde->pipe_hw->ops.setup_multirect(
|
||||
/* enable multirect config of corresponding rect */
|
||||
if (psde->pipe_hw->ops.update_multirect)
|
||||
psde->pipe_hw->ops.update_multirect(
|
||||
psde->pipe_hw,
|
||||
true,
|
||||
pstate->multirect_index,
|
||||
pstate->multirect_mode);
|
||||
}
|
||||
@@ -3283,6 +3285,7 @@ static void _sde_plane_atomic_disable(struct drm_plane *plane,
|
||||
struct sde_plane *psde;
|
||||
struct drm_plane_state *state;
|
||||
struct sde_plane_state *pstate;
|
||||
u32 multirect_index = SDE_SSPP_RECT_0;
|
||||
|
||||
if (!plane) {
|
||||
SDE_ERROR("invalid plane\n");
|
||||
@@ -3304,10 +3307,13 @@ static void _sde_plane_atomic_disable(struct drm_plane *plane,
|
||||
|
||||
pstate->pending = true;
|
||||
|
||||
if (is_sde_plane_virtual(plane) &&
|
||||
psde->pipe_hw && psde->pipe_hw->ops.setup_multirect)
|
||||
psde->pipe_hw->ops.setup_multirect(psde->pipe_hw,
|
||||
SDE_SSPP_RECT_SOLO, SDE_SSPP_MULTIRECT_NONE);
|
||||
if (is_sde_plane_virtual(plane))
|
||||
multirect_index = SDE_SSPP_RECT_1;
|
||||
|
||||
/* disable multirect config of corresponding rect */
|
||||
if (psde->pipe_hw && psde->pipe_hw->ops.update_multirect)
|
||||
psde->pipe_hw->ops.update_multirect(psde->pipe_hw, false,
|
||||
multirect_index, SDE_SSPP_MULTIRECT_TIME_MX);
|
||||
}
|
||||
|
||||
static void sde_plane_atomic_update(struct drm_plane *plane,
|
||||
|
新增問題並參考
封鎖使用者