aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/namespace/nsutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/namespace/nsutils.c')
-rw-r--r--drivers/acpi/namespace/nsutils.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c
index 3e7cad549a38..aa4e799d9a8c 100644
--- a/drivers/acpi/namespace/nsutils.c
+++ b/drivers/acpi/namespace/nsutils.c
@@ -78,15 +78,17 @@ acpi_ns_report_error(char *module_name,
78 char *internal_name, acpi_status lookup_status) 78 char *internal_name, acpi_status lookup_status)
79{ 79{
80 acpi_status status; 80 acpi_status status;
81 u32 bad_name;
81 char *name = NULL; 82 char *name = NULL;
82 83
83 acpi_ut_report_error(module_name, line_number); 84 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
84 85
85 if (lookup_status == AE_BAD_CHARACTER) { 86 if (lookup_status == AE_BAD_CHARACTER) {
87
86 /* There is a non-ascii character in the name */ 88 /* There is a non-ascii character in the name */
87 89
88 acpi_os_printf("[0x%4.4X] (NON-ASCII)", 90 ACPI_MOVE_32_TO_32(&bad_name, internal_name);
89 *(ACPI_CAST_PTR(u32, internal_name))); 91 acpi_os_printf("[0x%4.4X] (NON-ASCII)", bad_name);
90 } else { 92 } else {
91 /* Convert path to external format */ 93 /* Convert path to external format */
92 94
@@ -102,7 +104,7 @@ acpi_ns_report_error(char *module_name,
102 } 104 }
103 105
104 if (name) { 106 if (name) {
105 ACPI_MEM_FREE(name); 107 ACPI_FREE(name);
106 } 108 }
107 } 109 }
108 110
@@ -137,11 +139,12 @@ acpi_ns_report_method_error(char *module_name,
137 acpi_status status; 139 acpi_status status;
138 struct acpi_namespace_node *node = prefix_node; 140 struct acpi_namespace_node *node = prefix_node;
139 141
140 acpi_ut_report_error(module_name, line_number); 142 acpi_os_printf("ACPI Error (%s-%04d): ", module_name, line_number);
141 143
142 if (path) { 144 if (path) {
143 status = acpi_ns_get_node_by_path(path, prefix_node, 145 status =
144 ACPI_NS_NO_UPSEARCH, &node); 146 acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
147 &node);
145 if (ACPI_FAILURE(status)) { 148 if (ACPI_FAILURE(status)) {
146 acpi_os_printf("[Could not get node by pathname]"); 149 acpi_os_printf("[Could not get node by pathname]");
147 } 150 }
@@ -185,7 +188,7 @@ acpi_ns_print_node_pathname(struct acpi_namespace_node *node, char *message)
185 } 188 }
186 189
187 acpi_os_printf("[%s] (Node %p)", (char *)buffer.pointer, node); 190 acpi_os_printf("[%s] (Node %p)", (char *)buffer.pointer, node);
188 ACPI_MEM_FREE(buffer.pointer); 191 ACPI_FREE(buffer.pointer);
189 } 192 }
190} 193}
191 194
@@ -239,7 +242,7 @@ static u8 acpi_ns_valid_path_separator(char sep)
239 242
240acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node) 243acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
241{ 244{
242 ACPI_FUNCTION_TRACE("ns_get_type"); 245 ACPI_FUNCTION_TRACE(ns_get_type);
243 246
244 if (!node) { 247 if (!node) {
245 ACPI_WARNING((AE_INFO, "Null Node parameter")); 248 ACPI_WARNING((AE_INFO, "Null Node parameter"));
@@ -264,9 +267,10 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
264 267
265u32 acpi_ns_local(acpi_object_type type) 268u32 acpi_ns_local(acpi_object_type type)
266{ 269{
267 ACPI_FUNCTION_TRACE("ns_local"); 270 ACPI_FUNCTION_TRACE(ns_local);
268 271
269 if (!acpi_ut_valid_object_type(type)) { 272 if (!acpi_ut_valid_object_type(type)) {
273
270 /* Type code out of range */ 274 /* Type code out of range */
271 275
272 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type)); 276 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
@@ -363,7 +367,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
363 char *result = NULL; 367 char *result = NULL;
364 acpi_native_uint i; 368 acpi_native_uint i;
365 369
366 ACPI_FUNCTION_TRACE("ns_build_internal_name"); 370 ACPI_FUNCTION_TRACE(ns_build_internal_name);
367 371
368 /* Setup the correct prefixes, counts, and pointers */ 372 /* Setup the correct prefixes, counts, and pointers */
369 373
@@ -411,6 +415,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
411 for (i = 0; i < ACPI_NAME_SIZE; i++) { 415 for (i = 0; i < ACPI_NAME_SIZE; i++) {
412 if (acpi_ns_valid_path_separator(*external_name) || 416 if (acpi_ns_valid_path_separator(*external_name) ||
413 (*external_name == 0)) { 417 (*external_name == 0)) {
418
414 /* Pad the segment with underscore(s) if segment is short */ 419 /* Pad the segment with underscore(s) if segment is short */
415 420
416 result[i] = '_'; 421 result[i] = '_';
@@ -473,7 +478,7 @@ acpi_status acpi_ns_internalize_name(char *external_name, char **converted_name)
473 struct acpi_namestring_info info; 478 struct acpi_namestring_info info;
474 acpi_status status; 479 acpi_status status;
475 480
476 ACPI_FUNCTION_TRACE("ns_internalize_name"); 481 ACPI_FUNCTION_TRACE(ns_internalize_name);
477 482
478 if ((!external_name) || (*external_name == 0) || (!converted_name)) { 483 if ((!external_name) || (*external_name == 0) || (!converted_name)) {
479 return_ACPI_STATUS(AE_BAD_PARAMETER); 484 return_ACPI_STATUS(AE_BAD_PARAMETER);
@@ -486,7 +491,7 @@ acpi_status acpi_ns_internalize_name(char *external_name, char **converted_name)
486 491
487 /* We need a segment to store the internal name */ 492 /* We need a segment to store the internal name */
488 493
489 internal_name = ACPI_MEM_CALLOCATE(info.length); 494 internal_name = ACPI_ALLOCATE_ZEROED(info.length);
490 if (!internal_name) { 495 if (!internal_name) {
491 return_ACPI_STATUS(AE_NO_MEMORY); 496 return_ACPI_STATUS(AE_NO_MEMORY);
492 } 497 }
@@ -496,7 +501,7 @@ acpi_status acpi_ns_internalize_name(char *external_name, char **converted_name)
496 info.internal_name = internal_name; 501 info.internal_name = internal_name;
497 status = acpi_ns_build_internal_name(&info); 502 status = acpi_ns_build_internal_name(&info);
498 if (ACPI_FAILURE(status)) { 503 if (ACPI_FAILURE(status)) {
499 ACPI_MEM_FREE(internal_name); 504 ACPI_FREE(internal_name);
500 return_ACPI_STATUS(status); 505 return_ACPI_STATUS(status);
501 } 506 }
502 507
@@ -533,7 +538,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
533 acpi_native_uint i = 0; 538 acpi_native_uint i = 0;
534 acpi_native_uint j = 0; 539 acpi_native_uint j = 0;
535 540
536 ACPI_FUNCTION_TRACE("ns_externalize_name"); 541 ACPI_FUNCTION_TRACE(ns_externalize_name);
537 542
538 if (!internal_name_length || !internal_name || !converted_name) { 543 if (!internal_name_length || !internal_name || !converted_name) {
539 return_ACPI_STATUS(AE_BAD_PARAMETER); 544 return_ACPI_STATUS(AE_BAD_PARAMETER);
@@ -628,7 +633,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
628 /* 633 /*
629 * Build converted_name 634 * Build converted_name
630 */ 635 */
631 *converted_name = ACPI_MEM_CALLOCATE(required_length); 636 *converted_name = ACPI_ALLOCATE_ZEROED(required_length);
632 if (!(*converted_name)) { 637 if (!(*converted_name)) {
633 return_ACPI_STATUS(AE_NO_MEMORY); 638 return_ACPI_STATUS(AE_NO_MEMORY);
634 } 639 }
@@ -681,13 +686,9 @@ struct acpi_namespace_node *acpi_ns_map_handle_to_node(acpi_handle handle)
681 ACPI_FUNCTION_ENTRY(); 686 ACPI_FUNCTION_ENTRY();
682 687
683 /* 688 /*
684 * Simple implementation. 689 * Simple implementation
685 */ 690 */
686 if (!handle) { 691 if ((!handle) || (handle == ACPI_ROOT_OBJECT)) {
687 return (NULL);
688 }
689
690 if (handle == ACPI_ROOT_OBJECT) {
691 return (acpi_gbl_root_node); 692 return (acpi_gbl_root_node);
692 } 693 }
693 694
@@ -697,7 +698,7 @@ struct acpi_namespace_node *acpi_ns_map_handle_to_node(acpi_handle handle)
697 return (NULL); 698 return (NULL);
698 } 699 }
699 700
700 return ((struct acpi_namespace_node *)handle); 701 return (ACPI_CAST_PTR(struct acpi_namespace_node, handle));
701} 702}
702 703
703/******************************************************************************* 704/*******************************************************************************
@@ -752,7 +753,7 @@ void acpi_ns_terminate(void)
752{ 753{
753 union acpi_operand_object *obj_desc; 754 union acpi_operand_object *obj_desc;
754 755
755 ACPI_FUNCTION_TRACE("ns_terminate"); 756 ACPI_FUNCTION_TRACE(ns_terminate);
756 757
757 /* 758 /*
758 * 1) Free the entire namespace -- all nodes and objects 759 * 1) Free the entire namespace -- all nodes and objects
@@ -792,9 +793,10 @@ void acpi_ns_terminate(void)
792 793
793u32 acpi_ns_opens_scope(acpi_object_type type) 794u32 acpi_ns_opens_scope(acpi_object_type type)
794{ 795{
795 ACPI_FUNCTION_TRACE_STR("ns_opens_scope", acpi_ut_get_type_name(type)); 796 ACPI_FUNCTION_TRACE_STR(ns_opens_scope, acpi_ut_get_type_name(type));
796 797
797 if (!acpi_ut_valid_object_type(type)) { 798 if (!acpi_ut_valid_object_type(type)) {
799
798 /* type code out of range */ 800 /* type code out of range */
799 801
800 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type)); 802 ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type));
@@ -806,12 +808,12 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
806 808
807/******************************************************************************* 809/*******************************************************************************
808 * 810 *
809 * FUNCTION: acpi_ns_get_node_by_path 811 * FUNCTION: acpi_ns_get_node
810 * 812 *
811 * PARAMETERS: *Pathname - Name to be found, in external (ASL) format. The 813 * PARAMETERS: *Pathname - Name to be found, in external (ASL) format. The
812 * \ (backslash) and ^ (carat) prefixes, and the 814 * \ (backslash) and ^ (carat) prefixes, and the
813 * . (period) to separate segments are supported. 815 * . (period) to separate segments are supported.
814 * start_node - Root of subtree to be searched, or NS_ALL for the 816 * prefix_node - Root of subtree to be searched, or NS_ALL for the
815 * root of the name space. If Name is fully 817 * root of the name space. If Name is fully
816 * qualified (first s8 is '\'), the passed value 818 * qualified (first s8 is '\'), the passed value
817 * of Scope will not be accessed. 819 * of Scope will not be accessed.
@@ -827,23 +829,29 @@ u32 acpi_ns_opens_scope(acpi_object_type type)
827 ******************************************************************************/ 829 ******************************************************************************/
828 830
829acpi_status 831acpi_status
830acpi_ns_get_node_by_path(char *pathname, 832acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
831 struct acpi_namespace_node *start_node, 833 char *pathname,
832 u32 flags, struct acpi_namespace_node **return_node) 834 u32 flags, struct acpi_namespace_node **return_node)
833{ 835{
834 union acpi_generic_state scope_info; 836 union acpi_generic_state scope_info;
835 acpi_status status; 837 acpi_status status;
836 char *internal_path = NULL; 838 char *internal_path;
837
838 ACPI_FUNCTION_TRACE_PTR("ns_get_node_by_path", pathname);
839 839
840 if (pathname) { 840 ACPI_FUNCTION_TRACE_PTR(ns_get_node, pathname);
841 /* Convert path to internal representation */
842 841
843 status = acpi_ns_internalize_name(pathname, &internal_path); 842 if (!pathname) {
844 if (ACPI_FAILURE(status)) { 843 *return_node = prefix_node;
845 return_ACPI_STATUS(status); 844 if (!prefix_node) {
845 *return_node = acpi_gbl_root_node;
846 } 846 }
847 return_ACPI_STATUS(AE_OK);
848 }
849
850 /* Convert path to internal representation */
851
852 status = acpi_ns_internalize_name(pathname, &internal_path);
853 if (ACPI_FAILURE(status)) {
854 return_ACPI_STATUS(status);
847 } 855 }
848 856
849 /* Must lock namespace during lookup */ 857 /* Must lock namespace during lookup */
@@ -855,26 +863,23 @@ acpi_ns_get_node_by_path(char *pathname,
855 863
856 /* Setup lookup scope (search starting point) */ 864 /* Setup lookup scope (search starting point) */
857 865
858 scope_info.scope.node = start_node; 866 scope_info.scope.node = prefix_node;
859 867
860 /* Lookup the name in the namespace */ 868 /* Lookup the name in the namespace */
861 869
862 status = acpi_ns_lookup(&scope_info, internal_path, 870 status = acpi_ns_lookup(&scope_info, internal_path, ACPI_TYPE_ANY,
863 ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 871 ACPI_IMODE_EXECUTE,
864 (flags | ACPI_NS_DONT_OPEN_SCOPE), 872 (flags | ACPI_NS_DONT_OPEN_SCOPE), NULL,
865 NULL, return_node); 873 return_node);
866 if (ACPI_FAILURE(status)) { 874 if (ACPI_FAILURE(status)) {
867 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s, %s\n", 875 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "%s, %s\n",
868 internal_path, 876 pathname, acpi_format_exception(status)));
869 acpi_format_exception(status)));
870 } 877 }
871 878
872 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 879 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
873 880
874 cleanup: 881 cleanup:
875 if (internal_path) { 882 ACPI_FREE(internal_path);
876 ACPI_MEM_FREE(internal_path);
877 }
878 return_ACPI_STATUS(status); 883 return_ACPI_STATUS(status);
879} 884}
880 885
@@ -960,9 +965,10 @@ acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node * child_node)
960{ 965{
961 struct acpi_namespace_node *parent_node; 966 struct acpi_namespace_node *parent_node;
962 967
963 ACPI_FUNCTION_TRACE("ns_find_parent_name"); 968 ACPI_FUNCTION_TRACE(ns_find_parent_name);
964 969
965 if (child_node) { 970 if (child_node) {
971
966 /* Valid entry. Get the parent Node */ 972 /* Valid entry. Get the parent Node */
967 973
968 parent_node = acpi_ns_get_parent_node(child_node); 974 parent_node = acpi_ns_get_parent_node(child_node);