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