1 /* 2 * Logging support 3 * 4 * Copyright (c) 2017 Google, Inc 5 * Written by Simon Glass <sjg@chromium.org> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #ifndef __LOG_H 11 #define __LOG_H 12 13 #include <dm/uclass-id.h> 14 #include <linux/list.h> 15 16 /** Log levels supported, ranging from most to least important */ 17 enum log_level_t { 18 LOGL_EMERG = 0, /*U-Boot is unstable */ 19 LOGL_ALERT, /* Action must be taken immediately */ 20 LOGL_CRIT, /* Critical conditions */ 21 LOGL_ERR, /* Error that prevents something from working */ 22 LOGL_WARNING, /* Warning may prevent optimial operation */ 23 LOGL_NOTICE, /* Normal but significant condition, printf() */ 24 LOGL_INFO, /* General information message */ 25 LOGL_DEBUG, /* Basic debug-level message */ 26 LOGL_DEBUG_CONTENT, /* Debug message showing full message content */ 27 LOGL_DEBUG_IO, /* Debug message showing hardware I/O access */ 28 29 LOGL_COUNT, 30 LOGL_NONE, 31 32 LOGL_FIRST = LOGL_EMERG, 33 LOGL_MAX = LOGL_DEBUG_IO, 34 }; 35 36 /** 37 * Log categories supported. Most of these correspond to uclasses (i.e. 38 * enum uclass_id) but there are also some more generic categories 39 */ 40 enum log_category_t { 41 LOGC_FIRST = 0, /* First part mirrors UCLASS_... */ 42 43 LOGC_NONE = UCLASS_COUNT, 44 LOGC_ARCH, 45 LOGC_BOARD, 46 LOGC_CORE, 47 LOGC_DM, /* Core driver-model */ 48 LOGC_DT, /* Device-tree */ 49 LOGL_EFI, /* EFI implementation */ 50 51 LOGC_COUNT, 52 LOGC_END, 53 }; 54 55 /* Helper to cast a uclass ID to a log category */ 56 static inline int log_uc_cat(enum uclass_id id) 57 { 58 return (enum log_category_t)id; 59 } 60 61 /** 62 * _log() - Internal function to emit a new log record 63 * 64 * @cat: Category of log record (indicating which subsystem generated it) 65 * @level: Level of log record (indicating its severity) 66 * @file: File name of file where log record was generated 67 * @line: Line number in file where log record was generated 68 * @func: Function where log record was generated 69 * @fmt: printf() format string for log record 70 * @...: Optional parameters, according to the format string @fmt 71 * @return 0 if log record was emitted, -ve on error 72 */ 73 int _log(enum log_category_t cat, enum log_level_t level, const char *file, 74 int line, const char *func, const char *fmt, ...); 75 76 /* Define this at the top of a file to add a prefix to debug messages */ 77 #ifndef pr_fmt 78 #define pr_fmt(fmt) fmt 79 #endif 80 81 /* Use a default category if this file does not supply one */ 82 #ifndef LOG_CATEGORY 83 #define LOG_CATEGORY LOGC_NONE 84 #endif 85 86 /* 87 * This header may be including when CONFIG_LOG is disabled, in which case 88 * CONFIG_LOG_MAX_LEVEL is not defined. Add a check for this. 89 */ 90 #if CONFIG_IS_ENABLED(LOG) 91 #define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL) 92 #else 93 #define _LOG_MAX_LEVEL LOGL_INFO 94 #endif 95 96 /* Emit a log record if the level is less that the maximum */ 97 #define log(_cat, _level, _fmt, _args...) ({ \ 98 int _l = _level; \ 99 if (_l <= _LOG_MAX_LEVEL) \ 100 _log((enum log_category_t)(_cat), _l, __FILE__, __LINE__, \ 101 __func__, \ 102 pr_fmt(_fmt), ##_args); \ 103 }) 104 105 #ifdef DEBUG 106 #define _DEBUG 1 107 #else 108 #define _DEBUG 0 109 #endif 110 111 #ifdef CONFIG_SPL_BUILD 112 #define _SPL_BUILD 1 113 #else 114 #define _SPL_BUILD 0 115 #endif 116 117 #if !_DEBUG && CONFIG_IS_ENABLED(LOG) 118 119 #define debug_cond(cond, fmt, args...) \ 120 do { \ 121 if (1) \ 122 log(LOG_CATEGORY, LOGL_DEBUG, fmt, ##args); \ 123 } while (0) 124 125 #else /* _DEBUG */ 126 127 /* 128 * Output a debug text when condition "cond" is met. The "cond" should be 129 * computed by a preprocessor in the best case, allowing for the best 130 * optimization. 131 */ 132 #define debug_cond(cond, fmt, args...) \ 133 do { \ 134 if (cond) \ 135 printf(pr_fmt(fmt), ##args); \ 136 } while (0) 137 138 #endif /* _DEBUG */ 139 140 /* Show a message if DEBUG is defined in a file */ 141 #define debug(fmt, args...) \ 142 debug_cond(_DEBUG, fmt, ##args) 143 144 /* Show a message if not in SPL */ 145 #define warn_non_spl(fmt, args...) \ 146 debug_cond(!_SPL_BUILD, fmt, ##args) 147 148 /* 149 * An assertion is run-time check done in debug mode only. If DEBUG is not 150 * defined then it is skipped. If DEBUG is defined and the assertion fails, 151 * then it calls panic*( which may or may not reset/halt U-Boot (see 152 * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found 153 * before release, and after release it is hoped that they don't matter. But 154 * in any case these failing assertions cannot be fixed with a reset (which 155 * may just do the same assertion again). 156 */ 157 void __assert_fail(const char *assertion, const char *file, unsigned int line, 158 const char *function); 159 #define assert(x) \ 160 ({ if (!(x) && _DEBUG) \ 161 __assert_fail(#x, __FILE__, __LINE__, __func__); }) 162 163 #ifdef CONFIG_LOG_ERROR_RETURN 164 #define log_ret(_ret) ({ \ 165 int __ret = (_ret); \ 166 if (__ret < 0) \ 167 log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \ 168 __ret; \ 169 }) 170 #else 171 #define log_ret(_ret) (_ret) 172 #endif 173 174 /** 175 * struct log_rec - a single log record 176 * 177 * Holds information about a single record in the log 178 * 179 * Members marked as 'not allocated' are stored as pointers and the caller is 180 * responsible for making sure that the data pointed to is not overwritten. 181 * Memebers marked as 'allocated' are allocated (e.g. via strdup()) by the log 182 * system. 183 * 184 * @cat: Category, representing a uclass or part of U-Boot 185 * @level: Severity level, less severe is higher 186 * @file: Name of file where the log record was generated (not allocated) 187 * @line: Line number where the log record was generated 188 * @func: Function where the log record was generated (not allocated) 189 * @msg: Log message (allocated) 190 */ 191 struct log_rec { 192 enum log_category_t cat; 193 enum log_level_t level; 194 const char *file; 195 int line; 196 const char *func; 197 const char *msg; 198 }; 199 200 struct log_device; 201 202 /** 203 * struct log_driver - a driver which accepts and processes log records 204 * 205 * @name: Name of driver 206 */ 207 struct log_driver { 208 const char *name; 209 /** 210 * emit() - emit a log record 211 * 212 * Called by the log system to pass a log record to a particular driver 213 * for processing. The filter is checked before calling this function. 214 */ 215 int (*emit)(struct log_device *ldev, struct log_rec *rec); 216 }; 217 218 /** 219 * struct log_device - an instance of a log driver 220 * 221 * Since drivers are set up at build-time we need to have a separate device for 222 * the run-time aspects of drivers (currently just a list of filters to apply 223 * to records send to this device). 224 * 225 * @next_filter_num: Seqence number of next filter filter added (0=no filters 226 * yet). This increments with each new filter on the device, but never 227 * decrements 228 * @drv: Pointer to driver for this device 229 * @filter_head: List of filters for this device 230 * @sibling_node: Next device in the list of all devices 231 */ 232 struct log_device { 233 int next_filter_num; 234 struct log_driver *drv; 235 struct list_head filter_head; 236 struct list_head sibling_node; 237 }; 238 239 enum { 240 LOGF_MAX_CATEGORIES = 5, /* maximum categories per filter */ 241 }; 242 243 enum log_filter_flags { 244 LOGFF_HAS_CAT = 1 << 0, /* Filter has a category list */ 245 }; 246 247 /** 248 * struct log_filter - criterial to filter out log messages 249 * 250 * @filter_num: Sequence number of this filter. This is returned when adding a 251 * new filter, and must be provided when removing a previously added 252 * filter. 253 * @flags: Flags for this filter (LOGFF_...) 254 * @cat_list: List of categories to allow (terminated by LOGC_none). If empty 255 * then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries 256 * can be provided 257 * @max_level: Maximum log level to allow 258 * @file_list: List of files to allow, separated by comma. If NULL then all 259 * files are permitted 260 * @sibling_node: Next filter in the list of filters for this log device 261 */ 262 struct log_filter { 263 int filter_num; 264 int flags; 265 enum log_category_t cat_list[LOGF_MAX_CATEGORIES]; 266 enum log_level_t max_level; 267 const char *file_list; 268 struct list_head sibling_node; 269 }; 270 271 #define LOG_DRIVER(_name) \ 272 ll_entry_declare(struct log_driver, _name, log_driver) 273 274 /** 275 * log_get_cat_name() - Get the name of a category 276 * 277 * @cat: Category to look up 278 * @return category name (which may be a uclass driver name) 279 */ 280 const char *log_get_cat_name(enum log_category_t cat); 281 282 /** 283 * log_get_cat_by_name() - Look up a category by name 284 * 285 * @name: Name to look up 286 * @return category ID, or LOGC_NONE if not found 287 */ 288 enum log_category_t log_get_cat_by_name(const char *name); 289 290 /** 291 * log_get_level_name() - Get the name of a log level 292 * 293 * @level: Log level to look up 294 * @return log level name (in ALL CAPS) 295 */ 296 const char *log_get_level_name(enum log_level_t level); 297 298 /** 299 * log_get_level_by_name() - Look up a log level by name 300 * 301 * @name: Name to look up 302 * @return log level ID, or LOGL_NONE if not found 303 */ 304 enum log_level_t log_get_level_by_name(const char *name); 305 306 /* Log format flags (bit numbers) for gd->log_fmt. See log_fmt_chars */ 307 enum log_fmt { 308 LOGF_CAT = 0, 309 LOGF_LEVEL, 310 LOGF_FILE, 311 LOGF_LINE, 312 LOGF_FUNC, 313 LOGF_MSG, 314 315 LOGF_COUNT, 316 LOGF_DEFAULT = (1 << LOGF_FUNC) | (1 << LOGF_MSG), 317 LOGF_ALL = 0x3f, 318 }; 319 320 /* Handle the 'log test' command */ 321 int do_log_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); 322 323 /** 324 * log_add_filter() - Add a new filter to a log device 325 * 326 * @drv_name: Driver name to add the filter to (since each driver only has a 327 * single device) 328 * @cat_list: List of categories to allow (terminated by LOGC_none). If empty 329 * then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries 330 * can be provided 331 * @max_level: Maximum log level to allow 332 * @file_list: List of files to allow, separated by comma. If NULL then all 333 * files are permitted 334 * @return the sequence number of the new filter (>=0) if the filter was added, 335 * or a -ve value on error 336 */ 337 int log_add_filter(const char *drv_name, enum log_category_t cat_list[], 338 enum log_level_t max_level, const char *file_list); 339 340 /** 341 * log_remove_filter() - Remove a filter from a log device 342 * 343 * @drv_name: Driver name to remove the filter from (since each driver only has 344 * a single device) 345 * @filter_num: Filter number to remove (as returned by log_add_filter()) 346 * @return 0 if the filter was removed, -ENOENT if either the driver or the 347 * filter number was not found 348 */ 349 int log_remove_filter(const char *drv_name, int filter_num); 350 351 #if CONFIG_IS_ENABLED(LOG) 352 /** 353 * log_init() - Set up the log system ready for use 354 * 355 * @return 0 if OK, -ENOMEM if out of memory 356 */ 357 int log_init(void); 358 #else 359 static inline int log_init(void) 360 { 361 return 0; 362 } 363 #endif 364 365 #endif 366