111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without 411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are 511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met: 611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions of source code must retain the above copyright 711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * notice, this list of conditions and the following disclaimer. 811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions in binary form must reproduce the above 911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * copyright notice, this list of conditions and the following 1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * disclaimer in the documentation and/or other materials provided 1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * with the distribution. 1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * contributors may be used to endorse or promote products derived 1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * from this software without specific prior written permission. 1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */ 2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define LOG_TAG "QCameraHWI_Mem" 3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <string.h> 3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <fcntl.h> 3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <sys/mman.h> 3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <utils/Log.h> 3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <utils/Errors.h> 3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <gralloc_priv.h> 3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCamera3Mem.h" 3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" { 4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h> 4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevusing namespace android; 4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera { 4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// QCaemra2Memory base class 4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : QCamera3Memory 5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: default constructor of QCamera3Memory 5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : None 5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3Memory::QCamera3Memory() 6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferCount = 0; 6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < MM_CAMERA_MAX_NUM_FRAMES; i++) { 6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].fd = 0; 6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].main_ion_fd = 0; 6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].handle = NULL; 6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].size = 0; 6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : ~QCamera3Memory 7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: deconstructor of QCamera3Memory 7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : None 7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3Memory::~QCamera3Memory() 8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : cacheOpsInternal 8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: ion related memory cache operations 8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @cmd : cache ops command 9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @vaddr : ptr to the virtual address 9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3Memory::cacheOpsInternal(int index, unsigned int cmd, void *vaddr) 9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_flush_data cache_inv_data; 10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_custom_data custom_data; 10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int ret = OK; 10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) { 10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: index %d out of bound [0, %d)", __func__, index, mBufferCount); 10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&cache_inv_data, 0, sizeof(cache_inv_data)); 10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&custom_data, 0, sizeof(custom_data)); 11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cache_inv_data.vaddr = vaddr; 11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cache_inv_data.fd = mMemInfo[index].fd; 11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cache_inv_data.handle = mMemInfo[index].handle; 11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cache_inv_data.length = mMemInfo[index].size; 11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev custom_data.cmd = cmd; 11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev custom_data.arg = (unsigned long)&cache_inv_data; 11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGV("%s: addr = %p, fd = %d, handle = %p length = %d, ION Fd = %d", 11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev __func__, cache_inv_data.vaddr, cache_inv_data.fd, 11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev cache_inv_data.handle, cache_inv_data.length, 12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[index].main_ion_fd); 12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ret = ioctl(mMemInfo[index].main_ion_fd, ION_IOC_CUSTOM, &custom_data); 12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (ret < 0) 12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Cache Invalidate failed: %s\n", __func__, strerror(errno)); 12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return ret; 12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getFd 13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: return file descriptor of the indexed buffer 13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : file descriptor 13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3Memory::getFd(int index) const 13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) 14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return mMemInfo[index].fd; 14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getSize 14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: return buffer size of the indexed buffer 15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : buffer size 15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3Memory::getSize(int index) const 15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) 15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 16011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 16111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return (int)mMemInfo[index].size; 16211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 16311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 16411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 16511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getCnt 16611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 16711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query number of buffers allocated 16811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 16911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 17011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 17111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : number of buffers allocated 17211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 17311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3Memory::getCnt() const 17411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 17511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return mBufferCount; 17611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 17711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 17811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 17911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getBufDef 18011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 18111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query detailed buffer information 18211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 18311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 18411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @offset : [input] frame buffer offset 18511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @bufDef : [output] reference to struct to store buffer definition 18611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : [input] index of the buffer 18711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 18811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 18911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 19011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid QCamera3Memory::getBufDef(const cam_frame_len_offset_t &offset, 19111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_buf_def_t &bufDef, int index) const 19211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 19311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (!mBufferCount) { 19411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("Memory not allocated"); 19511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return; 19611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 19711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.fd = mMemInfo[index].fd; 19811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.frame_len = mMemInfo[index].size; 19911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.mem_info = (void *)this; 20011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.num_planes = offset.num_planes; 20111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.buffer = getPtr(index); 20211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.buf_idx = index; 20311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 20411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* Plane 0 needs to be set separately. Set other planes in a loop */ 20511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[0].length = offset.mp[0].len; 20611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[0].m.userptr = mMemInfo[index].fd; 20711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[0].data_offset = offset.mp[0].offset; 20811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[0].reserved[0] = 0; 20911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 1; i < bufDef.num_planes; i++) { 21011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i].length = offset.mp[i].len; 21111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i].m.userptr = mMemInfo[i].fd; 21211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i].data_offset = offset.mp[i].offset; 21311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i].reserved[0] = 21411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i-1].reserved[0] + 21511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev bufDef.planes[i-1].length; 21611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 21711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 21811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 21911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 22011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : QCamera3HeapMemory 22111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 22211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: constructor of QCamera3HeapMemory for ion memory used internally in HAL 22311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 22411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 22511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 22611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 22711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 22811a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3HeapMemory::QCamera3HeapMemory() 22911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev : QCamera3Memory() 23011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 23111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < MM_CAMERA_MAX_NUM_FRAMES; i ++) 23211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPtr[i] = NULL; 23311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 23411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 23511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 23611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : ~QCamera3HeapMemory 23711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 23811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: deconstructor of QCamera3HeapMemory 23911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 24011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 24111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 24211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 24311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 24411a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3HeapMemory::~QCamera3HeapMemory() 24511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 24611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 24711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 24811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 24911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : alloc 25011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 25111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: allocate requested number of buffers of certain size 25211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 25311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 25411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @count : number of buffers to be allocated 25511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @size : lenght of the buffer to be allocated 25611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @heap_id : heap id to indicate where the buffers will be allocated from 25711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 25811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 25911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 26011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 26111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 26211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::alloc(int count, int size, int heap_id) 26311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 26411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int rc = OK; 26511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > MM_CAMERA_MAX_NUM_FRAMES) { 26611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("Buffer count %d out of bound. Max is %d", count, MM_CAMERA_MAX_NUM_FRAMES); 26711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 26811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 26911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (mBufferCount) { 27011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("Allocating a already allocated heap memory"); 27111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return INVALID_OPERATION; 27211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 27311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 27411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < count; i ++) { 27511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = allocOneBuffer(mMemInfo[i], heap_id, size); 27611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (rc < 0) { 27711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("AllocateIonMemory failed"); 27811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int j = i-1; j >= 0; j--) 27911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev deallocOneBuffer(mMemInfo[j]); 28011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 28111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 28211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 28311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return rc; 28411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 28511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 28611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 28711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : dealloc 28811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 28911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: deallocate buffers 29011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 29111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 29211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 29311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 29411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 29511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid QCamera3HeapMemory::dealloc() 29611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 29711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < mBufferCount; i++) 29811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev deallocOneBuffer(mMemInfo[i]); 29911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 30011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 30111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 30211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : allocOneBuffer 30311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 30411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: impl of allocating one buffers of certain size 30511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 30611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 30711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @memInfo : [output] reference to struct to store additional memory allocation info 30811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @heap : [input] heap id to indicate where the buffers will be allocated from 30911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @size : [input] lenght of the buffer to be allocated 31011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 31111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 31211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 31311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 31411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 31511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::allocOneBuffer(QCamera3MemInfo &memInfo, int heap_id, int size) 31611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 31711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int rc = OK; 31811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle_data handle_data; 31911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_allocation_data alloc; 32011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_fd_data ion_info_fd; 32111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int main_ion_fd = 0; 32211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 32311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev main_ion_fd = open("/dev/ion", O_RDONLY); 32411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (main_ion_fd <= 0) { 32511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("Ion dev open failed: %s\n", strerror(errno)); 32611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev goto ION_OPEN_FAILED; 32711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 32811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 32911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&alloc, 0, sizeof(alloc)); 33011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev alloc.len = size; 33111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev /* to make it page size aligned */ 33211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev alloc.len = (alloc.len + 4095) & (~4095); 33311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev alloc.align = 4096; 33411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev alloc.flags = ION_FLAG_CACHED; 33552811a996868c92dd80ed38aa1ecd5e9953d0f12Rom Lemarchand alloc.heap_id_mask = heap_id; 33611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = ioctl(main_ion_fd, ION_IOC_ALLOC, &alloc); 33711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (rc < 0) { 33811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("ION allocation for len %d failed: %s\n", alloc.len, 33911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev strerror(errno)); 34011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev goto ION_ALLOC_FAILED; 34111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 34211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 34311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&ion_info_fd, 0, sizeof(ion_info_fd)); 34411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ion_info_fd.handle = alloc.handle; 34511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = ioctl(main_ion_fd, ION_IOC_SHARE, &ion_info_fd); 34611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (rc < 0) { 34711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("ION map failed %s\n", strerror(errno)); 34811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev goto ION_MAP_FAILED; 34911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 35011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 35111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.main_ion_fd = main_ion_fd; 35211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.fd = ion_info_fd.fd; 35311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.handle = ion_info_fd.handle; 35411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.size = alloc.len; 35511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return OK; 35611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 35711a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevION_MAP_FAILED: 35811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&handle_data, 0, sizeof(handle_data)); 35911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev handle_data.handle = ion_info_fd.handle; 36011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ioctl(main_ion_fd, ION_IOC_FREE, &handle_data); 36111a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevION_ALLOC_FAILED: 36211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(main_ion_fd); 36311a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevION_OPEN_FAILED: 36411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return NO_MEMORY; 36511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 36611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 36711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 36811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : deallocOneBuffer 36911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 37011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: impl of deallocating one buffers 37111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 37211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 37311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @memInfo : reference to struct that stores additional memory allocation info 37411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 37511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 37611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 37711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid QCamera3HeapMemory::deallocOneBuffer(QCamera3MemInfo &memInfo) 37811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 37911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle_data handle_data; 38011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 38111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (memInfo.fd > 0) { 38211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(memInfo.fd); 38311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.fd = 0; 38411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 38511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 38611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (memInfo.main_ion_fd > 0) { 38711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&handle_data, 0, sizeof(handle_data)); 38811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev handle_data.handle = memInfo.handle; 38911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ioctl(memInfo.main_ion_fd, ION_IOC_FREE, &handle_data); 39011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(memInfo.main_ion_fd); 39111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.main_ion_fd = 0; 39211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 39311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.handle = NULL; 39411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memInfo.size = 0; 39511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 39611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 39711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 39811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getPtr 39911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 40011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: return buffer pointer 40111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 40211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 40311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 40411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 40511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : buffer ptr 40611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 40711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid *QCamera3HeapMemory::getPtr(int index) const 40811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 40911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) { 41011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("index out of bound"); 41111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return (void *)BAD_INDEX; 41211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 41311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return mPtr[index]; 41411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 41511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 41611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 41711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : allocate 41811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 41911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: allocate requested number of buffers of certain size 42011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 42111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 42211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @count : number of buffers to be allocated 42311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @size : lenght of the buffer to be allocated 42411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @queueAll: whether to queue all allocated buffers at the beginning 42511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 42611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 42711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 42811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 42911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 43011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::allocate(int count, int size, bool queueAll) 43111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 43252811a996868c92dd80ed38aa1ecd5e9953d0f12Rom Lemarchand int heap_id_mask = 0x1 << ION_IOMMU_HEAP_ID; 43352811a996868c92dd80ed38aa1ecd5e9953d0f12Rom Lemarchand int rc = alloc(count, size, heap_id_mask); 43411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (rc < 0) 43511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return rc; 43611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 43711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < count; i ++) { 43811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *vaddr = mmap(NULL, 43911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].size, 44011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev PROT_READ | PROT_WRITE, 44111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev MAP_SHARED, 44211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[i].fd, 0); 44311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (vaddr == MAP_FAILED) { 44411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int j = i-1; j >= 0; j --) { 44511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev munmap(mPtr[i], mMemInfo[i].size); 44611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = NO_MEMORY; 44711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 44811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 44911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else 45011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPtr[i] = vaddr; 45111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 45211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (rc == 0) 45311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferCount = count; 45411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 45511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mQueueAll = queueAll; 45611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return OK; 45711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 45811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 45911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 46011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : deallocate 46111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 46211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: deallocate buffers 46311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 46411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 46511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 46611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 46711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 46811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid QCamera3HeapMemory::deallocate() 46911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 47011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < mBufferCount; i++) { 47111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev munmap(mPtr[i], mMemInfo[i].size); 47211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPtr[i] = NULL; 47311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 47411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev dealloc(); 47511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferCount = 0; 47611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 47711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 47811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 47911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : cacheOps 48011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 48111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: ion related memory cache operations 48211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 48311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 48411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 48511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @cmd : cache ops command 48611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 48711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 48811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 48911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 49011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 49111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::cacheOps(int index, unsigned int cmd) 49211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 49311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) 49411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 49511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return cacheOpsInternal(index, cmd, mPtr[index]); 49611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 49711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 49811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 49911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getRegFlags 50011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 50111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query initial reg flags 50211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 50311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 50411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @regFlags: initial reg flags of the allocated buffers 50511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 50611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 50711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 50811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 50911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 51011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::getRegFlags(uint8_t * regFlags) const 51111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 51211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int i; 51311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (i = 0; i < mBufferCount; i ++) 51411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev regFlags[i] = (mQueueAll ? 1 : 0); 51511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return NO_ERROR; 51611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 51711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 51811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 51911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getMatchBufIndex 52011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 52111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query buffer index by object ptr 52211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 52311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 52411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @object : object ptr 52511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 52611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : buffer index if match found, 52711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * -1 if failed 52811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 52911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3HeapMemory::getMatchBufIndex(void * /*object*/) 53011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 53111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 53211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* 53311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev TODO for HEAP memory type, would there be an equivalent requirement? 53411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 53511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int index = -1; 53611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev buffer_handle_t *key = (buffer_handle_t*) object; 53711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (!key) { 53811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_VALUE; 53911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 54011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < mBufferCount; i++) { 54111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (mBufferHandle[i] == key) { 54211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev index = i; 54311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 54411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 54511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 54611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return index; 54711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev*/ 54811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: FATAL: Not supposed to come here", __func__); 54911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return -1; 55011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 55111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 55211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 55311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : QCamera3GrallocMemory 55411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 55511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: constructor of QCamera3GrallocMemory 55611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * preview stream buffers are allocated from gralloc native_windoe 55711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 55811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 55911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @getMemory : camera memory request ops table 56011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 56111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 56211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 56311a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3GrallocMemory::QCamera3GrallocMemory() 56411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev : QCamera3Memory() 56511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 56611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < MM_CAMERA_MAX_NUM_FRAMES; i ++) { 56711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferHandle[i] = NULL; 56811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[i] = NULL; 56911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mCurrentFrameNumbers[i] = -1; 57011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 57111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 57211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 57311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 57411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : ~QCamera3GrallocMemory 57511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 57611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: deconstructor of QCamera3GrallocMemory 57711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 57811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 57911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 58011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 58111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 58211a4b5c79df5f832d512e0da94d596380c319dbcIliyan MalchevQCamera3GrallocMemory::~QCamera3GrallocMemory() 58311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 58411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 58511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 58611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 58711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : registerBuffers 58811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 58911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: register frameworks-allocated gralloc buffer_handle_t 59011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 59111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 59211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @num_buffer : number of buffers to be registered 59311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @buffers : array of buffer_handle_t pointers 59411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 59511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 59611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 59711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 59811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 59911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3GrallocMemory::registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers) 60011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 60111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev status_t ret = NO_ERROR; 60211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_fd_data ion_info_fd; 60311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGV(" %s : E ", __FUNCTION__); 60411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 60511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&ion_info_fd, 0, sizeof(ion_info_fd)); 60611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 60711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 60811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (num_buffers > MM_CAMERA_MAX_NUM_FRAMES) { 60911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Number of buffers %d greater than what's supported %d", 61011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev __func__, num_buffers, MM_CAMERA_MAX_NUM_FRAMES); 61111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return -EINVAL; 61211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 61311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 61411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (size_t cnt = 0; cnt < num_buffers; cnt++) { 61511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (buffers[cnt] == NULL) { 61611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Invalid buffers[%d].", __func__, cnt); 61711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return -EINVAL; 61811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 61911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferHandle[cnt] = buffers[cnt]; 62011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[cnt] = 62111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev (struct private_handle_t *)(*mBufferHandle[cnt]); 62211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].main_ion_fd = open("/dev/ion", O_RDONLY); 62311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (mMemInfo[cnt].main_ion_fd < 0) { 62411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: failed: could not open ion device", __func__); 62511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for(size_t i = 0; i < cnt; i++) { 62611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle_data ion_handle; 62711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&ion_handle, 0, sizeof(ion_handle)); 62811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ion_handle.handle = mMemInfo[i].handle; 62911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (ioctl(mMemInfo[i].main_ion_fd, ION_IOC_FREE, &ion_handle) < 0) { 63011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: ion free failed", __func__); 63111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 63211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(mMemInfo[i].main_ion_fd); 63311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGD("%s: cancel_buffer: hdl =%p", __func__, (*mBufferHandle[i])); 63411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferHandle[i] = NULL; 63511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 63611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&mMemInfo, 0, sizeof(mMemInfo)); 63711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ret = -ENOMEM; 63811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev goto end; 63911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 64011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ion_info_fd.fd = mPrivateHandle[cnt]->fd; 64111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (ioctl(mMemInfo[cnt].main_ion_fd, 64211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ION_IOC_IMPORT, &ion_info_fd) < 0) { 64311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: ION import failed\n", __func__); 64411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for(size_t i = 0; i < cnt; i++) { 64511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle_data ion_handle; 64611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&ion_handle, 0, sizeof(ion_handle)); 64711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ion_handle.handle = mMemInfo[i].handle; 64811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (ioctl(mMemInfo[i].main_ion_fd, ION_IOC_FREE, &ion_handle) < 0) { 64911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("ion free failed"); 65011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 65111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(mMemInfo[i].main_ion_fd); 65211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferHandle[i] = NULL; 65311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 65411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(mMemInfo[cnt].main_ion_fd); 65511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&mMemInfo, 0, sizeof(mMemInfo)); 65611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ret = -ENOMEM; 65711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev goto end; 65811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 65911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 66011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGD("%s: idx = %d, fd = %d, size = %d, offset = %d", 66111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev __func__, cnt, mPrivateHandle[cnt]->fd, 66211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[cnt]->size, 66311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[cnt]->offset); 66411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].fd = 66511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[cnt]->fd; 66611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].size = 66711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPrivateHandle[cnt]->size; 66811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].handle = ion_info_fd.handle; 66911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 67011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *vaddr = mmap(NULL, 67111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].size, 67211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev PROT_READ | PROT_WRITE, 67311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev MAP_SHARED, 67411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mMemInfo[cnt].fd, 0); 67511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (vaddr == MAP_FAILED) { 67611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int j = cnt-1; j >= 0; j --) { 67711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev munmap(mPtr[cnt], mMemInfo[cnt].size); 67811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ret = -ENOMEM; 67911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 68011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 68111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else 68211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPtr[cnt] = vaddr; 68311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 68411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferCount = num_buffers; 68511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 68611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevend: 68711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGV(" %s : X ",__func__); 68811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return ret; 68911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 69011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 69111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 69211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : unregisterBuffers 69311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 69411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: unregister buffers 69511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 69611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : none 69711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 69811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : none 69911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 70011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid QCamera3GrallocMemory::unregisterBuffers() 70111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 70211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGV("%s: E ", __FUNCTION__); 70311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 70411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int cnt = 0; cnt < mBufferCount; cnt++) { 70511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev munmap(mPtr[cnt], mMemInfo[cnt].size); 70611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mPtr[cnt] = NULL; 70711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 70811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev struct ion_handle_data ion_handle; 70911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(&ion_handle, 0, sizeof(ion_handle)); 71011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ion_handle.handle = mMemInfo[cnt].handle; 71111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (ioctl(mMemInfo[cnt].main_ion_fd, ION_IOC_FREE, &ion_handle) < 0) { 71211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("ion free failed"); 71311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 71411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev close(mMemInfo[cnt].main_ion_fd); 71511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGD("put buffer %d successfully", cnt); 71611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 71711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mBufferCount = 0; 71811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGV(" %s : X ",__FUNCTION__); 71911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 72011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 72111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 72211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : markFrameNumber 72311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 72411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: We use this function from the request call path to mark the 72511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * buffers with the frame number they are intended for this info 72611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * is used later when giving out callback & it is duty of PP to 72711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ensure that data for that particular frameNumber/Request is 72811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * written to this buffer. 72911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 73011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 73111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @frame# : Frame number from the framework 73211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 73311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 73411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 73511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 73611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 73711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint32_t QCamera3GrallocMemory::markFrameNumber(int index, uint32_t frameNumber) 73811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 73911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if(index >= mBufferCount || index >= MM_CAMERA_MAX_NUM_FRAMES) { 74011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Index out of bounds",__func__); 74111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 74211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 74311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mCurrentFrameNumbers[index] = frameNumber; 74411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return NO_ERROR; 74511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 74611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 74711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 74811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getFrameNumber 74911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 75011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: We use this to fetch the frameNumber for the request with which 75111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * this buffer was given to HAL 75211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 75311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 75411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 75511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 75611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 75711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t frameNumber 75811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * postive/zero -- success 75911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * negetive failure 76011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 76111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint32_t QCamera3GrallocMemory::getFrameNumber(int index) 76211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 76311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if(index >= mBufferCount || index >= MM_CAMERA_MAX_NUM_FRAMES) { 76411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Index out of bounds",__func__); 76511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return -1; 76611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 76711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 76811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return mCurrentFrameNumbers[index]; 76911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 77011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 77111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 77211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : cacheOps 77311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 77411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: ion related memory cache operations 77511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 77611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 77711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 77811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @cmd : cache ops command 77911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 78011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 78111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 78211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 78311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 78411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3GrallocMemory::cacheOps(int index, unsigned int cmd) 78511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 78611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) 78711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_INDEX; 78811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return cacheOpsInternal(index, cmd, mPtr[index]); 78911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 79011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 79111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 79211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getRegFlags 79311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 79411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query initial reg flags 79511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 79611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 79711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @regFlags: initial reg flags of the allocated buffers 79811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 79911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : int32_t type of status 80011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * NO_ERROR -- success 80111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 80211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 80311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3GrallocMemory::getRegFlags(uint8_t *regFlags) const 80411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 80511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int i; 80611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (i = 0; i < mBufferCount; i ++) 80711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev regFlags[i] = 0; 80811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return NO_ERROR; 80911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 81011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 81111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 81211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getMatchBufIndex 81311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 81411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: query buffer index by object ptr 81511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 81611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 81711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @opaque : opaque ptr 81811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 81911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : buffer index if match found, 82011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * -1 if failed 82111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 82211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint QCamera3GrallocMemory::getMatchBufIndex(void *object) 82311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 82411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int index = -1; 82511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev buffer_handle_t *key = (buffer_handle_t*) object; 82611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (!key) { 82711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return BAD_VALUE; 82811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 82911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (int i = 0; i < mBufferCount; i++) { 83011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (mBufferHandle[i] == key) { 83111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev index = i; 83211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 83311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 83411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 83511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return index; 83611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 83711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 83811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/*=========================================================================== 83911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * FUNCTION : getPtr 84011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 84111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * DESCRIPTION: return buffer pointer 84211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 84311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * PARAMETERS : 84411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @index : index of the buffer 84511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 84611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * RETURN : buffer ptr 84711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *==========================================================================*/ 84811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevvoid *QCamera3GrallocMemory::getPtr(int index) const 84911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 85011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (index >= mBufferCount) { 85111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("index out of bound"); 85211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return (void *)BAD_INDEX; 85311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 85411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return mPtr[index]; 85511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 85611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 85711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; //namespace qcamera 858