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