1 /*
2 * Copyright (c) 2024, Texas Instruments Incorporated
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * * Neither the name of Texas Instruments Incorporated nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 /*
33 * ======== QueueP_zephyr.c ========
34 */
35
36 #include <ti/drivers/dpl/HwiP.h>
37 #include "QueueP.h"
38
39 /*
40 * ======== QueueP_init ========
41 */
QueueP_init(QueueP_Obj * obj)42 void QueueP_init(QueueP_Obj *obj)
43 {
44 obj->elem.next = obj->elem.prev = &(obj->elem);
45 }
46
47 /*
48 * ======== QueueP_empty ========
49 */
QueueP_empty(QueueP_Obj * obj)50 bool QueueP_empty(QueueP_Obj *obj)
51 {
52 return (obj->elem.next == &(obj->elem));
53 }
54
55 /*
56 * ======== QueueP_get ========
57 */
QueueP_get(QueueP_Obj * obj)58 uintptr_t QueueP_get(QueueP_Obj *obj)
59 {
60 QueueP_Elem *elem;
61 uintptr_t key;
62
63 key = HwiP_disable();
64
65 elem = obj->elem.next;
66
67 obj->elem.next = elem->next;
68 elem->next->prev = &(obj->elem);
69
70 HwiP_restore(key);
71
72 return ((uintptr_t)elem);
73 }
74
75 /*
76 * ======== QueueP_getTail ========
77 */
QueueP_getTail(QueueP_Obj * obj)78 uintptr_t QueueP_getTail(QueueP_Obj *obj)
79 {
80 QueueP_Elem *elem;
81 uintptr_t key;
82
83 key = HwiP_disable();
84
85 elem = obj->elem.prev;
86
87 obj->elem.prev = elem->prev;
88 elem->prev->next = &(obj->elem);
89
90 HwiP_restore(key);
91
92 return ((uintptr_t)elem);
93 }
94
95 /*
96 * ======== QueueP_head ========
97 */
QueueP_head(QueueP_Obj * obj)98 uintptr_t QueueP_head(QueueP_Obj *obj)
99 {
100 return ((uintptr_t)(obj->elem.next));
101 }
102
103 /*
104 * ======== elemClear ========
105 */
QueueP_elemClear(QueueP_Elem * qelem)106 void QueueP_elemClear(QueueP_Elem *qelem)
107 {
108 qelem->next = qelem->prev = qelem;
109 }
110
111 /*
112 * ======== insert ========
113 */
QueueP_insert(QueueP_Elem * qelem,QueueP_Elem * elem)114 void QueueP_insert(QueueP_Elem *qelem, QueueP_Elem *elem)
115 {
116 QueueP_put((QueueP_Obj *)qelem, elem);
117 }
118
119 /*
120 * ======== next ========
121 */
QueueP_next(QueueP_Elem * qelem)122 uintptr_t QueueP_next(QueueP_Elem *qelem)
123 {
124 return ((uintptr_t)qelem->next);
125 }
126
127 /*
128 * ======== QueueP_prev ========
129 */
QueueP_prev(QueueP_Elem * qelem)130 uintptr_t QueueP_prev(QueueP_Elem *qelem)
131 {
132 return ((uintptr_t)qelem->prev);
133 }
134
135 /*
136 * ======== QueueP_put ========
137 */
QueueP_put(QueueP_Obj * obj,QueueP_Elem * elem)138 void QueueP_put(QueueP_Obj *obj, QueueP_Elem *elem)
139 {
140 uintptr_t key;
141
142 key = HwiP_disable();
143
144 elem->next = &(obj->elem);
145 elem->prev = obj->elem.prev;
146 obj->elem.prev->next = elem;
147 obj->elem.prev = elem;
148
149 HwiP_restore(key);
150 }
151
152 /*
153 * ======== QueueP_putHead ========
154 */
QueueP_putHead(QueueP_Obj * obj,QueueP_Elem * elem)155 void QueueP_putHead(QueueP_Obj *obj, QueueP_Elem *elem)
156 {
157 uintptr_t key;
158
159 key = HwiP_disable();
160
161 elem->prev = &(obj->elem);
162 elem->next = obj->elem.next;
163 obj->elem.next->prev = elem;
164 obj->elem.next = elem;
165
166 HwiP_restore(key);
167 }
168
169 /*
170 * ======== QueueP_remove ========
171 */
QueueP_remove(QueueP_Elem * qelem)172 void QueueP_remove(QueueP_Elem *qelem)
173 {
174 #if defined(__IAR_SYSTEMS_ICC__)
175 QueueP_Elem *temp;
176 temp = qelem->next;
177 qelem->prev->next = temp;
178 temp = qelem->prev;
179 qelem->next->prev = temp;
180 #else
181 qelem->prev->next = qelem->next;
182 qelem->next->prev = qelem->prev;
183 #endif
184 }
185
186 /*
187 * ======== isQueued ========
188 */
QueueP_isQueued(QueueP_Elem * qelem)189 bool QueueP_isQueued(QueueP_Elem *qelem)
190 {
191 if ((qelem->prev == qelem) && (qelem->next == qelem))
192 {
193 return (false);
194 }
195 else
196 {
197 return (true);
198 }
199 }
200