diff options
Diffstat (limited to 'drivers/gpu/pvr/lists.h')
-rw-r--r-- | drivers/gpu/pvr/lists.h | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/drivers/gpu/pvr/lists.h b/drivers/gpu/pvr/lists.h new file mode 100644 index 00000000000..0d7478862e1 --- /dev/null +++ b/drivers/gpu/pvr/lists.h | |||
@@ -0,0 +1,244 @@ | |||
1 | /********************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful but, except | ||
10 | * as otherwise stated in writing, without any warranty; without even the | ||
11 | * implied warranty of merchantability or fitness for a particular purpose. | ||
12 | * See the GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
17 | * | ||
18 | * The full GNU General Public License is included in this distribution in | ||
19 | * the file called "COPYING". | ||
20 | * | ||
21 | * Contact Information: | ||
22 | * Imagination Technologies Ltd. <gpl-support@imgtec.com> | ||
23 | * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK | ||
24 | * | ||
25 | ******************************************************************************/ | ||
26 | |||
27 | #ifndef __LISTS_UTILS__ | ||
28 | #define __LISTS_UTILS__ | ||
29 | |||
30 | #include <stdarg.h> | ||
31 | #include "img_types.h" | ||
32 | |||
33 | #define DECLARE_LIST_FOR_EACH(TYPE) \ | ||
34 | IMG_VOID List_##TYPE##_ForEach(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode)) | ||
35 | |||
36 | #define IMPLEMENT_LIST_FOR_EACH(TYPE) \ | ||
37 | IMG_VOID List_##TYPE##_ForEach(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode))\ | ||
38 | {\ | ||
39 | while(psHead)\ | ||
40 | {\ | ||
41 | pfnCallBack(psHead);\ | ||
42 | psHead = psHead->psNext;\ | ||
43 | }\ | ||
44 | } | ||
45 | |||
46 | |||
47 | #define DECLARE_LIST_FOR_EACH_VA(TYPE) \ | ||
48 | IMG_VOID List_##TYPE##_ForEach_va(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode, va_list va), ...) | ||
49 | |||
50 | #define IMPLEMENT_LIST_FOR_EACH_VA(TYPE) \ | ||
51 | IMG_VOID List_##TYPE##_ForEach_va(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode, va_list va), ...) \ | ||
52 | {\ | ||
53 | va_list ap;\ | ||
54 | while(psHead)\ | ||
55 | {\ | ||
56 | va_start(ap, pfnCallBack);\ | ||
57 | pfnCallBack(psHead, ap);\ | ||
58 | psHead = psHead->psNext;\ | ||
59 | va_end(ap);\ | ||
60 | }\ | ||
61 | } | ||
62 | |||
63 | |||
64 | #define DECLARE_LIST_ANY(TYPE) \ | ||
65 | IMG_VOID* List_##TYPE##_Any(TYPE *psHead, IMG_VOID* (*pfnCallBack)(TYPE* psNode)) | ||
66 | |||
67 | #define IMPLEMENT_LIST_ANY(TYPE) \ | ||
68 | IMG_VOID* List_##TYPE##_Any(TYPE *psHead, IMG_VOID* (*pfnCallBack)(TYPE* psNode))\ | ||
69 | { \ | ||
70 | IMG_VOID *pResult;\ | ||
71 | TYPE *psNextNode;\ | ||
72 | pResult = IMG_NULL;\ | ||
73 | psNextNode = psHead;\ | ||
74 | while(psHead && !pResult)\ | ||
75 | {\ | ||
76 | psNextNode = psNextNode->psNext;\ | ||
77 | pResult = pfnCallBack(psHead);\ | ||
78 | psHead = psNextNode;\ | ||
79 | }\ | ||
80 | return pResult;\ | ||
81 | } | ||
82 | |||
83 | |||
84 | #define DECLARE_LIST_ANY_VA(TYPE) \ | ||
85 | IMG_VOID* List_##TYPE##_Any_va(TYPE *psHead, IMG_VOID*(*pfnCallBack)(TYPE* psNode, va_list va), ...) | ||
86 | |||
87 | #define IMPLEMENT_LIST_ANY_VA(TYPE) \ | ||
88 | IMG_VOID* List_##TYPE##_Any_va(TYPE *psHead, IMG_VOID*(*pfnCallBack)(TYPE* psNode, va_list va), ...)\ | ||
89 | {\ | ||
90 | va_list ap;\ | ||
91 | TYPE *psNextNode;\ | ||
92 | IMG_VOID* pResult = IMG_NULL;\ | ||
93 | while(psHead && !pResult)\ | ||
94 | {\ | ||
95 | psNextNode = psHead->psNext;\ | ||
96 | va_start(ap, pfnCallBack);\ | ||
97 | pResult = pfnCallBack(psHead, ap);\ | ||
98 | va_end(ap);\ | ||
99 | psHead = psNextNode;\ | ||
100 | }\ | ||
101 | return pResult;\ | ||
102 | } | ||
103 | |||
104 | #define DECLARE_LIST_ANY_2(TYPE, RTYPE, CONTINUE) \ | ||
105 | RTYPE List_##TYPE##_##RTYPE##_Any(TYPE *psHead, RTYPE (*pfnCallBack)(TYPE* psNode)) | ||
106 | |||
107 | #define IMPLEMENT_LIST_ANY_2(TYPE, RTYPE, CONTINUE) \ | ||
108 | RTYPE List_##TYPE##_##RTYPE##_Any(TYPE *psHead, RTYPE (*pfnCallBack)(TYPE* psNode))\ | ||
109 | { \ | ||
110 | RTYPE result;\ | ||
111 | TYPE *psNextNode;\ | ||
112 | result = CONTINUE;\ | ||
113 | psNextNode = psHead;\ | ||
114 | while(psHead && result == CONTINUE)\ | ||
115 | {\ | ||
116 | psNextNode = psNextNode->psNext;\ | ||
117 | result = pfnCallBack(psHead);\ | ||
118 | psHead = psNextNode;\ | ||
119 | }\ | ||
120 | return result;\ | ||
121 | } | ||
122 | |||
123 | |||
124 | #define DECLARE_LIST_ANY_VA_2(TYPE, RTYPE, CONTINUE) \ | ||
125 | RTYPE List_##TYPE##_##RTYPE##_Any_va(TYPE *psHead, RTYPE(*pfnCallBack)(TYPE* psNode, va_list va), ...) | ||
126 | |||
127 | #define IMPLEMENT_LIST_ANY_VA_2(TYPE, RTYPE, CONTINUE) \ | ||
128 | RTYPE List_##TYPE##_##RTYPE##_Any_va(TYPE *psHead, RTYPE(*pfnCallBack)(TYPE* psNode, va_list va), ...)\ | ||
129 | {\ | ||
130 | va_list ap;\ | ||
131 | TYPE *psNextNode;\ | ||
132 | RTYPE result = CONTINUE;\ | ||
133 | while(psHead && result == CONTINUE)\ | ||
134 | {\ | ||
135 | psNextNode = psHead->psNext;\ | ||
136 | va_start(ap, pfnCallBack);\ | ||
137 | result = pfnCallBack(psHead, ap);\ | ||
138 | va_end(ap);\ | ||
139 | psHead = psNextNode;\ | ||
140 | }\ | ||
141 | return result;\ | ||
142 | } | ||
143 | |||
144 | |||
145 | #define DECLARE_LIST_REMOVE(TYPE) \ | ||
146 | IMG_VOID List_##TYPE##_Remove(TYPE *psNode) | ||
147 | |||
148 | #define IMPLEMENT_LIST_REMOVE(TYPE) \ | ||
149 | IMG_VOID List_##TYPE##_Remove(TYPE *psNode)\ | ||
150 | {\ | ||
151 | (*psNode->ppsThis)=psNode->psNext;\ | ||
152 | if(psNode->psNext)\ | ||
153 | {\ | ||
154 | psNode->psNext->ppsThis = psNode->ppsThis;\ | ||
155 | }\ | ||
156 | } | ||
157 | |||
158 | #define DECLARE_LIST_INSERT(TYPE) \ | ||
159 | IMG_VOID List_##TYPE##_Insert(TYPE **ppsHead, TYPE *psNewNode) | ||
160 | |||
161 | #define IMPLEMENT_LIST_INSERT(TYPE) \ | ||
162 | IMG_VOID List_##TYPE##_Insert(TYPE **ppsHead, TYPE *psNewNode)\ | ||
163 | {\ | ||
164 | psNewNode->ppsThis = ppsHead;\ | ||
165 | psNewNode->psNext = *ppsHead;\ | ||
166 | *ppsHead = psNewNode;\ | ||
167 | if(psNewNode->psNext)\ | ||
168 | {\ | ||
169 | psNewNode->psNext->ppsThis = &(psNewNode->psNext);\ | ||
170 | }\ | ||
171 | } | ||
172 | |||
173 | #define DECLARE_LIST_REVERSE(TYPE) \ | ||
174 | IMG_VOID List_##TYPE##_Reverse(TYPE **ppsHead) | ||
175 | |||
176 | #define IMPLEMENT_LIST_REVERSE(TYPE) \ | ||
177 | IMG_VOID List_##TYPE##_Reverse(TYPE **ppsHead)\ | ||
178 | {\ | ||
179 | TYPE *psTmpNode1; \ | ||
180 | TYPE *psTmpNode2; \ | ||
181 | TYPE *psCurNode; \ | ||
182 | psTmpNode1 = IMG_NULL; \ | ||
183 | psCurNode = *ppsHead; \ | ||
184 | while(psCurNode) { \ | ||
185 | psTmpNode2 = psCurNode->psNext; \ | ||
186 | psCurNode->psNext = psTmpNode1; \ | ||
187 | psTmpNode1 = psCurNode; \ | ||
188 | psCurNode = psTmpNode2; \ | ||
189 | if(psCurNode) \ | ||
190 | { \ | ||
191 | psTmpNode1->ppsThis = &(psCurNode->psNext); \ | ||
192 | } \ | ||
193 | else \ | ||
194 | { \ | ||
195 | psTmpNode1->ppsThis = ppsHead; \ | ||
196 | } \ | ||
197 | } \ | ||
198 | *ppsHead = psTmpNode1; \ | ||
199 | } | ||
200 | |||
201 | #define IS_LAST_ELEMENT(x) ((x)->psNext == IMG_NULL) | ||
202 | |||
203 | #include "services_headers.h" | ||
204 | |||
205 | DECLARE_LIST_ANY_VA(BM_HEAP); | ||
206 | DECLARE_LIST_ANY_2(BM_HEAP, PVRSRV_ERROR, PVRSRV_OK); | ||
207 | DECLARE_LIST_ANY_VA_2(BM_HEAP, PVRSRV_ERROR, PVRSRV_OK); | ||
208 | DECLARE_LIST_FOR_EACH_VA(BM_HEAP); | ||
209 | DECLARE_LIST_REMOVE(BM_HEAP); | ||
210 | DECLARE_LIST_INSERT(BM_HEAP); | ||
211 | |||
212 | DECLARE_LIST_ANY_VA(BM_CONTEXT); | ||
213 | DECLARE_LIST_ANY_VA_2(BM_CONTEXT, IMG_HANDLE, IMG_NULL); | ||
214 | DECLARE_LIST_ANY_VA_2(BM_CONTEXT, PVRSRV_ERROR, PVRSRV_OK); | ||
215 | DECLARE_LIST_FOR_EACH(BM_CONTEXT); | ||
216 | DECLARE_LIST_REMOVE(BM_CONTEXT); | ||
217 | DECLARE_LIST_INSERT(BM_CONTEXT); | ||
218 | |||
219 | DECLARE_LIST_ANY_2(PVRSRV_DEVICE_NODE, PVRSRV_ERROR, PVRSRV_OK); | ||
220 | DECLARE_LIST_ANY_VA(PVRSRV_DEVICE_NODE); | ||
221 | DECLARE_LIST_ANY_VA_2(PVRSRV_DEVICE_NODE, PVRSRV_ERROR, PVRSRV_OK); | ||
222 | DECLARE_LIST_FOR_EACH(PVRSRV_DEVICE_NODE); | ||
223 | DECLARE_LIST_FOR_EACH_VA(PVRSRV_DEVICE_NODE); | ||
224 | DECLARE_LIST_INSERT(PVRSRV_DEVICE_NODE); | ||
225 | DECLARE_LIST_REMOVE(PVRSRV_DEVICE_NODE); | ||
226 | |||
227 | DECLARE_LIST_ANY_VA(PVRSRV_POWER_DEV); | ||
228 | DECLARE_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, PVRSRV_OK); | ||
229 | DECLARE_LIST_INSERT(PVRSRV_POWER_DEV); | ||
230 | DECLARE_LIST_REMOVE(PVRSRV_POWER_DEV); | ||
231 | |||
232 | #undef DECLARE_LIST_ANY_2 | ||
233 | #undef DECLARE_LIST_ANY_VA | ||
234 | #undef DECLARE_LIST_ANY_VA_2 | ||
235 | #undef DECLARE_LIST_FOR_EACH | ||
236 | #undef DECLARE_LIST_FOR_EACH_VA | ||
237 | #undef DECLARE_LIST_INSERT | ||
238 | #undef DECLARE_LIST_REMOVE | ||
239 | |||
240 | IMG_VOID* MatchDeviceKM_AnyVaCb(PVRSRV_DEVICE_NODE* psDeviceNode, va_list va); | ||
241 | IMG_VOID* MatchPowerDeviceIndex_AnyVaCb(PVRSRV_POWER_DEV *psPowerDev, va_list va); | ||
242 | |||
243 | #endif | ||
244 | |||