195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 295b482a8SLen Brown /******************************************************************************* 395b482a8SLen Brown * 495b482a8SLen Brown * Module Name: nsxfobj - Public interfaces to the ACPI subsystem 595b482a8SLen Brown * ACPI Object oriented interfaces 695b482a8SLen Brown * 795b482a8SLen Brown ******************************************************************************/ 895b482a8SLen Brown 9839e928fSLv Zheng #define EXPORT_ACPI_INTERFACES 10839e928fSLv Zheng 1195b482a8SLen Brown #include <acpi/acpi.h> 12e2f7a777SLen Brown #include "accommon.h" 13e2f7a777SLen Brown #include "acnamesp.h" 1495b482a8SLen Brown 1595b482a8SLen Brown #define _COMPONENT ACPI_NAMESPACE 1695b482a8SLen Brown ACPI_MODULE_NAME("nsxfobj") 1795b482a8SLen Brown 1895b482a8SLen Brown /******************************************************************************* 1995b482a8SLen Brown * 2095b482a8SLen Brown * FUNCTION: acpi_get_type 2195b482a8SLen Brown * 22ba494beeSBob Moore * PARAMETERS: handle - Handle of object whose type is desired 2395b482a8SLen Brown * ret_type - Where the type will be placed 2495b482a8SLen Brown * 2595b482a8SLen Brown * RETURN: Status 2695b482a8SLen Brown * 2795b482a8SLen Brown * DESCRIPTION: This routine returns the type associatd with a particular handle 2895b482a8SLen Brown * 2995b482a8SLen Brown ******************************************************************************/ 3095b482a8SLen Brown acpi_status acpi_get_type(acpi_handle handle, acpi_object_type *ret_type) 3195b482a8SLen Brown { 3295b482a8SLen Brown struct acpi_namespace_node *node; 3395b482a8SLen Brown acpi_status status; 3495b482a8SLen Brown 3595b482a8SLen Brown /* Parameter Validation */ 3695b482a8SLen Brown 3795b482a8SLen Brown if (!ret_type) { 3895b482a8SLen Brown return (AE_BAD_PARAMETER); 3995b482a8SLen Brown } 4095b482a8SLen Brown 411fad8738SBob Moore /* Special case for the predefined Root Node (return type ANY) */ 421fad8738SBob Moore 4395b482a8SLen Brown if (handle == ACPI_ROOT_OBJECT) { 4495b482a8SLen Brown *ret_type = ACPI_TYPE_ANY; 4595b482a8SLen Brown return (AE_OK); 4695b482a8SLen Brown } 4795b482a8SLen Brown 4895b482a8SLen Brown status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 4995b482a8SLen Brown if (ACPI_FAILURE(status)) { 5095b482a8SLen Brown return (status); 5195b482a8SLen Brown } 5295b482a8SLen Brown 5395b482a8SLen Brown /* Convert and validate the handle */ 5495b482a8SLen Brown 55f24b664dSBob Moore node = acpi_ns_validate_handle(handle); 5695b482a8SLen Brown if (!node) { 5795b482a8SLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 5895b482a8SLen Brown return (AE_BAD_PARAMETER); 5995b482a8SLen Brown } 6095b482a8SLen Brown 6195b482a8SLen Brown *ret_type = node->type; 6295b482a8SLen Brown 6395b482a8SLen Brown status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 6495b482a8SLen Brown return (status); 6595b482a8SLen Brown } 6695b482a8SLen Brown 6795b482a8SLen Brown ACPI_EXPORT_SYMBOL(acpi_get_type) 6895b482a8SLen Brown 6995b482a8SLen Brown /******************************************************************************* 7095b482a8SLen Brown * 7195b482a8SLen Brown * FUNCTION: acpi_get_parent 7295b482a8SLen Brown * 73ba494beeSBob Moore * PARAMETERS: handle - Handle of object whose parent is desired 7495b482a8SLen Brown * ret_handle - Where the parent handle will be placed 7595b482a8SLen Brown * 7695b482a8SLen Brown * RETURN: Status 7795b482a8SLen Brown * 7895b482a8SLen Brown * DESCRIPTION: Returns a handle to the parent of the object represented by 7995b482a8SLen Brown * Handle. 8095b482a8SLen Brown * 8195b482a8SLen Brown ******************************************************************************/ 8295b482a8SLen Brown acpi_status acpi_get_parent(acpi_handle handle, acpi_handle *ret_handle) 8395b482a8SLen Brown { 8495b482a8SLen Brown struct acpi_namespace_node *node; 85c446eed6SAlex Chiang struct acpi_namespace_node *parent_node; 8695b482a8SLen Brown acpi_status status; 8795b482a8SLen Brown 8895b482a8SLen Brown if (!ret_handle) { 8995b482a8SLen Brown return (AE_BAD_PARAMETER); 9095b482a8SLen Brown } 9195b482a8SLen Brown 9295b482a8SLen Brown /* Special case for the predefined Root Node (no parent) */ 9395b482a8SLen Brown 9495b482a8SLen Brown if (handle == ACPI_ROOT_OBJECT) { 9595b482a8SLen Brown return (AE_NULL_ENTRY); 9695b482a8SLen Brown } 9795b482a8SLen Brown 9895b482a8SLen Brown status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 9995b482a8SLen Brown if (ACPI_FAILURE(status)) { 10095b482a8SLen Brown return (status); 10195b482a8SLen Brown } 10295b482a8SLen Brown 10395b482a8SLen Brown /* Convert and validate the handle */ 10495b482a8SLen Brown 105f24b664dSBob Moore node = acpi_ns_validate_handle(handle); 10695b482a8SLen Brown if (!node) { 10795b482a8SLen Brown status = AE_BAD_PARAMETER; 10895b482a8SLen Brown goto unlock_and_exit; 10995b482a8SLen Brown } 11095b482a8SLen Brown 11195b482a8SLen Brown /* Get the parent entry */ 11295b482a8SLen Brown 113c45b5c09SAlexey Starikovskiy parent_node = node->parent; 114f24b664dSBob Moore *ret_handle = ACPI_CAST_PTR(acpi_handle, parent_node); 11595b482a8SLen Brown 11695b482a8SLen Brown /* Return exception if parent is null */ 11795b482a8SLen Brown 118c446eed6SAlex Chiang if (!parent_node) { 11995b482a8SLen Brown status = AE_NULL_ENTRY; 12095b482a8SLen Brown } 12195b482a8SLen Brown 12295b482a8SLen Brown unlock_and_exit: 12395b482a8SLen Brown 12495b482a8SLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 12595b482a8SLen Brown return (status); 12695b482a8SLen Brown } 12795b482a8SLen Brown 12895b482a8SLen Brown ACPI_EXPORT_SYMBOL(acpi_get_parent) 12995b482a8SLen Brown 13095b482a8SLen Brown /******************************************************************************* 13195b482a8SLen Brown * 13295b482a8SLen Brown * FUNCTION: acpi_get_next_object 13395b482a8SLen Brown * 134ba494beeSBob Moore * PARAMETERS: type - Type of object to be searched for 135ba494beeSBob Moore * parent - Parent object whose children we are getting 13695b482a8SLen Brown * last_child - Previous child that was found. 13795b482a8SLen Brown * The NEXT child will be returned 13895b482a8SLen Brown * ret_handle - Where handle to the next object is placed 13995b482a8SLen Brown * 14095b482a8SLen Brown * RETURN: Status 14195b482a8SLen Brown * 14295b482a8SLen Brown * DESCRIPTION: Return the next peer object within the namespace. If Handle is 14395b482a8SLen Brown * valid, Scope is ignored. Otherwise, the first object within 14495b482a8SLen Brown * Scope is returned. 14595b482a8SLen Brown * 14695b482a8SLen Brown ******************************************************************************/ 14795b482a8SLen Brown acpi_status 14895b482a8SLen Brown acpi_get_next_object(acpi_object_type type, 14995b482a8SLen Brown acpi_handle parent, 15095b482a8SLen Brown acpi_handle child, acpi_handle *ret_handle) 15195b482a8SLen Brown { 15295b482a8SLen Brown acpi_status status; 15395b482a8SLen Brown struct acpi_namespace_node *node; 15495b482a8SLen Brown struct acpi_namespace_node *parent_node = NULL; 15595b482a8SLen Brown struct acpi_namespace_node *child_node = NULL; 15695b482a8SLen Brown 15795b482a8SLen Brown /* Parameter validation */ 15895b482a8SLen Brown 15995b482a8SLen Brown if (type > ACPI_TYPE_EXTERNAL_MAX) { 16095b482a8SLen Brown return (AE_BAD_PARAMETER); 16195b482a8SLen Brown } 16295b482a8SLen Brown 16395b482a8SLen Brown status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 16495b482a8SLen Brown if (ACPI_FAILURE(status)) { 16595b482a8SLen Brown return (status); 16695b482a8SLen Brown } 16795b482a8SLen Brown 16895b482a8SLen Brown /* If null handle, use the parent */ 16995b482a8SLen Brown 17095b482a8SLen Brown if (!child) { 17195b482a8SLen Brown 17295b482a8SLen Brown /* Start search at the beginning of the specified scope */ 17395b482a8SLen Brown 174f24b664dSBob Moore parent_node = acpi_ns_validate_handle(parent); 17595b482a8SLen Brown if (!parent_node) { 17695b482a8SLen Brown status = AE_BAD_PARAMETER; 17795b482a8SLen Brown goto unlock_and_exit; 17895b482a8SLen Brown } 17995b482a8SLen Brown } else { 18095b482a8SLen Brown /* Non-null handle, ignore the parent */ 18195b482a8SLen Brown /* Convert and validate the handle */ 18295b482a8SLen Brown 183f24b664dSBob Moore child_node = acpi_ns_validate_handle(child); 18495b482a8SLen Brown if (!child_node) { 18595b482a8SLen Brown status = AE_BAD_PARAMETER; 18695b482a8SLen Brown goto unlock_and_exit; 18795b482a8SLen Brown } 18895b482a8SLen Brown } 18995b482a8SLen Brown 19095b482a8SLen Brown /* Internal function does the real work */ 19195b482a8SLen Brown 1928c725bf9SBob Moore node = acpi_ns_get_next_node_typed(type, parent_node, child_node); 19395b482a8SLen Brown if (!node) { 19495b482a8SLen Brown status = AE_NOT_FOUND; 19595b482a8SLen Brown goto unlock_and_exit; 19695b482a8SLen Brown } 19795b482a8SLen Brown 19895b482a8SLen Brown if (ret_handle) { 199f24b664dSBob Moore *ret_handle = ACPI_CAST_PTR(acpi_handle, node); 20095b482a8SLen Brown } 20195b482a8SLen Brown 20295b482a8SLen Brown unlock_and_exit: 20395b482a8SLen Brown 20495b482a8SLen Brown (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 20595b482a8SLen Brown return (status); 20695b482a8SLen Brown } 20795b482a8SLen Brown 20895b482a8SLen Brown ACPI_EXPORT_SYMBOL(acpi_get_next_object) 209