acmacros.h revision 281687
150276Speter/******************************************************************************
2184989Srafan *
350276Speter * Name: acmacros.h - C macros for the entire subsystem.
450276Speter *
550276Speter *****************************************************************************/
650276Speter
750276Speter/*
850276Speter * Copyright (C) 2000 - 2015, Intel Corp.
950276Speter * All rights reserved.
1050276Speter *
1150276Speter * Redistribution and use in source and binary forms, with or without
1250276Speter * modification, are permitted provided that the following conditions
1350276Speter * are met:
1450276Speter * 1. Redistributions of source code must retain the above copyright
1550276Speter *    notice, this list of conditions, and the following disclaimer,
1650276Speter *    without modification.
1750276Speter * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1850276Speter *    substantially similar to the "NO WARRANTY" disclaimer below
1950276Speter *    ("Disclaimer") and any redistribution must be conditioned upon
2050276Speter *    including a substantially similar Disclaimer requirement for further
2150276Speter *    binary redistribution.
2250276Speter * 3. Neither the names of the above-listed copyright holders nor the names
2350276Speter *    of any contributors may be used to endorse or promote products derived
2450276Speter *    from this software without specific prior written permission.
2550276Speter *
2650276Speter * Alternatively, this software may be distributed under the terms of the
2750276Speter * GNU General Public License ("GPL") version 2 as published by the Free
2850276Speter * Software Foundation.
2950276Speter *
3050276Speter * NO WARRANTY
3150276Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32166124Srafan * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3350276Speter * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3450276Speter * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3550276Speter * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3650276Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3750276Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3850276Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39166124Srafan * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40166124Srafan * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41166124Srafan * POSSIBILITY OF SUCH DAMAGES.
42166124Srafan */
43166124Srafan
4450276Speter#ifndef __ACMACROS_H__
4550276Speter#define __ACMACROS_H__
4650276Speter
4750276Speter
4850276Speter/*
4950276Speter * Extract data using a pointer. Any more than a byte and we
5050276Speter * get into potential aligment issues -- see the STORE macros below.
5150276Speter * Use with care.
5250276Speter */
5350276Speter#define ACPI_CAST8(ptr)                 ACPI_CAST_PTR (UINT8, (ptr))
5450276Speter#define ACPI_CAST16(ptr)                ACPI_CAST_PTR (UINT16, (ptr))
5550276Speter#define ACPI_CAST32(ptr)                ACPI_CAST_PTR (UINT32, (ptr))
5650276Speter#define ACPI_CAST64(ptr)                ACPI_CAST_PTR (UINT64, (ptr))
5750276Speter#define ACPI_GET8(ptr)                  (*ACPI_CAST8 (ptr))
5850276Speter#define ACPI_GET16(ptr)                 (*ACPI_CAST16 (ptr))
5950276Speter#define ACPI_GET32(ptr)                 (*ACPI_CAST32 (ptr))
6050276Speter#define ACPI_GET64(ptr)                 (*ACPI_CAST64 (ptr))
6150276Speter#define ACPI_SET8(ptr, val)             (*ACPI_CAST8 (ptr) = (UINT8) (val))
6250276Speter#define ACPI_SET16(ptr, val)            (*ACPI_CAST16 (ptr) = (UINT16) (val))
6350276Speter#define ACPI_SET32(ptr, val)            (*ACPI_CAST32 (ptr) = (UINT32) (val))
6450276Speter#define ACPI_SET64(ptr, val)            (*ACPI_CAST64 (ptr) = (UINT64) (val))
6550276Speter
6650276Speter/*
6750276Speter * printf() format helper. This macros is a workaround for the difficulties
6850276Speter * with emitting 64-bit integers and 64-bit pointers with the same code
6950276Speter * for both 32-bit and 64-bit hosts.
7050276Speter */
7162449Speter#define ACPI_FORMAT_UINT64(i)           ACPI_HIDWORD(i), ACPI_LODWORD(i)
7250276Speter
7350276Speter
7450276Speter/*
7550276Speter * Macros for moving data around to/from buffers that are possibly unaligned.
7650276Speter * If the hardware supports the transfer of unaligned data, just do the store.
7750276Speter * Otherwise, we have to move one byte at a time.
7850276Speter */
7950276Speter#ifdef ACPI_BIG_ENDIAN
8050276Speter/*
81166124Srafan * Macros for big-endian machines
82184989Srafan */
83166124Srafan
8450276Speter/* These macros reverse the bytes during the move, converting little-endian to big endian */
85166124Srafan
8650276Speter                                                     /* Big Endian      <==        Little Endian */
8750276Speter                                                     /*  Hi...Lo                     Lo...Hi     */
8850276Speter/* 16-bit source, 16/32/64 destination */
89166124Srafan
90166124Srafan#define ACPI_MOVE_16_TO_16(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[1];\
91166124Srafan                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[0];}
92166124Srafan
93166124Srafan#define ACPI_MOVE_16_TO_32(d, s)        {(*(UINT32 *)(void *)(d))=0;\
94166124Srafan                                           ((UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\
95166124Srafan                                           ((UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];}
96166124Srafan
97166124Srafan#define ACPI_MOVE_16_TO_64(d, s)        {(*(UINT64 *)(void *)(d))=0;\
98166124Srafan                                           ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
99166124Srafan                                           ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
100166124Srafan
10150276Speter/* 32-bit source, 16/32/64 destination */
102166124Srafan
103166124Srafan#define ACPI_MOVE_32_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
104166124Srafan
105166124Srafan#define ACPI_MOVE_32_TO_32(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
106166124Srafan                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\
107166124Srafan                                         ((  UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\
108166124Srafan                                         ((  UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];}
109166124Srafan
110166124Srafan#define ACPI_MOVE_32_TO_64(d, s)        {(*(UINT64 *)(void *)(d))=0;\
111166124Srafan                                           ((UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\
112166124Srafan                                           ((UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\
113166124Srafan                                           ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
114166124Srafan                                           ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
115166124Srafan
11650276Speter/* 64-bit source, 16/32/64 destination */
117166124Srafan
11850276Speter#define ACPI_MOVE_64_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
11950276Speter
12050276Speter#define ACPI_MOVE_64_TO_32(d, s)        ACPI_MOVE_32_TO_32(d, s)    /* Truncate to 32 */
121166124Srafan
122166124Srafan#define ACPI_MOVE_64_TO_64(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
123166124Srafan                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
124166124Srafan                                         ((  UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\
125166124Srafan                                         ((  UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];\
126166124Srafan                                         ((  UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\
127166124Srafan                                         ((  UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\
128166124Srafan                                         ((  UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
129166124Srafan                                         ((  UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
130166124Srafan#else
131166124Srafan/*
132166124Srafan * Macros for little-endian machines
133166124Srafan */
134166124Srafan
135166124Srafan#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
136166124Srafan
137166124Srafan/* The hardware supports unaligned transfers, just do the little-endian move */
138166124Srafan
139166124Srafan/* 16-bit source, 16/32/64 destination */
140166124Srafan
141166124Srafan#define ACPI_MOVE_16_TO_16(d, s)        *(UINT16 *)(void *)(d) = *(UINT16 *)(void *)(s)
142166124Srafan#define ACPI_MOVE_16_TO_32(d, s)        *(UINT32 *)(void *)(d) = *(UINT16 *)(void *)(s)
143166124Srafan#define ACPI_MOVE_16_TO_64(d, s)        *(UINT64 *)(void *)(d) = *(UINT16 *)(void *)(s)
14450276Speter
145166124Srafan/* 32-bit source, 16/32/64 destination */
14650276Speter
147166124Srafan#define ACPI_MOVE_32_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
14850276Speter#define ACPI_MOVE_32_TO_32(d, s)        *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s)
149166124Srafan#define ACPI_MOVE_32_TO_64(d, s)        *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s)
150166124Srafan
15150276Speter/* 64-bit source, 16/32/64 destination */
15250276Speter
153184989Srafan#define ACPI_MOVE_64_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
15450276Speter#define ACPI_MOVE_64_TO_32(d, s)        ACPI_MOVE_32_TO_32(d, s)    /* Truncate to 32 */
155166124Srafan#define ACPI_MOVE_64_TO_64(d, s)        *(UINT64 *)(void *)(d) = *(UINT64 *)(void *)(s)
156166124Srafan
157184989Srafan#else
15850276Speter/*
15950276Speter * The hardware does not support unaligned transfers. We must move the
16050276Speter * data one byte at a time. These macros work whether the source or
16150276Speter * the destination (or both) is/are unaligned. (Little-endian move)
16250276Speter */
163184989Srafan
164184989Srafan/* 16-bit source, 16/32/64 destination */
165184989Srafan
166166124Srafan#define ACPI_MOVE_16_TO_16(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
167184989Srafan                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];}
168184989Srafan
169166124Srafan#define ACPI_MOVE_16_TO_32(d, s)        {(*(UINT32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);}
17050276Speter#define ACPI_MOVE_16_TO_64(d, s)        {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);}
171166124Srafan
172184989Srafan/* 32-bit source, 16/32/64 destination */
173184989Srafan
174166124Srafan#define ACPI_MOVE_32_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
175166124Srafan
176184989Srafan#define ACPI_MOVE_32_TO_32(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
177184989Srafan                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\
178184989Srafan                                         ((  UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\
179184989Srafan                                         ((  UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];}
180184989Srafan
181184989Srafan#define ACPI_MOVE_32_TO_64(d, s)        {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d, s);}
18250276Speter
18362449Speter/* 64-bit source, 16/32/64 destination */
184184989Srafan
18550276Speter#define ACPI_MOVE_64_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
18662449Speter#define ACPI_MOVE_64_TO_32(d, s)        ACPI_MOVE_32_TO_32(d, s)    /* Truncate to 32 */
18750276Speter#define ACPI_MOVE_64_TO_64(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
18862449Speter                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\
18950276Speter                                         ((  UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\
190184989Srafan                                         ((  UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];\
19162449Speter                                         ((  UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[4];\
192184989Srafan                                         ((  UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[5];\
193184989Srafan                                         ((  UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[6];\
19450276Speter                                         ((  UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[7];}
19550276Speter#endif
19650276Speter#endif
197166124Srafan
19850276Speter
19950276Speter/*
20050276Speter * Fast power-of-two math macros for non-optimized compilers
20150276Speter */
20250276Speter#define _ACPI_DIV(value, PowerOf2)      ((UINT32) ((value) >> (PowerOf2)))
20350276Speter#define _ACPI_MUL(value, PowerOf2)      ((UINT32) ((value) << (PowerOf2)))
20450276Speter#define _ACPI_MOD(value, Divisor)       ((UINT32) ((value) & ((Divisor) -1)))
205184989Srafan
20650276Speter#define ACPI_DIV_2(a)                   _ACPI_DIV(a, 1)
20750276Speter#define ACPI_MUL_2(a)                   _ACPI_MUL(a, 1)
20850276Speter#define ACPI_MOD_2(a)                   _ACPI_MOD(a, 2)
20950276Speter
21066963Speter#define ACPI_DIV_4(a)                   _ACPI_DIV(a, 2)
21150276Speter#define ACPI_MUL_4(a)                   _ACPI_MUL(a, 2)
21250276Speter#define ACPI_MOD_4(a)                   _ACPI_MOD(a, 4)
21350276Speter
214184989Srafan#define ACPI_DIV_8(a)                   _ACPI_DIV(a, 3)
21550276Speter#define ACPI_MUL_8(a)                   _ACPI_MUL(a, 3)
21650276Speter#define ACPI_MOD_8(a)                   _ACPI_MOD(a, 8)
21750276Speter
218184989Srafan#define ACPI_DIV_16(a)                  _ACPI_DIV(a, 4)
21950276Speter#define ACPI_MUL_16(a)                  _ACPI_MUL(a, 4)
220184989Srafan#define ACPI_MOD_16(a)                  _ACPI_MOD(a, 16)
22150276Speter
22250276Speter#define ACPI_DIV_32(a)                  _ACPI_DIV(a, 5)
22350276Speter#define ACPI_MUL_32(a)                  _ACPI_MUL(a, 5)
22450276Speter#define ACPI_MOD_32(a)                  _ACPI_MOD(a, 32)
22550276Speter
22666963Speter/*
22750276Speter * Rounding macros (Power of two boundaries only)
22866963Speter */
22966963Speter#define ACPI_ROUND_DOWN(value, boundary)    (((ACPI_SIZE)(value)) & \
23050276Speter                                                (~(((ACPI_SIZE) boundary)-1)))
23150276Speter
23262449Speter#define ACPI_ROUND_UP(value, boundary)      ((((ACPI_SIZE)(value)) + \
23366963Speter                                                (((ACPI_SIZE) boundary)-1)) & \
23466963Speter                                                (~(((ACPI_SIZE) boundary)-1)))
23566963Speter
23666963Speter/* Note: sizeof(ACPI_SIZE) evaluates to either 4 or 8 (32- vs 64-bit mode) */
23766963Speter
23866963Speter#define ACPI_ROUND_DOWN_TO_32BIT(a)         ACPI_ROUND_DOWN(a, 4)
23966963Speter#define ACPI_ROUND_DOWN_TO_64BIT(a)         ACPI_ROUND_DOWN(a, 8)
24050276Speter#define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a)   ACPI_ROUND_DOWN(a, sizeof(ACPI_SIZE))
24150276Speter
24266963Speter#define ACPI_ROUND_UP_TO_32BIT(a)           ACPI_ROUND_UP(a, 4)
24366963Speter#define ACPI_ROUND_UP_TO_64BIT(a)           ACPI_ROUND_UP(a, 8)
24466963Speter#define ACPI_ROUND_UP_TO_NATIVE_WORD(a)     ACPI_ROUND_UP(a, sizeof(ACPI_SIZE))
24562449Speter
24666963Speter#define ACPI_ROUND_BITS_UP_TO_BYTES(a)      ACPI_DIV_8((a) + 7)
247184989Srafan#define ACPI_ROUND_BITS_DOWN_TO_BYTES(a)    ACPI_DIV_8((a))
24850276Speter
24950276Speter#define ACPI_ROUND_UP_TO_1K(a)              (((a) + 1023) >> 10)
25050276Speter
25150276Speter/* Generic (non-power-of-two) rounding */
25250276Speter
25362449Speter#define ACPI_ROUND_UP_TO(value, boundary)   (((value) + ((boundary)-1)) / (boundary))
25462449Speter
25562449Speter#define ACPI_IS_MISALIGNED(value)           (((ACPI_SIZE) value) & (sizeof(ACPI_SIZE)-1))
25650276Speter
25750276Speter/*
258184989Srafan * Bitmask creation
259184989Srafan * Bit positions start at zero.
26050276Speter * MASK_BITS_ABOVE creates a mask starting AT the position and above
261184989Srafan * MASK_BITS_BELOW creates a mask starting one bit BELOW the position
262184989Srafan */
26350276Speter#define ACPI_MASK_BITS_ABOVE(position)      (~((ACPI_UINT64_MAX) << ((UINT32) (position))))
264184989Srafan#define ACPI_MASK_BITS_BELOW(position)      ((ACPI_UINT64_MAX) << ((UINT32) (position)))
265184989Srafan
26650276Speter/* Bitfields within ACPI registers */
26750276Speter
26850276Speter#define ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask) \
26950276Speter    ((Val << Pos) & Mask)
27066963Speter
27166963Speter#define ACPI_REGISTER_INSERT_VALUE(Reg, Pos, Mask, Val) \
27266963Speter    Reg = (Reg & (~(Mask))) | ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask)
27350276Speter
27466963Speter#define ACPI_INSERT_BITS(Target, Mask, Source) \
27550276Speter    Target = ((Target & (~(Mask))) | (Source & Mask))
27650276Speter
27762449Speter/* Generic bitfield macros and masks */
27850276Speter
27966963Speter#define ACPI_GET_BITS(SourcePtr, Position, Mask) \
280166124Srafan    ((*SourcePtr >> Position) & Mask)
281166124Srafan
282166124Srafan#define ACPI_SET_BITS(TargetPtr, Position, Mask, Value) \
28350276Speter    (*TargetPtr |= ((Value & Mask) << Position))
284184989Srafan
285166124Srafan#define ACPI_1BIT_MASK      0x00000001
286166124Srafan#define ACPI_2BIT_MASK      0x00000003
287166124Srafan#define ACPI_3BIT_MASK      0x00000007
288166124Srafan#define ACPI_4BIT_MASK      0x0000000F
289166124Srafan#define ACPI_5BIT_MASK      0x0000001F
290184989Srafan#define ACPI_6BIT_MASK      0x0000003F
291184989Srafan#define ACPI_7BIT_MASK      0x0000007F
292184989Srafan#define ACPI_8BIT_MASK      0x000000FF
293184989Srafan#define ACPI_16BIT_MASK     0x0000FFFF
294166124Srafan#define ACPI_24BIT_MASK     0x00FFFFFF
295184989Srafan
296184989Srafan/* Macros to extract flag bits from position zero */
297184989Srafan
298166124Srafan#define ACPI_GET_1BIT_FLAG(Value)                   ((Value) & ACPI_1BIT_MASK)
299184989Srafan#define ACPI_GET_2BIT_FLAG(Value)                   ((Value) & ACPI_2BIT_MASK)
300166124Srafan#define ACPI_GET_3BIT_FLAG(Value)                   ((Value) & ACPI_3BIT_MASK)
301166124Srafan#define ACPI_GET_4BIT_FLAG(Value)                   ((Value) & ACPI_4BIT_MASK)
302166124Srafan
303184989Srafan/* Macros to extract flag bits from position one and above */
304184989Srafan
305166124Srafan#define ACPI_EXTRACT_1BIT_FLAG(Field, Position)     (ACPI_GET_1BIT_FLAG ((Field) >> Position))
306184989Srafan#define ACPI_EXTRACT_2BIT_FLAG(Field, Position)     (ACPI_GET_2BIT_FLAG ((Field) >> Position))
307184989Srafan#define ACPI_EXTRACT_3BIT_FLAG(Field, Position)     (ACPI_GET_3BIT_FLAG ((Field) >> Position))
308166124Srafan#define ACPI_EXTRACT_4BIT_FLAG(Field, Position)     (ACPI_GET_4BIT_FLAG ((Field) >> Position))
309184989Srafan
310166124Srafan/* ACPI Pathname helpers */
311184989Srafan
312166124Srafan#define ACPI_IS_ROOT_PREFIX(c)      ((c) == (UINT8) 0x5C) /* Backslash */
313166124Srafan#define ACPI_IS_PARENT_PREFIX(c)    ((c) == (UINT8) 0x5E) /* Carat */
314184989Srafan#define ACPI_IS_PATH_SEPARATOR(c)   ((c) == (UINT8) 0x2E) /* Period (dot) */
315166124Srafan
316184989Srafan/*
317166124Srafan * An object of type ACPI_NAMESPACE_NODE can appear in some contexts
318184989Srafan * where a pointer to an object of type ACPI_OPERAND_OBJECT can also
319166124Srafan * appear. This macro is used to distinguish them.
320166124Srafan *
321166124Srafan * The "DescriptorType" field is the second field in both structures.
322166124Srafan */
323166124Srafan#define ACPI_GET_DESCRIPTOR_PTR(d)      (((ACPI_DESCRIPTOR *)(void *)(d))->Common.CommonPointer)
324184989Srafan#define ACPI_SET_DESCRIPTOR_PTR(d, p)   (((ACPI_DESCRIPTOR *)(void *)(d))->Common.CommonPointer = (p))
325166124Srafan#define ACPI_GET_DESCRIPTOR_TYPE(d)     (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType)
326184989Srafan#define ACPI_SET_DESCRIPTOR_TYPE(d, t)  (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType = (t))
327166124Srafan
328166124Srafan/*
329166124Srafan * Macros for the master AML opcode table
330166124Srafan */
331166124Srafan#if defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
332184989Srafan#define ACPI_OP(Name, PArgs, IArgs, ObjType, Class, Type, Flags) \
333184989Srafan    {Name, (UINT32)(PArgs), (UINT32)(IArgs), (UINT32)(Flags), ObjType, Class, Type}
334166124Srafan#else
335184989Srafan#define ACPI_OP(Name, PArgs, IArgs, ObjType, Class, Type, Flags) \
336184989Srafan    {(UINT32)(PArgs), (UINT32)(IArgs), (UINT32)(Flags), ObjType, Class, Type}
337166124Srafan#endif
33850276Speter
339184989Srafan#define ARG_TYPE_WIDTH                  5
340184989Srafan#define ARG_1(x)                        ((UINT32)(x))
341184989Srafan#define ARG_2(x)                        ((UINT32)(x) << (1 * ARG_TYPE_WIDTH))
342184989Srafan#define ARG_3(x)                        ((UINT32)(x) << (2 * ARG_TYPE_WIDTH))
343184989Srafan#define ARG_4(x)                        ((UINT32)(x) << (3 * ARG_TYPE_WIDTH))
344184989Srafan#define ARG_5(x)                        ((UINT32)(x) << (4 * ARG_TYPE_WIDTH))
345166124Srafan#define ARG_6(x)                        ((UINT32)(x) << (5 * ARG_TYPE_WIDTH))
34650276Speter
347166124Srafan#define ARGI_LIST1(a)                   (ARG_1(a))
348184989Srafan#define ARGI_LIST2(a, b)                (ARG_1(b)|ARG_2(a))
349166124Srafan#define ARGI_LIST3(a, b, c)             (ARG_1(c)|ARG_2(b)|ARG_3(a))
350184989Srafan#define ARGI_LIST4(a, b, c, d)          (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a))
351184989Srafan#define ARGI_LIST5(a, b, c, d, e)       (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a))
352184989Srafan#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))
353184989Srafan
354166124Srafan#define ARGP_LIST1(a)                   (ARG_1(a))
355166124Srafan#define ARGP_LIST2(a, b)                (ARG_1(a)|ARG_2(b))
356166124Srafan#define ARGP_LIST3(a, b, c)             (ARG_1(a)|ARG_2(b)|ARG_3(c))
357184989Srafan#define ARGP_LIST4(a, b, c, d)          (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d))
358166124Srafan#define ARGP_LIST5(a, b, c, d, e)       (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e))
359166124Srafan#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))
360184989Srafan
361166124Srafan#define GET_CURRENT_ARG_TYPE(List)      (List & ((UINT32) 0x1F))
362184989Srafan#define INCREMENT_ARG_LIST(List)        (List >>= ((UINT32) ARG_TYPE_WIDTH))
36350276Speter
364184989Srafan/*
365166124Srafan * Ascii error messages can be configured out
36650276Speter */
367166124Srafan#ifndef ACPI_NO_ERROR_MESSAGES
368184989Srafan/*
369166124Srafan * Error reporting. Callers module and line number are inserted by AE_INFO,
370166124Srafan * the plist contains a set of parens to allow variable-length lists.
371184989Srafan * These macros are used for both the debug and non-debug versions of the code.
372184989Srafan */
373166124Srafan#define ACPI_ERROR_NAMESPACE(s, e)          AcpiUtNamespaceError (AE_INFO, s, e);
374166124Srafan#define ACPI_ERROR_METHOD(s, n, p, e)       AcpiUtMethodError (AE_INFO, s, n, p, e);
375184989Srafan#define ACPI_WARN_PREDEFINED(plist)         AcpiUtPredefinedWarning plist
376166124Srafan#define ACPI_INFO_PREDEFINED(plist)         AcpiUtPredefinedInfo plist
377184989Srafan#define ACPI_BIOS_ERROR_PREDEFINED(plist)   AcpiUtPredefinedBiosError plist
378184989Srafan
379184989Srafan#else
380184989Srafan
381184989Srafan/* No error messages */
382184989Srafan
383184989Srafan#define ACPI_ERROR_NAMESPACE(s, e)
384184989Srafan#define ACPI_ERROR_METHOD(s, n, p, e)
385184989Srafan#define ACPI_WARN_PREDEFINED(plist)
386184989Srafan#define ACPI_INFO_PREDEFINED(plist)
387184989Srafan#define ACPI_BIOS_ERROR_PREDEFINED(plist)
388184989Srafan
389184989Srafan#endif /* ACPI_NO_ERROR_MESSAGES */
390184989Srafan
391184989Srafan#if (!ACPI_REDUCED_HARDWARE)
392184989Srafan#define ACPI_HW_OPTIONAL_FUNCTION(addr)     addr
393166124Srafan#else
394184989Srafan#define ACPI_HW_OPTIONAL_FUNCTION(addr)     NULL
395166124Srafan#endif
39650276Speter
397184989Srafan
398184989Srafan/*
399184989Srafan * Some code only gets executed when the debugger is built in.
400184989Srafan * Note that this is entirely independent of whether the
401184989Srafan * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
402184989Srafan */
403184989Srafan#ifdef ACPI_DEBUGGER
404184989Srafan#define ACPI_DEBUGGER_EXEC(a)           a
405184989Srafan#else
406184989Srafan#define ACPI_DEBUGGER_EXEC(a)
407184989Srafan#endif
408184989Srafan
409184989Srafan
410184989Srafan/*
411184989Srafan * Macros used for ACPICA utilities only
412184989Srafan */
413184989Srafan
414184989Srafan/* Generate a UUID */
415184989Srafan
416184989Srafan#define ACPI_INIT_UUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
417184989Srafan    (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \
418184989Srafan    (b) & 0xFF, ((b) >> 8) & 0xFF, \
419184989Srafan    (c) & 0xFF, ((c) >> 8) & 0xFF, \
420184989Srafan    (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)
421184989Srafan
422184989Srafan#define ACPI_IS_OCTAL_DIGIT(d)              (((char)(d) >= '0') && ((char)(d) <= '7'))
423184989Srafan
424184989Srafan
425184989Srafan#endif /* ACMACROS_H */
426184989Srafan