diff options
author | msmith <msmith@FreeBSD.org> | 2001-11-28 04:29:40 +0000 |
---|---|---|
committer | msmith <msmith@FreeBSD.org> | 2001-11-28 04:29:40 +0000 |
commit | fe76969b7da935c578de24725d0e86947a339135 (patch) | |
tree | 6b8691c238dc2893608d45924156125021b3fddb /sys/contrib/dev/acpica/nsobject.c | |
parent | 3699168fb0ef62ab72780ca4cada6b30936b1b4f (diff) | |
download | FreeBSD-src-fe76969b7da935c578de24725d0e86947a339135.zip FreeBSD-src-fe76969b7da935c578de24725d0e86947a339135.tar.gz |
Vendor import of the Intel ACPI CA 20011120 snapshot.
Diffstat (limited to 'sys/contrib/dev/acpica/nsobject.c')
-rw-r--r-- | sys/contrib/dev/acpica/nsobject.c | 320 |
1 files changed, 239 insertions, 81 deletions
diff --git a/sys/contrib/dev/acpica/nsobject.c b/sys/contrib/dev/acpica/nsobject.c index 05bfd79..a6166c5 100644 --- a/sys/contrib/dev/acpica/nsobject.c +++ b/sys/contrib/dev/acpica/nsobject.c @@ -2,7 +2,7 @@ * * Module Name: nsobject - Utilities for objects attached to namespace * table entries - * $Revision: 67 $ + * $Revision: 73 $ * ******************************************************************************/ @@ -141,6 +141,8 @@ * DESCRIPTION: Record the given object as the value associated with the * name whose ACPI_HANDLE is passed. If Object is NULL * and Type is ACPI_TYPE_ANY, set the name as having no value. + * Note: Future may require that the Node->Flags field be passed + * as a parameter. * * MUTEX: Assumes namespace is locked * @@ -153,9 +155,8 @@ AcpiNsAttachObject ( ACPI_OBJECT_TYPE8 Type) { ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_OPERAND_OBJECT *PreviousObjDesc; - ACPI_OBJECT_TYPE8 ObjType = ACPI_TYPE_ANY; - UINT8 Flags; + ACPI_OPERAND_OBJECT *LastObjDesc; + ACPI_OBJECT_TYPE8 ObjectType = ACPI_TYPE_ANY; FUNCTION_TRACE ("NsAttachObject"); @@ -164,14 +165,6 @@ AcpiNsAttachObject ( /* * Parameter validation */ - if (!AcpiGbl_RootNode) - { - /* Name space not initialized */ - - REPORT_ERROR (("NsAttachObject: Namespace not initialized\n")); - return_ACPI_STATUS (AE_NO_NAMESPACE); - } - if (!Node) { /* Invalid handle */ @@ -206,19 +199,12 @@ AcpiNsAttachObject ( return_ACPI_STATUS (AE_OK); } - - /* Get the current flags field of the Node */ - - Flags = Node->Flags; - Flags &= ~ANOBJ_AML_ATTACHMENT; - - /* If null object, we will just install it */ if (!Object) { - ObjDesc = NULL; - ObjType = ACPI_TYPE_ANY; + ObjDesc = NULL; + ObjectType = ACPI_TYPE_ANY; } /* @@ -232,19 +218,10 @@ AcpiNsAttachObject ( * Value passed is a name handle and that name has a * non-null value. Use that name's value and type. */ - ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object; - ObjType = ((ACPI_NAMESPACE_NODE *) Object)->Type; - - /* - * Copy appropriate flags - */ - if (((ACPI_NAMESPACE_NODE *) Object)->Flags & ANOBJ_AML_ATTACHMENT) - { - Flags |= ANOBJ_AML_ATTACHMENT; - } + ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object; + ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type; } - /* * Otherwise, we will use the parameter object, but we must type * it first @@ -257,41 +234,16 @@ AcpiNsAttachObject ( if (ACPI_TYPE_ANY != Type) { - ObjType = Type; + ObjectType = Type; } - else { - /* - * Cannot figure out the type -- set to DefAny which - * will print as an error in the name table dump - */ - if (AcpiDbgLevel > 0) - { - DUMP_PATHNAME (Node, - "NsAttachObject confused: setting bogus type for ", - ACPI_LV_INFO, _COMPONENT); - - if (VALID_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_NAMED)) - { - DUMP_PATHNAME (Object, "name ", ACPI_LV_INFO, _COMPONENT); - } - - else - { - DUMP_PATHNAME (Object, "object ", ACPI_LV_INFO, _COMPONENT); - DUMP_STACK_ENTRY (Object); - } - } - - ObjType = INTERNAL_TYPE_DEF_ANY; + ObjectType = INTERNAL_TYPE_DEF_ANY; } } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", - ObjDesc, Node, (char*)&Node->Name)); - + ObjDesc, Node, (char *) &Node->Name)); /* * Must increment the new value's reference count @@ -299,30 +251,30 @@ AcpiNsAttachObject ( */ AcpiUtAddReference (ObjDesc); - /* Save the existing object (if any) for deletion later */ + /* Detach an existing attached object if present */ - PreviousObjDesc = Node->Object; - - /* Install the object and set the type, flags */ - - Node->Object = ObjDesc; - Node->Type = (UINT8) ObjType; - Node->Flags |= Flags; + if (Node->Object) + { + AcpiNsDetachObject (Node); + } - /* - * Delete an existing attached object. + /* + * Handle objects with multiple descriptors - walk + * to the end of the descriptor list */ - if (PreviousObjDesc) + LastObjDesc = ObjDesc; + while (LastObjDesc->Common.NextObject) { - /* One for the attach to the Node */ + LastObjDesc = LastObjDesc->Common.NextObject; + } - AcpiUtRemoveReference (PreviousObjDesc); + /* Install the object at the front of the object list */ - /* Now delete */ + LastObjDesc->Common.NextObject = Node->Object; - AcpiUtRemoveReference (PreviousObjDesc); - } + Node->Type = (UINT8) ObjectType; + Node->Object = ObjDesc; return_ACPI_STATUS (AE_OK); } @@ -353,7 +305,8 @@ AcpiNsDetachObject ( ObjDesc = Node->Object; - if (!ObjDesc) + if (!ObjDesc || + (ObjDesc->Common.Type == INTERNAL_TYPE_DATA)) { return_VOID; } @@ -361,9 +314,22 @@ AcpiNsDetachObject ( /* Clear the entry in all cases */ Node->Object = NULL; + if (VALID_DESCRIPTOR_TYPE (ObjDesc, ACPI_DESC_TYPE_INTERNAL)) + { + Node->Object = ObjDesc->Common.NextObject; + if (Node->Object && + (Node->Object->Common.Type != INTERNAL_TYPE_DATA)) + { + Node->Object = Node->Object->Common.NextObject; + } + } + + /* Reset the node type to untyped */ + + Node->Type = ACPI_TYPE_ANY; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object=%p Value=%p Name %4.4s\n", - Node, ObjDesc, (char*)&Node->Name)); + Node, ObjDesc, (char *) &Node->Name)); /* Remove one reference on the object (and all subobjects) */ @@ -383,7 +349,7 @@ AcpiNsDetachObject ( * ******************************************************************************/ -void * +ACPI_OPERAND_OBJECT * AcpiNsGetAttachedObject ( ACPI_NAMESPACE_NODE *Node) { @@ -392,13 +358,205 @@ AcpiNsGetAttachedObject ( if (!Node) { - /* handle invalid */ - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Null Node ptr\n")); return_PTR (NULL); } + if (!Node->Object || + ((!(VALID_DESCRIPTOR_TYPE (Node->Object, ACPI_DESC_TYPE_INTERNAL))) && + (!(VALID_DESCRIPTOR_TYPE (Node->Object, ACPI_DESC_TYPE_NAMED)))) || + (Node->Object->Common.Type == INTERNAL_TYPE_DATA)) + { + return_PTR (NULL); + } + return_PTR (Node->Object); } +/******************************************************************************* + * + * FUNCTION: AcpiNsGetSecondaryObject + * + * PARAMETERS: Node - Parent Node to be examined + * + * RETURN: Current value of the object field from the Node whose + * handle is passed + * + ******************************************************************************/ + +ACPI_OPERAND_OBJECT * +AcpiNsGetSecondaryObject ( + ACPI_OPERAND_OBJECT *ObjDesc) +{ + FUNCTION_TRACE_PTR ("AcpiNsGetSecondaryObject", ObjDesc); + + + if ((!ObjDesc) || + (ObjDesc->Common.Type == INTERNAL_TYPE_DATA) || + (!ObjDesc->Common.NextObject) || + (ObjDesc->Common.NextObject->Common.Type == INTERNAL_TYPE_DATA)) + { + return_PTR (NULL); + } + + return_PTR (ObjDesc->Common.NextObject); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsAttachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsAttachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void *Data) +{ + ACPI_OPERAND_OBJECT *PrevObjDesc; + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *DataDesc; + + + + /* */ + PrevObjDesc = NULL; + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + return (AE_ALREADY_EXISTS); + } + + PrevObjDesc = ObjDesc; + ObjDesc = ObjDesc->Common.NextObject; + } + + + /* Create an internal object for the data */ + + DataDesc = AcpiUtCreateInternalObject (INTERNAL_TYPE_DATA); + if (!DataDesc) + { + return (AE_NO_MEMORY); + } + + DataDesc->Data.Handler = Handler; + DataDesc->Data.Pointer = Data; + + + /* Install the data object */ + + if (PrevObjDesc) + { + PrevObjDesc->Common.NextObject = DataDesc; + } + else + { + Node->Object = DataDesc; + } + + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsDetachData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsDetachData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *PrevObjDesc; + + + PrevObjDesc = NULL; + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + if (PrevObjDesc) + { + PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject; + } + else + { + Node->Object = ObjDesc->Common.NextObject; + } + + AcpiUtRemoveReference (ObjDesc); + return (AE_OK); + } + + PrevObjDesc = ObjDesc; + ObjDesc = ObjDesc->Common.NextObject; + } + + return (AE_NOT_FOUND); +} + + + +/******************************************************************************* + * + * FUNCTION: AcpiNsGetAttachedData + * + * PARAMETERS: + * + * RETURN: Status + * + * DESCRIPTION: + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsGetAttachedData ( + ACPI_NAMESPACE_NODE *Node, + ACPI_OBJECT_HANDLER Handler, + void **Data) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + + + ObjDesc = Node->Object; + while (ObjDesc) + { + if ((ObjDesc->Common.Type == INTERNAL_TYPE_DATA) && + (ObjDesc->Data.Handler == Handler)) + { + *Data = ObjDesc->Data.Pointer; + return (AE_OK); + } + + ObjDesc = ObjDesc->Common.NextObject; + } + + return (AE_NOT_FOUND); +} + + + |