Merge tag 'pm-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
[sfrench/cifs-2.6.git] / drivers / acpi / acpica / uterror.c
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*******************************************************************************
3  *
4  * Module Name: uterror - Various internal error/warning output functions
5  *
6  ******************************************************************************/
7
8 #include <acpi/acpi.h>
9 #include "accommon.h"
10 #include "acnamesp.h"
11
12 #define _COMPONENT          ACPI_UTILITIES
13 ACPI_MODULE_NAME("uterror")
14
15 /*
16  * This module contains internal error functions that may
17  * be configured out.
18  */
19 #if !defined (ACPI_NO_ERROR_MESSAGES)
20 /*******************************************************************************
21  *
22  * FUNCTION:    acpi_ut_predefined_warning
23  *
24  * PARAMETERS:  module_name     - Caller's module name (for error output)
25  *              line_number     - Caller's line number (for error output)
26  *              pathname        - Full pathname to the node
27  *              node_flags      - From Namespace node for the method/object
28  *              format          - Printf format string + additional args
29  *
30  * RETURN:      None
31  *
32  * DESCRIPTION: Warnings for the predefined validation module. Messages are
33  *              only emitted the first time a problem with a particular
34  *              method/object is detected. This prevents a flood of error
35  *              messages for methods that are repeatedly evaluated.
36  *
37  ******************************************************************************/
38 void ACPI_INTERNAL_VAR_XFACE
39 acpi_ut_predefined_warning(const char *module_name,
40                            u32 line_number,
41                            char *pathname,
42                            u8 node_flags, const char *format, ...)
43 {
44         va_list arg_list;
45
46         /*
47          * Warning messages for this method/object will be disabled after the
48          * first time a validation fails or an object is successfully repaired.
49          */
50         if (node_flags & ANOBJ_EVALUATED) {
51                 return;
52         }
53
54         acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
55
56         va_start(arg_list, format);
57         acpi_os_vprintf(format, arg_list);
58         ACPI_MSG_SUFFIX;
59         va_end(arg_list);
60 }
61
62 /*******************************************************************************
63  *
64  * FUNCTION:    acpi_ut_predefined_info
65  *
66  * PARAMETERS:  module_name     - Caller's module name (for error output)
67  *              line_number     - Caller's line number (for error output)
68  *              pathname        - Full pathname to the node
69  *              node_flags      - From Namespace node for the method/object
70  *              format          - Printf format string + additional args
71  *
72  * RETURN:      None
73  *
74  * DESCRIPTION: Info messages for the predefined validation module. Messages
75  *              are only emitted the first time a problem with a particular
76  *              method/object is detected. This prevents a flood of
77  *              messages for methods that are repeatedly evaluated.
78  *
79  ******************************************************************************/
80
81 void ACPI_INTERNAL_VAR_XFACE
82 acpi_ut_predefined_info(const char *module_name,
83                         u32 line_number,
84                         char *pathname, u8 node_flags, const char *format, ...)
85 {
86         va_list arg_list;
87
88         /*
89          * Warning messages for this method/object will be disabled after the
90          * first time a validation fails or an object is successfully repaired.
91          */
92         if (node_flags & ANOBJ_EVALUATED) {
93                 return;
94         }
95
96         acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
97
98         va_start(arg_list, format);
99         acpi_os_vprintf(format, arg_list);
100         ACPI_MSG_SUFFIX;
101         va_end(arg_list);
102 }
103
104 /*******************************************************************************
105  *
106  * FUNCTION:    acpi_ut_predefined_bios_error
107  *
108  * PARAMETERS:  module_name     - Caller's module name (for error output)
109  *              line_number     - Caller's line number (for error output)
110  *              pathname        - Full pathname to the node
111  *              node_flags      - From Namespace node for the method/object
112  *              format          - Printf format string + additional args
113  *
114  * RETURN:      None
115  *
116  * DESCRIPTION: BIOS error message for predefined names. Messages
117  *              are only emitted the first time a problem with a particular
118  *              method/object is detected. This prevents a flood of
119  *              messages for methods that are repeatedly evaluated.
120  *
121  ******************************************************************************/
122
123 void ACPI_INTERNAL_VAR_XFACE
124 acpi_ut_predefined_bios_error(const char *module_name,
125                               u32 line_number,
126                               char *pathname,
127                               u8 node_flags, const char *format, ...)
128 {
129         va_list arg_list;
130
131         /*
132          * Warning messages for this method/object will be disabled after the
133          * first time a validation fails or an object is successfully repaired.
134          */
135         if (node_flags & ANOBJ_EVALUATED) {
136                 return;
137         }
138
139         acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
140
141         va_start(arg_list, format);
142         acpi_os_vprintf(format, arg_list);
143         ACPI_MSG_SUFFIX;
144         va_end(arg_list);
145 }
146
147 /*******************************************************************************
148  *
149  * FUNCTION:    acpi_ut_prefixed_namespace_error
150  *
151  * PARAMETERS:  module_name         - Caller's module name (for error output)
152  *              line_number         - Caller's line number (for error output)
153  *              prefix_scope        - Scope/Path that prefixes the internal path
154  *              internal_path       - Name or path of the namespace node
155  *              lookup_status       - Exception code from NS lookup
156  *
157  * RETURN:      None
158  *
159  * DESCRIPTION: Print error message with the full pathname constructed this way:
160  *
161  *                  prefix_scope_node_full_path.externalized_internal_path
162  *
163  * NOTE:        10/2017: Treat the major ns_lookup errors as firmware errors
164  *
165  ******************************************************************************/
166
167 void
168 acpi_ut_prefixed_namespace_error(const char *module_name,
169                                  u32 line_number,
170                                  union acpi_generic_state *prefix_scope,
171                                  const char *internal_path,
172                                  acpi_status lookup_status)
173 {
174         char *full_path;
175         const char *message;
176
177         /*
178          * Main cases:
179          * 1) Object creation, object must not already exist
180          * 2) Object lookup, object must exist
181          */
182         switch (lookup_status) {
183         case AE_ALREADY_EXISTS:
184
185                 acpi_os_printf(ACPI_MSG_BIOS_ERROR);
186                 message = "Failure creating";
187                 break;
188
189         case AE_NOT_FOUND:
190
191                 acpi_os_printf(ACPI_MSG_BIOS_ERROR);
192                 message = "Could not resolve";
193                 break;
194
195         default:
196
197                 acpi_os_printf(ACPI_MSG_ERROR);
198                 message = "Failure resolving";
199                 break;
200         }
201
202         /* Concatenate the prefix path and the internal path */
203
204         full_path =
205             acpi_ns_build_prefixed_pathname(prefix_scope, internal_path);
206
207         acpi_os_printf("%s [%s], %s", message,
208                        full_path ? full_path : "Could not get pathname",
209                        acpi_format_exception(lookup_status));
210
211         if (full_path) {
212                 ACPI_FREE(full_path);
213         }
214
215         ACPI_MSG_SUFFIX;
216 }
217
218 #ifdef __OBSOLETE_FUNCTION
219 /*******************************************************************************
220  *
221  * FUNCTION:    acpi_ut_namespace_error
222  *
223  * PARAMETERS:  module_name         - Caller's module name (for error output)
224  *              line_number         - Caller's line number (for error output)
225  *              internal_name       - Name or path of the namespace node
226  *              lookup_status       - Exception code from NS lookup
227  *
228  * RETURN:      None
229  *
230  * DESCRIPTION: Print error message with the full pathname for the NS node.
231  *
232  ******************************************************************************/
233
234 void
235 acpi_ut_namespace_error(const char *module_name,
236                         u32 line_number,
237                         const char *internal_name, acpi_status lookup_status)
238 {
239         acpi_status status;
240         u32 bad_name;
241         char *name = NULL;
242
243         ACPI_MSG_REDIRECT_BEGIN;
244         acpi_os_printf(ACPI_MSG_ERROR);
245
246         if (lookup_status == AE_BAD_CHARACTER) {
247
248                 /* There is a non-ascii character in the name */
249
250                 ACPI_MOVE_32_TO_32(&bad_name,
251                                    ACPI_CAST_PTR(u32, internal_name));
252                 acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
253         } else {
254                 /* Convert path to external format */
255
256                 status =
257                     acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
258                                              NULL, &name);
259
260                 /* Print target name */
261
262                 if (ACPI_SUCCESS(status)) {
263                         acpi_os_printf("[%s]", name);
264                 } else {
265                         acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
266                 }
267
268                 if (name) {
269                         ACPI_FREE(name);
270                 }
271         }
272
273         acpi_os_printf(" Namespace lookup failure, %s",
274                        acpi_format_exception(lookup_status));
275
276         ACPI_MSG_SUFFIX;
277         ACPI_MSG_REDIRECT_END;
278 }
279 #endif
280
281 /*******************************************************************************
282  *
283  * FUNCTION:    acpi_ut_method_error
284  *
285  * PARAMETERS:  module_name         - Caller's module name (for error output)
286  *              line_number         - Caller's line number (for error output)
287  *              message             - Error message to use on failure
288  *              prefix_node         - Prefix relative to the path
289  *              path                - Path to the node (optional)
290  *              method_status       - Execution status
291  *
292  * RETURN:      None
293  *
294  * DESCRIPTION: Print error message with the full pathname for the method.
295  *
296  ******************************************************************************/
297
298 void
299 acpi_ut_method_error(const char *module_name,
300                      u32 line_number,
301                      const char *message,
302                      struct acpi_namespace_node *prefix_node,
303                      const char *path, acpi_status method_status)
304 {
305         acpi_status status;
306         struct acpi_namespace_node *node = prefix_node;
307
308         ACPI_MSG_REDIRECT_BEGIN;
309         acpi_os_printf(ACPI_MSG_ERROR);
310
311         if (path) {
312                 status = acpi_ns_get_node(prefix_node, path,
313                                           ACPI_NS_NO_UPSEARCH, &node);
314                 if (ACPI_FAILURE(status)) {
315                         acpi_os_printf("[Could not get node by pathname]");
316                 }
317         }
318
319         acpi_ns_print_node_pathname(node, message);
320         acpi_os_printf(", %s", acpi_format_exception(method_status));
321
322         ACPI_MSG_SUFFIX;
323         ACPI_MSG_REDIRECT_END;
324 }
325
326 #endif                          /* ACPI_NO_ERROR_MESSAGES */