^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Module Name: nsobject - Utilities for objects attached to namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * table entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "acnamesp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define _COMPONENT ACPI_NAMESPACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ACPI_MODULE_NAME("nsobject")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * FUNCTION: acpi_ns_attach_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * PARAMETERS: node - Parent Node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * object - Object to be attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * type - Type of object, or ACPI_TYPE_ANY if not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * known
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * DESCRIPTION: Record the given object as the value associated with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * name whose acpi_handle is passed. If Object is NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * and Type is ACPI_TYPE_ANY, set the name as having no value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * Note: Future may require that the Node->Flags field be passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * as a parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * MUTEX: Assumes namespace is locked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) acpi_ns_attach_object(struct acpi_namespace_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) union acpi_operand_object *object, acpi_object_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) union acpi_operand_object *last_obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) acpi_object_type object_type = ACPI_TYPE_ANY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ACPI_FUNCTION_TRACE(ns_attach_object);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Parameter validation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* Invalid handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ACPI_ERROR((AE_INFO, "Null NamedObj handle"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return_ACPI_STATUS(AE_BAD_PARAMETER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (!object && (ACPI_TYPE_ANY != type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* Null object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) "Null object, but type not ACPI_TYPE_ANY"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) return_ACPI_STATUS(AE_BAD_PARAMETER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /* Not a name handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ACPI_ERROR((AE_INFO, "Invalid handle %p [%s]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) node, acpi_ut_get_descriptor_name(node)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return_ACPI_STATUS(AE_BAD_PARAMETER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Check if this object is already attached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (node->object == object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) "Obj %p already installed in NameObj %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) object, node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* If null object, we will just install it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) if (!object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) obj_desc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) object_type = ACPI_TYPE_ANY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * If the source object is a namespace Node with an attached object,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * we will use that (attached) object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) else if ((ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ((struct acpi_namespace_node *)object)->object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * Value passed is a name handle and that name has a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * non-null value. Use that name's value and type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) obj_desc = ((struct acpi_namespace_node *)object)->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) object_type = ((struct acpi_namespace_node *)object)->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * Otherwise, we will use the parameter object, but we must type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * it first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) obj_desc = (union acpi_operand_object *)object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* Use the given type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) object_type = type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) obj_desc, node, acpi_ut_get_node_name(node)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* Detach an existing attached object if present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (node->object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) acpi_ns_detach_object(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if (obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * Must increment the new value's reference count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * (if it is an internal object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) acpi_ut_add_reference(obj_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * Handle objects with multiple descriptors - walk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * to the end of the descriptor list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) last_obj_desc = obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) while (last_obj_desc->common.next_object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) last_obj_desc = last_obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* Install the object at the front of the object list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) last_obj_desc->common.next_object = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) node->type = (u8) object_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) node->object = obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * FUNCTION: acpi_ns_detach_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * PARAMETERS: node - A Namespace node whose object will be detached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * RETURN: None.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * DESCRIPTION: Detach/delete an object associated with a namespace node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * if the object is an allocated object, it is freed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * Otherwise, the field is simply cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) void acpi_ns_detach_object(struct acpi_namespace_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ACPI_FUNCTION_TRACE(ns_detach_object);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) obj_desc = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (!obj_desc || (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (node->flags & ANOBJ_ALLOCATED_BUFFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* Free the dynamic aml buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (obj_desc->common.type == ACPI_TYPE_METHOD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ACPI_FREE(obj_desc->method.aml_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (obj_desc->common.type == ACPI_TYPE_REGION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) acpi_ut_remove_address_range(obj_desc->region.space_id, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* Clear the Node entry in all cases */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) node->object = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_OPERAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /* Unlink object from front of possible object list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) node->object = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /* Handle possible 2-descriptor object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (node->object &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) (node->object->common.type != ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) node->object = node->object->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * Detach the object from any data objects (which are still held by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * the namespace node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (obj_desc->common.next_object &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) ((obj_desc->common.next_object)->common.type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) obj_desc->common.next_object = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* Reset the node type to untyped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) node->type = ACPI_TYPE_ANY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) node, acpi_ut_get_node_name(node), obj_desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /* Remove one reference on the object (and all subobjects) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) acpi_ut_remove_reference(obj_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * FUNCTION: acpi_ns_get_attached_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * PARAMETERS: node - Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * RETURN: Current value of the object field from the Node whose
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * handle is passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * DESCRIPTION: Obtain the object attached to a namespace node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) union acpi_operand_object *acpi_ns_get_attached_object(struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) acpi_namespace_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) ACPI_FUNCTION_TRACE_PTR(ns_get_attached_object, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ACPI_WARNING((AE_INFO, "Null Node ptr"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (!node->object ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) ((ACPI_GET_DESCRIPTOR_TYPE(node->object) != ACPI_DESC_TYPE_OPERAND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) && (ACPI_GET_DESCRIPTOR_TYPE(node->object) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ACPI_DESC_TYPE_NAMED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) || ((node->object)->common.type == ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return_PTR(node->object);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * FUNCTION: acpi_ns_get_secondary_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * PARAMETERS: node - Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * RETURN: Current value of the object field from the Node whose
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * handle is passed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * DESCRIPTION: Obtain a secondary object associated with a namespace node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) union acpi_operand_object *acpi_ns_get_secondary_object(union
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) acpi_operand_object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) *obj_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) ACPI_FUNCTION_TRACE_PTR(ns_get_secondary_object, obj_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if ((!obj_desc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) (!obj_desc->common.next_object) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ((obj_desc->common.next_object)->common.type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) ACPI_TYPE_LOCAL_DATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) return_PTR(obj_desc->common.next_object);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * FUNCTION: acpi_ns_attach_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) * PARAMETERS: node - Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) * handler - Handler to be associated with the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * data - Data to be attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * DESCRIPTION: Low-level attach data. Create and attach a Data object.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) acpi_ns_attach_data(struct acpi_namespace_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) acpi_object_handler handler, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) union acpi_operand_object *prev_obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) union acpi_operand_object *data_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* We only allow one attachment per handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) prev_obj_desc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) obj_desc = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) while (obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) (obj_desc->data.handler == handler)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return (AE_ALREADY_EXISTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) prev_obj_desc = obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) obj_desc = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* Create an internal object for the data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) data_desc = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (!data_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) return (AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) data_desc->data.handler = handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) data_desc->data.pointer = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* Install the data object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (prev_obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) prev_obj_desc->common.next_object = data_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) node->object = data_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * FUNCTION: acpi_ns_detach_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * PARAMETERS: node - Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * handler - Handler associated with the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * DESCRIPTION: Low-level detach data. Delete the data node, but the caller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * is responsible for the actual data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) acpi_ns_detach_data(struct acpi_namespace_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) acpi_object_handler handler)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) union acpi_operand_object *prev_obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) prev_obj_desc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) obj_desc = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) while (obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) (obj_desc->data.handler == handler)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) if (prev_obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) prev_obj_desc->common.next_object =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) node->object = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) acpi_ut_remove_reference(obj_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) prev_obj_desc = obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) obj_desc = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return (AE_NOT_FOUND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * FUNCTION: acpi_ns_get_attached_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * PARAMETERS: node - Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) * handler - Handler associated with the data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) * data - Where the data is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * DESCRIPTION: Low level interface to obtain data previously associated with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) * a namespace node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) acpi_ns_get_attached_data(struct acpi_namespace_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) acpi_object_handler handler, void **data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) obj_desc = node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) while (obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) (obj_desc->data.handler == handler)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) *data = obj_desc->data.pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) obj_desc = obj_desc->common.next_object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) return (AE_NOT_FOUND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }