summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/components/namespace
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/components/namespace')
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsaccess.c4
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsconvert.c3
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsdump.c25
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsinit.c9
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nspredef.c14
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsprepkg.c16
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsrepair.c1
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsrepair2.c304
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsutils.c3
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsxfeval.c1
10 files changed, 312 insertions, 68 deletions
diff --git a/sys/contrib/dev/acpica/components/namespace/nsaccess.c b/sys/contrib/dev/acpica/components/namespace/nsaccess.c
index 8dc8b5f..aedb550 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsaccess.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsaccess.c
@@ -167,6 +167,7 @@ AcpiNsRootInitialize (
switch (InitVal->Type)
{
case ACPI_TYPE_METHOD:
+
ObjDesc->Method.ParamCount = (UINT8) ACPI_TO_INTEGER (Val);
ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID;
@@ -188,7 +189,6 @@ AcpiNsRootInitialize (
ObjDesc->Integer.Value = ACPI_TO_INTEGER (Val);
break;
-
case ACPI_TYPE_STRING:
/* Build an object around the static string */
@@ -198,7 +198,6 @@ AcpiNsRootInitialize (
ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
break;
-
case ACPI_TYPE_MUTEX:
ObjDesc->Mutex.Node = NewNode;
@@ -231,7 +230,6 @@ AcpiNsRootInitialize (
}
break;
-
default:
ACPI_ERROR ((AE_INFO, "Unsupported initial type value 0x%X",
diff --git a/sys/contrib/dev/acpica/components/namespace/nsconvert.c b/sys/contrib/dev/acpica/components/namespace/nsconvert.c
index ed6f885..4b12d3d 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsconvert.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsconvert.c
@@ -111,6 +111,7 @@ AcpiNsConvertToInteger (
break;
default:
+
return (AE_AML_OPERAND_TYPE);
}
@@ -208,6 +209,7 @@ AcpiNsConvertToString (
break;
default:
+
return (AE_AML_OPERAND_TYPE);
}
@@ -317,6 +319,7 @@ AcpiNsConvertToBuffer (
break;
default:
+
return (AE_AML_OPERAND_TYPE);
}
diff --git a/sys/contrib/dev/acpica/components/namespace/nsdump.c b/sys/contrib/dev/acpica/components/namespace/nsdump.c
index 1411534..e5cd380 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsdump.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsdump.c
@@ -282,10 +282,12 @@ AcpiNsDumpOneObject (
case ACPI_TYPE_BUFFER:
case ACPI_TYPE_STRING:
case ACPI_TYPE_METHOD:
+
AcpiOsPrintf ("<No attached object>");
break;
default:
+
break;
}
@@ -302,13 +304,11 @@ AcpiNsDumpOneObject (
ACPI_CAST_PTR (void, ObjDesc->Processor.Address));
break;
-
case ACPI_TYPE_DEVICE:
AcpiOsPrintf ("Notify Object: %p\n", ObjDesc);
break;
-
case ACPI_TYPE_METHOD:
AcpiOsPrintf ("Args %X Len %.4X Aml %p\n",
@@ -316,14 +316,12 @@ AcpiNsDumpOneObject (
ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart);
break;
-
case ACPI_TYPE_INTEGER:
AcpiOsPrintf ("= %8.8X%8.8X\n",
ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
break;
-
case ACPI_TYPE_PACKAGE:
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
@@ -337,7 +335,6 @@ AcpiNsDumpOneObject (
}
break;
-
case ACPI_TYPE_BUFFER:
if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
@@ -363,7 +360,6 @@ AcpiNsDumpOneObject (
}
break;
-
case ACPI_TYPE_STRING:
AcpiOsPrintf ("Len %.2X ", ObjDesc->String.Length);
@@ -371,7 +367,6 @@ AcpiNsDumpOneObject (
AcpiOsPrintf ("\n");
break;
-
case ACPI_TYPE_REGION:
AcpiOsPrintf ("[%s]",
@@ -388,13 +383,11 @@ AcpiNsDumpOneObject (
}
break;
-
case ACPI_TYPE_LOCAL_REFERENCE:
AcpiOsPrintf ("[%s]\n", AcpiUtGetReferenceName (ObjDesc));
break;
-
case ACPI_TYPE_BUFFER_FIELD:
if (ObjDesc->BufferField.BufferObj &&
@@ -406,7 +399,6 @@ AcpiNsDumpOneObject (
}
break;
-
case ACPI_TYPE_LOCAL_REGION_FIELD:
AcpiOsPrintf ("Rgn [%4.4s]",
@@ -414,7 +406,6 @@ AcpiNsDumpOneObject (
ObjDesc->CommonField.RegionObj->Region.Node));
break;
-
case ACPI_TYPE_LOCAL_BANK_FIELD:
AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]",
@@ -424,7 +415,6 @@ AcpiNsDumpOneObject (
ObjDesc->BankField.BankObj->CommonField.Node));
break;
-
case ACPI_TYPE_LOCAL_INDEX_FIELD:
AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]",
@@ -434,7 +424,6 @@ AcpiNsDumpOneObject (
ObjDesc->IndexField.DataObj->CommonField.Node));
break;
-
case ACPI_TYPE_LOCAL_ALIAS:
case ACPI_TYPE_LOCAL_METHOD_ALIAS:
@@ -465,11 +454,11 @@ AcpiNsDumpOneObject (
break;
default:
+
break;
}
break;
-
case ACPI_DISPLAY_OBJECTS:
AcpiOsPrintf ("O:%p", ObjDesc);
@@ -518,7 +507,6 @@ AcpiNsDumpOneObject (
}
break;
-
default:
AcpiOsPrintf ("\n");
break;
@@ -605,30 +593,37 @@ AcpiNsDumpOneObject (
goto Cleanup;
case ACPI_TYPE_BUFFER_FIELD:
+
ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj;
break;
case ACPI_TYPE_PACKAGE:
+
ObjDesc = (void *) ObjDesc->Package.Elements;
break;
case ACPI_TYPE_METHOD:
+
ObjDesc = (void *) ObjDesc->Method.AmlStart;
break;
case ACPI_TYPE_LOCAL_REGION_FIELD:
+
ObjDesc = (void *) ObjDesc->Field.RegionObj;
break;
case ACPI_TYPE_LOCAL_BANK_FIELD:
+
ObjDesc = (void *) ObjDesc->BankField.RegionObj;
break;
case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
ObjDesc = (void *) ObjDesc->IndexField.IndexObj;
break;
default:
+
goto Cleanup;
}
diff --git a/sys/contrib/dev/acpica/components/namespace/nsinit.c b/sys/contrib/dev/acpica/components/namespace/nsinit.c
index adbe9de..cd50447 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsinit.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsinit.c
@@ -296,28 +296,34 @@ AcpiNsInitOneObject (
switch (Type)
{
case ACPI_TYPE_REGION:
+
Info->OpRegionCount++;
break;
case ACPI_TYPE_BUFFER_FIELD:
+
Info->FieldCount++;
break;
case ACPI_TYPE_LOCAL_BANK_FIELD:
+
Info->FieldCount++;
break;
case ACPI_TYPE_BUFFER:
+
Info->BufferCount++;
break;
case ACPI_TYPE_PACKAGE:
+
Info->PackageCount++;
break;
default:
/* No init required, just exit now */
+
return (AE_OK);
}
@@ -369,7 +375,9 @@ AcpiNsInitOneObject (
break;
default:
+
/* No other types can get here */
+
break;
}
@@ -456,6 +464,7 @@ AcpiNsFindIniMethods (
break;
default:
+
break;
}
diff --git a/sys/contrib/dev/acpica/components/namespace/nspredef.c b/sys/contrib/dev/acpica/components/namespace/nspredef.c
index 2de8f41..8f07293 100644
--- a/sys/contrib/dev/acpica/components/namespace/nspredef.c
+++ b/sys/contrib/dev/acpica/components/namespace/nspredef.c
@@ -175,7 +175,13 @@ AcpiNsCheckReturnValue (
Status = AcpiNsCheckPackage (Info, ReturnObjectPtr);
if (ACPI_FAILURE (Status))
{
- goto Exit;
+ /* We might be able to fix some errors */
+
+ if ((Status != AE_AML_OPERAND_TYPE) &&
+ (Status != AE_AML_OPERAND_VALUE))
+ {
+ goto Exit;
+ }
}
}
@@ -377,26 +383,32 @@ AcpiNsGetBitmappedType (
switch (ReturnObject->Common.Type)
{
case ACPI_TYPE_INTEGER:
+
ReturnBtype = ACPI_RTYPE_INTEGER;
break;
case ACPI_TYPE_BUFFER:
+
ReturnBtype = ACPI_RTYPE_BUFFER;
break;
case ACPI_TYPE_STRING:
+
ReturnBtype = ACPI_RTYPE_STRING;
break;
case ACPI_TYPE_PACKAGE:
+
ReturnBtype = ACPI_RTYPE_PACKAGE;
break;
case ACPI_TYPE_LOCAL_REFERENCE:
+
ReturnBtype = ACPI_RTYPE_REFERENCE;
break;
default:
+
/* Not one of the supported objects, must be incorrect */
ReturnBtype = ACPI_RTYPE_ANY;
diff --git a/sys/contrib/dev/acpica/components/namespace/nsprepkg.c b/sys/contrib/dev/acpica/components/namespace/nsprepkg.c
index 1e46f6a..cccd2c1 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsprepkg.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsprepkg.c
@@ -149,7 +149,6 @@ AcpiNsCheckPackage (
switch (Package->RetInfo.Type)
{
case ACPI_PTYPE1_FIXED:
-
/*
* The package count is fixed and there are no sub-packages
*
@@ -176,9 +175,7 @@ AcpiNsCheckPackage (
Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0);
break;
-
case ACPI_PTYPE1_VAR:
-
/*
* The package count is variable, there are no sub-packages, and all
* elements must be of the same type
@@ -195,9 +192,7 @@ AcpiNsCheckPackage (
}
break;
-
case ACPI_PTYPE1_OPTION:
-
/*
* The package count is variable, there are no sub-packages. There are
* a fixed number of required elements, and a variable number of
@@ -241,7 +236,6 @@ AcpiNsCheckPackage (
}
break;
-
case ACPI_PTYPE2_REV_FIXED:
/* First element is the (Integer) revision */
@@ -261,7 +255,6 @@ AcpiNsCheckPackage (
Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
break;
-
case ACPI_PTYPE2_PKG_COUNT:
/* First element is the (Integer) count of sub-packages to follow */
@@ -291,13 +284,11 @@ AcpiNsCheckPackage (
Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
break;
-
case ACPI_PTYPE2:
case ACPI_PTYPE2_FIXED:
case ACPI_PTYPE2_MIN:
case ACPI_PTYPE2_COUNT:
case ACPI_PTYPE2_FIX_VAR:
-
/*
* These types all return a single Package that consists of a
* variable number of sub-Packages.
@@ -330,7 +321,6 @@ AcpiNsCheckPackage (
Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
break;
-
default:
/* Should not get here if predefined info table is correct */
@@ -438,7 +428,6 @@ AcpiNsCheckPackageList (
}
break;
-
case ACPI_PTYPE2_FIX_VAR:
/*
* Each subpackage has a fixed number of elements and an
@@ -461,7 +450,6 @@ AcpiNsCheckPackageList (
}
break;
-
case ACPI_PTYPE2_FIXED:
/* Each sub-package has a fixed length */
@@ -485,7 +473,6 @@ AcpiNsCheckPackageList (
}
break;
-
case ACPI_PTYPE2_MIN:
/* Each sub-package has a variable but minimum length */
@@ -507,9 +494,7 @@ AcpiNsCheckPackageList (
}
break;
-
case ACPI_PTYPE2_COUNT:
-
/*
* First element is the (Integer) count of elements, including
* the count field (the ACPI name is NumElements)
@@ -558,7 +543,6 @@ AcpiNsCheckPackageList (
}
break;
-
default: /* Should not get here, type was validated by caller */
return (AE_AML_INTERNAL);
diff --git a/sys/contrib/dev/acpica/components/namespace/nsrepair.c b/sys/contrib/dev/acpica/components/namespace/nsrepair.c
index 4e0f55d..879c95a 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsrepair.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsrepair.c
@@ -510,6 +510,7 @@ AcpiNsRemoveNullElements (
case ACPI_PTYPE2_MIN:
case ACPI_PTYPE2_REV_FIXED:
case ACPI_PTYPE2_FIX_VAR:
+
break;
default:
diff --git a/sys/contrib/dev/acpica/components/namespace/nsrepair2.c b/sys/contrib/dev/acpica/components/namespace/nsrepair2.c
index 7486dd7..85379e6 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsrepair2.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsrepair2.c
@@ -86,6 +86,11 @@ AcpiNsRepair_CID (
ACPI_OPERAND_OBJECT **ReturnObjectPtr);
static ACPI_STATUS
+AcpiNsRepair_CST (
+ ACPI_EVALUATE_INFO *Info,
+ ACPI_OPERAND_OBJECT **ReturnObjectPtr);
+
+static ACPI_STATUS
AcpiNsRepair_FDE (
ACPI_EVALUATE_INFO *Info,
ACPI_OPERAND_OBJECT **ReturnObjectPtr);
@@ -96,6 +101,11 @@ AcpiNsRepair_HID (
ACPI_OPERAND_OBJECT **ReturnObjectPtr);
static ACPI_STATUS
+AcpiNsRepair_PRT (
+ ACPI_EVALUATE_INFO *Info,
+ ACPI_OPERAND_OBJECT **ReturnObjectPtr);
+
+static ACPI_STATUS
AcpiNsRepair_PSS (
ACPI_EVALUATE_INFO *Info,
ACPI_OPERAND_OBJECT **ReturnObjectPtr);
@@ -109,11 +119,22 @@ static ACPI_STATUS
AcpiNsCheckSortedList (
ACPI_EVALUATE_INFO *Info,
ACPI_OPERAND_OBJECT *ReturnObject,
+ UINT32 StartIndex,
UINT32 ExpectedCount,
UINT32 SortIndex,
UINT8 SortDirection,
char *SortKeyName);
+/* Values for SortDirection above */
+
+#define ACPI_SORT_ASCENDING 0
+#define ACPI_SORT_DESCENDING 1
+
+static void
+AcpiNsRemoveElement (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Index);
+
static void
AcpiNsSortList (
ACPI_OPERAND_OBJECT **Elements,
@@ -121,11 +142,6 @@ AcpiNsSortList (
UINT32 Index,
UINT8 SortDirection);
-/* Values for SortDirection above */
-
-#define ACPI_SORT_ASCENDING 0
-#define ACPI_SORT_DESCENDING 1
-
/*
* This table contains the names of the predefined methods for which we can
@@ -135,9 +151,11 @@ AcpiNsSortList (
*
* _ALR: Sort the list ascending by AmbientIlluminance
* _CID: Strings: uppercase all, remove any leading asterisk
+ * _CST: Sort the list ascending by C state type
* _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs
* _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs
* _HID: Strings: uppercase all, remove any leading asterisk
+ * _PRT: Fix reversed SourceName and SourceIndex
* _PSS: Sort the list descending by Power
* _TSS: Sort the list descending by Power
*
@@ -152,9 +170,11 @@ static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] =
{
{"_ALR", AcpiNsRepair_ALR},
{"_CID", AcpiNsRepair_CID},
+ {"_CST", AcpiNsRepair_CST},
{"_FDE", AcpiNsRepair_FDE},
{"_GTM", AcpiNsRepair_FDE}, /* _GTM has same repair as _FDE */
{"_HID", AcpiNsRepair_HID},
+ {"_PRT", AcpiNsRepair_PRT},
{"_PSS", AcpiNsRepair_PSS},
{"_TSS", AcpiNsRepair_TSS},
{{0,0,0,0}, NULL} /* Table terminator */
@@ -267,7 +287,7 @@ AcpiNsRepair_ALR (
ACPI_STATUS Status;
- Status = AcpiNsCheckSortedList (Info, ReturnObject, 2, 1,
+ Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 2, 1,
ACPI_SORT_ASCENDING, "AmbientIlluminance");
return (Status);
@@ -354,6 +374,7 @@ AcpiNsRepair_FDE (
break;
default:
+
return (AE_AML_OPERAND_TYPE);
}
@@ -446,6 +467,97 @@ AcpiNsRepair_CID (
/******************************************************************************
*
+ * FUNCTION: AcpiNsRepair_CST
+ *
+ * PARAMETERS: Info - Method execution information block
+ * ReturnObjectPtr - Pointer to the object returned from the
+ * evaluation of a method or object
+ *
+ * RETURN: Status. AE_OK if object is OK or was repaired successfully
+ *
+ * DESCRIPTION: Repair for the _CST object:
+ * 1. Sort the list ascending by C state type
+ * 2. Ensure type cannot be zero
+ * 3. A sub-package count of zero means _CST is meaningless
+ * 4. Count must match the number of C state sub-packages
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+AcpiNsRepair_CST (
+ ACPI_EVALUATE_INFO *Info,
+ ACPI_OPERAND_OBJECT **ReturnObjectPtr)
+{
+ ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
+ ACPI_OPERAND_OBJECT **OuterElements;
+ UINT32 OuterElementCount;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ BOOLEAN Removing;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_NAME (NsRepair_CST);
+
+
+ /*
+ * Entries (subpackages) in the _CST Package must be sorted by the
+ * C-state type, in ascending order.
+ */
+ Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1,
+ ACPI_SORT_ASCENDING, "C-State Type");
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /*
+ * We now know the list is correctly sorted by C-state type. Check if
+ * the C-state type values are proportional.
+ */
+ OuterElementCount = ReturnObject->Package.Count - 1;
+ i = 0;
+ while (i < OuterElementCount)
+ {
+ OuterElements = &ReturnObject->Package.Elements[i + 1];
+ Removing = FALSE;
+
+ if ((*OuterElements)->Package.Count == 0)
+ {
+ ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+ "SubPackage[%u] - removing entry due to zero count", i));
+ Removing = TRUE;
+ }
+
+ ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */
+ if ((UINT32) ObjDesc->Integer.Value == 0)
+ {
+ ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+ "SubPackage[%u] - removing entry due to invalid Type(0)", i));
+ Removing = TRUE;
+ }
+
+ if (Removing)
+ {
+ AcpiNsRemoveElement (ReturnObject, i + 1);
+ OuterElementCount--;
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ /* Update top-level package count, Type "Integer" checked elsewhere */
+
+ ObjDesc = ReturnObject->Package.Elements[0];
+ ObjDesc->Integer.Value = OuterElementCount;
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
* FUNCTION: AcpiNsRepair_HID
*
* PARAMETERS: Info - Method execution information block
@@ -536,7 +648,7 @@ AcpiNsRepair_HID (
/******************************************************************************
*
- * FUNCTION: AcpiNsRepair_TSS
+ * FUNCTION: AcpiNsRepair_PRT
*
* PARAMETERS: Info - Method execution information block
* ReturnObjectPtr - Pointer to the object returned from the
@@ -544,40 +656,57 @@ AcpiNsRepair_HID (
*
* RETURN: Status. AE_OK if object is OK or was repaired successfully
*
- * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
- * descending by the power dissipation values.
+ * DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed
+ * SourceName and SourceIndex field, a common BIOS bug.
*
*****************************************************************************/
static ACPI_STATUS
-AcpiNsRepair_TSS (
+AcpiNsRepair_PRT (
ACPI_EVALUATE_INFO *Info,
ACPI_OPERAND_OBJECT **ReturnObjectPtr)
{
- ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
- ACPI_STATUS Status;
- ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *PackageObject = *ReturnObjectPtr;
+ ACPI_OPERAND_OBJECT **TopObjectList;
+ ACPI_OPERAND_OBJECT **SubObjectList;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 ElementCount;
+ UINT32 Index;
- /*
- * We can only sort the _TSS return package if there is no _PSS in the
- * same scope. This is because if _PSS is present, the ACPI specification
- * dictates that the _TSS Power Dissipation field is to be ignored, and
- * therefore some BIOSs leave garbage values in the _TSS Power field(s).
- * In this case, it is best to just return the _TSS package as-is.
- * (May, 2011)
- */
- Status = AcpiNsGetNode (Info->Node, "^_PSS",
- ACPI_NS_NO_UPSEARCH, &Node);
- if (ACPI_SUCCESS (Status))
+ /* Each element in the _PRT package is a subpackage */
+
+ TopObjectList = PackageObject->Package.Elements;
+ ElementCount = PackageObject->Package.Count;
+
+ for (Index = 0; Index < ElementCount; Index++)
{
- return (AE_OK);
- }
+ SubObjectList = (*TopObjectList)->Package.Elements;
- Status = AcpiNsCheckSortedList (Info, ReturnObject, 5, 1,
- ACPI_SORT_DESCENDING, "PowerDissipation");
+ /*
+ * If the BIOS has erroneously reversed the _PRT SourceName (index 2)
+ * and the SourceIndex (index 3), fix it. _PRT is important enough to
+ * workaround this BIOS error. This also provides compatibility with
+ * other ACPI implementations.
+ */
+ ObjDesc = SubObjectList[3];
+ if (!ObjDesc || (ObjDesc->Common.Type != ACPI_TYPE_INTEGER))
+ {
+ SubObjectList[3] = SubObjectList[2];
+ SubObjectList[2] = ObjDesc;
+ Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
- return (Status);
+ ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
+ "PRT[%X]: Fixed reversed SourceName and SourceIndex",
+ Index));
+ }
+
+ /* Point to the next ACPI_OPERAND_OBJECT in the top level package */
+
+ TopObjectList++;
+ }
+
+ return (AE_OK);
}
@@ -619,7 +748,7 @@ AcpiNsRepair_PSS (
* incorrectly sorted, sort it. We sort by CpuFrequency, since this
* should be proportional to the power.
*/
- Status =AcpiNsCheckSortedList (Info, ReturnObject, 6, 0,
+ Status =AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0,
ACPI_SORT_DESCENDING, "CpuFrequency");
if (ACPI_FAILURE (Status))
{
@@ -656,10 +785,58 @@ AcpiNsRepair_PSS (
/******************************************************************************
*
+ * FUNCTION: AcpiNsRepair_TSS
+ *
+ * PARAMETERS: Info - Method execution information block
+ * ReturnObjectPtr - Pointer to the object returned from the
+ * evaluation of a method or object
+ *
+ * RETURN: Status. AE_OK if object is OK or was repaired successfully
+ *
+ * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
+ * descending by the power dissipation values.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+AcpiNsRepair_TSS (
+ ACPI_EVALUATE_INFO *Info,
+ ACPI_OPERAND_OBJECT **ReturnObjectPtr)
+{
+ ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ /*
+ * We can only sort the _TSS return package if there is no _PSS in the
+ * same scope. This is because if _PSS is present, the ACPI specification
+ * dictates that the _TSS Power Dissipation field is to be ignored, and
+ * therefore some BIOSs leave garbage values in the _TSS Power field(s).
+ * In this case, it is best to just return the _TSS package as-is.
+ * (May, 2011)
+ */
+ Status = AcpiNsGetNode (Info->Node, "^_PSS",
+ ACPI_NS_NO_UPSEARCH, &Node);
+ if (ACPI_SUCCESS (Status))
+ {
+ return (AE_OK);
+ }
+
+ Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 5, 1,
+ ACPI_SORT_DESCENDING, "PowerDissipation");
+
+ return (Status);
+}
+
+
+/******************************************************************************
+ *
* FUNCTION: AcpiNsCheckSortedList
*
* PARAMETERS: Info - Method execution information block
* ReturnObject - Pointer to the top-level returned object
+ * StartIndex - Index of the first sub-package
* ExpectedCount - Minimum length of each sub-package
* SortIndex - Sub-package entry to sort on
* SortDirection - Ascending or descending
@@ -677,6 +854,7 @@ static ACPI_STATUS
AcpiNsCheckSortedList (
ACPI_EVALUATE_INFO *Info,
ACPI_OPERAND_OBJECT *ReturnObject,
+ UINT32 StartIndex,
UINT32 ExpectedCount,
UINT32 SortIndex,
UINT8 SortDirection,
@@ -705,13 +883,15 @@ AcpiNsCheckSortedList (
* Any NULL elements should have been removed by earlier call
* to AcpiNsRemoveNullElements.
*/
- OuterElements = ReturnObject->Package.Elements;
OuterElementCount = ReturnObject->Package.Count;
- if (!OuterElementCount)
+ if (!OuterElementCount || StartIndex >= OuterElementCount)
{
return (AE_AML_PACKAGE_LIMIT);
}
+ OuterElements = &ReturnObject->Package.Elements[StartIndex];
+ OuterElementCount -= StartIndex;
+
PreviousValue = 0;
if (SortDirection == ACPI_SORT_DESCENDING)
{
@@ -753,7 +933,7 @@ AcpiNsCheckSortedList (
((SortDirection == ACPI_SORT_DESCENDING) &&
(ObjDesc->Integer.Value > PreviousValue)))
{
- AcpiNsSortList (ReturnObject->Package.Elements,
+ AcpiNsSortList (&ReturnObject->Package.Elements[StartIndex],
OuterElementCount, SortIndex, SortDirection);
Info->ReturnFlags |= ACPI_OBJECT_REPAIRED;
@@ -826,3 +1006,61 @@ AcpiNsSortList (
}
}
}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiNsRemoveElement
+ *
+ * PARAMETERS: ObjDesc - Package object element list
+ * Index - Index of element to remove
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Remove the requested element of a package and delete it.
+ *
+ *****************************************************************************/
+
+static void
+AcpiNsRemoveElement (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Index)
+{
+ ACPI_OPERAND_OBJECT **Source;
+ ACPI_OPERAND_OBJECT **Dest;
+ UINT32 Count;
+ UINT32 NewCount;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_NAME (NsRemoveElement);
+
+
+ Count = ObjDesc->Package.Count;
+ NewCount = Count - 1;
+
+ Source = ObjDesc->Package.Elements;
+ Dest = Source;
+
+ /* Examine all elements of the package object, remove matched index */
+
+ for (i = 0; i < Count; i++)
+ {
+ if (i == Index)
+ {
+ AcpiUtRemoveReference (*Source); /* Remove one ref for being in pkg */
+ AcpiUtRemoveReference (*Source);
+ }
+ else
+ {
+ *Dest = *Source;
+ Dest++;
+ }
+ Source++;
+ }
+
+ /* NULL terminate list and update the package count */
+
+ *Dest = NULL;
+ ObjDesc->Package.Count = NewCount;
+}
diff --git a/sys/contrib/dev/acpica/components/namespace/nsutils.c b/sys/contrib/dev/acpica/components/namespace/nsutils.c
index 31f9496..fdde368 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsutils.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsutils.c
@@ -497,10 +497,12 @@ AcpiNsExternalizeName (
switch (InternalName[0])
{
case AML_ROOT_PREFIX:
+
PrefixLength = 1;
break;
case AML_PARENT_PREFIX:
+
for (i = 0; i < InternalNameLength; i++)
{
if (ACPI_IS_PARENT_PREFIX (InternalName[i]))
@@ -521,6 +523,7 @@ AcpiNsExternalizeName (
break;
default:
+
break;
}
diff --git a/sys/contrib/dev/acpica/components/namespace/nsxfeval.c b/sys/contrib/dev/acpica/components/namespace/nsxfeval.c
index 4890768..33976c7 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsxfeval.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsxfeval.c
@@ -550,6 +550,7 @@ AcpiNsResolveReferences (
break;
default:
+
return;
}
OpenPOWER on IntegriCloud