195857638SErik Schmauss /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2e2f7a777SLen Brown /****************************************************************************** 3e2f7a777SLen Brown * 4e2f7a777SLen Brown * Name: acmacros.h - C macros for the entire subsystem. 5e2f7a777SLen Brown * 6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp. 7e2f7a777SLen Brown * 895857638SErik Schmauss *****************************************************************************/ 9e2f7a777SLen Brown 10e2f7a777SLen Brown #ifndef __ACMACROS_H__ 11e2f7a777SLen Brown #define __ACMACROS_H__ 12e2f7a777SLen Brown 13e2f7a777SLen Brown /* 14e2f7a777SLen Brown * Extract data using a pointer. Any more than a byte and we 15fcfb4553SBob Moore * get into potential alignment issues -- see the STORE macros below. 16e2f7a777SLen Brown * Use with care. 17e2f7a777SLen Brown */ 1857bf6aefSLv Zheng #define ACPI_CAST8(ptr) ACPI_CAST_PTR (u8, (ptr)) 1957bf6aefSLv Zheng #define ACPI_CAST16(ptr) ACPI_CAST_PTR (u16, (ptr)) 2057bf6aefSLv Zheng #define ACPI_CAST32(ptr) ACPI_CAST_PTR (u32, (ptr)) 2157bf6aefSLv Zheng #define ACPI_CAST64(ptr) ACPI_CAST_PTR (u64, (ptr)) 2257bf6aefSLv Zheng #define ACPI_GET8(ptr) (*ACPI_CAST8 (ptr)) 2357bf6aefSLv Zheng #define ACPI_GET16(ptr) (*ACPI_CAST16 (ptr)) 2457bf6aefSLv Zheng #define ACPI_GET32(ptr) (*ACPI_CAST32 (ptr)) 2557bf6aefSLv Zheng #define ACPI_GET64(ptr) (*ACPI_CAST64 (ptr)) 2657bf6aefSLv Zheng #define ACPI_SET8(ptr, val) (*ACPI_CAST8 (ptr) = (u8) (val)) 2757bf6aefSLv Zheng #define ACPI_SET16(ptr, val) (*ACPI_CAST16 (ptr) = (u16) (val)) 2857bf6aefSLv Zheng #define ACPI_SET32(ptr, val) (*ACPI_CAST32 (ptr) = (u32) (val)) 2957bf6aefSLv Zheng #define ACPI_SET64(ptr, val) (*ACPI_CAST64 (ptr) = (u64) (val)) 30e2f7a777SLen Brown 31e2f7a777SLen Brown /* 32fcfb4553SBob Moore * printf() format helper. This macro is a workaround for the difficulties 33c03775c0SBob Moore * with emitting 64-bit integers and 64-bit pointers with the same code 34c03775c0SBob Moore * for both 32-bit and 64-bit hosts. 35e2f7a777SLen Brown */ 36e2f7a777SLen Brown #define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i), ACPI_LODWORD(i) 37e2f7a777SLen Brown 38e2f7a777SLen Brown /* 39e2f7a777SLen Brown * Macros for moving data around to/from buffers that are possibly unaligned. 40e2f7a777SLen Brown * If the hardware supports the transfer of unaligned data, just do the store. 41e2f7a777SLen Brown * Otherwise, we have to move one byte at a time. 42e2f7a777SLen Brown */ 43e2f7a777SLen Brown #ifdef ACPI_BIG_ENDIAN 44e2f7a777SLen Brown /* 45e2f7a777SLen Brown * Macros for big-endian machines 46e2f7a777SLen Brown */ 47e2f7a777SLen Brown 48e2f7a777SLen Brown /* These macros reverse the bytes during the move, converting little-endian to big endian */ 49e2f7a777SLen Brown 50e2f7a777SLen Brown /* Big Endian <== Little Endian */ 51e2f7a777SLen Brown /* Hi...Lo Lo...Hi */ 52e2f7a777SLen Brown /* 16-bit source, 16/32/64 destination */ 53e2f7a777SLen Brown 54e2f7a777SLen Brown #define ACPI_MOVE_16_TO_16(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[1];\ 55e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[0];} 56e2f7a777SLen Brown 57e2f7a777SLen Brown #define ACPI_MOVE_16_TO_32(d, s) {(*(u32 *)(void *)(d))=0;\ 58e2f7a777SLen Brown ((u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\ 59e2f7a777SLen Brown ((u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];} 60e2f7a777SLen Brown 61e2f7a777SLen Brown #define ACPI_MOVE_16_TO_64(d, s) {(*(u64 *)(void *)(d))=0;\ 62e2f7a777SLen Brown ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ 63e2f7a777SLen Brown ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} 64e2f7a777SLen Brown 65e2f7a777SLen Brown /* 32-bit source, 16/32/64 destination */ 66e2f7a777SLen Brown 67e2f7a777SLen Brown #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 68e2f7a777SLen Brown 69e2f7a777SLen Brown #define ACPI_MOVE_32_TO_32(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[3];\ 70e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[2];\ 71e2f7a777SLen Brown (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[1];\ 72e2f7a777SLen Brown (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[0];} 73e2f7a777SLen Brown 74e2f7a777SLen Brown #define ACPI_MOVE_32_TO_64(d, s) {(*(u64 *)(void *)(d))=0;\ 75e2f7a777SLen Brown ((u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\ 76e2f7a777SLen Brown ((u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\ 77e2f7a777SLen Brown ((u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ 78e2f7a777SLen Brown ((u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} 79e2f7a777SLen Brown 80e2f7a777SLen Brown /* 64-bit source, 16/32/64 destination */ 81e2f7a777SLen Brown 82e2f7a777SLen Brown #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 83e2f7a777SLen Brown 84e2f7a777SLen Brown #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 85e2f7a777SLen Brown 86e2f7a777SLen Brown #define ACPI_MOVE_64_TO_64(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[7];\ 87e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[6];\ 88e2f7a777SLen Brown (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[5];\ 89e2f7a777SLen Brown (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[4];\ 90e2f7a777SLen Brown (( u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[3];\ 91e2f7a777SLen Brown (( u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[2];\ 92e2f7a777SLen Brown (( u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[1];\ 93e2f7a777SLen Brown (( u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[0];} 94e2f7a777SLen Brown #else 95e2f7a777SLen Brown /* 96e2f7a777SLen Brown * Macros for little-endian machines 97e2f7a777SLen Brown */ 98e2f7a777SLen Brown 99e2f7a777SLen Brown #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED 100e2f7a777SLen Brown 101e2f7a777SLen Brown /* The hardware supports unaligned transfers, just do the little-endian move */ 102e2f7a777SLen Brown 103e2f7a777SLen Brown /* 16-bit source, 16/32/64 destination */ 104e2f7a777SLen Brown 105e2f7a777SLen Brown #define ACPI_MOVE_16_TO_16(d, s) *(u16 *)(void *)(d) = *(u16 *)(void *)(s) 106e2f7a777SLen Brown #define ACPI_MOVE_16_TO_32(d, s) *(u32 *)(void *)(d) = *(u16 *)(void *)(s) 107e2f7a777SLen Brown #define ACPI_MOVE_16_TO_64(d, s) *(u64 *)(void *)(d) = *(u16 *)(void *)(s) 108e2f7a777SLen Brown 109e2f7a777SLen Brown /* 32-bit source, 16/32/64 destination */ 110e2f7a777SLen Brown 111e2f7a777SLen Brown #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 112e2f7a777SLen Brown #define ACPI_MOVE_32_TO_32(d, s) *(u32 *)(void *)(d) = *(u32 *)(void *)(s) 113e2f7a777SLen Brown #define ACPI_MOVE_32_TO_64(d, s) *(u64 *)(void *)(d) = *(u32 *)(void *)(s) 114e2f7a777SLen Brown 115e2f7a777SLen Brown /* 64-bit source, 16/32/64 destination */ 116e2f7a777SLen Brown 117e2f7a777SLen Brown #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 118e2f7a777SLen Brown #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 119e2f7a777SLen Brown #define ACPI_MOVE_64_TO_64(d, s) *(u64 *)(void *)(d) = *(u64 *)(void *)(s) 120e2f7a777SLen Brown 121e2f7a777SLen Brown #else 122e2f7a777SLen Brown /* 123e2f7a777SLen Brown * The hardware does not support unaligned transfers. We must move the 124e2f7a777SLen Brown * data one byte at a time. These macros work whether the source or 125e2f7a777SLen Brown * the destination (or both) is/are unaligned. (Little-endian move) 126e2f7a777SLen Brown */ 127e2f7a777SLen Brown 128e2f7a777SLen Brown /* 16-bit source, 16/32/64 destination */ 129e2f7a777SLen Brown 130e2f7a777SLen Brown #define ACPI_MOVE_16_TO_16(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ 131e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];} 132e2f7a777SLen Brown 133e2f7a777SLen Brown #define ACPI_MOVE_16_TO_32(d, s) {(*(u32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} 134e2f7a777SLen Brown #define ACPI_MOVE_16_TO_64(d, s) {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} 135e2f7a777SLen Brown 136e2f7a777SLen Brown /* 32-bit source, 16/32/64 destination */ 137e2f7a777SLen Brown 138e2f7a777SLen Brown #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 139e2f7a777SLen Brown 140e2f7a777SLen Brown #define ACPI_MOVE_32_TO_32(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ 141e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\ 142e2f7a777SLen Brown (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\ 143e2f7a777SLen Brown (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];} 144e2f7a777SLen Brown 145e2f7a777SLen Brown #define ACPI_MOVE_32_TO_64(d, s) {(*(u64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d, s);} 146e2f7a777SLen Brown 147e2f7a777SLen Brown /* 64-bit source, 16/32/64 destination */ 148e2f7a777SLen Brown 149e2f7a777SLen Brown #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 150e2f7a777SLen Brown #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 151e2f7a777SLen Brown #define ACPI_MOVE_64_TO_64(d, s) {(( u8 *)(void *)(d))[0] = ((u8 *)(void *)(s))[0];\ 152e2f7a777SLen Brown (( u8 *)(void *)(d))[1] = ((u8 *)(void *)(s))[1];\ 153e2f7a777SLen Brown (( u8 *)(void *)(d))[2] = ((u8 *)(void *)(s))[2];\ 154e2f7a777SLen Brown (( u8 *)(void *)(d))[3] = ((u8 *)(void *)(s))[3];\ 155e2f7a777SLen Brown (( u8 *)(void *)(d))[4] = ((u8 *)(void *)(s))[4];\ 156e2f7a777SLen Brown (( u8 *)(void *)(d))[5] = ((u8 *)(void *)(s))[5];\ 157e2f7a777SLen Brown (( u8 *)(void *)(d))[6] = ((u8 *)(void *)(s))[6];\ 158e2f7a777SLen Brown (( u8 *)(void *)(d))[7] = ((u8 *)(void *)(s))[7];} 159e2f7a777SLen Brown #endif 160e2f7a777SLen Brown #endif 161e2f7a777SLen Brown 162e2f7a777SLen Brown /* 163e2f7a777SLen Brown * Fast power-of-two math macros for non-optimized compilers 164e2f7a777SLen Brown */ 165e2f7a777SLen Brown #define _ACPI_DIV(value, power_of2) ((u32) ((value) >> (power_of2))) 166e2f7a777SLen Brown #define _ACPI_MUL(value, power_of2) ((u32) ((value) << (power_of2))) 167e2f7a777SLen Brown #define _ACPI_MOD(value, divisor) ((u32) ((value) & ((divisor) -1))) 168e2f7a777SLen Brown 169e2f7a777SLen Brown #define ACPI_DIV_2(a) _ACPI_DIV(a, 1) 170e2f7a777SLen Brown #define ACPI_MUL_2(a) _ACPI_MUL(a, 1) 171e2f7a777SLen Brown #define ACPI_MOD_2(a) _ACPI_MOD(a, 2) 172e2f7a777SLen Brown 173e2f7a777SLen Brown #define ACPI_DIV_4(a) _ACPI_DIV(a, 2) 174e2f7a777SLen Brown #define ACPI_MUL_4(a) _ACPI_MUL(a, 2) 175e2f7a777SLen Brown #define ACPI_MOD_4(a) _ACPI_MOD(a, 4) 176e2f7a777SLen Brown 177e2f7a777SLen Brown #define ACPI_DIV_8(a) _ACPI_DIV(a, 3) 178e2f7a777SLen Brown #define ACPI_MUL_8(a) _ACPI_MUL(a, 3) 179e2f7a777SLen Brown #define ACPI_MOD_8(a) _ACPI_MOD(a, 8) 180e2f7a777SLen Brown 181e2f7a777SLen Brown #define ACPI_DIV_16(a) _ACPI_DIV(a, 4) 182e2f7a777SLen Brown #define ACPI_MUL_16(a) _ACPI_MUL(a, 4) 183e2f7a777SLen Brown #define ACPI_MOD_16(a) _ACPI_MOD(a, 16) 184e2f7a777SLen Brown 185e2f7a777SLen Brown #define ACPI_DIV_32(a) _ACPI_DIV(a, 5) 186e2f7a777SLen Brown #define ACPI_MUL_32(a) _ACPI_MUL(a, 5) 187e2f7a777SLen Brown #define ACPI_MOD_32(a) _ACPI_MOD(a, 32) 188e2f7a777SLen Brown 18927629196SBob Moore /* Test for ASCII character */ 19027629196SBob Moore 19127629196SBob Moore #define ACPI_IS_ASCII(c) ((c) < 0x80) 19227629196SBob Moore 19388606a2bSBob Moore /* Signed integers */ 19488606a2bSBob Moore 19588606a2bSBob Moore #define ACPI_SIGN_POSITIVE 0 19688606a2bSBob Moore #define ACPI_SIGN_NEGATIVE 1 19788606a2bSBob Moore 198e2f7a777SLen Brown /* 199e2f7a777SLen Brown * Rounding macros (Power of two boundaries only) 200e2f7a777SLen Brown */ 201e2f7a777SLen Brown #define ACPI_ROUND_DOWN(value, boundary) (((acpi_size)(value)) & \ 202e2f7a777SLen Brown (~(((acpi_size) boundary)-1))) 203e2f7a777SLen Brown 204e2f7a777SLen Brown #define ACPI_ROUND_UP(value, boundary) ((((acpi_size)(value)) + \ 205e2f7a777SLen Brown (((acpi_size) boundary)-1)) & \ 206e2f7a777SLen Brown (~(((acpi_size) boundary)-1))) 207e2f7a777SLen Brown 208e2f7a777SLen Brown /* Note: sizeof(acpi_size) evaluates to either 4 or 8 (32- vs 64-bit mode) */ 209e2f7a777SLen Brown 210e2f7a777SLen Brown #define ACPI_ROUND_DOWN_TO_32BIT(a) ACPI_ROUND_DOWN(a, 4) 211e2f7a777SLen Brown #define ACPI_ROUND_DOWN_TO_64BIT(a) ACPI_ROUND_DOWN(a, 8) 212e2f7a777SLen Brown #define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a, sizeof(acpi_size)) 213e2f7a777SLen Brown 214e2f7a777SLen Brown #define ACPI_ROUND_UP_TO_32BIT(a) ACPI_ROUND_UP(a, 4) 215e2f7a777SLen Brown #define ACPI_ROUND_UP_TO_64BIT(a) ACPI_ROUND_UP(a, 8) 216e2f7a777SLen Brown #define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a, sizeof(acpi_size)) 217e2f7a777SLen Brown 218e2f7a777SLen Brown #define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7) 219e2f7a777SLen Brown #define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a)) 220e2f7a777SLen Brown 221e2f7a777SLen Brown #define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) 222e2f7a777SLen Brown 223e2f7a777SLen Brown /* Generic (non-power-of-two) rounding */ 224e2f7a777SLen Brown 225e2f7a777SLen Brown #define ACPI_ROUND_UP_TO(value, boundary) (((value) + ((boundary)-1)) / (boundary)) 226e2f7a777SLen Brown 227e2f7a777SLen Brown #define ACPI_IS_MISALIGNED(value) (((acpi_size) value) & (sizeof(acpi_size)-1)) 228e2f7a777SLen Brown 229fcfb4553SBob Moore /* Generic bit manipulation */ 230a8d1e1c0SLv Zheng 231cc573b97SLv Zheng #ifndef ACPI_USE_NATIVE_BIT_FINDER 232cc573b97SLv Zheng 233cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_2(a, r) ((((u8) (a)) & 0x02) ? (r)+1 : (r)) 234cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_4(a, r) ((((u8) (a)) & 0x0C) ? \ 235cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_2 ((a)>>2, (r)+2) : \ 236cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_2 ((a), (r))) 237cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_8(a, r) ((((u8) (a)) & 0xF0) ? \ 238cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_4 ((a)>>4, (r)+4) : \ 239cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_4 ((a), (r))) 240cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_16(a, r) ((((u16) (a)) & 0xFF00) ? \ 241cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_8 ((a)>>8, (r)+8) : \ 242cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_8 ((a), (r))) 243cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_32(a, r) ((((u32) (a)) & 0xFFFF0000) ? \ 244cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_16 ((a)>>16, (r)+16) : \ 245cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_16 ((a), (r))) 246cc573b97SLv Zheng #define __ACPI_FIND_LAST_BIT_64(a, r) ((((u64) (a)) & 0xFFFFFFFF00000000) ? \ 247cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_32 ((a)>>32, (r)+32) : \ 248cc573b97SLv Zheng __ACPI_FIND_LAST_BIT_32 ((a), (r))) 249cc573b97SLv Zheng 250cc573b97SLv Zheng #define ACPI_FIND_LAST_BIT_8(a) ((a) ? __ACPI_FIND_LAST_BIT_8 (a, 1) : 0) 251cc573b97SLv Zheng #define ACPI_FIND_LAST_BIT_16(a) ((a) ? __ACPI_FIND_LAST_BIT_16 (a, 1) : 0) 252cc573b97SLv Zheng #define ACPI_FIND_LAST_BIT_32(a) ((a) ? __ACPI_FIND_LAST_BIT_32 (a, 1) : 0) 253cc573b97SLv Zheng #define ACPI_FIND_LAST_BIT_64(a) ((a) ? __ACPI_FIND_LAST_BIT_64 (a, 1) : 0) 254cc573b97SLv Zheng 255cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_2(a, r) ((((u8) (a)) & 0x01) ? (r) : (r)+1) 256cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_4(a, r) ((((u8) (a)) & 0x03) ? \ 257cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_2 ((a), (r)) : \ 258cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_2 ((a)>>2, (r)+2)) 259cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_8(a, r) ((((u8) (a)) & 0x0F) ? \ 260cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_4 ((a), (r)) : \ 261cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_4 ((a)>>4, (r)+4)) 262cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_16(a, r) ((((u16) (a)) & 0x00FF) ? \ 263cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_8 ((a), (r)) : \ 264cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_8 ((a)>>8, (r)+8)) 265cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_32(a, r) ((((u32) (a)) & 0x0000FFFF) ? \ 266cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_16 ((a), (r)) : \ 267cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_16 ((a)>>16, (r)+16)) 268cc573b97SLv Zheng #define __ACPI_FIND_FIRST_BIT_64(a, r) ((((u64) (a)) & 0x00000000FFFFFFFF) ? \ 269cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_32 ((a), (r)) : \ 270cc573b97SLv Zheng __ACPI_FIND_FIRST_BIT_32 ((a)>>32, (r)+32)) 271cc573b97SLv Zheng 272cc573b97SLv Zheng #define ACPI_FIND_FIRST_BIT_8(a) ((a) ? __ACPI_FIND_FIRST_BIT_8 (a, 1) : 0) 273cc573b97SLv Zheng #define ACPI_FIND_FIRST_BIT_16(a) ((a) ? __ACPI_FIND_FIRST_BIT_16 (a, 1) : 0) 274cc573b97SLv Zheng #define ACPI_FIND_FIRST_BIT_32(a) ((a) ? __ACPI_FIND_FIRST_BIT_32 (a, 1) : 0) 275cc573b97SLv Zheng #define ACPI_FIND_FIRST_BIT_64(a) ((a) ? __ACPI_FIND_FIRST_BIT_64 (a, 1) : 0) 276cc573b97SLv Zheng 277cc573b97SLv Zheng #endif /* ACPI_USE_NATIVE_BIT_FINDER */ 278cc573b97SLv Zheng 279fcfb4553SBob Moore /* Generic (power-of-two) rounding */ 280fcfb4553SBob Moore 281cc573b97SLv Zheng #define ACPI_ROUND_UP_POWER_OF_TWO_8(a) ((u8) \ 282cc573b97SLv Zheng (((u16) 1) << ACPI_FIND_LAST_BIT_8 ((a) - 1))) 283cc573b97SLv Zheng #define ACPI_ROUND_DOWN_POWER_OF_TWO_8(a) ((u8) \ 284cc573b97SLv Zheng (((u16) 1) << (ACPI_FIND_LAST_BIT_8 ((a)) - 1))) 285cc573b97SLv Zheng #define ACPI_ROUND_UP_POWER_OF_TWO_16(a) ((u16) \ 286cc573b97SLv Zheng (((u32) 1) << ACPI_FIND_LAST_BIT_16 ((a) - 1))) 287cc573b97SLv Zheng #define ACPI_ROUND_DOWN_POWER_OF_TWO_16(a) ((u16) \ 288cc573b97SLv Zheng (((u32) 1) << (ACPI_FIND_LAST_BIT_16 ((a)) - 1))) 289cc573b97SLv Zheng #define ACPI_ROUND_UP_POWER_OF_TWO_32(a) ((u32) \ 290cc573b97SLv Zheng (((u64) 1) << ACPI_FIND_LAST_BIT_32 ((a) - 1))) 291cc573b97SLv Zheng #define ACPI_ROUND_DOWN_POWER_OF_TWO_32(a) ((u32) \ 292cc573b97SLv Zheng (((u64) 1) << (ACPI_FIND_LAST_BIT_32 ((a)) - 1))) 293e35d7502SLv Zheng #define ACPI_IS_ALIGNED(a, s) (((a) & ((s) - 1)) == 0) 294e35d7502SLv Zheng #define ACPI_IS_POWER_OF_TWO(a) ACPI_IS_ALIGNED(a, a) 295a8d1e1c0SLv Zheng 296e2f7a777SLen Brown /* 297e2f7a777SLen Brown * Bitmask creation 298e2f7a777SLen Brown * Bit positions start at zero. 299e2f7a777SLen Brown * MASK_BITS_ABOVE creates a mask starting AT the position and above 300e2f7a777SLen Brown * MASK_BITS_BELOW creates a mask starting one bit BELOW the position 301fcfb4553SBob Moore * MASK_BITS_ABOVE/BELOW accepts a bit offset to create a mask 302fcfb4553SBob Moore * MASK_BITS_ABOVE/BELOW_32/64 accepts a bit width to create a mask 3039222aa82SLv Zheng * Note: The ACPI_INTEGER_BIT_SIZE check is used to bypass compiler 3049222aa82SLv Zheng * differences with the shift operator 305e2f7a777SLen Brown */ 3065df7e6cbSBob Moore #define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_UINT64_MAX) << ((u32) (position)))) 3075df7e6cbSBob Moore #define ACPI_MASK_BITS_BELOW(position) ((ACPI_UINT64_MAX) << ((u32) (position))) 3089222aa82SLv Zheng #define ACPI_MASK_BITS_ABOVE_32(width) ((u32) ACPI_MASK_BITS_ABOVE(width)) 3099222aa82SLv Zheng #define ACPI_MASK_BITS_BELOW_32(width) ((u32) ACPI_MASK_BITS_BELOW(width)) 3109222aa82SLv Zheng #define ACPI_MASK_BITS_ABOVE_64(width) ((width) == ACPI_INTEGER_BIT_SIZE ? \ 3119222aa82SLv Zheng ACPI_UINT64_MAX : \ 3129222aa82SLv Zheng ACPI_MASK_BITS_ABOVE(width)) 3139222aa82SLv Zheng #define ACPI_MASK_BITS_BELOW_64(width) ((width) == ACPI_INTEGER_BIT_SIZE ? \ 3149222aa82SLv Zheng (u64) 0 : \ 3159222aa82SLv Zheng ACPI_MASK_BITS_BELOW(width)) 316e2f7a777SLen Brown 317e2f7a777SLen Brown /* Bitfields within ACPI registers */ 318e2f7a777SLen Brown 319be030a57SBob Moore #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) \ 320be030a57SBob Moore ((val << pos) & mask) 321e2f7a777SLen Brown 322be030a57SBob Moore #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) \ 323be030a57SBob Moore reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) 324be030a57SBob Moore 325be030a57SBob Moore #define ACPI_INSERT_BITS(target, mask, source) \ 326be030a57SBob Moore target = ((target & (~(mask))) | (source & mask)) 327be030a57SBob Moore 328be030a57SBob Moore /* Generic bitfield macros and masks */ 329be030a57SBob Moore 330be030a57SBob Moore #define ACPI_GET_BITS(source_ptr, position, mask) \ 3310461f34eSLv Zheng ((*(source_ptr) >> (position)) & (mask)) 332be030a57SBob Moore 333be030a57SBob Moore #define ACPI_SET_BITS(target_ptr, position, mask, value) \ 3340461f34eSLv Zheng (*(target_ptr) |= (((value) & (mask)) << (position))) 335be030a57SBob Moore 336be030a57SBob Moore #define ACPI_1BIT_MASK 0x00000001 337be030a57SBob Moore #define ACPI_2BIT_MASK 0x00000003 338be030a57SBob Moore #define ACPI_3BIT_MASK 0x00000007 339be030a57SBob Moore #define ACPI_4BIT_MASK 0x0000000F 340be030a57SBob Moore #define ACPI_5BIT_MASK 0x0000001F 341be030a57SBob Moore #define ACPI_6BIT_MASK 0x0000003F 342be030a57SBob Moore #define ACPI_7BIT_MASK 0x0000007F 343be030a57SBob Moore #define ACPI_8BIT_MASK 0x000000FF 344be030a57SBob Moore #define ACPI_16BIT_MASK 0x0000FFFF 345be030a57SBob Moore #define ACPI_24BIT_MASK 0x00FFFFFF 346e2f7a777SLen Brown 3472f3faabaSBob Moore /* Macros to extract flag bits from position zero */ 3482f3faabaSBob Moore 3492f3faabaSBob Moore #define ACPI_GET_1BIT_FLAG(value) ((value) & ACPI_1BIT_MASK) 3502f3faabaSBob Moore #define ACPI_GET_2BIT_FLAG(value) ((value) & ACPI_2BIT_MASK) 3512f3faabaSBob Moore #define ACPI_GET_3BIT_FLAG(value) ((value) & ACPI_3BIT_MASK) 3522f3faabaSBob Moore #define ACPI_GET_4BIT_FLAG(value) ((value) & ACPI_4BIT_MASK) 3532f3faabaSBob Moore 3542f3faabaSBob Moore /* Macros to extract flag bits from position one and above */ 3552f3faabaSBob Moore 3562f3faabaSBob Moore #define ACPI_EXTRACT_1BIT_FLAG(field, position) (ACPI_GET_1BIT_FLAG ((field) >> position)) 3572f3faabaSBob Moore #define ACPI_EXTRACT_2BIT_FLAG(field, position) (ACPI_GET_2BIT_FLAG ((field) >> position)) 3582f3faabaSBob Moore #define ACPI_EXTRACT_3BIT_FLAG(field, position) (ACPI_GET_3BIT_FLAG ((field) >> position)) 3592f3faabaSBob Moore #define ACPI_EXTRACT_4BIT_FLAG(field, position) (ACPI_GET_4BIT_FLAG ((field) >> position)) 3602f3faabaSBob Moore 36104a81dceSBob Moore /* ACPI Pathname helpers */ 36204a81dceSBob Moore 36304a81dceSBob Moore #define ACPI_IS_ROOT_PREFIX(c) ((c) == (u8) 0x5C) /* Backslash */ 36404a81dceSBob Moore #define ACPI_IS_PARENT_PREFIX(c) ((c) == (u8) 0x5E) /* Carat */ 36504a81dceSBob Moore #define ACPI_IS_PATH_SEPARATOR(c) ((c) == (u8) 0x2E) /* Period (dot) */ 36604a81dceSBob Moore 367e2f7a777SLen Brown /* 368cf48958eSBob Moore * An object of type struct acpi_namespace_node can appear in some contexts 369cf48958eSBob Moore * where a pointer to an object of type union acpi_operand_object can also 370e2f7a777SLen Brown * appear. This macro is used to distinguish them. 371e2f7a777SLen Brown * 3721af89271SJung-uk Kim * The "DescriptorType" field is the second field in both structures. 373e2f7a777SLen Brown */ 3741af89271SJung-uk Kim #define ACPI_GET_DESCRIPTOR_PTR(d) (((union acpi_descriptor *)(void *)(d))->common.common_pointer) 375f1778eb1SBob Moore #define ACPI_SET_DESCRIPTOR_PTR(d, p) (((union acpi_descriptor *)(void *)(d))->common.common_pointer = (p)) 376e2f7a777SLen Brown #define ACPI_GET_DESCRIPTOR_TYPE(d) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type) 377f1778eb1SBob Moore #define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((union acpi_descriptor *)(void *)(d))->common.descriptor_type = (t)) 378e2f7a777SLen Brown 379e2f7a777SLen Brown /* 380e2f7a777SLen Brown * Macros for the master AML opcode table 381e2f7a777SLen Brown */ 382e2f7a777SLen Brown #if defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT) 383e2f7a777SLen Brown #define ACPI_OP(name, Pargs, Iargs, obj_type, class, type, flags) \ 384e2f7a777SLen Brown {name, (u32)(Pargs), (u32)(Iargs), (u32)(flags), obj_type, class, type} 385e2f7a777SLen Brown #else 386e2f7a777SLen Brown #define ACPI_OP(name, Pargs, Iargs, obj_type, class, type, flags) \ 387e2f7a777SLen Brown {(u32)(Pargs), (u32)(Iargs), (u32)(flags), obj_type, class, type} 388e2f7a777SLen Brown #endif 389e2f7a777SLen Brown 390e2f7a777SLen Brown #define ARG_TYPE_WIDTH 5 391e2f7a777SLen Brown #define ARG_1(x) ((u32)(x)) 392e2f7a777SLen Brown #define ARG_2(x) ((u32)(x) << (1 * ARG_TYPE_WIDTH)) 393e2f7a777SLen Brown #define ARG_3(x) ((u32)(x) << (2 * ARG_TYPE_WIDTH)) 394e2f7a777SLen Brown #define ARG_4(x) ((u32)(x) << (3 * ARG_TYPE_WIDTH)) 395e2f7a777SLen Brown #define ARG_5(x) ((u32)(x) << (4 * ARG_TYPE_WIDTH)) 396e2f7a777SLen Brown #define ARG_6(x) ((u32)(x) << (5 * ARG_TYPE_WIDTH)) 397e2f7a777SLen Brown 398e2f7a777SLen Brown #define ARGI_LIST1(a) (ARG_1(a)) 399e2f7a777SLen Brown #define ARGI_LIST2(a, b) (ARG_1(b)|ARG_2(a)) 400e2f7a777SLen Brown #define ARGI_LIST3(a, b, c) (ARG_1(c)|ARG_2(b)|ARG_3(a)) 401e2f7a777SLen Brown #define ARGI_LIST4(a, b, c, d) (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a)) 402e2f7a777SLen Brown #define ARGI_LIST5(a, b, c, d, e) (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a)) 403e2f7a777SLen Brown #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)) 404e2f7a777SLen Brown 405e2f7a777SLen Brown #define ARGP_LIST1(a) (ARG_1(a)) 406e2f7a777SLen Brown #define ARGP_LIST2(a, b) (ARG_1(a)|ARG_2(b)) 407e2f7a777SLen Brown #define ARGP_LIST3(a, b, c) (ARG_1(a)|ARG_2(b)|ARG_3(c)) 408e2f7a777SLen Brown #define ARGP_LIST4(a, b, c, d) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)) 409e2f7a777SLen Brown #define ARGP_LIST5(a, b, c, d, e) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)) 410e2f7a777SLen Brown #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)) 411e2f7a777SLen Brown 412e2f7a777SLen Brown #define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F)) 413e2f7a777SLen Brown #define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH)) 414e2f7a777SLen Brown 415e2f7a777SLen Brown /* 416e2f7a777SLen Brown * Ascii error messages can be configured out 417e2f7a777SLen Brown */ 418e2f7a777SLen Brown #ifndef ACPI_NO_ERROR_MESSAGES 419e2f7a777SLen Brown /* 420fcfb4553SBob Moore * Error reporting. The callers module and line number are inserted by AE_INFO, 421e2f7a777SLen Brown * the plist contains a set of parens to allow variable-length lists. 422e2f7a777SLen Brown * These macros are used for both the debug and non-debug versions of the code. 423e2f7a777SLen Brown */ 42416ccf829SBob Moore #define ACPI_ERROR_NAMESPACE(s, p, e) acpi_ut_prefixed_namespace_error (AE_INFO, s, p, e); 425cc84e262SBob Moore #define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e); 4260444e8f6SBob Moore #define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist 4277df200cdSBob Moore #define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist 428e1405ca5SBob Moore #define ACPI_BIOS_ERROR_PREDEFINED(plist) acpi_ut_predefined_bios_error plist 4290fe0bebfSErik Schmauss #define ACPI_ERROR_ONLY(s) s 430e2f7a777SLen Brown 431e2f7a777SLen Brown #else 432e2f7a777SLen Brown 433e2f7a777SLen Brown /* No error messages */ 434e2f7a777SLen Brown 4350fe0bebfSErik Schmauss #define ACPI_ERROR_NAMESPACE(s, p, e) 436e2f7a777SLen Brown #define ACPI_ERROR_METHOD(s, n, p, e) 4370444e8f6SBob Moore #define ACPI_WARN_PREDEFINED(plist) 4387df200cdSBob Moore #define ACPI_INFO_PREDEFINED(plist) 439e1405ca5SBob Moore #define ACPI_BIOS_ERROR_PREDEFINED(plist) 4400fe0bebfSErik Schmauss #define ACPI_ERROR_ONLY(s) 4417df200cdSBob Moore 442e2f7a777SLen Brown #endif /* ACPI_NO_ERROR_MESSAGES */ 443e2f7a777SLen Brown 44472a8887aSBob Moore #if (!ACPI_REDUCED_HARDWARE) 44572a8887aSBob Moore #define ACPI_HW_OPTIONAL_FUNCTION(addr) addr 44672a8887aSBob Moore #else 44772a8887aSBob Moore #define ACPI_HW_OPTIONAL_FUNCTION(addr) NULL 44872a8887aSBob Moore #endif 44972a8887aSBob Moore 450e2f7a777SLen Brown /* 45186ff0e50SLv Zheng * Macros used for ACPICA utilities only 45286ff0e50SLv Zheng */ 45386ff0e50SLv Zheng 45486ff0e50SLv Zheng /* Generate a UUID */ 45586ff0e50SLv Zheng 45686ff0e50SLv Zheng #define ACPI_INIT_UUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \ 45786ff0e50SLv Zheng (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \ 45886ff0e50SLv Zheng (b) & 0xFF, ((b) >> 8) & 0xFF, \ 45986ff0e50SLv Zheng (c) & 0xFF, ((c) >> 8) & 0xFF, \ 46086ff0e50SLv Zheng (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) 46186ff0e50SLv Zheng 46286ff0e50SLv Zheng #define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7')) 463e2f7a777SLen Brown 4649cf7adecSBob Moore /* 465c163f90cSErik Schmauss * Macros used for the ASL-/ASL+ converter utility 4669cf7adecSBob Moore */ 4679cf7adecSBob Moore #ifdef ACPI_ASL_COMPILER 4689cf7adecSBob Moore 4699cf7adecSBob Moore #define ASL_CV_LABEL_FILENODE(a) cv_label_file_node(a); 4709cf7adecSBob Moore #define ASL_CV_CAPTURE_COMMENTS_ONLY(a) cv_capture_comments_only (a); 4719cf7adecSBob Moore #define ASL_CV_CAPTURE_COMMENTS(a) cv_capture_comments (a); 4729cf7adecSBob Moore #define ASL_CV_TRANSFER_COMMENTS(a) cv_transfer_comments (a); 4739cf7adecSBob Moore #define ASL_CV_CLOSE_PAREN(a,b) cv_close_paren_write_comment(a,b); 4749cf7adecSBob Moore #define ASL_CV_CLOSE_BRACE(a,b) cv_close_brace_write_comment(a,b); 4759cf7adecSBob Moore #define ASL_CV_SWITCH_FILES(a,b) cv_switch_files(a,b); 4769cf7adecSBob Moore #define ASL_CV_CLEAR_OP_COMMENTS(a) cv_clear_op_comments(a); 4779cf7adecSBob Moore #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d) cv_print_one_comment_type (a,b,c,d); 4789cf7adecSBob Moore #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b) cv_print_one_comment_list (a,b); 4799cf7adecSBob Moore #define ASL_CV_FILE_HAS_SWITCHED(a) cv_file_has_switched(a) 4809e43f5d5SErik Kaneda #define ASL_CV_INIT_FILETREE(a,b) cv_init_file_tree(a,b); 4819cf7adecSBob Moore 4829cf7adecSBob Moore #else 4839cf7adecSBob Moore 4849cf7adecSBob Moore #define ASL_CV_LABEL_FILENODE(a) 4859cf7adecSBob Moore #define ASL_CV_CAPTURE_COMMENTS_ONLY(a) 4869cf7adecSBob Moore #define ASL_CV_CAPTURE_COMMENTS(a) 4879cf7adecSBob Moore #define ASL_CV_TRANSFER_COMMENTS(a) 4889cf7adecSBob Moore #define ASL_CV_CLOSE_PAREN(a,b) acpi_os_printf (")"); 4899cf7adecSBob Moore #define ASL_CV_CLOSE_BRACE(a,b) acpi_os_printf ("}"); 4909cf7adecSBob Moore #define ASL_CV_SWITCH_FILES(a,b) 4919cf7adecSBob Moore #define ASL_CV_CLEAR_OP_COMMENTS(a) 4929cf7adecSBob Moore #define ASL_CV_PRINT_ONE_COMMENT(a,b,c,d) 4939cf7adecSBob Moore #define ASL_CV_PRINT_ONE_COMMENT_LIST(a,b) 4949cf7adecSBob Moore #define ASL_CV_FILE_HAS_SWITCHED(a) 0 4959e43f5d5SErik Kaneda #define ASL_CV_INIT_FILETREE(a,b) 4969cf7adecSBob Moore 4979cf7adecSBob Moore #endif 4989cf7adecSBob Moore 499e2f7a777SLen Brown #endif /* ACMACROS_H */ 500