| /* Copyright © 2023 Intel Corporation |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef __GENX_HELPERS_H__ |
| #define __GENX_HELPERS_H__ |
| |
| #ifndef __gen_validate_value |
| #define __gen_validate_value(x) |
| #endif |
| |
| #ifndef __intel_field_functions |
| #define __intel_field_functions |
| #endif |
| |
| #ifndef __gen_address_type |
| #error #define __gen_address_type before including this file |
| #endif |
| |
| #ifndef __gen_user_data |
| #error #define __gen_combine_address before including this file |
| #endif |
| |
| static inline __attribute__((always_inline)) uint64_t |
| __gen_offset(uint64_t v, ASSERTED uint32_t start, ASSERTED uint32_t end) |
| { |
| __gen_validate_value(v); |
| #ifndef NDEBUG |
| uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start; |
| |
| assert((v & ~mask) == 0); |
| #endif |
| |
| return v; |
| } |
| |
| static inline __attribute__((always_inline)) uint64_t |
| __gen_offset_nonzero(uint64_t v, uint32_t start, uint32_t end) |
| { |
| assert(v != 0ull); |
| return __gen_offset(v, start, end); |
| } |
| |
| static inline __attribute__((always_inline)) uint64_t |
| __gen_address(__gen_user_data *data, void *location, |
| __gen_address_type address, uint32_t delta, |
| __attribute__((unused)) uint32_t start, uint32_t end) |
| { |
| uint64_t addr_u64 = __gen_combine_address(data, location, address, delta); |
| if (end == 31) { |
| return addr_u64; |
| } else if (end < 63) { |
| const unsigned shift = 63 - end; |
| return (addr_u64 << shift) >> shift; |
| } else { |
| return addr_u64; |
| } |
| } |
| |
| #endif /* __GENX_HELPERS_H__ */ |