Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[pandora-kernel.git] / drivers / acpi / acpica / utxferror.c
1 /*******************************************************************************
2  *
3  * Module Name: utxferror - Various error/warning output functions
4  *
5  ******************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2011, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44 #include <linux/export.h>
45 #include <acpi/acpi.h>
46 #include "accommon.h"
47 #include "acnamesp.h"
48
49 #define _COMPONENT          ACPI_UTILITIES
50 ACPI_MODULE_NAME("utxferror")
51
52 /*
53  * This module is used for the in-kernel ACPICA as well as the ACPICA
54  * tools/applications.
55  *
56  * For the i_aSL compiler case, the output is redirected to stderr so that
57  * any of the various ACPI errors and warnings do not appear in the output
58  * files, for either the compiler or disassembler portions of the tool.
59  */
60 #ifdef ACPI_ASL_COMPILER
61 #include <stdio.h>
62 extern FILE *acpi_gbl_output_file;
63
64 #define ACPI_MSG_REDIRECT_BEGIN \
65         FILE                            *output_file = acpi_gbl_output_file; \
66         acpi_os_redirect_output (stderr);
67
68 #define ACPI_MSG_REDIRECT_END \
69         acpi_os_redirect_output (output_file);
70
71 #else
72 /*
73  * non-i_aSL case - no redirection, nothing to do
74  */
75 #define ACPI_MSG_REDIRECT_BEGIN
76 #define ACPI_MSG_REDIRECT_END
77 #endif
78 /*
79  * Common message prefixes
80  */
81 #define ACPI_MSG_ERROR          "ACPI Error: "
82 #define ACPI_MSG_EXCEPTION      "ACPI Exception: "
83 #define ACPI_MSG_WARNING        "ACPI Warning: "
84 #define ACPI_MSG_INFO           "ACPI: "
85 /*
86  * Common message suffix
87  */
88 #define ACPI_MSG_SUFFIX \
89         acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
90 /*******************************************************************************
91  *
92  * FUNCTION:    acpi_error
93  *
94  * PARAMETERS:  module_name         - Caller's module name (for error output)
95  *              line_number         - Caller's line number (for error output)
96  *              Format              - Printf format string + additional args
97  *
98  * RETURN:      None
99  *
100  * DESCRIPTION: Print "ACPI Error" message with module/line/version info
101  *
102  ******************************************************************************/
103 void ACPI_INTERNAL_VAR_XFACE
104 acpi_error(const char *module_name, u32 line_number, const char *format, ...)
105 {
106         va_list arg_list;
107
108         ACPI_MSG_REDIRECT_BEGIN;
109         acpi_os_printf(ACPI_MSG_ERROR);
110
111         va_start(arg_list, format);
112         acpi_os_vprintf(format, arg_list);
113         ACPI_MSG_SUFFIX;
114         va_end(arg_list);
115
116         ACPI_MSG_REDIRECT_END;
117 }
118
119 ACPI_EXPORT_SYMBOL(acpi_error)
120
121 /*******************************************************************************
122  *
123  * FUNCTION:    acpi_exception
124  *
125  * PARAMETERS:  module_name         - Caller's module name (for error output)
126  *              line_number         - Caller's line number (for error output)
127  *              Status              - Status to be formatted
128  *              Format              - Printf format string + additional args
129  *
130  * RETURN:      None
131  *
132  * DESCRIPTION: Print "ACPI Exception" message with module/line/version info
133  *              and decoded acpi_status.
134  *
135  ******************************************************************************/
136 void ACPI_INTERNAL_VAR_XFACE
137 acpi_exception(const char *module_name,
138                u32 line_number, acpi_status status, const char *format, ...)
139 {
140         va_list arg_list;
141
142         ACPI_MSG_REDIRECT_BEGIN;
143         acpi_os_printf(ACPI_MSG_EXCEPTION "%s, ",
144                        acpi_format_exception(status));
145
146         va_start(arg_list, format);
147         acpi_os_vprintf(format, arg_list);
148         ACPI_MSG_SUFFIX;
149         va_end(arg_list);
150
151         ACPI_MSG_REDIRECT_END;
152 }
153
154 ACPI_EXPORT_SYMBOL(acpi_exception)
155
156 /*******************************************************************************
157  *
158  * FUNCTION:    acpi_warning
159  *
160  * PARAMETERS:  module_name         - Caller's module name (for error output)
161  *              line_number         - Caller's line number (for error output)
162  *              Format              - Printf format string + additional args
163  *
164  * RETURN:      None
165  *
166  * DESCRIPTION: Print "ACPI Warning" message with module/line/version info
167  *
168  ******************************************************************************/
169 void ACPI_INTERNAL_VAR_XFACE
170 acpi_warning(const char *module_name, u32 line_number, const char *format, ...)
171 {
172         va_list arg_list;
173
174         ACPI_MSG_REDIRECT_BEGIN;
175         acpi_os_printf(ACPI_MSG_WARNING);
176
177         va_start(arg_list, format);
178         acpi_os_vprintf(format, arg_list);
179         ACPI_MSG_SUFFIX;
180         va_end(arg_list);
181
182         ACPI_MSG_REDIRECT_END;
183 }
184
185 ACPI_EXPORT_SYMBOL(acpi_warning)
186
187 /*******************************************************************************
188  *
189  * FUNCTION:    acpi_info
190  *
191  * PARAMETERS:  module_name         - Caller's module name (for error output)
192  *              line_number         - Caller's line number (for error output)
193  *              Format              - Printf format string + additional args
194  *
195  * RETURN:      None
196  *
197  * DESCRIPTION: Print generic "ACPI:" information message. There is no
198  *              module/line/version info in order to keep the message simple.
199  *
200  * TBD: module_name and line_number args are not needed, should be removed.
201  *
202  ******************************************************************************/
203 void ACPI_INTERNAL_VAR_XFACE
204 acpi_info(const char *module_name, u32 line_number, const char *format, ...)
205 {
206         va_list arg_list;
207
208         ACPI_MSG_REDIRECT_BEGIN;
209         acpi_os_printf(ACPI_MSG_INFO);
210
211         va_start(arg_list, format);
212         acpi_os_vprintf(format, arg_list);
213         acpi_os_printf("\n");
214         va_end(arg_list);
215
216         ACPI_MSG_REDIRECT_END;
217 }
218
219 ACPI_EXPORT_SYMBOL(acpi_info)
220
221 /*
222  * The remainder of this module contains internal error functions that may
223  * be configured out.
224  */
225 #if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
226 /*******************************************************************************
227  *
228  * FUNCTION:    acpi_ut_predefined_warning
229  *
230  * PARAMETERS:  module_name     - Caller's module name (for error output)
231  *              line_number     - Caller's line number (for error output)
232  *              Pathname        - Full pathname to the node
233  *              node_flags      - From Namespace node for the method/object
234  *              Format          - Printf format string + additional args
235  *
236  * RETURN:      None
237  *
238  * DESCRIPTION: Warnings for the predefined validation module. Messages are
239  *              only emitted the first time a problem with a particular
240  *              method/object is detected. This prevents a flood of error
241  *              messages for methods that are repeatedly evaluated.
242  *
243  ******************************************************************************/
244 void ACPI_INTERNAL_VAR_XFACE
245 acpi_ut_predefined_warning(const char *module_name,
246                            u32 line_number,
247                            char *pathname,
248                            u8 node_flags, const char *format, ...)
249 {
250         va_list arg_list;
251
252         /*
253          * Warning messages for this method/object will be disabled after the
254          * first time a validation fails or an object is successfully repaired.
255          */
256         if (node_flags & ANOBJ_EVALUATED) {
257                 return;
258         }
259
260         acpi_os_printf(ACPI_MSG_WARNING "For %s: ", pathname);
261
262         va_start(arg_list, format);
263         acpi_os_vprintf(format, arg_list);
264         ACPI_MSG_SUFFIX;
265         va_end(arg_list);
266 }
267
268 /*******************************************************************************
269  *
270  * FUNCTION:    acpi_ut_predefined_info
271  *
272  * PARAMETERS:  module_name     - Caller's module name (for error output)
273  *              line_number     - Caller's line number (for error output)
274  *              Pathname        - Full pathname to the node
275  *              node_flags      - From Namespace node for the method/object
276  *              Format          - Printf format string + additional args
277  *
278  * RETURN:      None
279  *
280  * DESCRIPTION: Info messages for the predefined validation module. Messages
281  *              are only emitted the first time a problem with a particular
282  *              method/object is detected. This prevents a flood of
283  *              messages for methods that are repeatedly evaluated.
284  *
285  ******************************************************************************/
286
287 void ACPI_INTERNAL_VAR_XFACE
288 acpi_ut_predefined_info(const char *module_name,
289                         u32 line_number,
290                         char *pathname, u8 node_flags, const char *format, ...)
291 {
292         va_list arg_list;
293
294         /*
295          * Warning messages for this method/object will be disabled after the
296          * first time a validation fails or an object is successfully repaired.
297          */
298         if (node_flags & ANOBJ_EVALUATED) {
299                 return;
300         }
301
302         acpi_os_printf(ACPI_MSG_INFO "For %s: ", pathname);
303
304         va_start(arg_list, format);
305         acpi_os_vprintf(format, arg_list);
306         ACPI_MSG_SUFFIX;
307         va_end(arg_list);
308 }
309
310 /*******************************************************************************
311  *
312  * FUNCTION:    acpi_ut_namespace_error
313  *
314  * PARAMETERS:  module_name         - Caller's module name (for error output)
315  *              line_number         - Caller's line number (for error output)
316  *              internal_name       - Name or path of the namespace node
317  *              lookup_status       - Exception code from NS lookup
318  *
319  * RETURN:      None
320  *
321  * DESCRIPTION: Print error message with the full pathname for the NS node.
322  *
323  ******************************************************************************/
324
325 void
326 acpi_ut_namespace_error(const char *module_name,
327                         u32 line_number,
328                         const char *internal_name, acpi_status lookup_status)
329 {
330         acpi_status status;
331         u32 bad_name;
332         char *name = NULL;
333
334         ACPI_MSG_REDIRECT_BEGIN;
335         acpi_os_printf(ACPI_MSG_ERROR);
336
337         if (lookup_status == AE_BAD_CHARACTER) {
338
339                 /* There is a non-ascii character in the name */
340
341                 ACPI_MOVE_32_TO_32(&bad_name,
342                                    ACPI_CAST_PTR(u32, internal_name));
343                 acpi_os_printf("[0x%4.4X] (NON-ASCII)", bad_name);
344         } else {
345                 /* Convert path to external format */
346
347                 status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
348                                                   internal_name, NULL, &name);
349
350                 /* Print target name */
351
352                 if (ACPI_SUCCESS(status)) {
353                         acpi_os_printf("[%s]", name);
354                 } else {
355                         acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
356                 }
357
358                 if (name) {
359                         ACPI_FREE(name);
360                 }
361         }
362
363         acpi_os_printf(" Namespace lookup failure, %s",
364                        acpi_format_exception(lookup_status));
365
366         ACPI_MSG_SUFFIX;
367         ACPI_MSG_REDIRECT_END;
368 }
369
370 /*******************************************************************************
371  *
372  * FUNCTION:    acpi_ut_method_error
373  *
374  * PARAMETERS:  module_name         - Caller's module name (for error output)
375  *              line_number         - Caller's line number (for error output)
376  *              Message             - Error message to use on failure
377  *              prefix_node         - Prefix relative to the path
378  *              Path                - Path to the node (optional)
379  *              method_status       - Execution status
380  *
381  * RETURN:      None
382  *
383  * DESCRIPTION: Print error message with the full pathname for the method.
384  *
385  ******************************************************************************/
386
387 void
388 acpi_ut_method_error(const char *module_name,
389                      u32 line_number,
390                      const char *message,
391                      struct acpi_namespace_node *prefix_node,
392                      const char *path, acpi_status method_status)
393 {
394         acpi_status status;
395         struct acpi_namespace_node *node = prefix_node;
396
397         ACPI_MSG_REDIRECT_BEGIN;
398         acpi_os_printf(ACPI_MSG_ERROR);
399
400         if (path) {
401                 status =
402                     acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
403                                      &node);
404                 if (ACPI_FAILURE(status)) {
405                         acpi_os_printf("[Could not get node by pathname]");
406                 }
407         }
408
409         acpi_ns_print_node_pathname(node, message);
410         acpi_os_printf(", %s", acpi_format_exception(method_status));
411
412         ACPI_MSG_SUFFIX;
413         ACPI_MSG_REDIRECT_END;
414 }
415
416 #endif                          /* ACPI_NO_ERROR_MESSAGES */