17c478bd9Sstevel@tonic-gate /****************************************************************************** 27c478bd9Sstevel@tonic-gate * 37c478bd9Sstevel@tonic-gate * Name: acmacros.h - C macros for the entire subsystem. 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate *****************************************************************************/ 67c478bd9Sstevel@tonic-gate 7*26f3cdf0SGordon Ross /* 8*26f3cdf0SGordon Ross * Copyright (C) 2000 - 2011, Intel Corp. 97c478bd9Sstevel@tonic-gate * All rights reserved. 107c478bd9Sstevel@tonic-gate * 11*26f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 12*26f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 13*26f3cdf0SGordon Ross * are met: 14*26f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 15*26f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 16*26f3cdf0SGordon Ross * without modification. 17*26f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*26f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 19*26f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 20*26f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 21*26f3cdf0SGordon Ross * binary redistribution. 22*26f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 23*26f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 24*26f3cdf0SGordon Ross * from this software without specific prior written permission. 257c478bd9Sstevel@tonic-gate * 26*26f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 27*26f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 28*26f3cdf0SGordon Ross * Software Foundation. 297c478bd9Sstevel@tonic-gate * 30*26f3cdf0SGordon Ross * NO WARRANTY 31*26f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*26f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*26f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*26f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*26f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*26f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*26f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*26f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*26f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*26f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*26f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 42*26f3cdf0SGordon Ross */ 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate #ifndef __ACMACROS_H__ 457c478bd9Sstevel@tonic-gate #define __ACMACROS_H__ 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate 487c478bd9Sstevel@tonic-gate /* 49db2bae30SDana Myers * Extract data using a pointer. Any more than a byte and we 5030082d0cSmyers * get into potential aligment issues -- see the STORE macros below. 5130082d0cSmyers * Use with care. 527c478bd9Sstevel@tonic-gate */ 5330082d0cSmyers #define ACPI_GET8(ptr) *ACPI_CAST_PTR (UINT8, ptr) 5430082d0cSmyers #define ACPI_GET16(ptr) *ACPI_CAST_PTR (UINT16, ptr) 5530082d0cSmyers #define ACPI_GET32(ptr) *ACPI_CAST_PTR (UINT32, ptr) 5630082d0cSmyers #define ACPI_GET64(ptr) *ACPI_CAST_PTR (UINT64, ptr) 5730082d0cSmyers #define ACPI_SET8(ptr) *ACPI_CAST_PTR (UINT8, ptr) 5830082d0cSmyers #define ACPI_SET16(ptr) *ACPI_CAST_PTR (UINT16, ptr) 5930082d0cSmyers #define ACPI_SET32(ptr) *ACPI_CAST_PTR (UINT32, ptr) 6030082d0cSmyers #define ACPI_SET64(ptr) *ACPI_CAST_PTR (UINT64, ptr) 617c478bd9Sstevel@tonic-gate 62db2bae30SDana Myers /* 63db2bae30SDana Myers * printf() format helpers 64db2bae30SDana Myers */ 65db2bae30SDana Myers 66db2bae30SDana Myers /* Split 64-bit integer into two 32-bit values. Use with %8.8X%8.8X */ 67db2bae30SDana Myers 68db2bae30SDana Myers #define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i), ACPI_LODWORD(i) 69db2bae30SDana Myers 70db2bae30SDana Myers #if ACPI_MACHINE_WIDTH == 64 71db2bae30SDana Myers #define ACPI_FORMAT_NATIVE_UINT(i) ACPI_FORMAT_UINT64(i) 72db2bae30SDana Myers #else 73db2bae30SDana Myers #define ACPI_FORMAT_NATIVE_UINT(i) 0, (i) 74db2bae30SDana Myers #endif 75db2bae30SDana Myers 76db2bae30SDana Myers 777c478bd9Sstevel@tonic-gate /* 787c478bd9Sstevel@tonic-gate * Macros for moving data around to/from buffers that are possibly unaligned. 797c478bd9Sstevel@tonic-gate * If the hardware supports the transfer of unaligned data, just do the store. 807c478bd9Sstevel@tonic-gate * Otherwise, we have to move one byte at a time. 817c478bd9Sstevel@tonic-gate */ 827c478bd9Sstevel@tonic-gate #ifdef ACPI_BIG_ENDIAN 837c478bd9Sstevel@tonic-gate /* 847c478bd9Sstevel@tonic-gate * Macros for big-endian machines 857c478bd9Sstevel@tonic-gate */ 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate /* These macros reverse the bytes during the move, converting little-endian to big endian */ 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate /* Big Endian <== Little Endian */ 907c478bd9Sstevel@tonic-gate /* Hi...Lo Lo...Hi */ 917c478bd9Sstevel@tonic-gate /* 16-bit source, 16/32/64 destination */ 927c478bd9Sstevel@tonic-gate 93db2bae30SDana Myers #define ACPI_MOVE_16_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[1];\ 947c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[0];} 957c478bd9Sstevel@tonic-gate 96db2bae30SDana Myers #define ACPI_MOVE_16_TO_32(d, s) {(*(UINT32 *)(void *)(d))=0;\ 977c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\ 987c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];} 997c478bd9Sstevel@tonic-gate 100db2bae30SDana Myers #define ACPI_MOVE_16_TO_64(d, s) {(*(UINT64 *)(void *)(d))=0;\ 1017c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ 1027c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} 1037c478bd9Sstevel@tonic-gate 1047c478bd9Sstevel@tonic-gate /* 32-bit source, 16/32/64 destination */ 1057c478bd9Sstevel@tonic-gate 106db2bae30SDana Myers #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 1077c478bd9Sstevel@tonic-gate 108db2bae30SDana Myers #define ACPI_MOVE_32_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\ 1097c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\ 1107c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\ 1117c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];} 1127c478bd9Sstevel@tonic-gate 113db2bae30SDana Myers #define ACPI_MOVE_32_TO_64(d, s) {(*(UINT64 *)(void *)(d))=0;\ 1147c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\ 1157c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\ 1167c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ 1177c478bd9Sstevel@tonic-gate ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} 1187c478bd9Sstevel@tonic-gate 1197c478bd9Sstevel@tonic-gate /* 64-bit source, 16/32/64 destination */ 1207c478bd9Sstevel@tonic-gate 121db2bae30SDana Myers #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 1227c478bd9Sstevel@tonic-gate 123db2bae30SDana Myers #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 1247c478bd9Sstevel@tonic-gate 125db2bae30SDana Myers #define ACPI_MOVE_64_TO_64(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\ 1267c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\ 1277c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\ 1287c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];\ 1297c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\ 1307c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\ 1317c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\ 1327c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];} 1337c478bd9Sstevel@tonic-gate #else 1347c478bd9Sstevel@tonic-gate /* 1357c478bd9Sstevel@tonic-gate * Macros for little-endian machines 1367c478bd9Sstevel@tonic-gate */ 1377c478bd9Sstevel@tonic-gate 13830082d0cSmyers #ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED 1397c478bd9Sstevel@tonic-gate 1407c478bd9Sstevel@tonic-gate /* The hardware supports unaligned transfers, just do the little-endian move */ 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate /* 16-bit source, 16/32/64 destination */ 1437c478bd9Sstevel@tonic-gate 144db2bae30SDana Myers #define ACPI_MOVE_16_TO_16(d, s) *(UINT16 *)(void *)(d) = *(UINT16 *)(void *)(s) 145db2bae30SDana Myers #define ACPI_MOVE_16_TO_32(d, s) *(UINT32 *)(void *)(d) = *(UINT16 *)(void *)(s) 146db2bae30SDana Myers #define ACPI_MOVE_16_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT16 *)(void *)(s) 1477c478bd9Sstevel@tonic-gate 1487c478bd9Sstevel@tonic-gate /* 32-bit source, 16/32/64 destination */ 1497c478bd9Sstevel@tonic-gate 150db2bae30SDana Myers #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 151db2bae30SDana Myers #define ACPI_MOVE_32_TO_32(d, s) *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s) 152db2bae30SDana Myers #define ACPI_MOVE_32_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s) 1537c478bd9Sstevel@tonic-gate 1547c478bd9Sstevel@tonic-gate /* 64-bit source, 16/32/64 destination */ 1557c478bd9Sstevel@tonic-gate 156db2bae30SDana Myers #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 157db2bae30SDana Myers #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 158db2bae30SDana Myers #define ACPI_MOVE_64_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT64 *)(void *)(s) 1597c478bd9Sstevel@tonic-gate 1607c478bd9Sstevel@tonic-gate #else 1617c478bd9Sstevel@tonic-gate /* 162db2bae30SDana Myers * The hardware does not support unaligned transfers. We must move the 163db2bae30SDana Myers * data one byte at a time. These macros work whether the source or 164aa2aa9a6SDana Myers * the destination (or both) is/are unaligned. (Little-endian move) 1657c478bd9Sstevel@tonic-gate */ 1667c478bd9Sstevel@tonic-gate 1677c478bd9Sstevel@tonic-gate /* 16-bit source, 16/32/64 destination */ 1687c478bd9Sstevel@tonic-gate 169db2bae30SDana Myers #define ACPI_MOVE_16_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\ 1707c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];} 1717c478bd9Sstevel@tonic-gate 172db2bae30SDana Myers #define ACPI_MOVE_16_TO_32(d, s) {(*(UINT32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} 173db2bae30SDana Myers #define ACPI_MOVE_16_TO_64(d, s) {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);} 1747c478bd9Sstevel@tonic-gate 1757c478bd9Sstevel@tonic-gate /* 32-bit source, 16/32/64 destination */ 1767c478bd9Sstevel@tonic-gate 177db2bae30SDana Myers #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 1787c478bd9Sstevel@tonic-gate 179db2bae30SDana Myers #define ACPI_MOVE_32_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\ 1807c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\ 1817c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\ 1827c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];} 1837c478bd9Sstevel@tonic-gate 184db2bae30SDana Myers #define ACPI_MOVE_32_TO_64(d, s) {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d, s);} 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate /* 64-bit source, 16/32/64 destination */ 1877c478bd9Sstevel@tonic-gate 188db2bae30SDana Myers #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */ 189db2bae30SDana Myers #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */ 190db2bae30SDana Myers #define ACPI_MOVE_64_TO_64(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\ 1917c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\ 1927c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\ 1937c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];\ 1947c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[4];\ 1957c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[5];\ 1967c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[6];\ 1977c478bd9Sstevel@tonic-gate (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[7];} 1987c478bd9Sstevel@tonic-gate #endif 1997c478bd9Sstevel@tonic-gate #endif 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate 2027c478bd9Sstevel@tonic-gate /* 2037c478bd9Sstevel@tonic-gate * Fast power-of-two math macros for non-optimized compilers 2047c478bd9Sstevel@tonic-gate */ 205db2bae30SDana Myers #define _ACPI_DIV(value, PowerOf2) ((UINT32) ((value) >> (PowerOf2))) 206db2bae30SDana Myers #define _ACPI_MUL(value, PowerOf2) ((UINT32) ((value) << (PowerOf2))) 207db2bae30SDana Myers #define _ACPI_MOD(value, Divisor) ((UINT32) ((value) & ((Divisor) -1))) 2087c478bd9Sstevel@tonic-gate 209db2bae30SDana Myers #define ACPI_DIV_2(a) _ACPI_DIV(a, 1) 210db2bae30SDana Myers #define ACPI_MUL_2(a) _ACPI_MUL(a, 1) 211db2bae30SDana Myers #define ACPI_MOD_2(a) _ACPI_MOD(a, 2) 2127c478bd9Sstevel@tonic-gate 213db2bae30SDana Myers #define ACPI_DIV_4(a) _ACPI_DIV(a, 2) 214db2bae30SDana Myers #define ACPI_MUL_4(a) _ACPI_MUL(a, 2) 215db2bae30SDana Myers #define ACPI_MOD_4(a) _ACPI_MOD(a, 4) 2167c478bd9Sstevel@tonic-gate 217db2bae30SDana Myers #define ACPI_DIV_8(a) _ACPI_DIV(a, 3) 218db2bae30SDana Myers #define ACPI_MUL_8(a) _ACPI_MUL(a, 3) 219db2bae30SDana Myers #define ACPI_MOD_8(a) _ACPI_MOD(a, 8) 2207c478bd9Sstevel@tonic-gate 221db2bae30SDana Myers #define ACPI_DIV_16(a) _ACPI_DIV(a, 4) 222db2bae30SDana Myers #define ACPI_MUL_16(a) _ACPI_MUL(a, 4) 223db2bae30SDana Myers #define ACPI_MOD_16(a) _ACPI_MOD(a, 16) 2247c478bd9Sstevel@tonic-gate 225db2bae30SDana Myers #define ACPI_DIV_32(a) _ACPI_DIV(a, 5) 226db2bae30SDana Myers #define ACPI_MUL_32(a) _ACPI_MUL(a, 5) 227db2bae30SDana Myers #define ACPI_MOD_32(a) _ACPI_MOD(a, 32) 2287c478bd9Sstevel@tonic-gate 2297c478bd9Sstevel@tonic-gate /* 2307c478bd9Sstevel@tonic-gate * Rounding macros (Power of two boundaries only) 2317c478bd9Sstevel@tonic-gate */ 232db2bae30SDana Myers #define ACPI_ROUND_DOWN(value, boundary) (((ACPI_SIZE)(value)) & \ 233db2bae30SDana Myers (~(((ACPI_SIZE) boundary)-1))) 2347c478bd9Sstevel@tonic-gate 235db2bae30SDana Myers #define ACPI_ROUND_UP(value, boundary) ((((ACPI_SIZE)(value)) + \ 236db2bae30SDana Myers (((ACPI_SIZE) boundary)-1)) & \ 237db2bae30SDana Myers (~(((ACPI_SIZE) boundary)-1))) 2387c478bd9Sstevel@tonic-gate 239db2bae30SDana Myers /* Note: sizeof(ACPI_SIZE) evaluates to either 4 or 8 (32- vs 64-bit mode) */ 2407c478bd9Sstevel@tonic-gate 241db2bae30SDana Myers #define ACPI_ROUND_DOWN_TO_32BIT(a) ACPI_ROUND_DOWN(a, 4) 242db2bae30SDana Myers #define ACPI_ROUND_DOWN_TO_64BIT(a) ACPI_ROUND_DOWN(a, 8) 243db2bae30SDana Myers #define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a, sizeof(ACPI_SIZE)) 2447c478bd9Sstevel@tonic-gate 245db2bae30SDana Myers #define ACPI_ROUND_UP_TO_32BIT(a) ACPI_ROUND_UP(a, 4) 246db2bae30SDana Myers #define ACPI_ROUND_UP_TO_64BIT(a) ACPI_ROUND_UP(a, 8) 247db2bae30SDana Myers #define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a, sizeof(ACPI_SIZE)) 2487c478bd9Sstevel@tonic-gate 24930082d0cSmyers #define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7) 25030082d0cSmyers #define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a)) 25130082d0cSmyers 25230082d0cSmyers #define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) 2537c478bd9Sstevel@tonic-gate 2547c478bd9Sstevel@tonic-gate /* Generic (non-power-of-two) rounding */ 2557c478bd9Sstevel@tonic-gate 256db2bae30SDana Myers #define ACPI_ROUND_UP_TO(value, boundary) (((value) + ((boundary)-1)) / (boundary)) 25730082d0cSmyers 258db2bae30SDana Myers #define ACPI_IS_MISALIGNED(value) (((ACPI_SIZE) value) & (sizeof(ACPI_SIZE)-1)) 2597c478bd9Sstevel@tonic-gate 2607c478bd9Sstevel@tonic-gate /* 2617c478bd9Sstevel@tonic-gate * Bitmask creation 2627c478bd9Sstevel@tonic-gate * Bit positions start at zero. 2637c478bd9Sstevel@tonic-gate * MASK_BITS_ABOVE creates a mask starting AT the position and above 2647c478bd9Sstevel@tonic-gate * MASK_BITS_BELOW creates a mask starting one bit BELOW the position 2657c478bd9Sstevel@tonic-gate */ 266*26f3cdf0SGordon Ross #define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_UINT64_MAX) << ((UINT32) (position)))) 267*26f3cdf0SGordon Ross #define ACPI_MASK_BITS_BELOW(position) ((ACPI_UINT64_MAX) << ((UINT32) (position))) 2687c478bd9Sstevel@tonic-gate 2697c478bd9Sstevel@tonic-gate /* Bitfields within ACPI registers */ 2707c478bd9Sstevel@tonic-gate 2717c478bd9Sstevel@tonic-gate #define ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask) ((Val << Pos) & Mask) 2727c478bd9Sstevel@tonic-gate #define ACPI_REGISTER_INSERT_VALUE(Reg, Pos, Mask, Val) Reg = (Reg & (~(Mask))) | ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask) 2737c478bd9Sstevel@tonic-gate 27427f7c583Smyers #define ACPI_INSERT_BITS(Target, Mask, Source) Target = ((Target & (~(Mask))) | (Source & Mask)) 27527f7c583Smyers 2767c478bd9Sstevel@tonic-gate /* 277db2bae30SDana Myers * An ACPI_NAMESPACE_NODE can appear in some contexts 278db2bae30SDana Myers * where a pointer to an ACPI_OPERAND_OBJECT can also 279db2bae30SDana Myers * appear. This macro is used to distinguish them. 2807c478bd9Sstevel@tonic-gate * 2817c478bd9Sstevel@tonic-gate * The "Descriptor" field is the first field in both structures. 2827c478bd9Sstevel@tonic-gate */ 28327f7c583Smyers #define ACPI_GET_DESCRIPTOR_TYPE(d) (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType) 284db2bae30SDana Myers #define ACPI_SET_DESCRIPTOR_TYPE(d, t) (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType = t) 2857c478bd9Sstevel@tonic-gate 2867c478bd9Sstevel@tonic-gate /* 2877c478bd9Sstevel@tonic-gate * Macros for the master AML opcode table 2887c478bd9Sstevel@tonic-gate */ 289db2bae30SDana Myers #if defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT) 290db2bae30SDana Myers #define ACPI_OP(Name, PArgs, IArgs, ObjType, Class, Type, Flags) \ 291db2bae30SDana Myers {Name, (UINT32)(PArgs), (UINT32)(IArgs), (UINT32)(Flags), ObjType, Class, Type} 2927c478bd9Sstevel@tonic-gate #else 293db2bae30SDana Myers #define ACPI_OP(Name, PArgs, IArgs, ObjType, Class, Type, Flags) \ 294db2bae30SDana Myers {(UINT32)(PArgs), (UINT32)(IArgs), (UINT32)(Flags), ObjType, Class, Type} 2957c478bd9Sstevel@tonic-gate #endif 2967c478bd9Sstevel@tonic-gate 2977c478bd9Sstevel@tonic-gate #define ARG_TYPE_WIDTH 5 2987c478bd9Sstevel@tonic-gate #define ARG_1(x) ((UINT32)(x)) 2997c478bd9Sstevel@tonic-gate #define ARG_2(x) ((UINT32)(x) << (1 * ARG_TYPE_WIDTH)) 3007c478bd9Sstevel@tonic-gate #define ARG_3(x) ((UINT32)(x) << (2 * ARG_TYPE_WIDTH)) 3017c478bd9Sstevel@tonic-gate #define ARG_4(x) ((UINT32)(x) << (3 * ARG_TYPE_WIDTH)) 3027c478bd9Sstevel@tonic-gate #define ARG_5(x) ((UINT32)(x) << (4 * ARG_TYPE_WIDTH)) 3037c478bd9Sstevel@tonic-gate #define ARG_6(x) ((UINT32)(x) << (5 * ARG_TYPE_WIDTH)) 3047c478bd9Sstevel@tonic-gate 3057c478bd9Sstevel@tonic-gate #define ARGI_LIST1(a) (ARG_1(a)) 306db2bae30SDana Myers #define ARGI_LIST2(a, b) (ARG_1(b)|ARG_2(a)) 307db2bae30SDana Myers #define ARGI_LIST3(a, b, c) (ARG_1(c)|ARG_2(b)|ARG_3(a)) 308db2bae30SDana Myers #define ARGI_LIST4(a, b, c, d) (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a)) 309db2bae30SDana Myers #define ARGI_LIST5(a, b, c, d, e) (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a)) 310db2bae30SDana Myers #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)) 3117c478bd9Sstevel@tonic-gate 3127c478bd9Sstevel@tonic-gate #define ARGP_LIST1(a) (ARG_1(a)) 313db2bae30SDana Myers #define ARGP_LIST2(a, b) (ARG_1(a)|ARG_2(b)) 314db2bae30SDana Myers #define ARGP_LIST3(a, b, c) (ARG_1(a)|ARG_2(b)|ARG_3(c)) 315db2bae30SDana Myers #define ARGP_LIST4(a, b, c, d) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)) 316db2bae30SDana Myers #define ARGP_LIST5(a, b, c, d, e) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)) 317db2bae30SDana Myers #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)) 3187c478bd9Sstevel@tonic-gate 3197c478bd9Sstevel@tonic-gate #define GET_CURRENT_ARG_TYPE(List) (List & ((UINT32) 0x1F)) 3207c478bd9Sstevel@tonic-gate #define INCREMENT_ARG_LIST(List) (List >>= ((UINT32) ARG_TYPE_WIDTH)) 3217c478bd9Sstevel@tonic-gate 3227c478bd9Sstevel@tonic-gate /* 32330082d0cSmyers * Ascii error messages can be configured out 3247c478bd9Sstevel@tonic-gate */ 32530082d0cSmyers #ifndef ACPI_NO_ERROR_MESSAGES 32630082d0cSmyers /* 32730082d0cSmyers * Error reporting. Callers module and line number are inserted by AE_INFO, 32830082d0cSmyers * the plist contains a set of parens to allow variable-length lists. 32930082d0cSmyers * These macros are used for both the debug and non-debug versions of the code. 33030082d0cSmyers */ 331*26f3cdf0SGordon Ross #define ACPI_ERROR_NAMESPACE(s, e) AcpiUtNamespaceError (AE_INFO, s, e); 332*26f3cdf0SGordon Ross #define ACPI_ERROR_METHOD(s, n, p, e) AcpiUtMethodError (AE_INFO, s, n, p, e); 33357190917SDana Myers #define ACPI_WARN_PREDEFINED(plist) AcpiUtPredefinedWarning plist 33457190917SDana Myers #define ACPI_INFO_PREDEFINED(plist) AcpiUtPredefinedInfo plist 33530082d0cSmyers 3367c478bd9Sstevel@tonic-gate #else 3377c478bd9Sstevel@tonic-gate 33830082d0cSmyers /* No error messages */ 3397c478bd9Sstevel@tonic-gate 340db2bae30SDana Myers #define ACPI_ERROR_NAMESPACE(s, e) 341db2bae30SDana Myers #define ACPI_ERROR_METHOD(s, n, p, e) 34257190917SDana Myers #define ACPI_WARN_PREDEFINED(plist) 34357190917SDana Myers #define ACPI_INFO_PREDEFINED(plist) 344aa2aa9a6SDana Myers 345aa2aa9a6SDana Myers #endif /* ACPI_NO_ERROR_MESSAGES */ 3467c478bd9Sstevel@tonic-gate 3477c478bd9Sstevel@tonic-gate /* 3487c478bd9Sstevel@tonic-gate * Debug macros that are conditionally compiled 3497c478bd9Sstevel@tonic-gate */ 3507c478bd9Sstevel@tonic-gate #ifdef ACPI_DEBUG_OUTPUT 3517c478bd9Sstevel@tonic-gate /* 352450d6964Smyers * Function entry tracing 3537c478bd9Sstevel@tonic-gate */ 354450d6964Smyers #define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \ 355450d6964Smyers AcpiUtTrace(ACPI_DEBUG_PARAMETERS) 356db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_PTR(a, b) ACPI_FUNCTION_NAME(a) \ 357db2bae30SDana Myers AcpiUtTracePtr(ACPI_DEBUG_PARAMETERS, (void *)b) 358db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_U32(a, b) ACPI_FUNCTION_NAME(a) \ 359db2bae30SDana Myers AcpiUtTraceU32(ACPI_DEBUG_PARAMETERS, (UINT32)b) 360db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_STR(a, b) ACPI_FUNCTION_NAME(a) \ 361db2bae30SDana Myers AcpiUtTraceStr(ACPI_DEBUG_PARAMETERS, (char *)b) 362450d6964Smyers 363450d6964Smyers #define ACPI_FUNCTION_ENTRY() AcpiUtTrackStackPtr() 3647c478bd9Sstevel@tonic-gate 3657c478bd9Sstevel@tonic-gate /* 3667c478bd9Sstevel@tonic-gate * Function exit tracing. 367db2bae30SDana Myers * WARNING: These macros include a return statement. This is usually considered 3687c478bd9Sstevel@tonic-gate * bad form, but having a separate exit macro is very ugly and difficult to maintain. 3697c478bd9Sstevel@tonic-gate * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros 370450d6964Smyers * so that "_AcpiFunctionName" is defined. 371186507a7Smyers * 372186507a7Smyers * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining 373186507a7Smyers * about these constructs. 3747c478bd9Sstevel@tonic-gate */ 3757c478bd9Sstevel@tonic-gate #ifdef ACPI_USE_DO_WHILE_0 3767c478bd9Sstevel@tonic-gate #define ACPI_DO_WHILE0(a) do a while(0) 3777c478bd9Sstevel@tonic-gate #else 3787c478bd9Sstevel@tonic-gate #define ACPI_DO_WHILE0(a) a 3797c478bd9Sstevel@tonic-gate #endif 3807c478bd9Sstevel@tonic-gate 381186507a7Smyers #define return_VOID ACPI_DO_WHILE0 ({ \ 382186507a7Smyers AcpiUtExit (ACPI_DEBUG_PARAMETERS); \ 383186507a7Smyers return;}) 384186507a7Smyers /* 385186507a7Smyers * There are two versions of most of the return macros. The default version is 386186507a7Smyers * safer, since it avoids side-effects by guaranteeing that the argument will 387186507a7Smyers * not be evaluated twice. 38830082d0cSmyers * 389186507a7Smyers * A less-safe version of the macros is provided for optional use if the 390186507a7Smyers * compiler uses excessive CPU stack (for example, this may happen in the 391186507a7Smyers * debug case if code optimzation is disabled.) 392186507a7Smyers */ 393186507a7Smyers #ifndef ACPI_SIMPLE_RETURN_MACROS 394186507a7Smyers 395186507a7Smyers #define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \ 396186507a7Smyers register ACPI_STATUS _s = (s); \ 397186507a7Smyers AcpiUtStatusExit (ACPI_DEBUG_PARAMETERS, _s); \ 398186507a7Smyers return (_s); }) 399186507a7Smyers #define return_PTR(s) ACPI_DO_WHILE0 ({ \ 400186507a7Smyers register void *_s = (void *) (s); \ 401186507a7Smyers AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) _s); \ 402186507a7Smyers return (_s); }) 403186507a7Smyers #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ 404*26f3cdf0SGordon Ross register UINT64 _s = (s); \ 405186507a7Smyers AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, _s); \ 406186507a7Smyers return (_s); }) 407186507a7Smyers #define return_UINT8(s) ACPI_DO_WHILE0 ({ \ 408186507a7Smyers register UINT8 _s = (UINT8) (s); \ 409*26f3cdf0SGordon Ross AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) _s); \ 410186507a7Smyers return (_s); }) 411186507a7Smyers #define return_UINT32(s) ACPI_DO_WHILE0 ({ \ 412186507a7Smyers register UINT32 _s = (UINT32) (s); \ 413*26f3cdf0SGordon Ross AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) _s); \ 414186507a7Smyers return (_s); }) 415186507a7Smyers #else /* Use original less-safe macros */ 416186507a7Smyers 417186507a7Smyers #define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \ 418186507a7Smyers AcpiUtStatusExit (ACPI_DEBUG_PARAMETERS, (s)); \ 419186507a7Smyers return((s)); }) 420186507a7Smyers #define return_PTR(s) ACPI_DO_WHILE0 ({ \ 421186507a7Smyers AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) (s)); \ 422186507a7Smyers return((s)); }) 423186507a7Smyers #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ 424*26f3cdf0SGordon Ross AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) (s)); \ 425186507a7Smyers return((s)); }) 426186507a7Smyers #define return_UINT8(s) return_VALUE(s) 427186507a7Smyers #define return_UINT32(s) return_VALUE(s) 428186507a7Smyers 429186507a7Smyers #endif /* ACPI_SIMPLE_RETURN_MACROS */ 430186507a7Smyers 4317c478bd9Sstevel@tonic-gate 4327c478bd9Sstevel@tonic-gate /* Conditional execution */ 4337c478bd9Sstevel@tonic-gate 4347c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_EXEC(a) a 4357c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_ONLY_MEMBERS(a) a; 4367c478bd9Sstevel@tonic-gate #define _VERBOSE_STRUCTURES 4377c478bd9Sstevel@tonic-gate 4387c478bd9Sstevel@tonic-gate 439db2bae30SDana Myers /* Various object display routines for debug */ 4407c478bd9Sstevel@tonic-gate 441db2bae30SDana Myers #define ACPI_DUMP_STACK_ENTRY(a) AcpiExDumpOperand((a), 0) 442db2bae30SDana Myers #define ACPI_DUMP_OPERANDS(a, b ,c) AcpiExDumpOperands(a, b, c) 443db2bae30SDana Myers #define ACPI_DUMP_ENTRY(a, b) AcpiNsDumpEntry (a, b) 444db2bae30SDana Myers #define ACPI_DUMP_PATHNAME(a, b, c, d) AcpiNsDumpPathname(a, b, c, d) 445db2bae30SDana Myers #define ACPI_DUMP_BUFFER(a, b) AcpiUtDumpBuffer((UINT8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT) 4467c478bd9Sstevel@tonic-gate 4477c478bd9Sstevel@tonic-gate #else 4487c478bd9Sstevel@tonic-gate /* 4497c478bd9Sstevel@tonic-gate * This is the non-debug case -- make everything go away, 4507c478bd9Sstevel@tonic-gate * leaving no executable debug code! 4517c478bd9Sstevel@tonic-gate */ 4527c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_EXEC(a) 4537c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_ONLY_MEMBERS(a) 4547c478bd9Sstevel@tonic-gate #define ACPI_FUNCTION_TRACE(a) 455db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_PTR(a, b) 456db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_U32(a, b) 457db2bae30SDana Myers #define ACPI_FUNCTION_TRACE_STR(a, b) 4587c478bd9Sstevel@tonic-gate #define ACPI_FUNCTION_EXIT 4597c478bd9Sstevel@tonic-gate #define ACPI_FUNCTION_STATUS_EXIT(s) 4607c478bd9Sstevel@tonic-gate #define ACPI_FUNCTION_VALUE_EXIT(s) 4617c478bd9Sstevel@tonic-gate #define ACPI_FUNCTION_ENTRY() 4627c478bd9Sstevel@tonic-gate #define ACPI_DUMP_STACK_ENTRY(a) 463db2bae30SDana Myers #define ACPI_DUMP_OPERANDS(a, b, c) 464db2bae30SDana Myers #define ACPI_DUMP_ENTRY(a, b) 465db2bae30SDana Myers #define ACPI_DUMP_TABLES(a, b) 466db2bae30SDana Myers #define ACPI_DUMP_PATHNAME(a, b, c, d) 467db2bae30SDana Myers #define ACPI_DUMP_BUFFER(a, b) 4687c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_PRINT(pl) 4697c478bd9Sstevel@tonic-gate #define ACPI_DEBUG_PRINT_RAW(pl) 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate #define return_VOID return 4727c478bd9Sstevel@tonic-gate #define return_ACPI_STATUS(s) return(s) 4737c478bd9Sstevel@tonic-gate #define return_VALUE(s) return(s) 474186507a7Smyers #define return_UINT8(s) return(s) 475186507a7Smyers #define return_UINT32(s) return(s) 4767c478bd9Sstevel@tonic-gate #define return_PTR(s) return(s) 4777c478bd9Sstevel@tonic-gate 478aa2aa9a6SDana Myers #endif /* ACPI_DEBUG_OUTPUT */ 4797c478bd9Sstevel@tonic-gate 4807c478bd9Sstevel@tonic-gate /* 4817c478bd9Sstevel@tonic-gate * Some code only gets executed when the debugger is built in. 4827c478bd9Sstevel@tonic-gate * Note that this is entirely independent of whether the 4837c478bd9Sstevel@tonic-gate * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not. 4847c478bd9Sstevel@tonic-gate */ 4857c478bd9Sstevel@tonic-gate #ifdef ACPI_DEBUGGER 4867c478bd9Sstevel@tonic-gate #define ACPI_DEBUGGER_EXEC(a) a 4877c478bd9Sstevel@tonic-gate #else 4887c478bd9Sstevel@tonic-gate #define ACPI_DEBUGGER_EXEC(a) 4897c478bd9Sstevel@tonic-gate #endif 4907c478bd9Sstevel@tonic-gate 4917c478bd9Sstevel@tonic-gate 4927c478bd9Sstevel@tonic-gate /* 4937c478bd9Sstevel@tonic-gate * Memory allocation tracking (DEBUG ONLY) 4947c478bd9Sstevel@tonic-gate */ 495db2bae30SDana Myers #define ACPI_MEM_PARAMETERS _COMPONENT, _AcpiModuleName, __LINE__ 496db2bae30SDana Myers 4977c478bd9Sstevel@tonic-gate #ifndef ACPI_DBG_TRACK_ALLOCATIONS 4987c478bd9Sstevel@tonic-gate 4997c478bd9Sstevel@tonic-gate /* Memory allocation */ 5007c478bd9Sstevel@tonic-gate 501db2bae30SDana Myers #define ACPI_ALLOCATE(a) AcpiUtAllocate((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS) 502db2bae30SDana Myers #define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroed((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS) 50327f7c583Smyers #define ACPI_FREE(a) AcpiOsFree(a) 5047c478bd9Sstevel@tonic-gate #define ACPI_MEM_TRACKING(a) 5057c478bd9Sstevel@tonic-gate 5067c478bd9Sstevel@tonic-gate #else 5077c478bd9Sstevel@tonic-gate 5087c478bd9Sstevel@tonic-gate /* Memory allocation */ 5097c478bd9Sstevel@tonic-gate 510db2bae30SDana Myers #define ACPI_ALLOCATE(a) AcpiUtAllocateAndTrack((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS) 511db2bae30SDana Myers #define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroedAndTrack((ACPI_SIZE) (a), ACPI_MEM_PARAMETERS) 512db2bae30SDana Myers #define ACPI_FREE(a) AcpiUtFreeAndTrack(a, ACPI_MEM_PARAMETERS) 51327f7c583Smyers #define ACPI_MEM_TRACKING(a) a 5147c478bd9Sstevel@tonic-gate 5157c478bd9Sstevel@tonic-gate #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ 5167c478bd9Sstevel@tonic-gate 517db2bae30SDana Myers 518db2bae30SDana Myers /* 519db2bae30SDana Myers * Macros used for ACPICA utilities only 520db2bae30SDana Myers */ 521db2bae30SDana Myers 522db2bae30SDana Myers /* Generate a UUID */ 523db2bae30SDana Myers 524db2bae30SDana Myers #define ACPI_INIT_UUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \ 525db2bae30SDana Myers (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \ 526db2bae30SDana Myers (b) & 0xFF, ((b) >> 8) & 0xFF, \ 527db2bae30SDana Myers (c) & 0xFF, ((c) >> 8) & 0xFF, \ 528db2bae30SDana Myers (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) 529db2bae30SDana Myers 530db2bae30SDana Myers #define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7')) 531db2bae30SDana Myers 532db2bae30SDana Myers 5337c478bd9Sstevel@tonic-gate #endif /* ACMACROS_H */ 534