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>
此提交包含在:
Prabhanjan Kandula
2020-06-17 00:54:06 -07:00
父節點 743dc695c4
當前提交 f946219084
共有 3 個檔案被更改,包括 26 行新增12 行删除

查看文件

@@ -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,