"Das U-Boot" Source Tree
at master 704 lines 22 kB view raw
1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Logging support 4 * 5 * Copyright (c) 2017 Google, Inc 6 * Written by Simon Glass <sjg@chromium.org> 7 */ 8 9#ifndef __LOG_H 10#define __LOG_H 11 12#include <stdio.h> 13#include <linker_lists.h> 14#include <dm/uclass-id.h> 15#include <linux/bitops.h> 16#include <linux/list.h> 17 18struct cmd_tbl; 19 20/** 21 * enum log_level_t - Log levels supported, ranging from most to least important 22 */ 23enum log_level_t { 24 /** @LOGL_EMERG: U-Boot is unstable */ 25 LOGL_EMERG = 0, 26 /** @LOGL_ALERT: Action must be taken immediately */ 27 LOGL_ALERT, 28 /** @LOGL_CRIT: Critical conditions */ 29 LOGL_CRIT, 30 /** @LOGL_ERR: Error that prevents something from working */ 31 LOGL_ERR, 32 /** @LOGL_WARNING: Warning may prevent optimal operation */ 33 LOGL_WARNING, 34 /** @LOGL_NOTICE: Normal but significant condition, printf() */ 35 LOGL_NOTICE, 36 /** @LOGL_INFO: General information message */ 37 LOGL_INFO, 38 /** @LOGL_DEBUG: Basic debug-level message */ 39 LOGL_DEBUG, 40 /** @LOGL_DEBUG_CONTENT: Debug message showing full message content */ 41 LOGL_DEBUG_CONTENT, 42 /** @LOGL_DEBUG_IO: Debug message showing hardware I/O access */ 43 LOGL_DEBUG_IO, 44 45 /** @LOGL_COUNT: Total number of valid log levels */ 46 LOGL_COUNT, 47 /** @LOGL_NONE: Used to indicate that there is no valid log level */ 48 LOGL_NONE, 49 50 /** @LOGL_LEVEL_MASK: Mask for valid log levels */ 51 LOGL_LEVEL_MASK = 0xf, 52 /** @LOGL_FORCE_DEBUG: Mask to force output due to LOG_DEBUG */ 53 LOGL_FORCE_DEBUG = 0x10, 54 55 /** @LOGL_FIRST: The first, most-important log level */ 56 LOGL_FIRST = LOGL_EMERG, 57 /** @LOGL_MAX: The last, least-important log level */ 58 LOGL_MAX = LOGL_DEBUG_IO, 59 /** @LOGL_CONT: Use same log level as in previous call */ 60 LOGL_CONT = -1, 61}; 62 63/** 64 * enum log_category_t - Log categories supported. 65 * 66 * Log categories between %LOGC_FIRST and %LOGC_NONE correspond to uclasses 67 * (i.e. &enum uclass_id), but there are also some more generic categories. 68 * 69 * Remember to update log_cat_name[] after adding a new category. 70 */ 71enum log_category_t { 72 /** @LOGC_FIRST: First log category */ 73 LOGC_FIRST = 0, /* First part mirrors UCLASS_... */ 74 75 /** @LOGC_NONE: Default log category */ 76 LOGC_NONE = UCLASS_COUNT, /* First number is after all uclasses */ 77 /** @LOGC_ARCH: Related to arch-specific code */ 78 LOGC_ARCH, 79 /** @LOGC_BOARD: Related to board-specific code */ 80 LOGC_BOARD, 81 /** @LOGC_CORE: Related to core features (non-driver-model) */ 82 LOGC_CORE, 83 /** @LOGC_DM: Core driver-model */ 84 LOGC_DM, 85 /** @LOGC_DT: Device-tree */ 86 LOGC_DT, 87 /** @LOGC_EFI: EFI implementation */ 88 LOGC_EFI, 89 /** @LOGC_ALLOC: Memory allocation */ 90 LOGC_ALLOC, 91 /** @LOGC_SANDBOX: Related to the sandbox board */ 92 LOGC_SANDBOX, 93 /** @LOGC_BLOBLIST: Bloblist */ 94 LOGC_BLOBLIST, 95 /** @LOGC_DEVRES: Device resources (``devres_...`` functions) */ 96 LOGC_DEVRES, 97 /** @LOGC_ACPI: Advanced Configuration and Power Interface (ACPI) */ 98 LOGC_ACPI, 99 /** @LOGC_BOOT: Related to boot process / boot image processing */ 100 LOGC_BOOT, 101 /** @LOGC_EVENT: Related to event and event handling */ 102 LOGC_EVENT, 103 /** @LOGC_FS: Related to filesystems */ 104 LOGC_FS, 105 /** @LOGC_EXPO: Related to expo handling */ 106 LOGC_EXPO, 107 /** @LOGC_CONSOLE: Related to the console and stdio */ 108 LOGC_CONSOLE, 109 /** @LOGC_TEST: Related to testing */ 110 LOGC_TEST, 111 /** @LOGC_COUNT: Number of log categories */ 112 LOGC_COUNT, 113 /** @LOGC_END: Sentinel value for lists of log categories */ 114 LOGC_END, 115 /** @LOGC_CONT: Use same category as in previous call */ 116 LOGC_CONT = -1, 117}; 118 119/* Helper to cast a uclass ID to a log category */ 120static inline int log_uc_cat(enum uclass_id id) 121{ 122 return (enum log_category_t)id; 123} 124 125/** 126 * _log() - Internal function to emit a new log record 127 * 128 * @cat: Category of log record (indicating which subsystem generated it) 129 * @level: Level of log record (indicating its severity) 130 * @file: File name of file where log record was generated 131 * @line: Line number in file where log record was generated 132 * @func: Function where log record was generated, NULL if not known 133 * @fmt: printf() format string for log record 134 * @...: Optional parameters, according to the format string @fmt 135 * Return: 0 if log record was emitted, -ve on error 136 */ 137int _log(enum log_category_t cat, enum log_level_t level, const char *file, 138 int line, const char *func, const char *fmt, ...) 139 __attribute__ ((format (__printf__, 6, 7))); 140 141/** 142 * _log_buffer - Internal function to print data buffer in hex and ascii form 143 * 144 * @cat: Category of log record (indicating which subsystem generated it) 145 * @level: Level of log record (indicating its severity) 146 * @file: File name of file where log record was generated 147 * @line: Line number in file where log record was generated 148 * @func: Function where log record was generated, NULL if not known 149 * @addr: Starting address to display at start of line 150 * @data: pointer to data buffer 151 * @width: data value width. May be 1, 2, or 4. 152 * @count: number of values to display 153 * @linelen: Number of values to print per line; specify 0 for default length 154 */ 155int _log_buffer(enum log_category_t cat, enum log_level_t level, 156 const char *file, int line, const char *func, ulong addr, 157 const void *data, uint width, uint count, uint linelen); 158 159/* Define this at the top of a file to add a prefix to debug messages */ 160#ifndef pr_fmt 161#define pr_fmt(fmt) fmt 162#endif 163 164/* Use a default category if this file does not supply one */ 165#ifndef LOG_CATEGORY 166#define LOG_CATEGORY LOGC_NONE 167#endif 168 169/* 170 * This header may be including when CONFIG_LOG is disabled, in which case 171 * CONFIG_LOG_MAX_LEVEL is not defined. Add a check for this. 172 */ 173#if CONFIG_IS_ENABLED(LOG) 174#define _LOG_MAX_LEVEL CONFIG_VAL(LOG_MAX_LEVEL) 175#else 176#define _LOG_MAX_LEVEL LOGL_INFO 177#endif 178 179#define log_emer(_fmt...) log(LOG_CATEGORY, LOGL_EMERG, ##_fmt) 180#define log_alert(_fmt...) log(LOG_CATEGORY, LOGL_ALERT, ##_fmt) 181#define log_crit(_fmt...) log(LOG_CATEGORY, LOGL_CRIT, ##_fmt) 182#define log_err(_fmt...) log(LOG_CATEGORY, LOGL_ERR, ##_fmt) 183#define log_warning(_fmt...) log(LOG_CATEGORY, LOGL_WARNING, ##_fmt) 184#define log_notice(_fmt...) log(LOG_CATEGORY, LOGL_NOTICE, ##_fmt) 185#define log_info(_fmt...) log(LOG_CATEGORY, LOGL_INFO, ##_fmt) 186#define log_debug(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG, ##_fmt) 187#define log_content(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_CONTENT, ##_fmt) 188#define log_io(_fmt...) log(LOG_CATEGORY, LOGL_DEBUG_IO, ##_fmt) 189#define log_cont(_fmt...) log(LOGC_CONT, LOGL_CONT, ##_fmt) 190 191#ifdef LOG_DEBUG 192#define _LOG_DEBUG LOGL_FORCE_DEBUG 193#ifndef DEBUG 194#define DEBUG 195#endif 196#else 197#define _LOG_DEBUG 0 198#endif 199 200#ifdef CONFIG_LOGF_FUNC 201#define _log_func __func__ 202#else 203#define _log_func NULL 204#endif 205 206#if CONFIG_IS_ENABLED(LOG) 207 208/* Emit a log record if the level is less that the maximum */ 209#define log(_cat, _level, _fmt, _args...) ({ \ 210 int _l = _level; \ 211 if (_LOG_DEBUG != 0 || _l <= _LOG_MAX_LEVEL) \ 212 _log((enum log_category_t)(_cat), \ 213 (enum log_level_t)(_l | _LOG_DEBUG), __FILE__, \ 214 __LINE__, _log_func, \ 215 pr_fmt(_fmt), ##_args); \ 216 }) 217 218/* Emit a dump if the level is less that the maximum */ 219#define log_buffer(_cat, _level, _addr, _data, _width, _count, _linelen) ({ \ 220 int _l = _level; \ 221 if (_LOG_DEBUG != 0 || _l <= _LOG_MAX_LEVEL) \ 222 _log_buffer((enum log_category_t)(_cat), \ 223 (enum log_level_t)(_l | _LOG_DEBUG), __FILE__, \ 224 __LINE__, _log_func, _addr, _data, \ 225 _width, _count, _linelen); \ 226 }) 227#else 228 229/* Note: _LOG_DEBUG != 0 avoids a warning with clang */ 230#define log(_cat, _level, _fmt, _args...) ({ \ 231 int _l = _level; \ 232 if (_LOG_DEBUG != 0 || _l <= LOGL_INFO || \ 233 (_DEBUG && _l == LOGL_DEBUG)) \ 234 printf(_fmt, ##_args); \ 235 }) 236 237#define log_buffer(_cat, _level, _addr, _data, _width, _count, _linelen) ({ \ 238 int _l = _level; \ 239 if (_LOG_DEBUG != 0 || _l <= LOGL_INFO || \ 240 (_DEBUG && _l == LOGL_DEBUG)) \ 241 print_buffer(_addr, _data, _width, _count, _linelen); \ 242 }) 243#endif 244 245#ifdef DEBUG 246#define _DEBUG 1 247#else 248#define _DEBUG 0 249#endif 250 251#ifdef CONFIG_XPL_BUILD 252#define _XPL_BUILD 1 253#else 254#define _XPL_BUILD 0 255#endif 256 257#if CONFIG_IS_ENABLED(LOG) 258 259#define debug_cond(cond, fmt, args...) \ 260({ \ 261 if (cond) \ 262 log(LOG_CATEGORY, \ 263 (enum log_level_t)(LOGL_FORCE_DEBUG | _LOG_DEBUG), \ 264 fmt, ##args); \ 265}) 266 267#else /* _DEBUG */ 268 269/* 270 * Output a debug text when condition "cond" is met. The "cond" should be 271 * computed by a preprocessor in the best case, allowing for the best 272 * optimization. 273 */ 274#define debug_cond(cond, fmt, args...) \ 275({ \ 276 if (cond) \ 277 printf(pr_fmt(fmt), ##args); \ 278}) 279 280#endif /* _DEBUG */ 281 282/* Show a message if DEBUG is defined in a file */ 283#define debug(fmt, args...) \ 284 debug_cond(_DEBUG, fmt, ##args) 285 286/* Show a message if not in xPL */ 287#define warn_non_xpl(fmt, args...) \ 288 debug_cond(!_XPL_BUILD, fmt, ##args) 289 290/* 291 * An assertion is run-time check done in debug mode only. If DEBUG is not 292 * defined then it is skipped. If DEBUG is defined and the assertion fails, 293 * then it calls panic*( which may or may not reset/halt U-Boot (see 294 * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found 295 * before release, and after release it is hoped that they don't matter. But 296 * in any case these failing assertions cannot be fixed with a reset (which 297 * may just do the same assertion again). 298 */ 299void __assert_fail(const char *assertion, const char *file, unsigned int line, 300 const char *function); 301 302/** 303 * assert() - assert expression is true 304 * 305 * If the expression x evaluates to false and _DEBUG evaluates to true, a panic 306 * message is written and the system stalls. The value of _DEBUG is set to true 307 * if DEBUG is defined before including common.h. 308 * 309 * The expression x is always executed irrespective of the value of _DEBUG. 310 * 311 * @x: expression to test 312 */ 313#define assert(x) \ 314 ({ if (!(x) && _DEBUG) \ 315 __assert_fail(#x, __FILE__, __LINE__, __func__); }) 316 317/* 318 * This one actually gets compiled in even without DEBUG. It doesn't include the 319 * full pathname as it may be huge. Only use this when the user should be 320 * warning, similar to BUG_ON() in linux. 321 * 322 * Return: true if assertion succeeded (condition is true), else false 323 */ 324#define assert_noisy(x) \ 325 ({ bool _val = (x); \ 326 if (!_val) \ 327 __assert_fail(#x, "?", __LINE__, _log_func); \ 328 _val; \ 329 }) 330 331#if CONFIG_IS_ENABLED(LOG) && defined(CONFIG_LOG_ERROR_RETURN) 332/* 333 * Log an error return value, possibly with a message. Usage: 334 * 335 * return log_ret(fred_call()); 336 * 337 * or: 338 * 339 * return log_msg_ret("get", fred_call()); 340 * 341 * It is recommended to use <= 3 characters for the name since this will only 342 * use 4 bytes in rodata 343 */ 344#define log_ret(_ret) ({ \ 345 int __ret = (_ret); \ 346 if (__ret < 0) \ 347 log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \ 348 __ret; \ 349 }) 350#define log_msg_ret(_msg, _ret) ({ \ 351 int __ret = (_ret); \ 352 if (__ret < 0) \ 353 log(LOG_CATEGORY, LOGL_ERR, "%s: returning err=%d\n", _msg, \ 354 __ret); \ 355 __ret; \ 356 }) 357 358/* 359 * Similar to the above, but any non-zero value is consider an error, not just 360 * values less than 0. 361 */ 362#define log_retz(_ret) ({ \ 363 int __ret = (_ret); \ 364 if (__ret) \ 365 log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \ 366 __ret; \ 367 }) 368#define log_msg_retz(_msg, _ret) ({ \ 369 int __ret = (_ret); \ 370 if (__ret) \ 371 log(LOG_CATEGORY, LOGL_ERR, "%s: returning err=%d\n", _msg, \ 372 __ret); \ 373 __ret; \ 374 }) 375#else 376/* Non-logging versions of the above which just return the error code */ 377#define log_ret(_ret) (_ret) 378#define log_msg_ret(_msg, _ret) ((void)(_msg), _ret) 379#define log_retz(_ret) (_ret) 380#define log_msg_retz(_msg, _ret) ((void)(_msg), _ret) 381#endif 382 383/** * enum log_rec_flags - Flags for a log record */ 384enum log_rec_flags { 385 /** @LOGRECF_FORCE_DEBUG: Force output of debug record */ 386 LOGRECF_FORCE_DEBUG = BIT(0), 387 /** @LOGRECF_CONT: Continuation of previous log record */ 388 LOGRECF_CONT = BIT(1), 389}; 390 391/** 392 * struct log_rec - a single log record 393 * 394 * Holds information about a single record in the log 395 * 396 * Members marked as 'not allocated' are stored as pointers and the caller is 397 * responsible for making sure that the data pointed to is not overwritten. 398 * Members marked as 'allocated' are allocated (e.g. via strdup()) by the log 399 * system. 400 * 401 * TODO(sjg@chromium.org): Compress this struct down a bit to reduce space, e.g. 402 * a single u32 for cat, level, line and force_debug 403 * 404 * @cat: Category, representing a uclass or part of U-Boot 405 * @level: Severity level, less severe is higher 406 * @line: Line number where the log record was generated 407 * @flags: Flags for log record (enum log_rec_flags) 408 * @file: Name of file where the log record was generated (not allocated) 409 * @func: Function where the log record was generated (not allocated) 410 * @msg: Log message (allocated) 411 */ 412struct log_rec { 413 enum log_category_t cat; 414 enum log_level_t level; 415 u16 line; 416 u8 flags; 417 const char *file; 418 const char *func; 419 const char *msg; 420}; 421 422struct log_device; 423 424enum log_device_flags { 425 LOGDF_ENABLE = BIT(0), /* Device is enabled */ 426}; 427 428/** 429 * struct log_driver - a driver which accepts and processes log records 430 * 431 * @name: Name of driver 432 * @emit: Method to call to emit a log record via this device 433 * @flags: Initial value for flags (use LOGDF_ENABLE to enable on start-up) 434 */ 435struct log_driver { 436 const char *name; 437 438 /** 439 * @emit: emit a log record 440 * 441 * Called by the log system to pass a log record to a particular driver 442 * for processing. The filter is checked before calling this function. 443 */ 444 int (*emit)(struct log_device *ldev, struct log_rec *rec); 445 unsigned short flags; 446}; 447 448/** 449 * struct log_device - an instance of a log driver 450 * 451 * Since drivers are set up at build-time we need to have a separate device for 452 * the run-time aspects of drivers (currently just a list of filters to apply 453 * to records send to this device). 454 * 455 * @next_filter_num: Sequence number of next filter filter added (0=no filters 456 * yet). This increments with each new filter on the device, but never 457 * decrements 458 * @flags: Flags for this filter (enum log_device_flags) 459 * @drv: Pointer to driver for this device 460 * @filter_head: List of filters for this device 461 * @sibling_node: Next device in the list of all devices 462 */ 463struct log_device { 464 unsigned short next_filter_num; 465 unsigned short flags; 466 struct log_driver *drv; 467 struct list_head filter_head; 468 struct list_head sibling_node; 469}; 470 471enum { 472 LOGF_MAX_CATEGORIES = 5, /* maximum categories per filter */ 473}; 474 475/** 476 * enum log_filter_flags - Flags which modify a filter 477 */ 478enum log_filter_flags { 479 /** @LOGFF_HAS_CAT: Filter has a category list */ 480 LOGFF_HAS_CAT = 1 << 0, 481 /** @LOGFF_DENY: Filter denies matching messages */ 482 LOGFF_DENY = 1 << 1, 483 /** @LOGFF_LEVEL_MIN: Filter's level is a minimum, not a maximum */ 484 LOGFF_LEVEL_MIN = 1 << 2, 485}; 486 487/** 488 * struct log_filter - criteria to filter out log messages 489 * 490 * If a message matches all criteria, then it is allowed. If LOGFF_DENY is set, 491 * then it is denied instead. 492 * 493 * @filter_num: Sequence number of this filter. This is returned when adding a 494 * new filter, and must be provided when removing a previously added 495 * filter. 496 * @flags: Flags for this filter (``LOGFF_...``) 497 * @cat_list: List of categories to allow (terminated by %LOGC_END). If empty 498 * then all categories are permitted. Up to %LOGF_MAX_CATEGORIES entries 499 * can be provided 500 * @level: Maximum (or minimum, if %LOGFF_MIN_LEVEL) log level to allow 501 * @file_list: List of files to allow, separated by comma. If NULL then all 502 * files are permitted 503 * @func_list: Comma separated list of functions or NULL. 504 * @sibling_node: Next filter in the list of filters for this log device 505 */ 506struct log_filter { 507 int filter_num; 508 int flags; 509 enum log_category_t cat_list[LOGF_MAX_CATEGORIES]; 510 enum log_level_t level; 511 const char *file_list; 512 const char *func_list; 513 struct list_head sibling_node; 514}; 515 516#define LOG_DRIVER(_name) \ 517 ll_entry_declare(struct log_driver, _name, log_driver) 518 519/* Get a pointer to a given driver */ 520#define LOG_GET_DRIVER(__name) \ 521 ll_entry_get(struct log_driver, __name, log_driver) 522 523/** 524 * log_get_cat_name() - Get the name of a category 525 * 526 * @cat: Category to look up 527 * Return: category name (which may be a uclass driver name) if found, or 528 * "<invalid>" if invalid, or "<missing>" if not found. All error 529 * responses begin with '<'. 530 */ 531const char *log_get_cat_name(enum log_category_t cat); 532 533/** 534 * log_get_cat_by_name() - Look up a category by name 535 * 536 * @name: Name to look up 537 * Return: Category, or %LOGC_NONE if not found 538 */ 539enum log_category_t log_get_cat_by_name(const char *name); 540 541/** 542 * log_get_level_name() - Get the name of a log level 543 * 544 * @level: Log level to look up 545 * Return: Log level name (in ALL CAPS) 546 */ 547const char *log_get_level_name(enum log_level_t level); 548 549/** 550 * log_get_level_by_name() - Look up a log level by name 551 * 552 * @name: Name to look up 553 * Return: Log level, or %LOGL_NONE if not found 554 */ 555enum log_level_t log_get_level_by_name(const char *name); 556 557/** 558 * log_device_find_by_name() - Look up a log device by its driver's name 559 * 560 * @drv_name: Name of the driver 561 * Return: the log device, or %NULL if not found 562 */ 563struct log_device *log_device_find_by_name(const char *drv_name); 564 565/** 566 * log_has_cat() - check if a log category exists within a list 567 * 568 * @cat_list: List of categories to check, at most %LOGF_MAX_CATEGORIES entries 569 * long, terminated by %LC_END if fewer 570 * @cat: Category to search for 571 * 572 * Return: ``true`` if @cat is in @cat_list, else ``false`` 573 */ 574bool log_has_cat(enum log_category_t cat_list[], enum log_category_t cat); 575 576/* Log format flags (bit numbers) for gd->log_fmt. See log_fmt_chars */ 577enum log_fmt { 578 LOGF_CAT = 0, 579 LOGF_LEVEL, 580 LOGF_FILE, 581 LOGF_LINE, 582 LOGF_FUNC, 583 LOGF_MSG, 584 585 LOGF_COUNT, 586 LOGF_ALL = 0x3f, 587}; 588 589/* Handle the 'log test' command */ 590int do_log_test(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); 591 592/** 593 * log_add_filter_flags() - Add a new filter to a log device, specifying flags 594 * 595 * @drv_name: Driver name to add the filter to (since each driver only has a 596 * single device) 597 * @flags: Flags for this filter (``LOGFF_...``) 598 * @cat_list: List of categories to allow (terminated by %LOGC_END). If empty 599 * then all categories are permitted. Up to %LOGF_MAX_CATEGORIES entries 600 * can be provided 601 * @level: Maximum (or minimum, if %LOGFF_LEVEL_MIN) log level to allow 602 * @file_list: List of files to allow, separated by comma. If NULL then all 603 * files are permitted 604 * @func_list: Comma separated list of functions or NULL. 605 * Return: 606 * the sequence number of the new filter (>=0) if the filter was added, or a 607 * -ve value on error 608 */ 609int log_add_filter_flags(const char *drv_name, enum log_category_t cat_list[], 610 enum log_level_t level, const char *file_list, 611 const char *func_list, int flags); 612 613/** 614 * log_add_filter() - Add a new filter to a log device 615 * 616 * @drv_name: Driver name to add the filter to (since each driver only has a 617 * single device) 618 * @cat_list: List of categories to allow (terminated by %LOGC_END). If empty 619 * then all categories are permitted. Up to %LOGF_MAX_CATEGORIES entries 620 * can be provided 621 * @max_level: Maximum log level to allow 622 * @file_list: List of files to allow, separated by comma. If %NULL then all 623 * files are permitted 624 * Return: 625 * the sequence number of the new filter (>=0) if the filter was added, or a 626 * -ve value on error 627 */ 628static inline int log_add_filter(const char *drv_name, 629 enum log_category_t cat_list[], 630 enum log_level_t max_level, 631 const char *file_list) 632{ 633 return log_add_filter_flags(drv_name, cat_list, max_level, file_list, 634 NULL, 0); 635} 636 637/** 638 * log_remove_filter() - Remove a filter from a log device 639 * 640 * @drv_name: Driver name to remove the filter from (since each driver only has 641 * a single device) 642 * @filter_num: Filter number to remove (as returned by log_add_filter()) 643 * Return: 644 * 0 if the filter was removed, -%ENOENT if either the driver or the filter 645 * number was not found 646 */ 647int log_remove_filter(const char *drv_name, int filter_num); 648 649/** 650 * log_device_set_enable() - Enable or disable a log device 651 * 652 * Devices are referenced by their driver, so use LOG_GET_DRIVER(name) to pass 653 * the driver to this function. For example if the driver is declared with 654 * LOG_DRIVER(wibble) then pass LOG_GET_DRIVER(wibble) here. 655 * 656 * @drv: Driver of device to enable 657 * @enable: true to enable, false to disable 658 * Return: 0 if OK, -ENOENT if the driver was not found 659 */ 660int log_device_set_enable(struct log_driver *drv, bool enable); 661 662#if CONFIG_IS_ENABLED(LOG) 663/** 664 * log_init() - Set up the log system ready for use 665 * 666 * Return: 0 if OK, -%ENOMEM if out of memory 667 */ 668int log_init(void); 669#else 670static inline int log_init(void) 671{ 672 return 0; 673} 674#endif 675 676/** 677 * log_get_default_format() - get default log format 678 * 679 * The default log format is configurable via 680 * %CONFIG_LOGF_FILE, %CONFIG_LOGF_LINE, and %CONFIG_LOGF_FUNC. 681 * 682 * Return: default log format 683 */ 684static inline int log_get_default_format(void) 685{ 686 return BIT(LOGF_MSG) | 687 (IS_ENABLED(CONFIG_LOGF_FILE) ? BIT(LOGF_FILE) : 0) | 688 (IS_ENABLED(CONFIG_LOGF_LINE) ? BIT(LOGF_LINE) : 0) | 689 (IS_ENABLED(CONFIG_LOGF_FUNC) ? BIT(LOGF_FUNC) : 0); 690} 691 692struct global_data; 693/** 694 * log_fixup_for_gd_move() - Handle global_data moving to a new place 695 * 696 * @new_gd: Pointer to the new global data 697 * 698 * The log_head list is part of global_data. Due to the way lists work, moving 699 * the list will cause it to become invalid. This function fixes that up so 700 * that the log_head list will work correctly. 701 */ 702void log_fixup_for_gd_move(struct global_data *new_gd); 703 704#endif