Merge "gralloc: Align protected allocations with the spec"
diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp
index 9af52c9..8ef5611 100644
--- a/libgralloc/alloc_controller.cpp
+++ b/libgralloc/alloc_controller.cpp
@@ -175,7 +175,6 @@
{
int ionFlags = 0;
int ret;
- bool noncontig = false;
data.uncached = useUncached(usage);
data.allocType = 0;
@@ -183,24 +182,33 @@
if(usage & GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP)
ionFlags |= ION_HEAP(ION_SF_HEAP_ID);
- if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) {
+ if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP)
ionFlags |= ION_HEAP(ION_SYSTEM_HEAP_ID);
- noncontig = true;
- }
- if(usage & GRALLOC_USAGE_PRIVATE_IOMMU_HEAP) {
+ if(usage & GRALLOC_USAGE_PRIVATE_IOMMU_HEAP)
ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID);
- noncontig = true;
- }
- if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP)
- ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID);
+ //MM Heap is exclusively a secure heap.
+ if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP) {
+ //XXX: Right now the MM heap is the only secure heap we have. When we
+ //have other secure heaps, we can change this.
+ if(usage & GRALLOC_USAGE_PROTECTED) {
+ ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID);
+ ionFlags |= ION_SECURE;
+ }
+ else {
+ ALOGW("GRALLOC_USAGE_PRIVATE_MM_HEAP \
+ cannot be used as an insecure heap!\
+ trying to use IOMMU instead !!");
+ ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID);
+ }
+ }
if(usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP)
ionFlags |= ION_HEAP(ION_ADSP_HEAP_ID);
- if(usage & GRALLOC_USAGE_PROTECTED && !noncontig)
- ionFlags |= ION_SECURE;
+ if(usage & GRALLOC_USAGE_PROTECTED)
+ data.allocType |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER;
// if no flags are set, default to
// SF + IOMMU heaps, so that bypass can work
@@ -218,16 +226,11 @@
{
ALOGW("Falling back to system heap");
data.flags = ION_HEAP(ION_SYSTEM_HEAP_ID);
- noncontig = true;
ret = mIonAlloc->alloc_buffer(data);
}
if(ret >= 0 ) {
data.allocType |= private_handle_t::PRIV_FLAGS_USES_ION;
- if(noncontig)
- data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM;
- if(ionFlags & ION_SECURE)
- data.allocType |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER;
}
return ret;
diff --git a/liboverlay/overlayMem.h b/liboverlay/overlayMem.h
index d3cabb6..5fbe91b 100644
--- a/liboverlay/overlayMem.h
+++ b/liboverlay/overlayMem.h
@@ -138,21 +138,11 @@
data.uncached = true;
err = mAlloc->allocate(data, allocFlags);
- //see if we can fallback to other heap
- //we can try MM_HEAP once if it's not secure playback
- if (err != 0 && !isSecure) {
- allocFlags |= GRALLOC_USAGE_PRIVATE_MM_HEAP;
- err = mAlloc->allocate(data, allocFlags);
- if (err != 0) {
- ALOGE(" could not allocate from fallback heap");
- return false;
- }
- } else if (err != 0) {
- ALOGE("OvMem: error allocating memory can not fall back");
+ if (err != 0) {
+ ALOGE("OvMem: Error allocating memory");
return false;
}
-
mFd = data.fd;
mBaseAddr = data.base;
mAllocType = data.allocType;