blob: d6666f139a62c3df1ab5227dfa76ceb37400a4ac [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <stdint.h>
#include <stdio.h>
#include <ddk/driver.h>
#include <zircon/compiler.h>
#include <zircon/syscalls/log.h>
__BEGIN_CDECLS
// Log Flags
// Error messages should indicate unexpected failures. They
// should be terse (preferably one-line) but informative. They
// should avoid flooding the log (if an error is likely to happen
// repeatedly, rapidly, it should throttle its dprintf()s).
// Error messages are always displayed by default.
#define DDK_LOG_ERROR ZX_LOG_ERROR
// Info messages should provide terse information messages
// around driver startup, shutdown or state change. They
// should be concise, infrequent, and one-line whenever possible.
// Info messages are always displayed by default.
#define DDK_LOG_INFO ZX_LOG_INFO
// Trace messages are intended to provide detailed information
// about what a driver is doing (start/end of transaction, etc)
// They should aim for terseness, but provide visibility into
// driver operation. They are not displayed by default.
#define DDK_LOG_TRACE ZX_LOG_TRACE
// Spew messages are extremely verbose driver state tracing
// (possibly including register dumps / full state dumps).
// They are not displayed by default.
#define DDK_LOG_SPEW ZX_LOG_SPEW
// Debug1 through Debug4 messages are driver specific, and not
// displayed by default. Consult driver source or documentation
// to learn if these messages exist for a specific driver and
// what they're used for.
#define DDK_LOG_DEBUG1 ZX_LOG_DEBUG1
#define DDK_LOG_DEBUG2 ZX_LOG_DEBUG2
#define DDK_LOG_DEBUG3 ZX_LOG_DEBUG3
#define DDK_LOG_DEBUG4 ZX_LOG_DEBUG4
// Local variants of log levels. These levels will flag debug
// messages so they do not get sent over the network. They're
// useful for network core or driver logging that would otherwise
// spiral out of control as it logs about packets about logging...
#define DDK_LOG_LERROR (ZX_LOG_ERROR | ZX_LOG_LOCAL)
#define DDK_LOG_LINFO (ZX_LOG_INFO | ZX_LOG_LOCAL)
#define DDK_LOG_LTRACE (ZX_LOG_TRACE | ZX_LOG_LOCAL)
#define DDK_LOG_LSPEW (ZX_LOG_SPEW | ZX_LOG_LOCAL)
#define DDK_LOG_LDEBUG1 (ZX_LOG_DEBUG1 | ZX_LOG_LOCAL)
#define DDK_LOG_LDEBUG2 (ZX_LOG_DEBUG2 | ZX_LOG_LOCAL)
#define DDK_LOG_LDEBUG3 (ZX_LOG_DEBUG3 | ZX_LOG_LOCAL)
#define DDK_LOG_LDEBUG4 (ZX_LOG_DEBUG4 | ZX_LOG_LOCAL)
void driver_printf(uint32_t flags, const char* fmt, ...);
// dprintf() provides a path to the kernel debuglog gated by log level flags
//
// Example: dprintf(ERROR, "oh no! ...");
//
// By default drivers have ERROR and INFO debug levels enabled.
// The kernel commandline option driver.NAME.log may be used to override
// this. Its value is a comma-separated list of log levels to enable (prefixed
// with '+') or disable (prefixed with '-'). The levels are the strings
// "error", "info", "trace", "spew", "debug1", "debug2", "debug3", and "debug4",
// or an integer mask in decimal, octal, or hex.
//
// Example driver.floppydisk.log=-info,+trace,+0x10
//
#define dprintf(flag, fmt...) \
do { \
if ((DDK_LOG_##flag & ZX_LOG_LEVEL_MASK) & __zircon_driver_rec__.log_flags) { \
driver_printf(DDK_LOG_##flag, fmt); \
} \
} while (0)
static inline void driver_set_log_flags(uint32_t flags) {
__zircon_driver_rec__.log_flags = flags;
}
static inline uint32_t driver_get_log_flags(void) {
return __zircon_driver_rec__.log_flags;
}
__END_CDECLS