1/*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * BSD LICENSE 5 * 6 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * * Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * * Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> 34#include <dev/isci/isci.h> 35 36#include <dev/isci/scil/scif_user_callback.h> 37#include <dev/isci/scil/scic_user_callback.h> 38#include <dev/isci/scil/sci_logger.h> 39 40#include <machine/stdarg.h> 41#include <sys/time.h> 42 43#define ERROR_LEVEL 0 44#define WARNING_LEVEL 1 45#define TRACE_LEVEL 2 46#define INFO_LEVEL 3 47 48void 49isci_log_message(uint32_t verbosity, char *log_message_prefix, 50 char *log_message, ...) 51{ 52 va_list argp; 53 char buffer[512]; 54 struct timeval tv; 55 56 if (verbosity > g_isci_debug_level) 57 return; 58 59 va_start (argp, log_message); 60 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); 61 va_end(argp); 62 microtime(&tv); 63 64 printf("isci: %d:%06d %s %s", (int)tv.tv_sec, (int)tv.tv_usec, 65 log_message_prefix, buffer); 66} 67 68 69#ifdef SCI_LOGGING 70#define SCI_ENABLE_LOGGING_ERROR 1 71#define SCI_ENABLE_LOGGING_WARNING 1 72#define SCI_ENABLE_LOGGING_INFO 1 73#define SCI_ENABLE_LOGGING_TRACE 1 74#define SCI_ENABLE_LOGGING_STATES 1 75 76#define ISCI_LOG_MESSAGE( \ 77 logger_object, \ 78 log_object_mask, \ 79 log_message, \ 80 verbosity, \ 81 log_message_prefix \ 82) \ 83{ \ 84 va_list argp; \ 85 char buffer[512]; \ 86 \ 87 if (!sci_logger_is_enabled(logger_object, log_object_mask, verbosity)) \ 88 return; \ 89 \ 90 va_start (argp, log_message); \ 91 vsnprintf(buffer, sizeof(buffer)-1, log_message, argp); \ 92 va_end(argp); \ 93 \ 94 /* prepend the "object:verbosity_level:" */ \ 95 isci_log_message(verbosity, log_message_prefix, buffer); \ 96} 97#endif /* SCI_LOGGING */ 98 99 100#ifdef SCI_ENABLE_LOGGING_ERROR 101/** 102 * @brief In this method the user is expected to log the supplied 103 * error information. The user must be capable of handling variable 104 * length argument lists and should consider prepending the fact 105 * that this is an error from the framework. 106 * 107 * @param[in] logger_object This parameter specifies the logger object 108 * associated with this message. 109 * @param[in] log_object_mask This parameter specifies the log objects 110 * for which this message is being generated. 111 * @param[in] log_message This parameter specifies the message to be logged. 112 * 113 * @return none 114 */ 115void scif_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 116 uint32_t log_object_mask, char *log_message, ...) 117{ 118 119 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 120 SCI_LOG_VERBOSITY_ERROR, "FRAMEWORK: ERROR: "); 121} 122#endif 123 124#ifdef SCI_ENABLE_LOGGING_WARNING 125/** 126 * @brief In this method the user is expected to log the supplied warning 127 * information. The user must be capable of handling variable 128 * length argument lists and should consider prepending the fact 129 * that this is a warning from the framework. 130 * 131 * @param[in] logger_object This parameter specifies the logger object 132 * associated with this message. 133 * @param[in] log_object_mask This parameter specifies the log objects 134 * for which this message is being generated. 135 * @param[in] log_message This parameter specifies the message to be logged. 136 * 137 * @return none 138 */ 139void 140scif_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 141 uint32_t log_object_mask, char *log_message, ...) 142{ 143 144 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 145 SCI_LOG_VERBOSITY_WARNING, "FRAMEWORK: WARNING: "); 146} 147#endif 148 149#ifdef SCI_ENABLE_LOGGING_INFO 150/** 151 * @brief In this method the user is expected to log the supplied debug 152 * information. The user must be capable of handling variable 153 * length argument lists and should consider prepending the fact 154 * that this is a debug message from the framework. 155 * 156 * @param[in] logger_object This parameter specifies the logger object 157 * associated with this message. 158 * @param[in] log_object_mask This parameter specifies the log objects 159 * for which this message is being generated. 160 * @param[in] log_message This parameter specifies the message to be logged. 161 * 162 * @return none 163 */ 164void 165scif_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 166 uint32_t log_object_mask, char *log_message, ...) 167{ 168 169 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 170 SCI_LOG_VERBOSITY_INFO, "FRAMEWORK: INFO: "); 171} 172#endif 173 174#ifdef SCI_ENABLE_LOGGING_TRACE 175/** 176 * @brief In this method the user is expected to log the supplied function 177 * trace information. The user must be capable of handling variable 178 * length argument lists and should consider prepending the fact 179 * that this is a function trace (i.e. entry/exit) message from the 180 * framework. 181 * 182 * @param[in] logger_object This parameter specifies the logger object 183 * associated with this message. 184 * @param[in] log_object_mask This parameter specifies the log objects 185 * for which this message is being generated. 186 * @param[in] log_message This parameter specifies the message to be logged. 187 * 188 * @return none 189 */ 190void 191scif_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 192 uint32_t log_object_mask, char *log_message, ...) 193{ 194 195 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 196 SCI_LOG_VERBOSITY_TRACE, "FRAMEWORK: TRACE: "); 197} 198#endif 199 200#ifdef SCI_ENABLE_LOGGING_STATES 201/** 202 * @brief In this method the user is expected to log the supplied function 203 * state transition information. The user must be capable of handling 204 * variable length argument lists and should consider prepending the 205 * fact that this is a function trace (i.e. entry/exit) message from 206 * the framework. 207 * 208 * @param[in] logger_object This parameter specifies the logger object 209 * associated with this message. 210 * @param[in] log_object_mask This parameter specifies the log objects 211 * for which this message is being generated. 212 * @param[in] log_message This parameter specifies the message to be logged. 213 * 214 * @return none 215 */ 216void 217scif_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 218 uint32_t log_object_mask, char *log_message, ...) 219{ 220 221 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 222 SCI_LOG_VERBOSITY_STATES, "FRAMEWORK: STATE TRANSITION: "); 223} 224#endif 225 226#ifdef SCI_ENABLE_LOGGING_ERROR 227/** 228 * @brief In this method the user is expected to log the supplied 229 * error information. The user must be capable of handling variable 230 * length argument lists and should consider prepending the fact 231 * that this is an error from the core. 232 * 233 * @param[in] logger_object This parameter specifies the logger object 234 * associated with this message. 235 * @param[in] log_object_mask This parameter specifies the log objects 236 * for which this message is being generated. 237 * @param[in] log_message This parameter specifies the message to be logged. 238 * 239 * @return none 240 */ 241void 242scic_cb_logger_log_error(SCI_LOGGER_HANDLE_T logger_object, 243 uint32_t log_object_mask, char *log_message, ...) 244{ 245 246 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 247 SCI_LOG_VERBOSITY_ERROR, "CORE: ERROR: "); 248} 249#endif 250 251#ifdef SCI_ENABLE_LOGGING_WARNING 252/** 253 * @brief In this method the user is expected to log the supplied warning 254 * information. The user must be capable of handling variable 255 * length argument lists and should consider prepending the fact 256 * that this is a warning from the core. 257 * 258 * @param[in] logger_object This parameter specifies the logger object 259 * associated with this message. 260 * @param[in] log_object_mask This parameter specifies the log objects 261 * for which this message is being generated. 262 * @param[in] log_message This parameter specifies the message to be logged. 263 * 264 * @return none 265 */ 266void 267scic_cb_logger_log_warning(SCI_LOGGER_HANDLE_T logger_object, 268 uint32_t log_object_mask, char *log_message, ...) 269{ 270 271 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 272 SCI_LOG_VERBOSITY_WARNING, "CORE: WARNING: "); 273} 274#endif 275 276#ifdef SCI_ENABLE_LOGGING_INFO 277/** 278 * @brief In this method the user is expected to log the supplied debug 279 * information. The user must be capable of handling variable 280 * length argument lists and should consider prepending the fact 281 * that this is a debug message from the core. 282 * 283 * @param[in] logger_object This parameter specifies the logger object 284 * associated with this message. 285 * @param[in] log_object_mask This parameter specifies the log objects 286 * for which this message is being generated. 287 * @param[in] log_message This parameter specifies the message to be logged. 288 * 289 * @return none 290 */ 291void 292scic_cb_logger_log_info(SCI_LOGGER_HANDLE_T logger_object, 293 uint32_t log_object_mask, char *log_message, ...) 294{ 295 296 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 297 SCI_LOG_VERBOSITY_INFO, "CORE: INFO: "); 298} 299#endif 300 301#ifdef SCI_ENABLE_LOGGING_TRACE 302/** 303 * @brief In this method the user is expected to log the supplied function 304 * trace information. The user must be capable of handling variable 305 * length argument lists and should consider prepending the fact 306 * that this is a function trace (i.e. entry/exit) message from the 307 * core. 308 * 309 * @param[in] logger_object This parameter specifies the logger object 310 * associated with this message. 311 * @param[in] log_object_mask This parameter specifies the log objects 312 * for which this message is being generated. 313 * @param[in] log_message This parameter specifies the message to be logged. 314 * 315 * @return none 316 */ 317void 318scic_cb_logger_log_trace(SCI_LOGGER_HANDLE_T logger_object, 319 uint32_t log_object_mask, char *log_message, ...) 320{ 321 322 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 323 SCI_LOG_VERBOSITY_TRACE, "CORE: TRACE: "); 324} 325#endif 326 327#ifdef SCI_ENABLE_LOGGING_STATES 328/** 329 * @brief In this method the user is expected to log the supplied function 330 * state transition information. The user must be capable of handling 331 * variable length argument lists and should consider prepending the 332 * fact that this is a function trace (i.e. entry/exit) message from 333 * the core. 334 * 335 * @param[in] logger_object This parameter specifies the logger object 336 * associated with this message. 337 * @param[in] log_object_mask This parameter specifies the log objects 338 * for which this message is being generated. 339 * @param[in] log_message This parameter specifies the message to be logged. 340 * 341 * @return none 342 */ 343void 344scic_cb_logger_log_states(SCI_LOGGER_HANDLE_T logger_object, 345 uint32_t log_object_mask, char *log_message, ...) 346{ 347 348 ISCI_LOG_MESSAGE(logger_object, log_object_mask, log_message, 349 SCI_LOG_VERBOSITY_STATES, "CORE: STATE TRANSITION: "); 350} 351#endif 352