overlay: Call MSMFB_SECURE on alloc/free of secure rotator buffer

Call MSMFB_SECURE on alloc/free of secure rotator buffer. This
prevents the driver from calling into TZ each frame.

Conflicts:
	msm8084/liboverlay/overlayMem.h

Bug: 17957732
Acked-by: Saurabh Shah <saurshah@codeaurora.org>
Change-Id: Ib84125b205ec6194928ecad21740f90be6f8f523
diff --git a/msm8084/liboverlay/mdpWrapper.h b/msm8084/liboverlay/mdpWrapper.h
index 1bfa058..8e67cfa 100644
--- a/msm8084/liboverlay/mdpWrapper.h
+++ b/msm8084/liboverlay/mdpWrapper.h
@@ -98,6 +98,9 @@
 /* MSMFB_WRITEBACK_DEQUEUE_BUFFER */
 bool wbDequeueBuffer(int fbfd, struct msmfb_data& fbData);
 
+/* MSMFB_SECURE */
+bool setSecureBuffer(int fbFd, struct msmfb_secure_config& config);
+
 /* the following are helper functions for dumping
  * msm_mdp and friends*/
 void dump(const char* const s, const msmfb_overlay_data& ov);
@@ -281,6 +284,15 @@
     return true;
 }
 
+inline bool setSecureBuffer(int fbFd, struct msmfb_secure_config& config) {
+    if(ioctl(fbFd, MSMFB_SECURE, &config) < 0) {
+        ALOGE("Failed to call ioctl MSMFB_SECURE err=%s buf_fd=%d enable=%d",
+                strerror(errno), config.fd, config.enable);
+        return false;
+    }
+    return true;
+}
+
 /* dump funcs */
 inline void dump(const char* const s, const msmfb_overlay_data& ov) {
     ALOGE("%s msmfb_overlay_data id=%d",
diff --git a/msm8084/liboverlay/overlayMem.h b/msm8084/liboverlay/overlayMem.h
index cef854d..b2e7dd1 100644
--- a/msm8084/liboverlay/overlayMem.h
+++ b/msm8084/liboverlay/overlayMem.h
@@ -38,6 +38,8 @@
 
 #include "gralloc_priv.h"
 #include "overlayUtils.h"
+#include "mdpWrapper.h"
+
 #define SIZE_1M 0x00100000
 #define SIZE_2M 0x00200000
 
@@ -79,6 +81,9 @@
     /* return number of bufs */
     uint32_t numBufs() const ;
 
+    /* Set / unset secure with MDP */
+    bool setSecure(bool enable);
+
 private:
     /* actual os fd */
     int mFd;
@@ -100,6 +105,9 @@
 
     /*Holds the aligned buffer size used for actual allocation*/
     uint32_t mBufSzAligned;
+
+    /* Flags if the buffer has been secured by MDP */
+    bool mSecured;
 };
 
 //-------------------Inlines-----------------------------------
@@ -113,6 +121,7 @@
     mAllocType = 0;
     mBufSz = 0;
     mNumBuffers = 0;
+    mSecured = false;
     mAlloc = gralloc::IAllocController::getInstance();
 }
 
@@ -158,6 +167,10 @@
     mBaseAddr = data.base;
     mAllocType = data.allocType;
 
+    if(isSecure) {
+        setSecure(true);
+    }
+
     return true;
 }
 
@@ -169,6 +182,10 @@
         return true;
     }
 
+    if(mSecured) {
+        setSecure(false);
+    }
+
     IMemAlloc* memalloc = mAlloc->getAllocator(mAllocType);
     ret = memalloc->free_buffer(mBaseAddr, mBufSzAligned * mNumBuffers, 0, mFd);
     if (ret != 0) {
@@ -185,6 +202,27 @@
     return true;
 }
 
+inline bool OvMem::setSecure(bool enable) {
+    OvFD fbFd;
+    if(!utils::openDev(fbFd, 0, Res::fbPath, O_RDWR)) {
+        ALOGE("OvMem::%s failed to init fb0", __FUNCTION__);
+        return false;
+    }
+    struct msmfb_secure_config config;
+    utils::memset0(config);
+    config.fd = mFd;
+    config.enable = enable;
+    if(!mdp_wrapper::setSecureBuffer(fbFd.getFD(), config)) {
+        ALOGE("OvMem::%s failed enable=%d", __FUNCTION__, enable);
+        fbFd.close();
+        mSecured = false;
+        return false;
+    }
+    fbFd.close();
+    mSecured = enable;
+    return true;
+}
+
 inline bool OvMem::valid() const
 {
     return (mFd != -1) && (mBaseAddr != MAP_FAILED);