1fb403678SAdrian Chadd /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 36e778a7eSPedro F. Giffuni * 4fb403678SAdrian Chadd * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com> 5fb403678SAdrian Chadd * All rights reserved. 6fb403678SAdrian Chadd * 7fb403678SAdrian Chadd * Redistribution and use in source and binary forms, with or without 8fb403678SAdrian Chadd * modification, are permitted provided that the following conditions 9fb403678SAdrian Chadd * are met: 10fb403678SAdrian Chadd * 1. Redistributions of source code must retain the above copyright 11fb403678SAdrian Chadd * notice, this list of conditions and the following disclaimer, 12fb403678SAdrian Chadd * without modification. 13fb403678SAdrian Chadd * 2. Redistributions in binary form must reproduce at minimum a disclaimer 14fb403678SAdrian Chadd * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 15fb403678SAdrian Chadd * redistribution must be conditioned upon including a substantially 16fb403678SAdrian Chadd * similar Disclaimer requirement for further binary redistribution. 17fb403678SAdrian Chadd * 18fb403678SAdrian Chadd * NO WARRANTY 19fb403678SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fb403678SAdrian Chadd * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fb403678SAdrian Chadd * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 22fb403678SAdrian Chadd * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 23fb403678SAdrian Chadd * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 24fb403678SAdrian Chadd * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25fb403678SAdrian Chadd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26fb403678SAdrian Chadd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 27fb403678SAdrian Chadd * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28fb403678SAdrian Chadd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 29fb403678SAdrian Chadd * THE POSSIBILITY OF SUCH DAMAGES. 30fb403678SAdrian Chadd */ 31fb403678SAdrian Chadd 32fb403678SAdrian Chadd /* $FreeBSD$ */ 33fb403678SAdrian Chadd 34fb403678SAdrian Chadd /* 35fb403678SAdrian Chadd * This file provides set of macros for logging: 36fb403678SAdrian Chadd * - BHND_<LEVEL> and 37fb403678SAdrian Chadd * - BHND_<LEVEL>_DEV 38fb403678SAdrian Chadd * where LEVEL = {ERROR,WARN,INFO,DEBUG} 39fb403678SAdrian Chadd * 40fb403678SAdrian Chadd * BHND_<LEVEL> macros is proxies to printf call and accept same parameters, 41fb403678SAdrian Chadd * for instance: 42fb403678SAdrian Chadd * BHND_INFO("register %d has value %d", reg, val); 43fb403678SAdrian Chadd * 44fb403678SAdrian Chadd * BHND_<LEVEL>_DEV macros is proxies to device_printf call and accept 45fb403678SAdrian Chadd * same parameters, for instance: 46fb403678SAdrian Chadd * BHND_INFO_DEV(dev, "register %d has value %d", reg, val); 47fb403678SAdrian Chadd * 48fb403678SAdrian Chadd * All macros contains newline char at the end of each call 49fb403678SAdrian Chadd * 50fb403678SAdrian Chadd * ERROR, WARN, INFO messages are printed only if: 51fb403678SAdrian Chadd * - log message level is lower than BHND_LOGGING (logging threshold) 52fb403678SAdrian Chadd * 53fb403678SAdrian Chadd * DEBUG, TRACE messages are printed only if: 54fb403678SAdrian Chadd * - bootverbose and 55fb403678SAdrian Chadd * - log message level is lower than BHND_LOGGING (logging threshold) 56fb403678SAdrian Chadd * 57fb403678SAdrian Chadd * In addition, for debugging purpose log message contains information about 58fb403678SAdrian Chadd * file name and line number if BHND_LOGGING is more than BHND_INFO_LEVEL 59fb403678SAdrian Chadd * 60fb403678SAdrian Chadd * NOTE: macros starting with underscore (_) are private and should be not used 61fb403678SAdrian Chadd * 62fb403678SAdrian Chadd * To override logging (for instance, force tracing), you can use: 63fb403678SAdrian Chadd * - "options BHND_LOGLEVEL=BHND_TRACE_LEVEL" in kernel configuration 64fb403678SAdrian Chadd * - "#define BHND_LOGGING BHND_TRACE_LEVEL" in source code file 65fb403678SAdrian Chadd * 66fb403678SAdrian Chadd * NOTE: kernel config option doesn't override log level defined on file level, 67fb403678SAdrian Chadd * so try to avoid "#define BHND_LOGGING" 68fb403678SAdrian Chadd */ 69fb403678SAdrian Chadd 70fb403678SAdrian Chadd #ifndef _BHND_BHND_DEBUG_H_ 71fb403678SAdrian Chadd #define _BHND_BHND_DEBUG_H_ 72fb403678SAdrian Chadd 73fb403678SAdrian Chadd #include <sys/systm.h> 74fb403678SAdrian Chadd 75fb403678SAdrian Chadd #define BHND_ERROR_LEVEL 0x00 76fb403678SAdrian Chadd #define BHND_ERROR_MSG "ERROR" 77fb403678SAdrian Chadd #define BHND_WARN_LEVEL 0x10 78fb403678SAdrian Chadd #define BHND_WARN_MSG "!WARN" 79fb403678SAdrian Chadd #define BHND_INFO_LEVEL 0x20 80fb403678SAdrian Chadd #define BHND_INFO_MSG " info" 81fb403678SAdrian Chadd #define BHND_DEBUG_LEVEL 0x30 82fb403678SAdrian Chadd #define BHND_DEBUG_MSG "debug" 83fb403678SAdrian Chadd #define BHND_TRACE_LEVEL 0x40 84fb403678SAdrian Chadd #define BHND_TRACE_MSG "trace" 85fb403678SAdrian Chadd 86fb403678SAdrian Chadd #if !(defined(BHND_LOGGING)) 87fb403678SAdrian Chadd #if !(defined(BHND_LOGLEVEL)) 88fb403678SAdrian Chadd /* By default logging will print only INFO+ message*/ 89fb403678SAdrian Chadd #define BHND_LOGGING BHND_INFO_LEVEL 90fb403678SAdrian Chadd #else /* defined(BHND_LOGLEVEL) */ 91fb403678SAdrian Chadd /* Kernel configuration specifies logging level */ 92fb403678SAdrian Chadd #define BHND_LOGGING BHND_LOGLEVEL 93fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGLEVEL)) */ 94fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGGING)) */ 95fb403678SAdrian Chadd 96fb403678SAdrian Chadd #if BHND_LOGGING > BHND_INFO_LEVEL 97fb403678SAdrian Chadd #define _BHND_PRINT(fn, level, fmt, ...) \ 98fb403678SAdrian Chadd do { \ 99fb403678SAdrian Chadd if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ 100fb403678SAdrian Chadd fn "[BHND " level##MSG "] %s:%d => " fmt "\n", \ 101fb403678SAdrian Chadd __func__, __LINE__, ## __VA_ARGS__); \ 102fb403678SAdrian Chadd } while(0); 103fb403678SAdrian Chadd #else /* BHND_LOGGING <= BHND_INFO_LEVEL */ 104fb403678SAdrian Chadd #define _BHND_PRINT(fn, level, fmt, ...) \ 105fb403678SAdrian Chadd do { \ 106fb403678SAdrian Chadd if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose) \ 107fb403678SAdrian Chadd fn "bhnd: " fmt "\n", ## __VA_ARGS__); \ 108fb403678SAdrian Chadd } while(0); 109fb403678SAdrian Chadd #endif /* BHND_LOGGING > BHND_INFO_LEVEL */ 110fb403678SAdrian Chadd 111fb403678SAdrian Chadd #define _BHND_RAWPRINTFN printf( 112fb403678SAdrian Chadd #define _BHND_DEVPRINTFN(dev) device_printf(dev, 113fb403678SAdrian Chadd 114fb403678SAdrian Chadd #define _BHND_LOGPRINT(level, fmt, ...) \ 115fb403678SAdrian Chadd _BHND_PRINT(_BHND_RAWPRINTFN, level, fmt, ## __VA_ARGS__) 116fb403678SAdrian Chadd #define _BHND_DEVPRINT(dev, level, fmt, ...) \ 117fb403678SAdrian Chadd _BHND_PRINT(_BHND_DEVPRINTFN(dev), level, fmt, ## __VA_ARGS__) 118fb403678SAdrian Chadd 119fb403678SAdrian Chadd #define BHND_ERROR(fmt, ...) \ 120fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_ERROR_, fmt, ## __VA_ARGS__); 121fb403678SAdrian Chadd #define BHND_ERROR_DEV(dev, fmt, ...) \ 122fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_ERROR_, fmt, ## __VA_ARGS__) 123fb403678SAdrian Chadd 124fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_WARN_LEVEL 125fb403678SAdrian Chadd #define BHND_WARN(fmt, ...) \ 126fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_WARN_, fmt, ## __VA_ARGS__) 127fb403678SAdrian Chadd #define BHND_WARN_DEV(dev, fmt, ...) \ 128fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_WARN_, fmt, ## __VA_ARGS__) 129fb403678SAdrian Chadd 130fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_INFO_LEVEL 131fb403678SAdrian Chadd #define BHND_INFO(fmt, ...) \ 132fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_INFO_, fmt, ## __VA_ARGS__) 133fb403678SAdrian Chadd #define BHND_INFO_DEV(dev, fmt, ...) \ 134fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_INFO_, fmt, ## __VA_ARGS__) 135fb403678SAdrian Chadd 136fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_DEBUG_LEVEL 137fb403678SAdrian Chadd #define BHND_DEBUG(fmt, ...) \ 138fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_DEBUG_, fmt, ## __VA_ARGS__) 139fb403678SAdrian Chadd #define BHND_DEBUG_DEV(dev, fmt, ...) \ 140fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_DEBUG_, fmt, ## __VA_ARGS__) 141fb403678SAdrian Chadd 142fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_TRACE_LEVEL 143fb403678SAdrian Chadd #define BHND_TRACE(fmt, ...) \ 144fb403678SAdrian Chadd _BHND_LOGPRINT(BHND_TRACE_, fmt, ## __VA_ARGS__) 145fb403678SAdrian Chadd #define BHND_TRACE_DEV(dev, fmt, ...) \ 146fb403678SAdrian Chadd _BHND_DEVPRINT(dev, BHND_TRACE_, fmt, ## __VA_ARGS__) 147fb403678SAdrian Chadd 148fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_TRACE_LEVEL */ 149fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_DEBUG_LEVEL */ 150fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_INFO_LEVEL */ 151fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_WARN_LEVEL */ 152fb403678SAdrian Chadd 153fb403678SAdrian Chadd /* 154fb403678SAdrian Chadd * Empty defines without device context 155fb403678SAdrian Chadd */ 156fb403678SAdrian Chadd #if !(defined(BHND_WARN)) 157fb403678SAdrian Chadd #define BHND_WARN(fmt, ...); 158fb403678SAdrian Chadd #endif 159fb403678SAdrian Chadd 160fb403678SAdrian Chadd #if !(defined(BHND_INFO)) 161fb403678SAdrian Chadd #define BHND_INFO(fmt, ...); 162fb403678SAdrian Chadd #endif 163fb403678SAdrian Chadd 164fb403678SAdrian Chadd #if !(defined(BHND_DEBUG)) 165fb403678SAdrian Chadd #define BHND_DEBUG(fmt, ...); 166fb403678SAdrian Chadd #endif 167fb403678SAdrian Chadd 168fb403678SAdrian Chadd #if !(defined(BHND_TRACE)) 169fb403678SAdrian Chadd #define BHND_TRACE(fmt, ...); 170fb403678SAdrian Chadd #endif 171fb403678SAdrian Chadd 172fb403678SAdrian Chadd /* 173fb403678SAdrian Chadd * Empty defines with device context 174fb403678SAdrian Chadd */ 175fb403678SAdrian Chadd #if !(defined(BHND_WARN_DEV)) 176fb403678SAdrian Chadd #define BHND_WARN_DEV(dev, fmt, ...); 177fb403678SAdrian Chadd #endif 178fb403678SAdrian Chadd 179fb403678SAdrian Chadd #if !(defined(BHND_INFO_DEV)) 180fb403678SAdrian Chadd #define BHND_INFO_DEV(dev, fmt, ...); 181fb403678SAdrian Chadd #endif 182fb403678SAdrian Chadd 183fb403678SAdrian Chadd #if !(defined(BHND_DEBUG_DEV)) 184fb403678SAdrian Chadd #define BHND_DEBUG_DEV(dev, fmt, ...); 185fb403678SAdrian Chadd #endif 186fb403678SAdrian Chadd 187fb403678SAdrian Chadd #if !(defined(BHND_TRACE_DEV)) 188fb403678SAdrian Chadd #define BHND_TRACE_DEV(dev, fmt, ...); 189fb403678SAdrian Chadd #endif 190fb403678SAdrian Chadd 191fb403678SAdrian Chadd #endif /* _BHND_BHND_DEBUG_H_ */ 192