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#ifndef __QCAMERA3HWI_MEM_H__
3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCAMERA3HWI_MEM_H__
3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <hardware/camera3.h>
3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <utils/Mutex.h>
3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" {
3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <sys/types.h>
3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <linux/msm_ion.h>
3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h>
3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}
4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera {
4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Base class for all memory types. Abstract.
4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Memory {
4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int cleanCache(int index) {return cacheOps(index, ION_IOC_CLEAN_CACHES);}
4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int invalidateCache(int index) {return cacheOps(index, ION_IOC_INV_CACHES);}
4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int cleanInvalidateCache(int index) {return cacheOps(index, ION_IOC_CLEAN_INV_CACHES);}
5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int getFd(int index) const;
5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int getSize(int index) const;
5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int getCnt() const;
5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int cacheOps(int index, unsigned int cmd) = 0;
5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getRegFlags(uint8_t *regFlags) const = 0;
5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getMatchBufIndex(void *object) = 0;
5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void *getPtr(int index) const= 0;
5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Memory();
6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3Memory();
6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void getBufDef(const cam_frame_len_offset_t &offset,
6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                mm_camera_buf_def_t &bufDef, int index) const;
6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprotected:
6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    struct QCamera3MemInfo {
6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev        int fd;
6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev        int main_ion_fd;
6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev        struct ion_handle *handle;
7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev        uint32_t size;
7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    };
7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int cacheOpsInternal(int index, unsigned int cmd, void *vaddr);
7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int mBufferCount;
7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    struct QCamera3MemInfo mMemInfo[MM_CAMERA_MAX_NUM_FRAMES];
7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void *mPtr[MM_CAMERA_MAX_NUM_FRAMES];
7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Internal heap memory is used for memories used internally
8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// They are allocated from /dev/ion. Examples are: capabilities,
8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// parameters, metadata, and internal YUV data for jpeg encoding.
8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3HeapMemory : public QCamera3Memory {
8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3HeapMemory();
8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3HeapMemory();
8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int allocate(int count, int size, bool queueAll);
8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void deallocate();
9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int cacheOps(int index, unsigned int cmd);
9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getRegFlags(uint8_t *regFlags) const;
9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getMatchBufIndex(void *object);
9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void *getPtr(int index) const;
9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int alloc(int count, int size, int heap_id);
9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void dealloc();
9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int allocOneBuffer(struct QCamera3MemInfo &memInfo, int heap_id, int size);
10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void deallocOneBuffer(struct QCamera3MemInfo &memInfo);
10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    bool mQueueAll;
10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev// Gralloc Memory shared with frameworks
10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3GrallocMemory : public QCamera3Memory {
10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3GrallocMemory();
10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3GrallocMemory();
10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers);
11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void unregisterBuffers();
11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int cacheOps(int index, unsigned int cmd);
11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getRegFlags(uint8_t *regFlags) const;
11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual int getMatchBufIndex(void *object);
11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual void *getPtr(int index) const;
11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t markFrameNumber(int index, uint32_t frameNumber);
11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t getFrameNumber(int index);
11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    buffer_handle_t *mBufferHandle[MM_CAMERA_MAX_NUM_FRAMES];
12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    struct private_handle_t *mPrivateHandle[MM_CAMERA_MAX_NUM_FRAMES];
12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t mCurrentFrameNumbers[MM_CAMERA_MAX_NUM_FRAMES];
12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif
127