summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-09-02 13:52:33 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-02 13:52:33 -0700
commitd48d1c2287fda7985df05e578cd2bed3f85daf6d (patch)
tree2b0c51525d8540a562320248f76b5e47f8406ff2
parentce208ebb32597e733c201c3373616d18b5c62d57 (diff)
parentaeb8d34871ae29894660111bfa7b65b1e4cf33e8 (diff)
Merge "msm: sde: Fix SMMU fault in SDE rotator for secure playback"
-rw-r--r--drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c16
1 files changed, 16 insertions, 0 deletions
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 13d593c46824..76fd674d161d 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
*/