From aeb8d34871ae29894660111bfa7b65b1e4cf33e8 Mon Sep 17 00:00:00 2001 From: Benjamin Chan Date: Mon, 29 Aug 2016 10:04:22 -0400 Subject: [PATCH] msm: sde: Fix SMMU fault in SDE rotator for secure playback When playing secure content, framebuffer is setup as secure in the rotator. But the sw timestamp is not going through the secure route, and must clear out the secure setting, otherwise a smmu fault will be issued. This fix make sure the secure buffer status is cleared during the sw timestamp submission. CRs-Fixed: 1059620 Change-Id: Ifb0f9928fa1d948351e6fc1ad925a070a7f50a96 Signed-off-by: Benjamin Chan --- .../platform/msm/sde/rotator/sde_rotator_r3.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c index 9b08c4fe0989..6b44fb84ba2f 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c @@ -434,6 +434,14 @@ static void sde_hw_rotator_setup_timestamp_packet( SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x03020100); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x80000000); SDE_REGDMA_BLKWRITE_DATA(wrptr, ctx->timestamp); + /* + * Must clear secure buffer setting for SW timestamp because + * SW timstamp buffer allocation is always non-secure region. + */ + if (ctx->is_secure) { + SDE_REGDMA_WRITE(wrptr, ROT_SSPP_SRC_ADDR_SW_STATUS, 0); + SDE_REGDMA_WRITE(wrptr, ROT_WB_DST_ADDR_SW_STATUS, 0); + } SDE_REGDMA_BLKWRITE_INC(wrptr, ROT_WB_DST_FORMAT, 4); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x000037FF); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0); @@ -611,6 +619,9 @@ static void sde_hw_rotator_setup_fetchengine(struct sde_hw_rotator_context *ctx, if (flags & SDE_ROT_FLAG_SECURE_OVERLAY_SESSION) { SDE_REGDMA_WRITE(wrptr, ROT_SSPP_SRC_ADDR_SW_STATUS, 0xF); ctx->is_secure = true; + } else { + SDE_REGDMA_WRITE(wrptr, ROT_SSPP_SRC_ADDR_SW_STATUS, 0); + ctx->is_secure = false; } /* Update command queue write ptr */ @@ -703,6 +714,11 @@ static void sde_hw_rotator_setup_wbengine(struct sde_hw_rotator_context *ctx, SDE_REGDMA_WRITE(wrptr, ROT_WB_OUT_XY, cfg->dst_rect->x | (cfg->dst_rect->y << 16)); + if (flags & SDE_ROT_FLAG_SECURE_OVERLAY_SESSION) + SDE_REGDMA_WRITE(wrptr, ROT_WB_DST_ADDR_SW_STATUS, 0x1); + else + SDE_REGDMA_WRITE(wrptr, ROT_WB_DST_ADDR_SW_STATUS, 0); + /* * setup Downscale factor */