xref: /aosp_15_r20/external/gsc-utils/include/common.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker /* Copyright 2013 The ChromiumOS Authors
2*4f2df630SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*4f2df630SAndroid Build Coastguard Worker  * found in the LICENSE file.
4*4f2df630SAndroid Build Coastguard Worker  */
5*4f2df630SAndroid Build Coastguard Worker 
6*4f2df630SAndroid Build Coastguard Worker /* common.h - Common includes for Chrome EC */
7*4f2df630SAndroid Build Coastguard Worker 
8*4f2df630SAndroid Build Coastguard Worker #ifndef __CROS_EC_COMMON_H
9*4f2df630SAndroid Build Coastguard Worker #define __CROS_EC_COMMON_H
10*4f2df630SAndroid Build Coastguard Worker 
11*4f2df630SAndroid Build Coastguard Worker #include <stdbool.h>
12*4f2df630SAndroid Build Coastguard Worker #include <stddef.h>
13*4f2df630SAndroid Build Coastguard Worker #include <stdint.h>
14*4f2df630SAndroid Build Coastguard Worker #include <inttypes.h>
15*4f2df630SAndroid Build Coastguard Worker #include "compile_time_macros.h"
16*4f2df630SAndroid Build Coastguard Worker 
17*4f2df630SAndroid Build Coastguard Worker /*
18*4f2df630SAndroid Build Coastguard Worker  * Macros to concatenate 2 - 4 tokens together to form a single token.
19*4f2df630SAndroid Build Coastguard Worker  * Multiple levels of nesting are required to convince the preprocessor to
20*4f2df630SAndroid Build Coastguard Worker  * expand currently-defined tokens before concatenation.
21*4f2df630SAndroid Build Coastguard Worker  *
22*4f2df630SAndroid Build Coastguard Worker  * For example, if you have
23*4f2df630SAndroid Build Coastguard Worker  *     #define FOO 1
24*4f2df630SAndroid Build Coastguard Worker  *     #define BAR1 42
25*4f2df630SAndroid Build Coastguard Worker  * Then
26*4f2df630SAndroid Build Coastguard Worker  *     #define BAZ CONCAT2(BAR, FOO)
27*4f2df630SAndroid Build Coastguard Worker  * Will evaluate to BAR1, which then evaluates to 42.
28*4f2df630SAndroid Build Coastguard Worker  */
29*4f2df630SAndroid Build Coastguard Worker #define CONCAT_STAGE_1(w, x, y, z) w ## x ## y ## z
30*4f2df630SAndroid Build Coastguard Worker #define CONCAT2(w, x) CONCAT_STAGE_1(w, x, , )
31*4f2df630SAndroid Build Coastguard Worker #define CONCAT3(w, x, y) CONCAT_STAGE_1(w, x, y, )
32*4f2df630SAndroid Build Coastguard Worker #define CONCAT4(w, x, y, z) CONCAT_STAGE_1(w, x, y, z)
33*4f2df630SAndroid Build Coastguard Worker 
34*4f2df630SAndroid Build Coastguard Worker /*
35*4f2df630SAndroid Build Coastguard Worker  * Macros to turn the argument into a string constant.
36*4f2df630SAndroid Build Coastguard Worker  *
37*4f2df630SAndroid Build Coastguard Worker  * Compared to directly using the preprocessor # operator, this 2-stage macro
38*4f2df630SAndroid Build Coastguard Worker  * is safe with regards to using nested macros and defined arguments.
39*4f2df630SAndroid Build Coastguard Worker  */
40*4f2df630SAndroid Build Coastguard Worker #define STRINGIFY0(name)  #name
41*4f2df630SAndroid Build Coastguard Worker #define STRINGIFY(name)  STRINGIFY0(name)
42*4f2df630SAndroid Build Coastguard Worker 
43*4f2df630SAndroid Build Coastguard Worker /* Macros to access registers */
44*4f2df630SAndroid Build Coastguard Worker #define REG32_ADDR(addr) ((volatile uint32_t *)(addr))
45*4f2df630SAndroid Build Coastguard Worker #define REG16_ADDR(addr) ((volatile uint16_t *)(addr))
46*4f2df630SAndroid Build Coastguard Worker #define REG8_ADDR(addr)  ((volatile uint8_t  *)(addr))
47*4f2df630SAndroid Build Coastguard Worker 
48*4f2df630SAndroid Build Coastguard Worker #define REG32(addr) (*REG32_ADDR(addr))
49*4f2df630SAndroid Build Coastguard Worker #define REG16(addr) (*REG16_ADDR(addr))
50*4f2df630SAndroid Build Coastguard Worker #define REG8(addr)  (*REG8_ADDR(addr))
51*4f2df630SAndroid Build Coastguard Worker 
52*4f2df630SAndroid Build Coastguard Worker /*
53*4f2df630SAndroid Build Coastguard Worker  * Define __aligned(n) and __packed if someone hasn't beat us to it.  Linux
54*4f2df630SAndroid Build Coastguard Worker  * kernel style checking prefers these over __attribute__((packed)) and
55*4f2df630SAndroid Build Coastguard Worker  * __attribute__((aligned(n))).
56*4f2df630SAndroid Build Coastguard Worker  */
57*4f2df630SAndroid Build Coastguard Worker #ifndef __aligned
58*4f2df630SAndroid Build Coastguard Worker #define __aligned(n) __attribute__((aligned(n)))
59*4f2df630SAndroid Build Coastguard Worker #endif
60*4f2df630SAndroid Build Coastguard Worker 
61*4f2df630SAndroid Build Coastguard Worker #ifndef __packed
62*4f2df630SAndroid Build Coastguard Worker #define __packed __attribute__((packed))
63*4f2df630SAndroid Build Coastguard Worker #endif
64*4f2df630SAndroid Build Coastguard Worker 
65*4f2df630SAndroid Build Coastguard Worker /*
66*4f2df630SAndroid Build Coastguard Worker  * Define __unused in the same manner.
67*4f2df630SAndroid Build Coastguard Worker  */
68*4f2df630SAndroid Build Coastguard Worker #ifndef __unused
69*4f2df630SAndroid Build Coastguard Worker #define __unused __attribute__((unused))
70*4f2df630SAndroid Build Coastguard Worker #endif
71*4f2df630SAndroid Build Coastguard Worker 
72*4f2df630SAndroid Build Coastguard Worker /*
73*4f2df630SAndroid Build Coastguard Worker  * __maybe_unused is equivalent to the Linux kernel definition, so we
74*4f2df630SAndroid Build Coastguard Worker  * can follow the Kernel style guide more closely.
75*4f2df630SAndroid Build Coastguard Worker  *
76*4f2df630SAndroid Build Coastguard Worker  * An example use case is a function which is only used under certain
77*4f2df630SAndroid Build Coastguard Worker  * CONFIG options.
78*4f2df630SAndroid Build Coastguard Worker  */
79*4f2df630SAndroid Build Coastguard Worker #ifndef __maybe_unused
80*4f2df630SAndroid Build Coastguard Worker #define __maybe_unused __attribute__((unused))
81*4f2df630SAndroid Build Coastguard Worker #endif
82*4f2df630SAndroid Build Coastguard Worker 
83*4f2df630SAndroid Build Coastguard Worker /*
84*4f2df630SAndroid Build Coastguard Worker  * externally_visible is required by GCC to avoid kicking out memset.
85*4f2df630SAndroid Build Coastguard Worker  */
86*4f2df630SAndroid Build Coastguard Worker #ifndef __visible
87*4f2df630SAndroid Build Coastguard Worker #ifndef __clang__
88*4f2df630SAndroid Build Coastguard Worker #define __visible __attribute__((externally_visible))
89*4f2df630SAndroid Build Coastguard Worker #else
90*4f2df630SAndroid Build Coastguard Worker #define __visible __attribute__((used))
91*4f2df630SAndroid Build Coastguard Worker #endif
92*4f2df630SAndroid Build Coastguard Worker #endif
93*4f2df630SAndroid Build Coastguard Worker 
94*4f2df630SAndroid Build Coastguard Worker /*
95*4f2df630SAndroid Build Coastguard Worker  * Force the toolchain to keep a symbol even with Link Time Optimization
96*4f2df630SAndroid Build Coastguard Worker  * activated.
97*4f2df630SAndroid Build Coastguard Worker  *
98*4f2df630SAndroid Build Coastguard Worker  * Useful for C functions called only from assembly or through special sections.
99*4f2df630SAndroid Build Coastguard Worker  */
100*4f2df630SAndroid Build Coastguard Worker #ifndef __keep
101*4f2df630SAndroid Build Coastguard Worker #define __keep __attribute__((used)) __visible
102*4f2df630SAndroid Build Coastguard Worker #endif
103*4f2df630SAndroid Build Coastguard Worker 
104*4f2df630SAndroid Build Coastguard Worker /*
105*4f2df630SAndroid Build Coastguard Worker  * Place the object in the .bss.slow region.
106*4f2df630SAndroid Build Coastguard Worker  *
107*4f2df630SAndroid Build Coastguard Worker  * On boards with unoptimized RAM there is no penalty and it simply is appended
108*4f2df630SAndroid Build Coastguard Worker  * to the .bss section.
109*4f2df630SAndroid Build Coastguard Worker  */
110*4f2df630SAndroid Build Coastguard Worker #ifndef __bss_slow
111*4f2df630SAndroid Build Coastguard Worker #define __bss_slow __attribute__((section(".bss.slow")))
112*4f2df630SAndroid Build Coastguard Worker #endif
113*4f2df630SAndroid Build Coastguard Worker 
114*4f2df630SAndroid Build Coastguard Worker /* gcc does not support __has_feature */
115*4f2df630SAndroid Build Coastguard Worker #ifndef __has_feature
116*4f2df630SAndroid Build Coastguard Worker #define __has_feature(x) 0
117*4f2df630SAndroid Build Coastguard Worker #endif
118*4f2df630SAndroid Build Coastguard Worker 
119*4f2df630SAndroid Build Coastguard Worker /*
120*4f2df630SAndroid Build Coastguard Worker  * Use this to prevent AddressSanitizer from putting guards around some global
121*4f2df630SAndroid Build Coastguard Worker  * variables (e.g. hook/commands "arrays" that are put together at link time).
122*4f2df630SAndroid Build Coastguard Worker  */
123*4f2df630SAndroid Build Coastguard Worker #ifndef __no_sanitize_address
124*4f2df630SAndroid Build Coastguard Worker #if __has_feature(address_sanitizer)
125*4f2df630SAndroid Build Coastguard Worker #define __no_sanitize_address __attribute__((no_sanitize("address")))
126*4f2df630SAndroid Build Coastguard Worker #else
127*4f2df630SAndroid Build Coastguard Worker #define __no_sanitize_address
128*4f2df630SAndroid Build Coastguard Worker #endif
129*4f2df630SAndroid Build Coastguard Worker #endif
130*4f2df630SAndroid Build Coastguard Worker 
131*4f2df630SAndroid Build Coastguard Worker #ifndef __warn_unused_result
132*4f2df630SAndroid Build Coastguard Worker #define __warn_unused_result __attribute__((warn_unused_result))
133*4f2df630SAndroid Build Coastguard Worker #endif
134*4f2df630SAndroid Build Coastguard Worker 
135*4f2df630SAndroid Build Coastguard Worker #ifdef TEST_PINWEAVER_FUZZ
136*4f2df630SAndroid Build Coastguard Worker /**
137*4f2df630SAndroid Build Coastguard Worker  *  Workaround: Clang incorrectly handles profiling information
138*4f2df630SAndroid Build Coastguard Worker  *  used for fuzzing with __attribute__((always_inline)).
139*4f2df630SAndroid Build Coastguard Worker  */
140*4f2df630SAndroid Build Coastguard Worker #undef __always_inline
141*4f2df630SAndroid Build Coastguard Worker #define __always_inline static inline
142*4f2df630SAndroid Build Coastguard Worker #else
143*4f2df630SAndroid Build Coastguard Worker #ifndef __always_inline
144*4f2df630SAndroid Build Coastguard Worker #define __always_inline __inline __attribute__((always_inline))
145*4f2df630SAndroid Build Coastguard Worker #endif
146*4f2df630SAndroid Build Coastguard Worker #endif
147*4f2df630SAndroid Build Coastguard Worker 
148*4f2df630SAndroid Build Coastguard Worker /*
149*4f2df630SAndroid Build Coastguard Worker  * Macros for combining bytes into larger integers. _LE and _BE signify little
150*4f2df630SAndroid Build Coastguard Worker  * and big endian versions respectively.
151*4f2df630SAndroid Build Coastguard Worker  */
152*4f2df630SAndroid Build Coastguard Worker #define UINT16_FROM_BYTES(lsb, msb) ((lsb) | (msb) << 8)
153*4f2df630SAndroid Build Coastguard Worker #define UINT16_FROM_BYTE_ARRAY_LE(data, lsb_index) \
154*4f2df630SAndroid Build Coastguard Worker 	UINT16_FROM_BYTES((data)[(lsb_index)], (data)[(lsb_index) + 1])
155*4f2df630SAndroid Build Coastguard Worker #define UINT16_FROM_BYTE_ARRAY_BE(data, msb_index) \
156*4f2df630SAndroid Build Coastguard Worker 	UINT16_FROM_BYTES((data)[(msb_index) + 1], (data)[(msb_index)])
157*4f2df630SAndroid Build Coastguard Worker 
158*4f2df630SAndroid Build Coastguard Worker #define UINT32_FROM_BYTES(lsb, byte1, byte2, msb) \
159*4f2df630SAndroid Build Coastguard Worker 	((lsb) | (byte1) << 8 | (byte2) << 16 | (msb) << 24)
160*4f2df630SAndroid Build Coastguard Worker #define UINT32_FROM_BYTE_ARRAY_LE(data, lsb_index) \
161*4f2df630SAndroid Build Coastguard Worker 	UINT32_FROM_BYTES((data)[(lsb_index)], (data)[(lsb_index) + 1], \
162*4f2df630SAndroid Build Coastguard Worker 			  (data)[(lsb_index) + 2], (data)[(lsb_index) + 3])
163*4f2df630SAndroid Build Coastguard Worker #define UINT32_FROM_BYTE_ARRAY_BE(data, msb_index) \
164*4f2df630SAndroid Build Coastguard Worker 	UINT32_FROM_BYTES((data)[(msb_index) + 3], (data)[(msb_index) + 2], \
165*4f2df630SAndroid Build Coastguard Worker 			  (data)[(msb_index) + 1], (data)[(msb_index)])
166*4f2df630SAndroid Build Coastguard Worker 
167*4f2df630SAndroid Build Coastguard Worker /* There isn't really a better place for this */
168*4f2df630SAndroid Build Coastguard Worker #define C_TO_K(temp_c) ((temp_c) + 273)
169*4f2df630SAndroid Build Coastguard Worker #define K_TO_C(temp_c) ((temp_c) - 273)
170*4f2df630SAndroid Build Coastguard Worker #define CELSIUS_TO_DECI_KELVIN(temp_c) ((temp_c) * 10 + 2731)
171*4f2df630SAndroid Build Coastguard Worker #define DECI_KELVIN_TO_CELSIUS(temp_dk) ((temp_dk - 2731) / 10)
172*4f2df630SAndroid Build Coastguard Worker 
173*4f2df630SAndroid Build Coastguard Worker /* Calculate a value with error margin considered. For example,
174*4f2df630SAndroid Build Coastguard Worker  * TARGET_WITH_MARGIN(X, 5) returns X' where X' * 100.5% is almost equal to
175*4f2df630SAndroid Build Coastguard Worker  * but does not exceed X. */
176*4f2df630SAndroid Build Coastguard Worker #define TARGET_WITH_MARGIN(target, tenths_percent) \
177*4f2df630SAndroid Build Coastguard Worker 	(((target) * 1000) / (1000 + (tenths_percent)))
178*4f2df630SAndroid Build Coastguard Worker 
179*4f2df630SAndroid Build Coastguard Worker /* Include top-level configuration file */
180*4f2df630SAndroid Build Coastguard Worker #include "config.h"
181*4f2df630SAndroid Build Coastguard Worker 
182*4f2df630SAndroid Build Coastguard Worker /* Canonical list of module IDs */
183*4f2df630SAndroid Build Coastguard Worker #include "module_id.h"
184*4f2df630SAndroid Build Coastguard Worker 
185*4f2df630SAndroid Build Coastguard Worker /* List of common error codes that can be returned */
186*4f2df630SAndroid Build Coastguard Worker enum ec_error_list {
187*4f2df630SAndroid Build Coastguard Worker 	/* Success - no error */
188*4f2df630SAndroid Build Coastguard Worker 	EC_SUCCESS = 0,
189*4f2df630SAndroid Build Coastguard Worker 	/* Unknown error */
190*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_UNKNOWN = 1,
191*4f2df630SAndroid Build Coastguard Worker 	/* Function not implemented yet */
192*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_UNIMPLEMENTED = 2,
193*4f2df630SAndroid Build Coastguard Worker 	/* Overflow error; too much input provided. */
194*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_OVERFLOW = 3,
195*4f2df630SAndroid Build Coastguard Worker 	/* Timeout */
196*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_TIMEOUT = 4,
197*4f2df630SAndroid Build Coastguard Worker 	/* Invalid argument */
198*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_INVAL = 5,
199*4f2df630SAndroid Build Coastguard Worker 	/* Already in use, or not ready yet */
200*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_BUSY = 6,
201*4f2df630SAndroid Build Coastguard Worker 	/* Access denied */
202*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_ACCESS_DENIED = 7,
203*4f2df630SAndroid Build Coastguard Worker 	/* Failed because component does not have power */
204*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_NOT_POWERED = 8,
205*4f2df630SAndroid Build Coastguard Worker 	/* Failed because component is not calibrated */
206*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_NOT_CALIBRATED = 9,
207*4f2df630SAndroid Build Coastguard Worker 	/* Failed because CRC error */
208*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_CRC = 10,
209*4f2df630SAndroid Build Coastguard Worker 	/* Invalid console command param (PARAMn means parameter n is bad) */
210*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM1 = 11,
211*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM2 = 12,
212*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM3 = 13,
213*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM4 = 14,
214*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM5 = 15,
215*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM6 = 16,
216*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM7 = 17,
217*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM8 = 18,
218*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM9 = 19,
219*4f2df630SAndroid Build Coastguard Worker 	/* Wrong number of params */
220*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_PARAM_COUNT = 20,
221*4f2df630SAndroid Build Coastguard Worker 	/* Interrupt event not handled */
222*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_NOT_HANDLED = 21,
223*4f2df630SAndroid Build Coastguard Worker 	/* Data has not changed */
224*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_UNCHANGED = 22,
225*4f2df630SAndroid Build Coastguard Worker 	/* Memory allocation */
226*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_MEMORY_ALLOCATION = 23,
227*4f2df630SAndroid Build Coastguard Worker 	/* Invalid to configure in the current module mode/stage */
228*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_INVALID_CONFIG = 24,
229*4f2df630SAndroid Build Coastguard Worker 	/* something wrong in a HW */
230*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_HW_INTERNAL = 25,
231*4f2df630SAndroid Build Coastguard Worker 
232*4f2df630SAndroid Build Coastguard Worker 	/* Sometimes operation is expected to have to be repeated. */
233*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_TRY_AGAIN = 26,
234*4f2df630SAndroid Build Coastguard Worker 
235*4f2df630SAndroid Build Coastguard Worker 	/* Verified boot errors */
236*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_SIGNATURE = 0x1000, /* 4096 */
237*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_SIG_MAGIC = 0x1001,
238*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_SIG_SIZE = 0x1002,
239*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_SIG_ALGORITHM = 0x1003,
240*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_HASH_ALGORITHM = 0x1004,
241*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_SIG_OFFSET = 0x1005,
242*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_DATA_SIZE = 0x1006,
243*4f2df630SAndroid Build Coastguard Worker 
244*4f2df630SAndroid Build Coastguard Worker 	/* Verified boot key errors */
245*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_KEY = 0x1100,
246*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_KEY_MAGIC = 0x1101,
247*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_KEY_SIZE = 0x1102,
248*4f2df630SAndroid Build Coastguard Worker 
249*4f2df630SAndroid Build Coastguard Worker 	/* Verified boot data errors */
250*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_DATA = 0x1200,
251*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_DATA_VERIFY = 0x1201,
252*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_DATA_INCOMPATIBLE = 0x1202,
253*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_VBOOT_DATA_UNDERSIZED = 0x1203,
254*4f2df630SAndroid Build Coastguard Worker 
255*4f2df630SAndroid Build Coastguard Worker 	/* Module-internal error codes may use this range.   */
256*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_INTERNAL_FIRST = 0x10000,
257*4f2df630SAndroid Build Coastguard Worker 	EC_ERROR_INTERNAL_LAST = 0x1FFFF
258*4f2df630SAndroid Build Coastguard Worker };
259*4f2df630SAndroid Build Coastguard Worker 
260*4f2df630SAndroid Build Coastguard Worker /*
261*4f2df630SAndroid Build Coastguard Worker  * Define test_mockable and test_mockable_static for mocking
262*4f2df630SAndroid Build Coastguard Worker  * functions.
263*4f2df630SAndroid Build Coastguard Worker  */
264*4f2df630SAndroid Build Coastguard Worker #ifdef TEST_BUILD
265*4f2df630SAndroid Build Coastguard Worker #define test_mockable __attribute__((weak))
266*4f2df630SAndroid Build Coastguard Worker #define test_mockable_static __attribute__((weak))
267*4f2df630SAndroid Build Coastguard Worker #define test_export_static
268*4f2df630SAndroid Build Coastguard Worker #else
269*4f2df630SAndroid Build Coastguard Worker #define test_mockable
270*4f2df630SAndroid Build Coastguard Worker #define test_mockable_static static
271*4f2df630SAndroid Build Coastguard Worker #define test_export_static static
272*4f2df630SAndroid Build Coastguard Worker #endif
273*4f2df630SAndroid Build Coastguard Worker 
274*4f2df630SAndroid Build Coastguard Worker /*
275*4f2df630SAndroid Build Coastguard Worker  * Attribute to define functions to only be used in test code, causing
276*4f2df630SAndroid Build Coastguard Worker  * a compiler error if used without TEST_BUILD defined.
277*4f2df630SAndroid Build Coastguard Worker  *
278*4f2df630SAndroid Build Coastguard Worker  * Example usage (add to prototype in header):
279*4f2df630SAndroid Build Coastguard Worker  * __test_only void foo(void);
280*4f2df630SAndroid Build Coastguard Worker  */
281*4f2df630SAndroid Build Coastguard Worker #ifdef TEST_BUILD
282*4f2df630SAndroid Build Coastguard Worker #define __test_only
283*4f2df630SAndroid Build Coastguard Worker #else
284*4f2df630SAndroid Build Coastguard Worker #define __test_only __error("This function should only be used by tests")
285*4f2df630SAndroid Build Coastguard Worker #endif
286*4f2df630SAndroid Build Coastguard Worker 
287*4f2df630SAndroid Build Coastguard Worker /*
288*4f2df630SAndroid Build Coastguard Worker  * Weak symbol markers
289*4f2df630SAndroid Build Coastguard Worker  *
290*4f2df630SAndroid Build Coastguard Worker  * These macros are used to annotate weak definitions, their declarations, and
291*4f2df630SAndroid Build Coastguard Worker  * overriding definitions.
292*4f2df630SAndroid Build Coastguard Worker  *
293*4f2df630SAndroid Build Coastguard Worker  * __override_proto: declarations
294*4f2df630SAndroid Build Coastguard Worker  * __override: definitions which take precedence
295*4f2df630SAndroid Build Coastguard Worker  * __overridable: default (weak) definitions
296*4f2df630SAndroid Build Coastguard Worker  *
297*4f2df630SAndroid Build Coastguard Worker  * For example, in foo.h:
298*4f2df630SAndroid Build Coastguard Worker  *   __override_proto void foo(void);
299*4f2df630SAndroid Build Coastguard Worker  *
300*4f2df630SAndroid Build Coastguard Worker  * and in foo.c:
301*4f2df630SAndroid Build Coastguard Worker  *   __overridable void foo(void) {
302*4f2df630SAndroid Build Coastguard Worker  *     ...
303*4f2df630SAndroid Build Coastguard Worker  *   }
304*4f2df630SAndroid Build Coastguard Worker  *
305*4f2df630SAndroid Build Coastguard Worker  * and in board.c:
306*4f2df630SAndroid Build Coastguard Worker  *   __override void foo(void) {
307*4f2df630SAndroid Build Coastguard Worker  *     ...
308*4f2df630SAndroid Build Coastguard Worker  *   }
309*4f2df630SAndroid Build Coastguard Worker  */
310*4f2df630SAndroid Build Coastguard Worker #define __override_proto
311*4f2df630SAndroid Build Coastguard Worker #define __override
312*4f2df630SAndroid Build Coastguard Worker #define __overridable	__attribute__((weak))
313*4f2df630SAndroid Build Coastguard Worker 
314*4f2df630SAndroid Build Coastguard Worker /*
315*4f2df630SAndroid Build Coastguard Worker  * Mark functions that collide with stdlib so they can be hidden when linking
316*4f2df630SAndroid Build Coastguard Worker  * against libraries that require stdlib. HIDE_EC_STDLIB should be defined
317*4f2df630SAndroid Build Coastguard Worker  * before including common.h from code that links to cstdlib.
318*4f2df630SAndroid Build Coastguard Worker  */
319*4f2df630SAndroid Build Coastguard Worker #ifdef TEST_FUZZ
320*4f2df630SAndroid Build Coastguard Worker #define __stdlib_compat __attribute__((visibility("hidden")))
321*4f2df630SAndroid Build Coastguard Worker #else /* TEST_FUZZ */
322*4f2df630SAndroid Build Coastguard Worker #define __stdlib_compat
323*4f2df630SAndroid Build Coastguard Worker #endif /* TEST_FUZZ */
324*4f2df630SAndroid Build Coastguard Worker 
325*4f2df630SAndroid Build Coastguard Worker /*
326*4f2df630SAndroid Build Coastguard Worker  * __cfg_select(CONFIG_NAME, EMPTY, OTHERWISE) is a macro used for
327*4f2df630SAndroid Build Coastguard Worker  * defining other macros which conditionally select code based on a
328*4f2df630SAndroid Build Coastguard Worker  * config option. It will generate the argument passed as EMPTY
329*4f2df630SAndroid Build Coastguard Worker  * when CONFIG_NAME was defined to the empty string, and OTHERWISE
330*4f2df630SAndroid Build Coastguard Worker  * when the argument was not defined or defined to something
331*4f2df630SAndroid Build Coastguard Worker  * non-empty.
332*4f2df630SAndroid Build Coastguard Worker  *
333*4f2df630SAndroid Build Coastguard Worker  * Generally speaking, macros which use this should make some sort of
334*4f2df630SAndroid Build Coastguard Worker  * context-dependent assertion in OTHERWISE that CONFIG_NAME is
335*4f2df630SAndroid Build Coastguard Worker  * undefined, rather than defined to something else. This usually
336*4f2df630SAndroid Build Coastguard Worker  * involves tricks with __builtin_strcmp.
337*4f2df630SAndroid Build Coastguard Worker  */
338*4f2df630SAndroid Build Coastguard Worker #define __cfg_select(cfg, empty, otherwise)     \
339*4f2df630SAndroid Build Coastguard Worker 	__cfg_select_1(cfg, empty, otherwise)
340*4f2df630SAndroid Build Coastguard Worker #define __cfg_select_placeholder_ _,
341*4f2df630SAndroid Build Coastguard Worker #define __cfg_select_1(value, empty, otherwise)			  \
342*4f2df630SAndroid Build Coastguard Worker 	__cfg_select_2(__cfg_select_placeholder_##value, empty, otherwise)
343*4f2df630SAndroid Build Coastguard Worker #define __cfg_select_2(arg1_or_junk, empty, otherwise)		\
344*4f2df630SAndroid Build Coastguard Worker 	__cfg_select_3(arg1_or_junk _, empty, otherwise)
345*4f2df630SAndroid Build Coastguard Worker #define __cfg_select_3(_ignore1, _ignore2, select, ...) select
346*4f2df630SAndroid Build Coastguard Worker 
347*4f2df630SAndroid Build Coastguard Worker /*
348*4f2df630SAndroid Build Coastguard Worker  * This version concatenates a BUILD_ASSERT(...); before OTHERWISE,
349*4f2df630SAndroid Build Coastguard Worker  * handling the __builtin_strcmp trickery where a BUILD_ASSERT is
350*4f2df630SAndroid Build Coastguard Worker  * appropriate in the context.
351*4f2df630SAndroid Build Coastguard Worker  */
352*4f2df630SAndroid Build Coastguard Worker #define __cfg_select_build_assert(cfg, value, empty, undef)	\
353*4f2df630SAndroid Build Coastguard Worker 	__cfg_select(						\
354*4f2df630SAndroid Build Coastguard Worker 		value,						\
355*4f2df630SAndroid Build Coastguard Worker 		empty,						\
356*4f2df630SAndroid Build Coastguard Worker 		BUILD_ASSERT(					\
357*4f2df630SAndroid Build Coastguard Worker 			__builtin_strcmp(cfg, #value) == 0);	\
358*4f2df630SAndroid Build Coastguard Worker 		undef)
359*4f2df630SAndroid Build Coastguard Worker 
360*4f2df630SAndroid Build Coastguard Worker /*
361*4f2df630SAndroid Build Coastguard Worker  * Attribute for generating an error if a function is used.
362*4f2df630SAndroid Build Coastguard Worker  *
363*4f2df630SAndroid Build Coastguard Worker  * Clang does not have a function attribute to do this. Rely on linker
364*4f2df630SAndroid Build Coastguard Worker  * errors. :(
365*4f2df630SAndroid Build Coastguard Worker  */
366*4f2df630SAndroid Build Coastguard Worker #ifdef __clang__
367*4f2df630SAndroid Build Coastguard Worker #define __error(msg) __attribute__((section("/DISCARD/")))
368*4f2df630SAndroid Build Coastguard Worker #else
369*4f2df630SAndroid Build Coastguard Worker #define __error(msg) __attribute__((error(msg)))
370*4f2df630SAndroid Build Coastguard Worker #endif
371*4f2df630SAndroid Build Coastguard Worker 
372*4f2df630SAndroid Build Coastguard Worker /*
373*4f2df630SAndroid Build Coastguard Worker  * Getting something that works in C and CPP for an arg that may or may
374*4f2df630SAndroid Build Coastguard Worker  * not be defined is tricky.
375*4f2df630SAndroid Build Coastguard Worker  *
376*4f2df630SAndroid Build Coastguard Worker  * Compare the option name with the value string in the OTHERWISE to
377*4f2df630SAndroid Build Coastguard Worker  * __cfg_select. If they are identical we assume that the value was
378*4f2df630SAndroid Build Coastguard Worker  * undefined and return 0. If the value happens to be anything else we
379*4f2df630SAndroid Build Coastguard Worker  * call an undefined method that will raise a compiler error. This
380*4f2df630SAndroid Build Coastguard Worker  * technique requires that the optimizer be enabled so it can remove
381*4f2df630SAndroid Build Coastguard Worker  * the undefined function call.
382*4f2df630SAndroid Build Coastguard Worker  */
383*4f2df630SAndroid Build Coastguard Worker #define __config_enabled(cfg, value)					      \
384*4f2df630SAndroid Build Coastguard Worker 	__cfg_select(							      \
385*4f2df630SAndroid Build Coastguard Worker 		value, 1, ({						      \
386*4f2df630SAndroid Build Coastguard Worker 			int __undefined = __builtin_strcmp(cfg, #value) == 0; \
387*4f2df630SAndroid Build Coastguard Worker 			extern int IS_ENABLED_BAD_ARGS(void) __error(	      \
388*4f2df630SAndroid Build Coastguard Worker 				cfg " must be <blank>, or not defined.");     \
389*4f2df630SAndroid Build Coastguard Worker 			if (!__undefined)				      \
390*4f2df630SAndroid Build Coastguard Worker 				IS_ENABLED_BAD_ARGS();			      \
391*4f2df630SAndroid Build Coastguard Worker 			0;						      \
392*4f2df630SAndroid Build Coastguard Worker 		}))
393*4f2df630SAndroid Build Coastguard Worker 
394*4f2df630SAndroid Build Coastguard Worker /**
395*4f2df630SAndroid Build Coastguard Worker  * Checks if a config option is enabled or disabled
396*4f2df630SAndroid Build Coastguard Worker  *
397*4f2df630SAndroid Build Coastguard Worker  * Enabled examples:
398*4f2df630SAndroid Build Coastguard Worker  *     #define CONFIG_FOO
399*4f2df630SAndroid Build Coastguard Worker  *
400*4f2df630SAndroid Build Coastguard Worker  * Disabled examples:
401*4f2df630SAndroid Build Coastguard Worker  *     #undef CONFIG_FOO
402*4f2df630SAndroid Build Coastguard Worker  *
403*4f2df630SAndroid Build Coastguard Worker  * If the option is defined to any value a compiler error will be thrown.
404*4f2df630SAndroid Build Coastguard Worker  *
405*4f2df630SAndroid Build Coastguard Worker  * Note: This macro will only function inside a code block due to the way
406*4f2df630SAndroid Build Coastguard Worker  * it checks for unknown values.
407*4f2df630SAndroid Build Coastguard Worker  */
408*4f2df630SAndroid Build Coastguard Worker #define IS_ENABLED(option) __config_enabled(#option, option)
409*4f2df630SAndroid Build Coastguard Worker 
410*4f2df630SAndroid Build Coastguard Worker /**
411*4f2df630SAndroid Build Coastguard Worker  * Makes a global variable static when a config option is enabled,
412*4f2df630SAndroid Build Coastguard Worker  * extern otherwise (with the intention to cause linker errors if the
413*4f2df630SAndroid Build Coastguard Worker  * variable is used outside of a config context, for example thru
414*4f2df630SAndroid Build Coastguard Worker  * IS_ENABLED, that it should be).
415*4f2df630SAndroid Build Coastguard Worker  *
416*4f2df630SAndroid Build Coastguard Worker  * This follows the same constraints as IS_ENABLED, the config option
417*4f2df630SAndroid Build Coastguard Worker  * should be defined to nothing or undefined.
418*4f2df630SAndroid Build Coastguard Worker  */
419*4f2df630SAndroid Build Coastguard Worker #define STATIC_IF(option)						\
420*4f2df630SAndroid Build Coastguard Worker 	__cfg_select_build_assert(#option, option, static, extern)
421*4f2df630SAndroid Build Coastguard Worker 
422*4f2df630SAndroid Build Coastguard Worker /**
423*4f2df630SAndroid Build Coastguard Worker  * STATIC_IF_NOT is just like STATIC_IF, but makes the variable static
424*4f2df630SAndroid Build Coastguard Worker  * only if the config option is *not* defined, extern if it is.
425*4f2df630SAndroid Build Coastguard Worker  *
426*4f2df630SAndroid Build Coastguard Worker  * This is to assert that a variable will go unused with a certain
427*4f2df630SAndroid Build Coastguard Worker  * config option.
428*4f2df630SAndroid Build Coastguard Worker  */
429*4f2df630SAndroid Build Coastguard Worker #define STATIC_IF_NOT(option)						\
430*4f2df630SAndroid Build Coastguard Worker 	__cfg_select_build_assert(#option, option, extern, static)
431*4f2df630SAndroid Build Coastguard Worker 
432*4f2df630SAndroid Build Coastguard Worker #endif  /* __CROS_EC_COMMON_H */
433