1 /* Copyright © 2023 Intel Corporation
2 * SPDX-License-Identifier: MIT
3 */
4
5 #ifndef __GENX_HELPERS_H__
6 #define __GENX_HELPERS_H__
7
8 #ifndef __gen_validate_value
9 #define __gen_validate_value(x)
10 #endif
11
12 #ifndef __intel_field_functions
13 #define __intel_field_functions
14 #endif
15
16 #ifndef __gen_address_type
17 #error #define __gen_address_type before including this file
18 #endif
19
20 #ifndef __gen_user_data
21 #error #define __gen_combine_address before including this file
22 #endif
23
24 static inline __attribute__((always_inline)) uint64_t
__gen_offset(uint64_t v,ASSERTED uint32_t start,ASSERTED uint32_t end)25 __gen_offset(uint64_t v, ASSERTED uint32_t start, ASSERTED uint32_t end)
26 {
27 __gen_validate_value(v);
28 #ifndef NDEBUG
29 uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start;
30
31 assert((v & ~mask) == 0);
32 #endif
33
34 return v;
35 }
36
37 static inline __attribute__((always_inline)) uint64_t
__gen_offset_nonzero(uint64_t v,uint32_t start,uint32_t end)38 __gen_offset_nonzero(uint64_t v, uint32_t start, uint32_t end)
39 {
40 assert(v != 0ull);
41 return __gen_offset(v, start, end);
42 }
43
44 static inline __attribute__((always_inline)) uint64_t
__gen_address(__gen_user_data * data,void * location,__gen_address_type address,uint32_t delta,uint32_t start,uint32_t end)45 __gen_address(__gen_user_data *data, void *location,
46 __gen_address_type address, uint32_t delta,
47 __attribute__((unused)) uint32_t start, uint32_t end)
48 {
49 uint64_t addr_u64 = __gen_combine_address(data, location, address, delta);
50 if (end == 31) {
51 return addr_u64;
52 } else if (end < 63) {
53 const unsigned shift = 63 - end;
54 return (addr_u64 << shift) >> shift;
55 } else {
56 return addr_u64;
57 }
58 }
59
60 #endif /* __GENX_HELPERS_H__ */
61