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