summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/nsobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/nsobject.c')
-rw-r--r--sys/contrib/dev/acpica/nsobject.c320
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);
+}
+
+
+
OpenPOWER on IntegriCloud