Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Do not make oldconfig when building kitten
[palacios-OLD.git] / kitten / include / acpi / acmacros.h
1 /******************************************************************************
2  *
3  * Name: acmacros.h - C macros for the entire subsystem.
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2006, R. Byron Moore
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44 #ifndef __ACMACROS_H__
45 #define __ACMACROS_H__
46
47 /*
48  * Data manipulation macros
49  */
50 #define ACPI_LOWORD(l)                  ((u16)(u32)(l))
51 #define ACPI_HIWORD(l)                  ((u16)((((u32)(l)) >> 16) & 0xFFFF))
52 #define ACPI_LOBYTE(l)                  ((u8)(u16)(l))
53 #define ACPI_HIBYTE(l)                  ((u8)((((u16)(l)) >> 8) & 0xFF))
54
55 #define ACPI_SET_BIT(target,bit)        ((target) |= (bit))
56 #define ACPI_CLEAR_BIT(target,bit)      ((target) &= ~(bit))
57 #define ACPI_MIN(a,b)                   (((a)<(b))?(a):(b))
58
59 /* Size calculation */
60
61 #define ACPI_ARRAY_LENGTH(x)            (sizeof(x) / sizeof((x)[0]))
62
63 #if ACPI_MACHINE_WIDTH == 16
64
65 /*
66  * For 16-bit addresses, we have to assume that the upper 32 bits
67  * (out of 64) are zero.
68  */
69 #define ACPI_LODWORD(l)                 ((u32)(l))
70 #define ACPI_HIDWORD(l)                 ((u32)(0))
71
72 #define ACPI_GET_ADDRESS(a)             ((a).lo)
73 #define ACPI_STORE_ADDRESS(a,b)         {(a).hi=0;(a).lo=(u32)(b);}
74 #define ACPI_VALID_ADDRESS(a)           ((a).hi | (a).lo)
75
76 #else
77 #ifdef ACPI_NO_INTEGER64_SUPPORT
78 /*
79  * acpi_integer is 32-bits, no 64-bit support on this platform
80  */
81 #define ACPI_LODWORD(l)                 ((u32)(l))
82 #define ACPI_HIDWORD(l)                 ((u32)(0))
83
84 #define ACPI_GET_ADDRESS(a)             (a)
85 #define ACPI_STORE_ADDRESS(a,b)         ((a)=(b))
86 #define ACPI_VALID_ADDRESS(a)           (a)
87
88 #else
89
90 /*
91  * Full 64-bit address/integer on both 32-bit and 64-bit platforms
92  */
93 #define ACPI_LODWORD(l)                 ((u32)(u64)(l))
94 #define ACPI_HIDWORD(l)                 ((u32)(((*(struct uint64_struct *)(void *)(&l))).hi))
95
96 #define ACPI_GET_ADDRESS(a)             (a)
97 #define ACPI_STORE_ADDRESS(a,b)         ((a)=(acpi_physical_address)(b))
98 #define ACPI_VALID_ADDRESS(a)           (a)
99 #endif
100 #endif
101
102 /*
103  * printf() format helpers
104  */
105
106 /* Split 64-bit integer into two 32-bit values. Use with %8.8_x%8.8_x */
107
108 #define ACPI_FORMAT_UINT64(i)           ACPI_HIDWORD(i),ACPI_LODWORD(i)
109
110 /*
111  * Extract data using a pointer.  Any more than a byte and we
112  * get into potential aligment issues -- see the STORE macros below.
113  * Use with care.
114  */
115 #define ACPI_GET8(ptr)                  *ACPI_CAST_PTR (u8, ptr)
116 #define ACPI_GET16(ptr)                 *ACPI_CAST_PTR (u16, ptr)
117 #define ACPI_GET32(ptr)                 *ACPI_CAST_PTR (u32, ptr)
118 #define ACPI_GET64(ptr)                 *ACPI_CAST_PTR (u64, ptr)
119 #define ACPI_SET8(ptr)                  *ACPI_CAST_PTR (u8, ptr)
120 #define ACPI_SET16(ptr)                 *ACPI_CAST_PTR (u16, ptr)
121 #define ACPI_SET32(ptr)                 *ACPI_CAST_PTR (u32, ptr)
122 #define ACPI_SET64(ptr)                 *ACPI_CAST_PTR (u64, ptr)
123
124 /*
125  * Pointer manipulation
126  */
127 #define ACPI_CAST_PTR(t, p)             ((t *) (acpi_uintptr_t) (p))
128 #define ACPI_CAST_INDIRECT_PTR(t, p)    ((t **) (acpi_uintptr_t) (p))
129 #define ACPI_ADD_PTR(t,a,b)             ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8,(a)) + (acpi_native_uint)(b)))
130 #define ACPI_PTR_DIFF(a,b)              (acpi_native_uint) (ACPI_CAST_PTR (u8,(a)) - ACPI_CAST_PTR (u8,(b)))
131
132 /* Pointer/Integer type conversions */
133
134 #define ACPI_TO_POINTER(i)              ACPI_ADD_PTR (void,(void *) NULL,(acpi_native_uint) i)
135 #define ACPI_TO_INTEGER(p)              ACPI_PTR_DIFF (p,(void *) NULL)
136 #define ACPI_OFFSET(d,f)                (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL)
137
138 #if ACPI_MACHINE_WIDTH == 16
139 #define ACPI_STORE_POINTER(d,s)         ACPI_MOVE_32_TO_32(d,s)
140 #define ACPI_PHYSADDR_TO_PTR(i)         (void *)(i)
141 #define ACPI_PTR_TO_PHYSADDR(i)         (u32) ACPI_CAST_PTR (u8,(i))
142 #else
143 #define ACPI_PHYSADDR_TO_PTR(i)         ACPI_TO_POINTER(i)
144 #define ACPI_PTR_TO_PHYSADDR(i)         ACPI_TO_INTEGER(i)
145 #endif
146
147 #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
148 #define ACPI_COMPARE_NAME(a,b)          (*ACPI_CAST_PTR (u32,(a)) == *ACPI_CAST_PTR (u32,(b)))
149 #else
150 #define ACPI_COMPARE_NAME(a,b)          (!ACPI_STRNCMP (ACPI_CAST_PTR (char,(a)), ACPI_CAST_PTR (char,(b)), ACPI_NAME_SIZE))
151 #endif
152
153 /*
154  * Macros for moving data around to/from buffers that are possibly unaligned.
155  * If the hardware supports the transfer of unaligned data, just do the store.
156  * Otherwise, we have to move one byte at a time.
157  */
158 #ifdef ACPI_BIG_ENDIAN
159 /*
160  * Macros for big-endian machines
161  */
162
163 /* This macro sets a buffer index, starting from the end of the buffer */
164
165 #define ACPI_BUFFER_INDEX(buf_len,buf_offset,byte_gran) ((buf_len) - (((buf_offset)+1) * (byte_gran)))
166
167 /* These macros reverse the bytes during the move, converting little-endian to big endian */
168
169          /* Big Endian      <==        Little Endian */
170          /*  Hi...Lo                     Lo...Hi     */
171 /* 16-bit source, 16/32/64 destination */
172
173 #define ACPI_MOVE_16_TO_16(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[1];\
174                           ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[0];}
175
176 #define ACPI_MOVE_16_TO_32(d,s)         {(*(u32 *)(void *)(d))=0;\
177                                           ((u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\
178                                           ((u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];}
179
180 #define ACPI_MOVE_16_TO_64(d,s)         {(*(u64 *)(void *)(d))=0;\
181                                                            ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\
182                                                            ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];}
183
184 /* 32-bit source, 16/32/64 destination */
185
186 #define ACPI_MOVE_32_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
187
188 #define ACPI_MOVE_32_TO_32(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[3];\
189                                                                           ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[2];\
190                                                                           ((  u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\
191                                                                           ((  u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];}
192
193 #define ACPI_MOVE_32_TO_64(d,s)         {(*(u64 *)(void *)(d))=0;\
194                                                                                    ((u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\
195                                                                                    ((u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\
196                                                                                    ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\
197                                                                                    ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];}
198
199 /* 64-bit source, 16/32/64 destination */
200
201 #define ACPI_MOVE_64_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
202
203 #define ACPI_MOVE_64_TO_32(d,s)         ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
204
205 #define ACPI_MOVE_64_TO_64(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[7];\
206                                                                                  ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[6];\
207                                                                                  ((  u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[5];\
208                                                                                  ((  u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[4];\
209                                                                                  ((  u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\
210                                                                                  ((  u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\
211                                                                                  ((  u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\
212                                                                                  ((  u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];}
213 #else
214 /*
215  * Macros for little-endian machines
216  */
217
218 /* This macro sets a buffer index, starting from the beginning of the buffer */
219
220 #define ACPI_BUFFER_INDEX(buf_len,buf_offset,byte_gran) (buf_offset)
221
222 #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
223
224 /* The hardware supports unaligned transfers, just do the little-endian move */
225
226 #if ACPI_MACHINE_WIDTH == 16
227
228 /* No 64-bit integers */
229 /* 16-bit source, 16/32/64 destination */
230
231 #define ACPI_MOVE_16_TO_16(d,s)         *(u16 *)(void *)(d) = *(u16 *)(void *)(s)
232 #define ACPI_MOVE_16_TO_32(d,s)         *(u32 *)(void *)(d) = *(u16 *)(void *)(s)
233 #define ACPI_MOVE_16_TO_64(d,s)         ACPI_MOVE_16_TO_32(d,s)
234
235 /* 32-bit source, 16/32/64 destination */
236
237 #define ACPI_MOVE_32_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
238 #define ACPI_MOVE_32_TO_32(d,s)         *(u32 *)(void *)(d) = *(u32 *)(void *)(s)
239 #define ACPI_MOVE_32_TO_64(d,s)         ACPI_MOVE_32_TO_32(d,s)
240
241 /* 64-bit source, 16/32/64 destination */
242
243 #define ACPI_MOVE_64_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
244 #define ACPI_MOVE_64_TO_32(d,s)         ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
245 #define ACPI_MOVE_64_TO_64(d,s)         ACPI_MOVE_32_TO_32(d,s)
246
247 #else
248 /* 16-bit source, 16/32/64 destination */
249
250 #define ACPI_MOVE_16_TO_16(d,s)         *(u16 *)(void *)(d) = *(u16 *)(void *)(s)
251 #define ACPI_MOVE_16_TO_32(d,s)         *(u32 *)(void *)(d) = *(u16 *)(void *)(s)
252 #define ACPI_MOVE_16_TO_64(d,s)         *(u64 *)(void *)(d) = *(u16 *)(void *)(s)
253
254 /* 32-bit source, 16/32/64 destination */
255
256 #define ACPI_MOVE_32_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
257 #define ACPI_MOVE_32_TO_32(d,s)         *(u32 *)(void *)(d) = *(u32 *)(void *)(s)
258 #define ACPI_MOVE_32_TO_64(d,s)         *(u64 *)(void *)(d) = *(u32 *)(void *)(s)
259
260 /* 64-bit source, 16/32/64 destination */
261
262 #define ACPI_MOVE_64_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
263 #define ACPI_MOVE_64_TO_32(d,s)         ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
264 #define ACPI_MOVE_64_TO_64(d,s)         *(u64 *)(void *)(d) = *(u64 *)(void *)(s)
265 #endif
266
267 #else
268 /*
269  * The hardware does not support unaligned transfers.  We must move the
270  * data one byte at a time.  These macros work whether the source or
271  * the destination (or both) is/are unaligned.  (Little-endian move)
272  */
273
274 /* 16-bit source, 16/32/64 destination */
275
276 #define ACPI_MOVE_16_TO_16(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\
277                                                                                  ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];}
278
279 #define ACPI_MOVE_16_TO_32(d,s)         {(*(u32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d,s);}
280 #define ACPI_MOVE_16_TO_64(d,s)         {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d,s);}
281
282 /* 32-bit source, 16/32/64 destination */
283
284 #define ACPI_MOVE_32_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
285
286 #define ACPI_MOVE_32_TO_32(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\
287                                                                                  ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\
288                                                                                  ((  u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\
289                                                                                  ((  u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];}
290
291 #define ACPI_MOVE_32_TO_64(d,s)         {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d,s);}
292
293 /* 64-bit source, 16/32/64 destination */
294
295 #define ACPI_MOVE_64_TO_16(d,s)         ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
296 #define ACPI_MOVE_64_TO_32(d,s)         ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
297 #define ACPI_MOVE_64_TO_64(d,s)         {((  u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\
298                                                                                  ((  u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\
299                                                                                  ((  u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\
300                                                                                  ((  u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];\
301                                                                                  ((  u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[4];\
302                                                                                  ((  u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[5];\
303                                                                                  ((  u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[6];\
304                                                                                  ((  u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[7];}
305 #endif
306 #endif
307
308 /* Macros based on machine integer width */
309
310 #if ACPI_MACHINE_WIDTH == 16
311 #define ACPI_MOVE_SIZE_TO_16(d,s)       ACPI_MOVE_16_TO_16(d,s)
312
313 #elif ACPI_MACHINE_WIDTH == 32
314 #define ACPI_MOVE_SIZE_TO_16(d,s)       ACPI_MOVE_32_TO_16(d,s)
315
316 #elif ACPI_MACHINE_WIDTH == 64
317 #define ACPI_MOVE_SIZE_TO_16(d,s)       ACPI_MOVE_64_TO_16(d,s)
318
319 #else
320 #error unknown ACPI_MACHINE_WIDTH
321 #endif
322
323 /*
324  * Fast power-of-two math macros for non-optimized compilers
325  */
326 #define _ACPI_DIV(value,power_of2)      ((u32) ((value) >> (power_of2)))
327 #define _ACPI_MUL(value,power_of2)      ((u32) ((value) << (power_of2)))
328 #define _ACPI_MOD(value,divisor)        ((u32) ((value) & ((divisor) -1)))
329
330 #define ACPI_DIV_2(a)                   _ACPI_DIV(a,1)
331 #define ACPI_MUL_2(a)                   _ACPI_MUL(a,1)
332 #define ACPI_MOD_2(a)                   _ACPI_MOD(a,2)
333
334 #define ACPI_DIV_4(a)                   _ACPI_DIV(a,2)
335 #define ACPI_MUL_4(a)                   _ACPI_MUL(a,2)
336 #define ACPI_MOD_4(a)                   _ACPI_MOD(a,4)
337
338 #define ACPI_DIV_8(a)                   _ACPI_DIV(a,3)
339 #define ACPI_MUL_8(a)                   _ACPI_MUL(a,3)
340 #define ACPI_MOD_8(a)                   _ACPI_MOD(a,8)
341
342 #define ACPI_DIV_16(a)                  _ACPI_DIV(a,4)
343 #define ACPI_MUL_16(a)                  _ACPI_MUL(a,4)
344 #define ACPI_MOD_16(a)                  _ACPI_MOD(a,16)
345
346 #define ACPI_DIV_32(a)                  _ACPI_DIV(a,5)
347 #define ACPI_MUL_32(a)                  _ACPI_MUL(a,5)
348 #define ACPI_MOD_32(a)                  _ACPI_MOD(a,32)
349
350 /*
351  * Rounding macros (Power of two boundaries only)
352  */
353 #define ACPI_ROUND_DOWN(value,boundary)     (((acpi_native_uint)(value)) & \
354                                                                                                 (~(((acpi_native_uint) boundary)-1)))
355
356 #define ACPI_ROUND_UP(value,boundary)       ((((acpi_native_uint)(value)) + \
357                                                                                                 (((acpi_native_uint) boundary)-1)) & \
358                                                                                                 (~(((acpi_native_uint) boundary)-1)))
359
360 /* Note: sizeof(acpi_native_uint) evaluates to either 2, 4, or 8 */
361
362 #define ACPI_ROUND_DOWN_TO_32BIT(a)         ACPI_ROUND_DOWN(a,4)
363 #define ACPI_ROUND_DOWN_TO_64BIT(a)         ACPI_ROUND_DOWN(a,8)
364 #define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a)   ACPI_ROUND_DOWN(a,sizeof(acpi_native_uint))
365
366 #define ACPI_ROUND_UP_TO_32BIT(a)           ACPI_ROUND_UP(a,4)
367 #define ACPI_ROUND_UP_TO_64BIT(a)           ACPI_ROUND_UP(a,8)
368 #define ACPI_ROUND_UP_TO_NATIVE_WORD(a)     ACPI_ROUND_UP(a,sizeof(acpi_native_uint))
369
370 #define ACPI_ROUND_BITS_UP_TO_BYTES(a)      ACPI_DIV_8((a) + 7)
371 #define ACPI_ROUND_BITS_DOWN_TO_BYTES(a)    ACPI_DIV_8((a))
372
373 #define ACPI_ROUND_UP_TO_1K(a)              (((a) + 1023) >> 10)
374
375 /* Generic (non-power-of-two) rounding */
376
377 #define ACPI_ROUND_UP_TO(value,boundary)    (((value) + ((boundary)-1)) / (boundary))
378
379 #define ACPI_IS_MISALIGNED(value)           (((acpi_native_uint)value) & (sizeof(acpi_native_uint)-1))
380
381 /*
382  * Bitmask creation
383  * Bit positions start at zero.
384  * MASK_BITS_ABOVE creates a mask starting AT the position and above
385  * MASK_BITS_BELOW creates a mask starting one bit BELOW the position
386  */
387 #define ACPI_MASK_BITS_ABOVE(position)      (~((ACPI_INTEGER_MAX) << ((u32) (position))))
388 #define ACPI_MASK_BITS_BELOW(position)      ((ACPI_INTEGER_MAX) << ((u32) (position)))
389
390 #define ACPI_IS_OCTAL_DIGIT(d)              (((char)(d) >= '0') && ((char)(d) <= '7'))
391
392 /* Bitfields within ACPI registers */
393
394 #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask)      ((val << pos) & mask)
395 #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val)  reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask)
396
397 #define ACPI_INSERT_BITS(target, mask, source)          target = ((target & (~(mask))) | (source & mask))
398
399 /* Generate a UUID */
400
401 #define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
402         (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \
403         (b) & 0xFF, ((b) >> 8) & 0xFF, \
404         (c) & 0xFF, ((c) >> 8) & 0xFF, \
405         (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)
406
407 /*
408  * An struct acpi_namespace_node * can appear in some contexts,
409  * where a pointer to an union acpi_operand_object    can also
410  * appear.  This macro is used to distinguish them.
411  *
412  * The "Descriptor" field is the first field in both structures.
413  */
414 #define ACPI_GET_DESCRIPTOR_TYPE(d)     (((union acpi_descriptor *)(void *)(d))->common.descriptor_type)
415 #define ACPI_SET_DESCRIPTOR_TYPE(d,t)   (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = t)
416
417 /* Macro to test the object type */
418
419 #define ACPI_GET_OBJECT_TYPE(d)         (((union acpi_operand_object *)(void *)(d))->common.type)
420
421 /* Macro to check the table flags for SINGLE or MULTIPLE tables are allowed */
422
423 #define ACPI_IS_SINGLE_TABLE(x)         (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0)
424
425 /*
426  * Macros for the master AML opcode table
427  */
428 #if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
429 #define ACPI_OP(name,Pargs,Iargs,obj_type,class,type,flags)    {name,(u32)(Pargs),(u32)(Iargs),(u32)(flags),obj_type,class,type}
430 #else
431 #define ACPI_OP(name,Pargs,Iargs,obj_type,class,type,flags)    {(u32)(Pargs),(u32)(Iargs),(u32)(flags),obj_type,class,type}
432 #endif
433
434 #ifdef ACPI_DISASSEMBLER
435 #define ACPI_DISASM_ONLY_MEMBERS(a)     a;
436 #else
437 #define ACPI_DISASM_ONLY_MEMBERS(a)
438 #endif
439
440 #define ARG_TYPE_WIDTH                  5
441 #define ARG_1(x)                        ((u32)(x))
442 #define ARG_2(x)                        ((u32)(x) << (1 * ARG_TYPE_WIDTH))
443 #define ARG_3(x)                        ((u32)(x) << (2 * ARG_TYPE_WIDTH))
444 #define ARG_4(x)                        ((u32)(x) << (3 * ARG_TYPE_WIDTH))
445 #define ARG_5(x)                        ((u32)(x) << (4 * ARG_TYPE_WIDTH))
446 #define ARG_6(x)                        ((u32)(x) << (5 * ARG_TYPE_WIDTH))
447
448 #define ARGI_LIST1(a)                   (ARG_1(a))
449 #define ARGI_LIST2(a,b)                 (ARG_1(b)|ARG_2(a))
450 #define ARGI_LIST3(a,b,c)               (ARG_1(c)|ARG_2(b)|ARG_3(a))
451 #define ARGI_LIST4(a,b,c,d)             (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a))
452 #define ARGI_LIST5(a,b,c,d,e)           (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a))
453 #define ARGI_LIST6(a,b,c,d,e,f)         (ARG_1(f)|ARG_2(e)|ARG_3(d)|ARG_4(c)|ARG_5(b)|ARG_6(a))
454
455 #define ARGP_LIST1(a)                   (ARG_1(a))
456 #define ARGP_LIST2(a,b)                 (ARG_1(a)|ARG_2(b))
457 #define ARGP_LIST3(a,b,c)               (ARG_1(a)|ARG_2(b)|ARG_3(c))
458 #define ARGP_LIST4(a,b,c,d)             (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d))
459 #define ARGP_LIST5(a,b,c,d,e)           (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e))
460 #define ARGP_LIST6(a,b,c,d,e,f)         (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)|ARG_6(f))
461
462 #define GET_CURRENT_ARG_TYPE(list)      (list & ((u32) 0x1F))
463 #define INCREMENT_ARG_LIST(list)        (list >>= ((u32) ARG_TYPE_WIDTH))
464
465 #if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
466 /*
467  * Module name is include in both debug and non-debug versions primarily for
468  * error messages. The __FILE__ macro is not very useful for this, because it
469  * often includes the entire pathname to the module
470  */
471 #define ACPI_MODULE_NAME(name)          static char ACPI_UNUSED_VAR *_acpi_module_name = name;
472 #else
473 #define ACPI_MODULE_NAME(name)
474 #endif
475
476 /*
477  * Ascii error messages can be configured out
478  */
479 #ifndef ACPI_NO_ERROR_MESSAGES
480 #define AE_INFO                         _acpi_module_name, __LINE__
481
482 /*
483  * Error reporting. Callers module and line number are inserted by AE_INFO,
484  * the plist contains a set of parens to allow variable-length lists.
485  * These macros are used for both the debug and non-debug versions of the code.
486  */
487 #define ACPI_INFO(plist)                acpi_ut_info plist
488 #define ACPI_WARNING(plist)             acpi_ut_warning plist
489 #define ACPI_EXCEPTION(plist)           acpi_ut_exception plist
490 #define ACPI_ERROR(plist)               acpi_ut_error plist
491 #define ACPI_ERROR_NAMESPACE(s,e)       acpi_ns_report_error (AE_INFO, s, e);
492 #define ACPI_ERROR_METHOD(s,n,p,e)      acpi_ns_report_method_error (AE_INFO, s, n, p, e);
493
494 #else
495
496 /* No error messages */
497
498 #define ACPI_INFO(plist)
499 #define ACPI_WARNING(plist)
500 #define ACPI_EXCEPTION(plist)
501 #define ACPI_ERROR(plist)
502 #define ACPI_ERROR_NAMESPACE(s,e)
503 #define ACPI_ERROR_METHOD(s,n,p,e)
504 #endif
505
506 /*
507  * Debug macros that are conditionally compiled
508  */
509 #ifdef ACPI_DEBUG_OUTPUT
510
511 /*
512  * Common parameters used for debug output functions:
513  * line number, function name, module(file) name, component ID
514  */
515 #define ACPI_DEBUG_PARAMETERS           __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT
516
517 /*
518  * Function entry tracing
519  */
520
521 /*
522  * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header,
523  * define it now. This is the case where there the compiler does not support
524  * a __FUNCTION__ macro or equivalent. We save the function name on the
525  * local stack.
526  */
527 #ifndef ACPI_GET_FUNCTION_NAME
528 #define ACPI_GET_FUNCTION_NAME          _acpi_function_name
529 /*
530  * The Name parameter should be the procedure name as a quoted string.
531  * This is declared as a local string ("MyFunctionName") so that it can
532  * be also used by the function exit macros below.
533  * Note: (const char) is used to be compatible with the debug interfaces
534  * and macros such as __FUNCTION__.
535  */
536 #define ACPI_FUNCTION_NAME(name)        const char *_acpi_function_name = #name;
537
538 #else
539 /* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */
540
541 #define ACPI_FUNCTION_NAME(name)
542 #endif
543
544 #define ACPI_FUNCTION_TRACE(a)          ACPI_FUNCTION_NAME(a) \
545                           acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
546 #define ACPI_FUNCTION_TRACE_PTR(a,b)    ACPI_FUNCTION_NAME(a) \
547                                            acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b)
548 #define ACPI_FUNCTION_TRACE_U32(a,b)    ACPI_FUNCTION_NAME(a) \
549                                                          acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS,(u32)b)
550 #define ACPI_FUNCTION_TRACE_STR(a,b)    ACPI_FUNCTION_NAME(a) \
551                                                                           acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS,(char *)b)
552
553 #define ACPI_FUNCTION_ENTRY()           acpi_ut_track_stack_ptr()
554
555 /*
556  * Function exit tracing.
557  * WARNING: These macros include a return statement.  This is usually considered
558  * bad form, but having a separate exit macro is very ugly and difficult to maintain.
559  * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
560  * so that "_AcpiFunctionName" is defined.
561  *
562  * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining
563  * about these constructs.
564  */
565 #ifdef ACPI_USE_DO_WHILE_0
566 #define ACPI_DO_WHILE0(a)               do a while(0)
567 #else
568 #define ACPI_DO_WHILE0(a)               a
569 #endif
570
571 #define return_VOID                     ACPI_DO_WHILE0 ({ \
572                                                                                         acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \
573                                                                                         return;})
574 /*
575  * There are two versions of most of the return macros. The default version is
576  * safer, since it avoids side-effects by guaranteeing that the argument will
577  * not be evaluated twice.
578  *
579  * A less-safe version of the macros is provided for optional use if the
580  * compiler uses excessive CPU stack (for example, this may happen in the
581  * debug case if code optimzation is disabled.)
582  */
583 #ifndef ACPI_SIMPLE_RETURN_MACROS
584
585 #define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({ \
586                                                                                         register acpi_status _s = (s); \
587                                                                                         acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, _s); \
588                                                                                         return (_s); })
589 #define return_PTR(s)                   ACPI_DO_WHILE0 ({ \
590                                                                                         register void *_s = (void *) (s); \
591                                                                                         acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) _s); \
592                                                                                         return (_s); })
593 #define return_VALUE(s)                 ACPI_DO_WHILE0 ({ \
594                                                                                         register acpi_integer _s = (s); \
595                                                                                         acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, _s); \
596                                                                                         return (_s); })
597 #define return_UINT8(s)                 ACPI_DO_WHILE0 ({ \
598                                                                                         register u8 _s = (u8) (s); \
599                                                                                         acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
600                                                                                         return (_s); })
601 #define return_UINT32(s)                ACPI_DO_WHILE0 ({ \
602                                                                                         register u32 _s = (u32) (s); \
603                                                                                         acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) _s); \
604                                                                                         return (_s); })
605 #else                           /* Use original less-safe macros */
606
607 #define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({ \
608                                                                                         acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, (s)); \
609                                                                                         return((s)); })
610 #define return_PTR(s)                   ACPI_DO_WHILE0 ({ \
611                                                                                         acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) (s)); \
612                                                                                         return((s)); })
613 #define return_VALUE(s)                 ACPI_DO_WHILE0 ({ \
614                                                                                         acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (acpi_integer) (s)); \
615                                                                                         return((s)); })
616 #define return_UINT8(s)                 return_VALUE(s)
617 #define return_UINT32(s)                return_VALUE(s)
618
619 #endif                          /* ACPI_SIMPLE_RETURN_MACROS */
620
621 /* Conditional execution */
622
623 #define ACPI_DEBUG_EXEC(a)              a
624 #define ACPI_NORMAL_EXEC(a)
625
626 #define ACPI_DEBUG_DEFINE(a)            a;
627 #define ACPI_DEBUG_ONLY_MEMBERS(a)      a;
628 #define _VERBOSE_STRUCTURES
629
630 /* Stack and buffer dumping */
631
632 #define ACPI_DUMP_STACK_ENTRY(a)        acpi_ex_dump_operand((a),0)
633 #define ACPI_DUMP_OPERANDS(a,b,c,d,e)   acpi_ex_dump_operands(a,b,c,d,e,_acpi_module_name,__LINE__)
634
635 #define ACPI_DUMP_ENTRY(a,b)            acpi_ns_dump_entry (a,b)
636 #define ACPI_DUMP_PATHNAME(a,b,c,d)     acpi_ns_dump_pathname(a,b,c,d)
637 #define ACPI_DUMP_RESOURCE_LIST(a)      acpi_rs_dump_resource_list(a)
638 #define ACPI_DUMP_BUFFER(a,b)           acpi_ut_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT)
639
640 /*
641  * Master debug print macros
642  * Print iff:
643  *    1) Debug print for the current component is enabled
644  *    2) Debug error level or trace level for the print statement is enabled
645  */
646 #define ACPI_DEBUG_PRINT(plist)         acpi_ut_debug_print plist
647 #define ACPI_DEBUG_PRINT_RAW(plist)     acpi_ut_debug_print_raw plist
648
649 #else
650 /*
651  * This is the non-debug case -- make everything go away,
652  * leaving no executable debug code!
653  */
654 #define ACPI_DEBUG_EXEC(a)
655 #define ACPI_NORMAL_EXEC(a)             a;
656
657 #define ACPI_DEBUG_DEFINE(a)
658 #define ACPI_DEBUG_ONLY_MEMBERS(a)
659 #define ACPI_FUNCTION_NAME(a)
660 #define ACPI_FUNCTION_TRACE(a)
661 #define ACPI_FUNCTION_TRACE_PTR(a,b)
662 #define ACPI_FUNCTION_TRACE_U32(a,b)
663 #define ACPI_FUNCTION_TRACE_STR(a,b)
664 #define ACPI_FUNCTION_EXIT
665 #define ACPI_FUNCTION_STATUS_EXIT(s)
666 #define ACPI_FUNCTION_VALUE_EXIT(s)
667 #define ACPI_FUNCTION_ENTRY()
668 #define ACPI_DUMP_STACK_ENTRY(a)
669 #define ACPI_DUMP_OPERANDS(a,b,c,d,e)
670 #define ACPI_DUMP_ENTRY(a,b)
671 #define ACPI_DUMP_TABLES(a,b)
672 #define ACPI_DUMP_PATHNAME(a,b,c,d)
673 #define ACPI_DUMP_RESOURCE_LIST(a)
674 #define ACPI_DUMP_BUFFER(a,b)
675 #define ACPI_DEBUG_PRINT(pl)
676 #define ACPI_DEBUG_PRINT_RAW(pl)
677
678 #define return_VOID                     return
679 #define return_ACPI_STATUS(s)           return(s)
680 #define return_VALUE(s)                 return(s)
681 #define return_UINT8(s)                 return(s)
682 #define return_UINT32(s)                return(s)
683 #define return_PTR(s)                   return(s)
684
685 #endif
686
687 /*
688  * Some code only gets executed when the debugger is built in.
689  * Note that this is entirely independent of whether the
690  * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
691  */
692 #ifdef ACPI_DEBUGGER
693 #define ACPI_DEBUGGER_EXEC(a)           a
694 #else
695 #define ACPI_DEBUGGER_EXEC(a)
696 #endif
697
698 /*
699  * For 16-bit code, we want to shrink some things even though
700  * we are using ACPI_DEBUG_OUTPUT to get the debug output
701  */
702 #if ACPI_MACHINE_WIDTH == 16
703 #undef ACPI_DEBUG_ONLY_MEMBERS
704 #undef _VERBOSE_STRUCTURES
705 #define ACPI_DEBUG_ONLY_MEMBERS(a)
706 #endif
707
708 #ifdef ACPI_DEBUG_OUTPUT
709 /*
710  * 1) Set name to blanks
711  * 2) Copy the object name
712  */
713 #define ACPI_ADD_OBJECT_NAME(a,b)       ACPI_MEMSET (a->common.name, ' ', sizeof (a->common.name));\
714                                                                                 ACPI_STRNCPY (a->common.name, acpi_gbl_ns_type_names[b], sizeof (a->common.name))
715 #else
716
717 #define ACPI_ADD_OBJECT_NAME(a,b)
718 #endif
719
720 /*
721  * Memory allocation tracking (DEBUG ONLY)
722  */
723 #ifndef ACPI_DBG_TRACK_ALLOCATIONS
724
725 /* Memory allocation */
726
727 #ifndef ACPI_ALLOCATE
728 #define ACPI_ALLOCATE(a)            acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__)
729 #endif
730 #ifndef ACPI_ALLOCATE_ZEROED
731 #define ACPI_ALLOCATE_ZEROED(a)     acpi_ut_allocate_zeroed((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__)
732 #endif
733 #ifndef ACPI_FREE
734 #define ACPI_FREE(a)                acpio_os_free(a)
735 #endif
736 #define ACPI_MEM_TRACKING(a)
737
738 #else
739
740 /* Memory allocation */
741
742 #define ACPI_ALLOCATE(a)            acpi_ut_allocate_and_track((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__)
743 #define ACPI_ALLOCATE_ZEROED(a)     acpi_ut_allocate_zeroed_and_track((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__)
744 #define ACPI_FREE(a)                acpi_ut_free_and_track(a,_COMPONENT,_acpi_module_name,__LINE__)
745 #define ACPI_MEM_TRACKING(a)        a
746
747 #endif                          /* ACPI_DBG_TRACK_ALLOCATIONS */
748
749 #endif                          /* ACMACROS_H */