aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/lists.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/lists.h')
-rw-r--r--drivers/gpu/pvr/lists.h244
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) \
34IMG_VOID List_##TYPE##_ForEach(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode))
35
36#define IMPLEMENT_LIST_FOR_EACH(TYPE) \
37IMG_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) \
48IMG_VOID List_##TYPE##_ForEach_va(TYPE *psHead, IMG_VOID(*pfnCallBack)(TYPE* psNode, va_list va), ...)
49
50#define IMPLEMENT_LIST_FOR_EACH_VA(TYPE) \
51IMG_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) \
65IMG_VOID* List_##TYPE##_Any(TYPE *psHead, IMG_VOID* (*pfnCallBack)(TYPE* psNode))
66
67#define IMPLEMENT_LIST_ANY(TYPE) \
68IMG_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) \
85IMG_VOID* List_##TYPE##_Any_va(TYPE *psHead, IMG_VOID*(*pfnCallBack)(TYPE* psNode, va_list va), ...)
86
87#define IMPLEMENT_LIST_ANY_VA(TYPE) \
88IMG_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) \
105RTYPE List_##TYPE##_##RTYPE##_Any(TYPE *psHead, RTYPE (*pfnCallBack)(TYPE* psNode))
106
107#define IMPLEMENT_LIST_ANY_2(TYPE, RTYPE, CONTINUE) \
108RTYPE 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) \
125RTYPE 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) \
128RTYPE 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) \
146IMG_VOID List_##TYPE##_Remove(TYPE *psNode)
147
148#define IMPLEMENT_LIST_REMOVE(TYPE) \
149IMG_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) \
159IMG_VOID List_##TYPE##_Insert(TYPE **ppsHead, TYPE *psNewNode)
160
161#define IMPLEMENT_LIST_INSERT(TYPE) \
162IMG_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) \
174IMG_VOID List_##TYPE##_Reverse(TYPE **ppsHead)
175
176#define IMPLEMENT_LIST_REVERSE(TYPE) \
177IMG_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
205DECLARE_LIST_ANY_VA(BM_HEAP);
206DECLARE_LIST_ANY_2(BM_HEAP, PVRSRV_ERROR, PVRSRV_OK);
207DECLARE_LIST_ANY_VA_2(BM_HEAP, PVRSRV_ERROR, PVRSRV_OK);
208DECLARE_LIST_FOR_EACH_VA(BM_HEAP);
209DECLARE_LIST_REMOVE(BM_HEAP);
210DECLARE_LIST_INSERT(BM_HEAP);
211
212DECLARE_LIST_ANY_VA(BM_CONTEXT);
213DECLARE_LIST_ANY_VA_2(BM_CONTEXT, IMG_HANDLE, IMG_NULL);
214DECLARE_LIST_ANY_VA_2(BM_CONTEXT, PVRSRV_ERROR, PVRSRV_OK);
215DECLARE_LIST_FOR_EACH(BM_CONTEXT);
216DECLARE_LIST_REMOVE(BM_CONTEXT);
217DECLARE_LIST_INSERT(BM_CONTEXT);
218
219DECLARE_LIST_ANY_2(PVRSRV_DEVICE_NODE, PVRSRV_ERROR, PVRSRV_OK);
220DECLARE_LIST_ANY_VA(PVRSRV_DEVICE_NODE);
221DECLARE_LIST_ANY_VA_2(PVRSRV_DEVICE_NODE, PVRSRV_ERROR, PVRSRV_OK);
222DECLARE_LIST_FOR_EACH(PVRSRV_DEVICE_NODE);
223DECLARE_LIST_FOR_EACH_VA(PVRSRV_DEVICE_NODE);
224DECLARE_LIST_INSERT(PVRSRV_DEVICE_NODE);
225DECLARE_LIST_REMOVE(PVRSRV_DEVICE_NODE);
226
227DECLARE_LIST_ANY_VA(PVRSRV_POWER_DEV);
228DECLARE_LIST_ANY_VA_2(PVRSRV_POWER_DEV, PVRSRV_ERROR, PVRSRV_OK);
229DECLARE_LIST_INSERT(PVRSRV_POWER_DEV);
230DECLARE_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
240IMG_VOID* MatchDeviceKM_AnyVaCb(PVRSRV_DEVICE_NODE* psDeviceNode, va_list va);
241IMG_VOID* MatchPowerDeviceIndex_AnyVaCb(PVRSRV_POWER_DEV *psPowerDev, va_list va);
242
243#endif
244