/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2015-2019, MICROTRUST Incorporated * All Rights Reserved. * */ #ifndef _ISEE_IMSG_LOG_H_ #define _ISEE_IMSG_LOG_H_ #ifndef IMSG_TAG #define IMSG_TAG "[ISEE DRV]" #endif enum { IMSG_LV_DISABLE = 0, IMSG_LV_ERROR, IMSG_LV_WARN, IMSG_LV_INFO, IMSG_LV_DEBUG, IMSG_LV_TRACE }; #if IS_ENABLED(CONFIG_MICROTRUST_DEBUG) #define IMSG_LOG_LEVEL IMSG_LV_DEBUG #define IMSG_PROFILE_LEVEL IMSG_LV_TRACE #else /* DO NOT change the log level, this is for production */ #define IMSG_LOG_LEVEL IMSG_LV_WARN #define IMSG_PROFILE_LEVEL IMSG_LV_TRACE #endif #include #include #include extern uint32_t get_imsg_log_level(void); static inline unsigned long now_ms(void) { struct timespec64 now_time; ktime_get_real_ts64(&now_time); return (now_time.tv_sec * 1000) + now_time.tv_nsec / 1000000; } #define IMSG_PRINTK(fmt, ...) pr_info(fmt, ##__VA_ARGS__) #define IMSG_PRINTK_DEBUG(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT_ERROR(fmt, ...) pr_notice(fmt, ##__VA_ARGS__) #define IMSG_PRINT_WARN(fmt, ...) pr_notice(fmt, ##__VA_ARGS__) #define IMSG_PRINT_INFO(fmt, ...) pr_info(fmt, ##__VA_ARGS__) #define IMSG_PRINT_DEBUG(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT_TRACE(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT_ENTER(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT_LEAVE(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT_PROFILE(fmt, ...) pr_debug(fmt, ##__VA_ARGS__) #define IMSG_PRINT(level, func, fmt, ...) \ do { \ if (level <= get_imsg_log_level()) \ IMSG_PRINT_##func("%s[%s]: " fmt, IMSG_TAG, \ #func, ##__VA_ARGS__); \ } while (0) #define IMSG_PRINT_TIME_S(level, fmt, ...) \ unsigned long start_ms; \ do { \ start_ms = now_ms(); \ IMSG_PRINT(level, PROFILE, fmt " (start:%lu)\n", \ ##__VA_ARGS__, start_ms); \ } while (0) #define IMSG_PRINT_TIME_E(level, fmt, ...) \ do { \ unsigned long end_ms, delta_ms; \ end_ms = now_ms(); \ delta_ms = end_ms - start_ms; \ IMSG_PRINT(level, PROFILE, fmt " (end:%lu, spend:%lu ms)\n", \ ##__VA_ARGS__, end_ms, delta_ms); \ } while (0) /*************************************************************************/ /* Declare macros ********************************************************/ /*************************************************************************/ #define IMSG_ERROR(fmt, ...) \ IMSG_PRINT(IMSG_LV_ERROR, ERROR, fmt, ##__VA_ARGS__) #define IMSG_WARN(fmt, ...) \ IMSG_PRINT(IMSG_LV_WARN, WARN, fmt, ##__VA_ARGS__) #define IMSG_INFO(fmt, ...) \ IMSG_PRINT(IMSG_LV_INFO, INFO, fmt, ##__VA_ARGS__) #define IMSG_DEBUG(fmt, ...) \ IMSG_PRINT(IMSG_LV_DEBUG, DEBUG, fmt, ##__VA_ARGS__) #define IMSG_TRACE(fmt, ...) \ IMSG_PRINT(IMSG_LV_TRACE, TRACE, fmt, ##__VA_ARGS__) #define IMSG_ENTER() \ IMSG_PRINT(IMSG_LV_TRACE, ENTER, "%s\n", __func__) #define IMSG_LEAVE() \ IMSG_PRINT(IMSG_LV_TRACE, LEAVE, "%s\n", __func__) #define IMSG_PROFILE_S(fmt, ...) \ IMSG_PRINT_TIME_S(IMSG_PROFILE_LEVEL, fmt, ##__VA_ARGS__) #define IMSG_PROFILE_E(fmt, ...) \ IMSG_PRINT_TIME_E(IMSG_PROFILE_LEVEL, fmt, ##__VA_ARGS__) /*************************************************************************/ /* Declare Check Patch ***************************************************/ /*************************************************************************/ #define TZ_SEMA_INIT_0(x) sema_init(x, 0) #define TZ_SEMA_INIT_1(x) sema_init(x, 1) #define TZ_EMPTY_PARENTHESES(z) z #define TZ_VOLATILE(x) TZ_EMPTY_PARENTHESES(vola##tile x) #define TZ_NON_VOLATILE(x) x #endif /* _ISEE_IMSG_LOG_H_ */