1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Support for Intel Camera Imaging ISP subsystem.
4  * Copyright (c) 2010 - 2015, Intel Corporation.
5  */
6 
7 #ifndef __IA_CSS_QUEUE_H
8 #define __IA_CSS_QUEUE_H
9 
10 #include <platform_support.h>
11 #include <type_support.h>
12 
13 #include "ia_css_queue_comm.h"
14 #include "../src/queue_access.h"
15 
16 /* Local Queue object descriptor */
17 struct ia_css_queue_local {
18 	ia_css_circbuf_desc_t *cb_desc; /*Circbuf desc for local queues*/
19 	ia_css_circbuf_elem_t *cb_elems; /*Circbuf elements*/
20 };
21 
22 typedef struct ia_css_queue_local ia_css_queue_local_t;
23 
24 /* Handle for queue object*/
25 typedef struct ia_css_queue ia_css_queue_t;
26 
27 /*****************************************************************************
28  * Queue Public APIs
29  *****************************************************************************/
30 /* @brief Initialize a local queue instance.
31  *
32  * @param[out] qhandle. Handle to queue instance for use with API
33  * @param[in]  desc.   Descriptor with queue properties filled-in
34  * @return     0      - Successful init of local queue instance.
35  * @return     -EINVAL - Invalid argument.
36  *
37  */
38 int ia_css_queue_local_init(
39     ia_css_queue_t *qhandle,
40     ia_css_queue_local_t *desc);
41 
42 /* @brief Initialize a remote queue instance
43  *
44  * @param[out] qhandle. Handle to queue instance for use with API
45  * @param[in]  desc.   Descriptor with queue properties filled-in
46  * @return     0      - Successful init of remote queue instance.
47  * @return     -EINVAL - Invalid argument.
48  */
49 int ia_css_queue_remote_init(
50     ia_css_queue_t *qhandle,
51     ia_css_queue_remote_t *desc);
52 
53 /* @brief Uninitialize a queue instance
54  *
55  * @param[in]  qhandle. Handle to queue instance
56  * @return     0 - Successful uninit.
57  *
58  */
59 int ia_css_queue_uninit(
60     ia_css_queue_t *qhandle);
61 
62 /* @brief Enqueue an item in the queue instance
63  *
64  * @param[in]  qhandle. Handle to queue instance
65  * @param[in]  item.    Object to be enqueued.
66  * @return     0       - Successful enqueue.
67  * @return     -EINVAL  - Invalid argument.
68  * @return     -ENOBUFS - Queue is full.
69  *
70  */
71 int ia_css_queue_enqueue(
72     ia_css_queue_t *qhandle,
73     uint32_t item);
74 
75 /* @brief Dequeue an item from the queue instance
76  *
77  * @param[in]  qhandle. Handle to queue instance
78  * @param[out] item.    Object to be dequeued into this item.
79 
80  * @return     0       - Successful dequeue.
81  * @return     -EINVAL  - Invalid argument.
82  * @return     -ENODATA - Queue is empty.
83  *
84  */
85 int ia_css_queue_dequeue(
86     ia_css_queue_t *qhandle,
87     uint32_t *item);
88 
89 /* @brief Check if the queue is empty
90  *
91  * @param[in]  qhandle.  Handle to queue instance
92  * @param[in]  is_empty  True if empty, False if not.
93  * @return     0       - Successful access state.
94  * @return     -EINVAL  - Invalid argument.
95  * @return     -ENOSYS  - Function not implemented.
96  *
97  */
98 int ia_css_queue_is_empty(
99     ia_css_queue_t *qhandle,
100     bool *is_empty);
101 
102 /* @brief Check if the queue is full
103  *
104  * @param[in]  qhandle.  Handle to queue instance
105  * @param[in]  is_full   True if Full, False if not.
106  * @return     0       - Successfully access state.
107  * @return     -EINVAL  - Invalid argument.
108  * @return     -ENOSYS  - Function not implemented.
109  *
110  */
111 int ia_css_queue_is_full(
112     ia_css_queue_t *qhandle,
113     bool *is_full);
114 
115 /* @brief Get used space in the queue
116  *
117  * @param[in]  qhandle.  Handle to queue instance
118  * @param[in]  size      Number of available elements in the queue
119  * @return     0       - Successfully access state.
120  * @return     -EINVAL  - Invalid argument.
121  *
122  */
123 int ia_css_queue_get_used_space(
124     ia_css_queue_t *qhandle,
125     uint32_t *size);
126 
127 /* @brief Get free space in the queue
128  *
129  * @param[in]  qhandle.  Handle to queue instance
130  * @param[in]  size      Number of free elements in the queue
131  * @return     0       - Successfully access state.
132  * @return     -EINVAL  - Invalid argument.
133  *
134  */
135 int ia_css_queue_get_free_space(
136     ia_css_queue_t *qhandle,
137     uint32_t *size);
138 
139 /* @brief Peek at an element in the queue
140  *
141  * @param[in]  qhandle.  Handle to queue instance
142  * @param[in]  offset   Offset of element to peek,
143  *			 starting from head of queue
144  * @param[in]  element   Value of element returned
145  * @return     0       - Successfully access state.
146  * @return     -EINVAL  - Invalid argument.
147  *
148  */
149 int ia_css_queue_peek(
150     ia_css_queue_t *qhandle,
151     u32 offset,
152     uint32_t *element);
153 
154 /* @brief Get the usable size for the queue
155  *
156  * @param[in]  qhandle. Handle to queue instance
157  * @param[out] size     Size value to be returned here.
158  * @return     0       - Successful get size.
159  * @return     -EINVAL  - Invalid argument.
160  * @return     -ENOSYS  - Function not implemented.
161  *
162  */
163 int ia_css_queue_get_size(
164     ia_css_queue_t *qhandle,
165     uint32_t *size);
166 
167 #endif /* __IA_CSS_QUEUE_H */
168