1/*-
2 * This file is provided under a dual BSD/GPLv2 license.  When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 * The full GNU General Public License is included in this distribution
22 * in the file called LICENSE.GPL.
23 *
24 * BSD LICENSE
25 *
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 *
33 *   * Redistributions of source code must retain the above copyright
34 *     notice, this list of conditions and the following disclaimer.
35 *   * Redistributions in binary form must reproduce the above copyright
36 *     notice, this list of conditions and the following disclaimer in
37 *     the documentation and/or other materials provided with the
38 *     distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 */
52
53#include <sys/cdefs.h>
54__FBSDID("$FreeBSD$");
55
56/**
57 * @file
58 *
59 * @brief This file contains the implementation for the base logger object.
60 *        It provides the functionality necessary to enabling, disabling,
61 *        constructing, etc. logger objects.
62 */
63
64
65#include <dev/isci/scil/sci_base_logger.h>
66
67
68#ifdef SCI_LOGGING
69
70//******************************************************************************
71//* P R I V A T E   M E T H O D S
72//******************************************************************************
73
74#define SCI_LOGGER_GET_OBJECT_MASK(logger, verbosity_level) \
75   (((SCI_BASE_LOGGER_T *)(logger))->object_mask[(verbosity_level)])
76
77/**
78 * @brief This method is private to this object.  It attempts to enable the
79 *        supplied log objects for the supplied verbosity levels.
80 *
81 * @param[in]  logger This parameter specifies the logger object for which
82 *             to attempt to enable log object and verbosity levels.
83 * @param[in]  log_object_mask This parameter specifies the log objects to
84 *             attempt to enable.
85 * @param[in]  verbosity_mask This parameter specifies the verbosity levels
86 *             that are allowed to be enabled.
87 * @param[in]  verbosity This parameter specifies the specific verbosity level
88 *             to attempt to enable.
89 *
90 * @return none
91 */
92static
93void sci_base_logger_enable_log_object(
94   SCI_LOGGER_HANDLE_T  logger,
95   U32                  log_object_mask,
96   U8                   verbosity_mask,
97   U8                   verbosity
98)
99{
100   // Enable the log objects for the error verbosity if errs are enabled.
101   if ( (1<<verbosity) & verbosity_mask)
102   {
103      SCI_LOGGER_GET_OBJECT_MASK(logger, verbosity) |= log_object_mask;
104      (((SCI_BASE_LOGGER_T *)(logger))->verbosity_mask |= (1<<verbosity) );
105   }
106}
107
108/**
109 * @brief This method is private to this object.  It attempts to disable the
110 *        supplied log objects for the supplied verbosity levels.
111 *
112 * @param[in]  logger This parameter specifies the logger object for which
113 *             to attempt to disable log object and verbosity levels.
114 * @param[in]  log_object_mask This parameter specifies the log objects to
115 *             attempt to disable.
116 * @param[in]  verbosity_mask This parameter specifies the verbosity levels
117 *             that are allowed to be disabled.
118 * @param[in]  verbosity This parameter specifies the specific verbosity level
119 *             to attempt to disable.
120 *
121 * @return none
122 */
123static
124void sci_base_logger_disable_log_object(
125   SCI_LOGGER_HANDLE_T  logger,
126   U32                  log_object_mask,
127   U8                   verbosity_mask,
128   U8                   verbosity
129)
130{
131   if ( (1<<verbosity) & verbosity_mask)
132   {
133      SCI_LOGGER_GET_OBJECT_MASK(logger, verbosity) &= ~log_object_mask;
134
135      // If all of the objects in the object mask are disabled for this
136      // verbosity, then disable the verbosity as well.
137      if (SCI_LOGGER_GET_OBJECT_MASK(logger, verbosity) == 0)
138         (((SCI_BASE_LOGGER_T *)(logger))->verbosity_mask &= ~(1<<verbosity) );
139   }
140}
141
142//******************************************************************************
143//* P U B L I C   M E T H O D S
144//******************************************************************************
145
146U8 sci_logger_get_verbosity_mask(
147   SCI_LOGGER_HANDLE_T  logger,
148   U32                  log_object
149)
150{
151   U8 verbosity_mask = 0;
152   SCI_BASE_LOGGER_T * base_logger = (SCI_BASE_LOGGER_T *)logger;
153
154   if ( base_logger->object_mask[SCI_LOG_VERBOSITY_ERROR] & log_object )
155      verbosity_mask |= 1<<SCI_LOG_VERBOSITY_ERROR;
156
157   if ( base_logger->object_mask[SCI_LOG_VERBOSITY_WARNING] & log_object )
158      verbosity_mask |= 1<<SCI_LOG_VERBOSITY_WARNING;
159
160   if ( base_logger->object_mask[SCI_LOG_VERBOSITY_INFO] & log_object )
161      verbosity_mask |= 1<<SCI_LOG_VERBOSITY_INFO;
162
163   if ( base_logger->object_mask[SCI_LOG_VERBOSITY_TRACE] & log_object )
164      verbosity_mask |= 1<<SCI_LOG_VERBOSITY_TRACE;
165
166   if ( base_logger->object_mask[SCI_LOG_VERBOSITY_STATES] & log_object )
167      verbosity_mask |= 1<<SCI_LOG_VERBOSITY_TRACE;
168
169   return verbosity_mask;
170}
171
172// ---------------------------------------------------------------------------
173
174U32 sci_logger_get_object_mask(
175   SCI_LOGGER_HANDLE_T  logger,
176   U8                   verbosity
177)
178{
179   // Ensure that a supported verbosity level was supplied.
180   if (  (SCI_LOG_VERBOSITY_ERROR == verbosity)
181      || (SCI_LOG_VERBOSITY_WARNING == verbosity)
182      || (SCI_LOG_VERBOSITY_INFO == verbosity)
183      || (SCI_LOG_VERBOSITY_TRACE == verbosity)
184      || (SCI_LOG_VERBOSITY_STATES == verbosity) )
185   {
186      return SCI_LOGGER_GET_OBJECT_MASK(logger, verbosity);
187   }
188
189   // An unsupported verbosity level was supplied.  Simply return an empty
190   // log object mask.
191   return 0;
192}
193
194// ---------------------------------------------------------------------------
195
196void sci_logger_enable(
197   SCI_LOGGER_HANDLE_T  logger,
198   U32                  log_object_mask,
199   U8                   verbosity_mask
200)
201{
202   sci_base_logger_enable_log_object(
203      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_ERROR
204   );
205
206   sci_base_logger_enable_log_object(
207      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_WARNING
208   );
209
210   sci_base_logger_enable_log_object(
211      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_INFO
212   );
213
214   sci_base_logger_enable_log_object(
215      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_TRACE
216   );
217
218   sci_base_logger_enable_log_object(
219      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_STATES
220   );
221}
222
223// ---------------------------------------------------------------------------
224
225void sci_logger_disable(
226   SCI_LOGGER_HANDLE_T  logger,
227   U32                  log_object_mask,
228   U8                   verbosity_mask
229)
230{
231   sci_base_logger_disable_log_object(
232      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_ERROR
233   );
234
235   sci_base_logger_disable_log_object(
236      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_WARNING
237   );
238
239   sci_base_logger_disable_log_object(
240      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_INFO
241   );
242
243   sci_base_logger_disable_log_object(
244      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_TRACE
245   );
246
247   sci_base_logger_disable_log_object(
248      logger, log_object_mask, verbosity_mask, SCI_LOG_VERBOSITY_STATES
249   );
250}
251
252// ---------------------------------------------------------------------------
253
254BOOL sci_logger_is_enabled(
255   SCI_LOGGER_HANDLE_T  logger,
256   U32                  log_object_mask,
257   U8                   verbosity_level
258)
259{
260   SCI_BASE_LOGGER_T * base_logger = (SCI_BASE_LOGGER_T*) logger;
261
262   if (  (base_logger->verbosity_mask & (1<<verbosity_level))
263      && (base_logger->object_mask[verbosity_level] & log_object_mask) )
264      return TRUE;
265
266   return FALSE;
267}
268
269//******************************************************************************
270//* P R O T E C T E D   M E T H O D S
271//******************************************************************************
272
273void sci_base_logger_construct(
274   SCI_BASE_LOGGER_T *this_logger
275)
276{
277   int index;
278
279   sci_base_object_construct(
280      &this_logger->parent, this_logger
281   );
282
283   this_logger->verbosity_mask = 0;
284
285   for (index = 0; index < SCI_BASE_LOGGER_MAX_VERBOSITY_LEVELS; index++)
286   {
287      this_logger->object_mask[index] = 0;
288   }
289}
290
291#endif // SCI_LOGGING
292