diff options
author | John Stultz <john.stultz@linaro.org> | 2017-05-03 11:12:18 -0700 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2017-05-26 22:23:57 -0700 |
commit | 16100f69b8b4444baa661307c5790eae039a1cc3 (patch) | |
tree | abd613b597e2bfdb171c059b06d3b080e4b93e40 /gralloc960/gralloc_buffer_priv.cpp | |
parent | a063cbdb355a3067eeda9728a531ec7754dfc099 (diff) | |
download | hikey-16100f69b8b4444baa661307c5790eae039a1cc3.tar.gz |
HiKey960: Integrate ARM's reference gralloc for mali bifrost
This integrates the BX304L01B-SW-99005-r4p0-01rel0
mali bifrost package from ARM available here:
https://developer.arm.com/products/software/mali-drivers/android-gralloc-module
Change-Id: I737bce784d21d1a870229a16bcddd3668738405a
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'gralloc960/gralloc_buffer_priv.cpp')
-rw-r--r-- | gralloc960/gralloc_buffer_priv.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/gralloc960/gralloc_buffer_priv.cpp b/gralloc960/gralloc_buffer_priv.cpp new file mode 100644 index 00000000..a3570308 --- /dev/null +++ b/gralloc960/gralloc_buffer_priv.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2014 ARM Limited. All rights reserved. + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <cutils/ashmem.h> +#include <cutils/log.h> +#include <sys/mman.h> +#include "gralloc_priv.h" +#include "gralloc_buffer_priv.h" + + +/* + * Allocate shared memory for attribute storage. Only to be + * used by gralloc internally. + * + * Return 0 on success. + */ +int gralloc_buffer_attr_allocate( private_handle_t *hnd ) +{ + int rval = -1; + + if( !hnd ) + goto out; + + if( hnd->share_attr_fd >= 0 ) + { + ALOGW("Warning share attribute fd already exists during create. Closing."); + close( hnd->share_attr_fd ); + } + + hnd->share_attr_fd = ashmem_create_region( "gralloc_shared_attr", PAGE_SIZE ); + if(hnd->share_attr_fd < 0) + { + ALOGE("Failed to allocate page for shared attribute region"); + goto err_ashmem; + } + + /* + * Default protection on the shm region is PROT_EXEC | PROT_READ | PROT_WRITE. + * + * Personality flag READ_IMPLIES_EXEC which is used by some processes, namely gdbserver, + * causes a mmap with PROT_READ to be translated to PROT_READ | PROT_EXEC. + * + * If we were to drop PROT_EXEC here with a call to ashmem_set_prot_region() + * this can potentially cause clients to fail importing this gralloc attribute buffer + * with EPERM error since PROT_EXEC is not allowed. + * + * Because of this we keep the PROT_EXEC flag. + */ + + hnd->attr_base = mmap( NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, hnd->share_attr_fd, 0 ); + if(hnd->attr_base != MAP_FAILED) + { + /* The attribute region contains signed integers only. + * The reason for this is because we can set a value less than 0 for + * not-initialized values. + */ + attr_region *region = (attr_region *) hnd->attr_base; + + memset(hnd->attr_base, 0xff, PAGE_SIZE); + munmap( hnd->attr_base, PAGE_SIZE ); + hnd->attr_base = MAP_FAILED; + } + else + { + ALOGE("Failed to mmap shared attribute region"); + goto err_ashmem; + } + + rval = 0; + goto out; + +err_ashmem: + if( hnd->share_attr_fd >= 0 ) + { + close( hnd->share_attr_fd ); + hnd->share_attr_fd = -1; + } + +out: + return rval; +} + +/* + * Frees the shared memory allocated for attribute storage. + * Only to be used by gralloc internally. + + * Return 0 on success. + */ +int gralloc_buffer_attr_free( private_handle_t *hnd ) +{ + int rval = -1; + + if( !hnd ) + goto out; + + if( hnd->share_attr_fd < 0 ) + { + ALOGE("Shared attribute region not avail to free"); + goto out; + } + if( hnd->attr_base != MAP_FAILED ) + { + ALOGW("Warning shared attribute region mapped at free. Unmapping"); + munmap( hnd->attr_base, PAGE_SIZE ); + hnd->attr_base = MAP_FAILED; + } + + close( hnd->share_attr_fd ); + hnd->share_attr_fd = -1; + rval = 0; + +out: + return rval; +} |