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 <bkchan@codeaurora.org>
This commit is contained in:
Benjamin Chan 2016-08-29 10:04:22 -04:00 committed by Gerrit - the friendly Code Review server
parent aaf356abef
commit aeb8d34871

View file

@ -434,6 +434,14 @@ static void sde_hw_rotator_setup_timestamp_packet(
SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x03020100); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x03020100);
SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x80000000); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x80000000);
SDE_REGDMA_BLKWRITE_DATA(wrptr, ctx->timestamp); 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_INC(wrptr, ROT_WB_DST_FORMAT, 4);
SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x000037FF); SDE_REGDMA_BLKWRITE_DATA(wrptr, 0x000037FF);
SDE_REGDMA_BLKWRITE_DATA(wrptr, 0); 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) { if (flags & SDE_ROT_FLAG_SECURE_OVERLAY_SESSION) {
SDE_REGDMA_WRITE(wrptr, ROT_SSPP_SRC_ADDR_SW_STATUS, 0xF); SDE_REGDMA_WRITE(wrptr, ROT_SSPP_SRC_ADDR_SW_STATUS, 0xF);
ctx->is_secure = true; 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 */ /* 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, SDE_REGDMA_WRITE(wrptr, ROT_WB_OUT_XY,
cfg->dst_rect->x | (cfg->dst_rect->y << 16)); 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 * setup Downscale factor
*/ */