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