1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * 4 * HDF is dual licensed: you can use it either under the terms of 5 * the GPL, or the BSD license, at your option. 6 * See the LICENSE file in the root of this repository for complete details. 7 */ 8 9 #ifndef CAMERA_BUFFER_H 10 #define CAMERA_BUFFER_H 11 12 #include <hdf_dlist.h> 13 #include <osal_atomic.h> 14 #include <osal_mutex.h> 15 #include <osal_spinlock.h> 16 #include <camera/camera_product.h> 17 18 #define MAX_PLANES 8 /* max plane count per buffer */ 19 20 enum BufferState { 21 BUFFER_STATE_DEQUEUED, 22 BUFFER_STATE_PREPARING, 23 BUFFER_STATE_QUEUED, 24 BUFFER_STATE_ACTIVE, 25 BUFFER_STATE_DONE, 26 BUFFER_STATE_ERROR, 27 }; 28 29 struct BufferPlane { 30 void *memPriv; 31 void *dmaBuf; 32 uint32_t dmaMapped; 33 uint32_t bytesUsed; 34 uint32_t length; 35 uint32_t minLength; 36 union { 37 uint32_t offset; 38 unsigned long userPtr; 39 uint32_t fd; 40 } memory; 41 uint32_t dataOffset; 42 }; 43 44 struct CameraBuffer { 45 struct BufferQueue *bufferQueue; 46 uint32_t id; 47 uint32_t memType; 48 uint64_t timeStamp; 49 enum BufferState state; 50 uint32_t flags; 51 uint32_t numPlanes; 52 struct BufferPlane planes[MAX_PLANES]; 53 struct DListHead queueEntry; 54 struct DListHead doneEntry; 55 uint32_t field; 56 uint32_t sequence; 57 }; 58 59 /* CameraBuffer flags */ 60 enum BufferFlags { 61 BUFFER_DEVICE_SYNCED = (1 << 0), 62 BUFFER_NEED_USER_SYNC = (1 << 1), 63 BUFFER_NEED_DEVICE_SYNC = (1 << 2), 64 BUFFER_PREPARED = (1 << 3), 65 }; 66 67 void CameraBufferSyncForUser(struct CameraBuffer *buffer); 68 void CameraBufferFree(struct CameraBuffer *buffer); 69 int32_t CameraBufferAllocMmapPlanes(struct CameraBuffer *buffer); 70 void CameraBufferSetupOffsets(struct CameraBuffer *buffer); 71 int32_t CameraBufferCheckPlanes(struct CameraBuffer *buffer, const struct UserCameraBuffer *userBuffer); 72 void CameraBufferToUserBuffer(struct CameraBuffer *buffer, struct UserCameraBuffer *userBuffer); 73 void CameraBufferEnqueue(struct CameraBuffer *buffer); 74 void CameraBufferQueueBuffer(struct CameraBuffer *buffer); 75 void CameraBufferSetCacheSync(struct BufferQueue *queue, struct CameraBuffer *buffer); 76 int32_t CameraBufferCheckPlaneLength(struct CameraBuffer *buffer, const struct UserCameraBuffer *userBuffer); 77 int32_t CameraBufferFromUserBuffer(struct CameraBuffer *buffer, const struct UserCameraBuffer *userBuffer); 78 79 #endif // CAMERA_BUFFER_H