diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp index f02cf53..3abf069 100644 --- a/libgralloc/alloc_controller.cpp +++ b/libgralloc/alloc_controller.cpp @@ -136,6 +136,9 @@ int IonController::allocate(alloc_data& data, int usage, if(usage & GRALLOC_USAGE_PROTECTED) ionFlags |= ION_SECURE; + if(usage & GRALLOC_USAGE_PRIVATE_DO_NOT_MAP) + data.allocType = private_handle_t::PRIV_FLAGS_NOT_MAPPED; + // if no flags are set, default to // EBI heap, so that bypass can work // we can fall back to system heap if diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h index 233a24e..7ef6f54 100644 --- a/libgralloc/gralloc_priv.h +++ b/libgralloc/gralloc_priv.h @@ -74,6 +74,9 @@ enum { * and may need to be moved if the gralloc API changes */ GRALLOC_USAGE_PRIVATE_UNSYNCHRONIZED = 0X00040000, + + /* Set this flag when you need to avoid mapping the memory in userspace */ + GRALLOC_USAGE_PRIVATE_DO_NOT_MAP = 0X00080000, }; enum { @@ -317,6 +320,7 @@ struct private_handle_t { PRIV_FLAGS_HWC_LOCK = 0x00000200, // Set by HWC when storing the handle PRIV_FLAGS_SECURE_BUFFER = 0x00000400, PRIV_FLAGS_UNSYNCHRONIZED = 0x00000800, // For explicit synchronization + PRIV_FLAGS_NOT_MAPPED = 0x00001000, // Not mapped in userspace }; // file-descriptors diff --git a/libgralloc/ionalloc.cpp b/libgralloc/ionalloc.cpp index f89f853..94a27e3 100644 --- a/libgralloc/ionalloc.cpp +++ b/libgralloc/ionalloc.cpp @@ -34,6 +34,7 @@ #include #include #include +#include "gralloc_priv.h" #include "ionalloc.h" using gralloc::IonAlloc; @@ -116,7 +117,8 @@ int IonAlloc::alloc_buffer(alloc_data& data) return err; } - if(!(data.flags & ION_SECURE)) { + if(!(data.flags & ION_SECURE) && + !(data.allocType & private_handle_t::PRIV_FLAGS_NOT_MAPPED)) { base = mmap(0, ionAllocData.len, PROT_READ|PROT_WRITE, MAP_SHARED, fd_data.fd, 0); diff --git a/liboverlay/overlayLib.cpp b/liboverlay/overlayLib.cpp index 0175c66..1e1b5e6 100755 --- a/liboverlay/overlayLib.cpp +++ b/liboverlay/overlayLib.cpp @@ -1830,8 +1830,9 @@ bool OverlayDataChannel::mapRotatorMemory(int num_buffers, bool uiChannel, int r data.align = getpagesize(); data.uncached = true; - int allocFlags = GRALLOC_USAGE_PRIVATE_MM_HEAP | - GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP; + int allocFlags = GRALLOC_USAGE_PRIVATE_MM_HEAP | + GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP| + GRALLOC_USAGE_PRIVATE_DO_NOT_MAP; if(mSecure) { allocFlags |= GRALLOC_USAGE_PROTECTED; diff --git a/liboverlay/overlayLibUI.cpp b/liboverlay/overlayLibUI.cpp index 4f9362f..3e2e850 100755 --- a/liboverlay/overlayLibUI.cpp +++ b/liboverlay/overlayLibUI.cpp @@ -164,7 +164,8 @@ status_t Rotator::startRotSession(msm_rotator_img_info& rotInfo, GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP | GRALLOC_USAGE_PRIVATE_ADSP_HEAP | GRALLOC_USAGE_PRIVATE_IOMMU_HEAP | - GRALLOC_USAGE_PRIVATE_SMI_HEAP; + GRALLOC_USAGE_PRIVATE_SMI_HEAP | + GRALLOC_USAGE_PRIVATE_DO_NOT_MAP; int err = mAlloc->allocate(data, allocFlags, 0);