Merge ACPICA 20130725.

This commit is contained in:
jkim 2013-07-26 21:34:09 +00:00
parent 97ac613107
commit e0885a9b34
24 changed files with 1535 additions and 636 deletions

File diff suppressed because it is too large Load Diff

View File

@ -719,34 +719,54 @@ AcpiDmEmitExternals (
AcpiDmUnresolvedWarning (1);
/* Emit any unresolved method externals in a single text block */
NextExternal = AcpiGbl_ExternalList;
while (NextExternal)
{
if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
(!NextExternal->Resolved))
{
AcpiOsPrintf (" External (%s%s",
NextExternal->Path,
AcpiDmGetObjectTypeName (NextExternal->Type));
AcpiOsPrintf (") // Warning: Unresolved Method, "
"guessing %u arguments (may be incorrect, see warning above)\n",
NextExternal->Value);
NextExternal->Emitted = TRUE;
}
NextExternal = NextExternal->Next;
}
AcpiOsPrintf ("\n");
/*
* Walk the list of externals (unresolved references)
* found during the AML parsing
*/
while (AcpiGbl_ExternalList)
{
AcpiOsPrintf (" External (%s%s",
AcpiGbl_ExternalList->Path,
AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
if (!AcpiGbl_ExternalList->Emitted)
{
if (AcpiGbl_ExternalList->Resolved)
AcpiOsPrintf (" External (%s%s",
AcpiGbl_ExternalList->Path,
AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type));
/* For methods, add a comment with the number of arguments */
if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
{
AcpiOsPrintf (") // %u Arguments\n",
AcpiGbl_ExternalList->Value);
}
else
{
AcpiOsPrintf (") // Warning: unresolved Method, "
"assuming %u arguments (may be incorrect, see warning above)\n",
AcpiGbl_ExternalList->Value);
AcpiOsPrintf (")\n");
}
}
else
{
AcpiOsPrintf (")\n");
}
/* Free this external info block and move on to next external */
@ -931,5 +951,4 @@ AcpiDmUnresolvedWarning (
(AcpiGbl_NumExternalMethods - AcpiGbl_ResolvedExternalMethods));
}
}
}

View File

@ -197,6 +197,26 @@ AcpiGetopt(
CurrentCharPtr = 1;
}
/* Option has an optional argument? */
else if (*OptsPtr == '+')
{
if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0')
{
AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)];
}
else if (++AcpiGbl_Optind >= argc)
{
AcpiGbl_Optarg = NULL;
}
else
{
AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
}
CurrentCharPtr = 1;
}
/* Option has optional single-char arguments? */
else if (*OptsPtr == '^')

View File

@ -57,10 +57,12 @@ static void
LsEmitOffsetTableEntry (
UINT32 FileId,
ACPI_NAMESPACE_NODE *Node,
UINT32 NamepathOffset,
UINT32 Offset,
char *OpName,
UINT64 Value,
UINT8 AmlOpcode);
UINT8 AmlOpcode,
UINT16 ParentOpcode);
/*******************************************************************************
@ -94,7 +96,8 @@ LsAmlOffsetWalk (
UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context);
ACPI_NAMESPACE_NODE *Node;
UINT32 Length;
UINT32 OffsetOfOpcode;
UINT32 NamepathOffset;
UINT32 DataOffset;
ACPI_PARSE_OBJECT *NextOp;
@ -119,8 +122,9 @@ LsAmlOffsetWalk (
if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE) &&
(Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
{
LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset,
Op->Asl.ParseOpName, 0, Op->Asl.Extra);
LsEmitOffsetTableEntry (FileId, Node, 0, Gbl_CurrentAmlOffset,
Op->Asl.ParseOpName, 0, Op->Asl.Extra, AML_BUFFER_OP);
Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength;
return (AE_OK);
}
@ -138,22 +142,25 @@ LsAmlOffsetWalk (
}
Length = Op->Asl.FinalAmlLength;
NamepathOffset = Gbl_CurrentAmlOffset + Length;
/* Get to the NameSeg/NamePath Op (and length of the name) */
Op = Op->Asl.Child;
OffsetOfOpcode = Length + Op->Asl.FinalAmlLength;
/* Get offset of last nameseg and the actual data */
NamepathOffset = Gbl_CurrentAmlOffset + Length +
(Op->Asl.FinalAmlLength - ACPI_NAME_SIZE);
DataOffset = Gbl_CurrentAmlOffset + Length +
Op->Asl.FinalAmlLength;
/* Get actual value associated with the name */
Op = Op->Asl.Next;
switch (Op->Asl.AmlOpcode)
{
/*
* We are only interested in integer constants that can be changed
* at boot time. Note, the One/Ones/Zero opcodes are considered
* non-changeable, so we ignore them here.
*/
case AML_BYTE_OP:
case AML_WORD_OP:
case AML_DWORD_OP:
@ -161,22 +168,32 @@ LsAmlOffsetWalk (
/* The +1 is to handle the integer size prefix (opcode) */
LsEmitOffsetTableEntry (FileId, Node,
(Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
Op->Asl.ParseOpName, Op->Asl.Value.Integer,
(UINT8) Op->Asl.AmlOpcode);
(UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
break;
case AML_ONE_OP:
case AML_ONES_OP:
case AML_ZERO_OP:
/* For these, offset will point to the opcode */
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
Op->Asl.ParseOpName, Op->Asl.Value.Integer,
(UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
break;
case AML_PACKAGE_OP:
case AML_VAR_PACKAGE_OP:
/* Get the package element count */
NextOp = Op->Asl.Child;
LsEmitOffsetTableEntry (FileId, Node,
(Gbl_CurrentAmlOffset + OffsetOfOpcode),
Op->Asl.ParseOpName,
NextOp->Asl.Value.Integer,
(UINT8) Op->Asl.AmlOpcode);
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
(UINT8) Op->Asl.AmlOpcode, AML_NAME_OP);
break;
default:
@ -195,7 +212,14 @@ LsAmlOffsetWalk (
/* Get the name/namepath node */
NextOp = Op->Asl.Child;
OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1;
/* Get offset of last nameseg and the actual data */
NamepathOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
DataOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength + 1);
/* Get the SpaceId node, then the Offset (address) node */
@ -214,10 +238,9 @@ LsAmlOffsetWalk (
case AML_DWORD_OP:
case AML_QWORD_OP:
LsEmitOffsetTableEntry (FileId, Node,
(Gbl_CurrentAmlOffset + OffsetOfOpcode + 1),
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, (DataOffset + 1),
Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
(UINT8) NextOp->Asl.AmlOpcode);
(UINT8) NextOp->Asl.AmlOpcode, AML_REGION_OP);
Gbl_CurrentAmlOffset += Length;
return (AE_OK);
@ -237,15 +260,62 @@ LsAmlOffsetWalk (
NextOp = Op->Asl.Child;
/* Point to the *last* nameseg in the namepath */
/* Get offset of last nameseg and the actual data (flags byte) */
OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE;
NamepathOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
LsEmitOffsetTableEntry (FileId, Node,
(Gbl_CurrentAmlOffset + OffsetOfOpcode + Length),
Op->Asl.ParseOpName,
*((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]),
(UINT8) Op->Asl.AmlOpcode);
DataOffset = Gbl_CurrentAmlOffset + Length +
NextOp->Asl.FinalAmlLength;
/* Get the flags byte Op */
NextOp = NextOp->Asl.Next;
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
(UINT8) Op->Asl.AmlOpcode, AML_METHOD_OP);
break;
case AML_PROCESSOR_OP:
/* Processor (Namepath, ProcessorId, Address, Length) */
Length = Op->Asl.FinalAmlLength;
NextOp = Op->Asl.Child; /* Get Namepath */
/* Get offset of last nameseg and the actual data (PBlock address) */
NamepathOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
DataOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength + 1);
NextOp = NextOp->Asl.Next; /* Get ProcessorID (BYTE) */
NextOp = NextOp->Asl.Next; /* Get Address (DWORD) */
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, DataOffset,
Op->Asl.ParseOpName, NextOp->Asl.Value.Integer,
(UINT8) AML_DWORD_OP, AML_PROCESSOR_OP);
break;
case AML_DEVICE_OP:
case AML_SCOPE_OP:
case AML_THERMAL_ZONE_OP:
/* Device/Scope/ThermalZone (Namepath) */
Length = Op->Asl.FinalAmlLength;
NextOp = Op->Asl.Child; /* Get Namepath */
/* Get offset of last nameseg */
NamepathOffset = Gbl_CurrentAmlOffset + Length +
(NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE);
LsEmitOffsetTableEntry (FileId, Node, NamepathOffset, 0,
Op->Asl.ParseOpName, 0, (UINT8) 0, Op->Asl.AmlOpcode);
break;
default:
@ -267,6 +337,7 @@ LsAmlOffsetWalk (
* OpName - Name of the AML opcode
* Value - Current value of the AML field
* AmlOpcode - Opcode associated with the field
* ObjectType - ACPI object type
*
* RETURN: None
*
@ -278,10 +349,12 @@ static void
LsEmitOffsetTableEntry (
UINT32 FileId,
ACPI_NAMESPACE_NODE *Node,
UINT32 NamepathOffset,
UINT32 Offset,
char *OpName,
UINT64 Value,
UINT8 AmlOpcode)
UINT8 AmlOpcode,
UINT16 ParentOpcode)
{
ACPI_BUFFER TargetPath;
ACPI_STATUS Status;
@ -308,8 +381,9 @@ LsEmitOffsetTableEntry (
* Max Length for Integers is 8 bytes.
*/
FlPrintFile (FileId,
" {%-29s 0x%8.8X, 0x%2.2X, 0x%8.8X%8.8X}, /* %s */\n",
MsgBuffer, Offset, AmlOpcode, ACPI_FORMAT_UINT64 (Value), OpName);
" {%-29s 0x%4.4X, 0x%8.8X, 0x%2.2X, 0x%8.8X, 0x%8.8X%8.8X}, /* %s */\n",
MsgBuffer, ParentOpcode, NamepathOffset, AmlOpcode,
Offset, ACPI_FORMAT_UINT64 (Value), OpName);
}
@ -335,10 +409,12 @@ LsDoOffsetTableHeader (
"#define __AML_OFFSET_TABLE_H\n\n");
FlPrintFile (FileId, "typedef struct {\n"
" char *Pathname;\n"
" unsigned long Offset;\n"
" unsigned char Opcode;\n"
" unsigned long long Value;\n"
" char *Pathname; /* Full pathname (from root) to the object */\n"
" unsigned short ParentOpcode; /* AML opcode for the parent object */\n"
" unsigned long NamesegOffset; /* Offset of last nameseg in the parent namepath */\n"
" unsigned char Opcode; /* AML opcode for the data */\n"
" unsigned long Offset; /* Offset for the data */\n"
" unsigned long long Value; /* Original value of the data (as applicable) */\n"
"} AML_OFFSET_TABLE_ENTRY;\n\n");
FlPrintFile (FileId,
@ -346,29 +422,37 @@ LsDoOffsetTableHeader (
FlPrintFile (FileId,
"/*\n"
" * Information about supported object types:\n"
" * Information specific to the supported object types:\n"
" *\n"
" * Integers:\n"
" * Offset points to the actual integer data\n"
" * Opcode is the integer prefix, indicates length of the data\n"
" * (One of: BYTE, WORD, DWORD, QWORD, ZERO, ONE, ONES)\n"
" * Offset points to the actual integer data\n"
" * Value is the existing value in the AML\n"
" *\n"
" * Packages:\n"
" * Offset points to the package opcode\n"
" * Opcode is the package or var_package opcode\n"
" * Value is the package element cound\n"
" * Offset points to the package opcode\n"
" * Value is the package element count\n"
" *\n"
" * Operation Regions:\n"
" * Offset points to the region address data\n"
" * Opcode is the address integer prefix, indicates length of the data\n"
" * Offset points to the region address\n"
" * Value is the existing address value in the AML\n"
" *\n"
" * Control Methods:\n"
" * Offset points to the first byte of the namepath\n"
" * Offset points to the method flags byte\n"
" * Value is the existing flags value in the AML\n"
" *\n"
" * Processors:\n"
" * Offset points to the first byte of the PBlock Address\n"
" *\n"
" * Resource Descriptors:\n"
" * Offset points to the start of the descriptor\n"
" * Opcode is the descriptor type\n"
" * Offset points to the start of the descriptor\n"
" *\n"
" * Scopes/Devices/ThermalZones:\n"
" * Nameseg offset only\n"
" */\n");
FlPrintFile (FileId,
@ -383,6 +467,6 @@ LsDoOffsetTableFooter (
{
FlPrintFile (FileId,
" {0,0,0,0} /* Table terminator */\n};\n\n");
" {NULL,0,0,0,0,0} /* Table terminator */\n};\n\n");
Gbl_CurrentAmlOffset = 0;
}

View File

@ -971,12 +971,15 @@ OpnDoDefinitionBlock (
Gbl_TableId = AcpiOsAllocate (Length + 1);
ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
/*
* Convert anything non-alphanumeric to an underscore. This
* allows us to use the TableID to generate unique C symbols.
*/
for (i = 0; i < Length; i++)
{
if (Gbl_TableId[i] == ' ')
if (!isalnum ((int) Gbl_TableId[i]))
{
Gbl_TableId[i] = 0;
break;
Gbl_TableId[i] = '_';
}
}
}

View File

@ -68,7 +68,7 @@ AslDoResponseFile (
#define ASL_TOKEN_SEPARATORS " \t\n"
#define ASL_SUPPORTED_OPTIONS "@:b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z"
#define ASL_SUPPORTED_OPTIONS "@:b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T+G^v^w|x:z"
/*******************************************************************************

View File

@ -117,13 +117,21 @@ DtCreateTemplates (
AslInitializeGlobals ();
/* Default (no signature) is DSDT */
if (!Signature)
{
Signature = "DSDT";
goto GetTemplate;
}
AcpiUtStrupr (Signature);
/* Create all known templates if requested */
if (!ACPI_STRNCMP (Signature, "ALL", 3) ||
if (!ACPI_STRCMP (Signature, "ALL") ||
!ACPI_STRCMP (Signature, "*"))
{
/* Create all available/known templates */
Status = DtCreateAllTemplates ();
return (Status);
}
@ -136,7 +144,9 @@ DtCreateTemplates (
*/
if (strlen (Signature) != ACPI_NAME_SIZE)
{
fprintf (stderr, "%s, Invalid ACPI table signature\n", Signature);
fprintf (stderr,
"%s: Invalid ACPI table signature (length must be 4 characters)\n",
Signature);
return (AE_ERROR);
}
@ -153,19 +163,20 @@ DtCreateTemplates (
Signature = "FACP";
}
GetTemplate:
TableData = AcpiDmGetTableData (Signature);
if (TableData)
{
if (!TableData->Template)
{
fprintf (stderr, "%4.4s, No template available\n", Signature);
fprintf (stderr, "%4.4s: No template available\n", Signature);
return (AE_ERROR);
}
}
else if (!AcpiUtIsSpecialTable (Signature))
{
fprintf (stderr,
"%4.4s, Unrecognized ACPI table signature\n", Signature);
"%4.4s: Unrecognized ACPI table signature\n", Signature);
return (AE_ERROR);
}

View File

@ -1009,10 +1009,17 @@ AcpiExOpcode_1A_0T_1R (
* add another reference to the referenced object, however.
*/
ReturnDesc = *(Operand[0]->Reference.Where);
if (ReturnDesc)
if (!ReturnDesc)
{
AcpiUtAddReference (ReturnDesc);
/*
* Element is NULL, do not allow the dereference.
* This provides compatibility with other ACPI
* implementations.
*/
return_ACPI_STATUS (AE_AML_UNINITIALIZED_ELEMENT);
}
AcpiUtAddReference (ReturnDesc);
break;
default:
@ -1030,15 +1037,44 @@ AcpiExOpcode_1A_0T_1R (
ReturnDesc = Operand[0]->Reference.Object;
if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
ACPI_DESC_TYPE_NAMED)
ACPI_DESC_TYPE_NAMED)
{
ReturnDesc = AcpiNsGetAttachedObject (
(ACPI_NAMESPACE_NODE *) ReturnDesc);
(ACPI_NAMESPACE_NODE *) ReturnDesc);
if (!ReturnDesc)
{
break;
}
/*
* June 2013:
* BufferFields/FieldUnits require additional resolution
*/
switch (ReturnDesc->Common.Type)
{
case ACPI_TYPE_BUFFER_FIELD:
case ACPI_TYPE_LOCAL_REGION_FIELD:
case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD:
Status = AcpiExReadDataFromField (WalkState,
ReturnDesc, &TempDesc);
if (ACPI_FAILURE (Status))
{
goto Cleanup;
}
ReturnDesc = TempDesc;
break;
default:
/* Add another reference to the object */
AcpiUtAddReference (ReturnDesc);
break;
}
}
/* Add another reference to the object! */
AcpiUtAddReference (ReturnDesc);
break;
default:

View File

@ -115,8 +115,14 @@ AcpiGetTimer (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
Status = AcpiHwRead (Ticks, &AcpiGbl_FADT.XPmTimerBlock);
/* ACPI 5.0A: PM Timer is optional */
if (!AcpiGbl_FADT.XPmTimerBlock.Address)
{
return_ACPI_STATUS (AE_SUPPORT);
}
Status = AcpiHwRead (Ticks, &AcpiGbl_FADT.XPmTimerBlock);
return_ACPI_STATUS (Status);
}
@ -171,6 +177,13 @@ AcpiGetTimerDuration (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
/* ACPI 5.0A: PM Timer is optional */
if (!AcpiGbl_FADT.XPmTimerBlock.Address)
{
return_ACPI_STATUS (AE_SUPPORT);
}
/*
* Compute Tick Delta:
* Handle (max one) timer rollovers on 24-bit versus 32-bit timers.

View File

@ -165,6 +165,16 @@ AcpiNsCheckReturnValue (
goto Exit;
}
/*
*
* 4) If there is no return value and it is optional, just return
* AE_OK (_WAK).
*/
if (!(*ReturnObjectPtr))
{
goto Exit;
}
/*
* For returned Package objects, check the type of all sub-objects.
* Note: Package may have been newly created by call above.
@ -293,7 +303,13 @@ AcpiNsCheckObjectType (
AcpiUtGetExpectedReturnTypes (TypeBuffer, ExpectedBtypes);
if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
if (!ReturnObject)
{
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
"Expected return object of type %s",
TypeBuffer));
}
else if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT)
{
ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
"Return type mismatch - found %s, expected %s",

View File

@ -165,9 +165,9 @@ AcpiNsGetNextNodeTyped (
* MaxDepth - Depth to which search is to reach
* Flags - Whether to unlock the NS before invoking
* the callback routine
* PreOrderVisit - Called during tree pre-order visit
* DescendingCallback - Called during tree descent
* when an object of "Type" is found
* PostOrderVisit - Called during tree post-order visit
* AscendingCallback - Called during tree ascent
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - from the UserFunction if terminated
@ -195,8 +195,8 @@ AcpiNsWalkNamespace (
ACPI_HANDLE StartNode,
UINT32 MaxDepth,
UINT32 Flags,
ACPI_WALK_CALLBACK PreOrderVisit,
ACPI_WALK_CALLBACK PostOrderVisit,
ACPI_WALK_CALLBACK DescendingCallback,
ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue)
{
@ -274,22 +274,22 @@ AcpiNsWalkNamespace (
}
/*
* Invoke the user function, either pre-order or post-order
* Invoke the user function, either descending, ascending,
* or both.
*/
if (!NodePreviouslyVisited)
{
if (PreOrderVisit)
if (DescendingCallback)
{
Status = PreOrderVisit (ChildNode, Level,
Status = DescendingCallback (ChildNode, Level,
Context, ReturnValue);
}
}
else
{
if (PostOrderVisit)
if (AscendingCallback)
{
Status = PostOrderVisit (ChildNode, Level,
Status = AscendingCallback (ChildNode, Level,
Context, ReturnValue);
}
}

View File

@ -574,9 +574,9 @@ AcpiNsResolveReferences (
* PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
* StartObject - Handle in namespace where search begins
* MaxDepth - Depth to which search is to reach
* PreOrderVisit - Called during tree pre-order visit
* DescendingCallback - Called during tree descent
* when an object of "Type" is found
* PostOrderVisit - Called during tree post-order visit
* AscendingCallback - Called during tree ascent
* when an object of "Type" is found
* Context - Passed to user function(s) above
* ReturnValue - Location where return value of
@ -605,8 +605,8 @@ AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
ACPI_WALK_CALLBACK PreOrderVisit,
ACPI_WALK_CALLBACK PostOrderVisit,
ACPI_WALK_CALLBACK DescendingCallback,
ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue)
{
@ -620,7 +620,7 @@ AcpiWalkNamespace (
if ((Type > ACPI_TYPE_LOCAL_MAX) ||
(!MaxDepth) ||
(!PreOrderVisit && !PostOrderVisit))
(!DescendingCallback && !AscendingCallback))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
@ -655,8 +655,8 @@ AcpiWalkNamespace (
}
Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
ACPI_NS_WALK_UNLOCK, PreOrderVisit,
PostOrderVisit, Context, ReturnValue);
ACPI_NS_WALK_UNLOCK, DescendingCallback,
AscendingCallback, Context, ReturnValue);
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);

View File

@ -132,7 +132,7 @@ static ACPI_FADT_INFO FadtInfoTable[] =
ACPI_FADT_OFFSET (PmTimerBlock),
ACPI_FADT_OFFSET (PmTimerLength),
ACPI_PM_TIMER_WIDTH,
ACPI_FADT_REQUIRED},
ACPI_FADT_SEPARATE_LENGTH}, /* ACPI 5.0A: Timer is optional */
{"Gpe0Block",
ACPI_FADT_OFFSET (XGpe0Block),
@ -606,7 +606,7 @@ AcpiTbValidateFadt (
if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
{
/*
* Field is required (PM1aEvent, PM1aControl, PmTimer).
* Field is required (PM1aEvent, PM1aControl).
* Both the address and length must be non-zero.
*/
if (!Address64->Address || !Length)

View File

@ -51,12 +51,6 @@
#define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME ("tbxfroot")
/* Local prototypes */
static ACPI_STATUS
AcpiTbValidateRsdp (
ACPI_TABLE_RSDP *Rsdp);
/*******************************************************************************
*
@ -70,7 +64,7 @@ AcpiTbValidateRsdp (
*
******************************************************************************/
static ACPI_STATUS
ACPI_STATUS
AcpiTbValidateRsdp (
ACPI_TABLE_RSDP *Rsdp)
{
@ -81,7 +75,7 @@ AcpiTbValidateRsdp (
* Note: Sometimes there exists more than one RSDP in memory; the valid
* RSDP has a valid checksum, all others have an invalid checksum.
*/
if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP,
if (ACPI_STRNCMP ((char *) Rsdp->Signature, ACPI_SIG_RSDP,
sizeof (ACPI_SIG_RSDP)-1) != 0)
{
/* Nope, BAD Signature */

View File

@ -319,7 +319,6 @@ AcpiUtInitGlobals (
AcpiGbl_TraceDbgLayer = 0;
AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING;
AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT;
AcpiGbl_OsiData = 0;
AcpiGbl_OsiMutex = NULL;
AcpiGbl_RegMethodsExecuted = FALSE;

View File

@ -81,21 +81,20 @@ static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] =
/* Feature Group Strings */
{"Extended Address Space Descriptor", NULL, 0, 0}
{"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
/*
* All "optional" feature group strings (features that are implemented
* by the host) should be dynamically added by the host via
* AcpiInstallInterface and should not be manually added here.
*
* Examples of optional feature group strings:
*
* "Module Device"
* "Processor Device"
* "3.0 Thermal Model"
* "3.0 _SCP Extensions"
* "Processor Aggregator Device"
* by the host) should be dynamically modified to VALID by the host via
* AcpiInstallInterface or AcpiUpdateInterfaces. Such optional feature
* group strings are set as INVALID by default here.
*/
{"Module Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
{"Processor Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
{"3.0 Thermal Model", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
{"3.0 _SCP Extensions", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
{"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
};
@ -172,13 +171,26 @@ AcpiUtInterfaceTerminate (
{
AcpiGbl_SupportedInterfaces = NextInterface->Next;
/* Only interfaces added at runtime can be freed */
if (NextInterface->Flags & ACPI_OSI_DYNAMIC)
{
/* Only interfaces added at runtime can be freed */
ACPI_FREE (NextInterface->Name);
ACPI_FREE (NextInterface);
}
else
{
/* Interface is in static list. Reset it to invalid or valid. */
if (NextInterface->Flags & ACPI_OSI_DEFAULT_INVALID)
{
NextInterface->Flags |= ACPI_OSI_INVALID;
}
else
{
NextInterface->Flags &= ~ACPI_OSI_INVALID;
}
}
NextInterface = AcpiGbl_SupportedInterfaces;
}
@ -305,6 +317,57 @@ AcpiUtRemoveInterface (
}
/*******************************************************************************
*
* FUNCTION: AcpiUtUpdateInterfaces
*
* PARAMETERS: Action - Actions to be performed during the
* update
*
* RETURN: Status
*
* DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
* strings or/and feature group strings.
* Caller MUST hold AcpiGbl_OsiMutex
*
******************************************************************************/
ACPI_STATUS
AcpiUtUpdateInterfaces (
UINT8 Action)
{
ACPI_INTERFACE_INFO *NextInterface;
NextInterface = AcpiGbl_SupportedInterfaces;
while (NextInterface)
{
if (((NextInterface->Flags & ACPI_OSI_FEATURE) &&
(Action & ACPI_FEATURE_STRINGS)) ||
(!(NextInterface->Flags & ACPI_OSI_FEATURE) &&
(Action & ACPI_VENDOR_STRINGS)))
{
if (Action & ACPI_DISABLE_INTERFACES)
{
/* Mark the interfaces as invalid */
NextInterface->Flags |= ACPI_OSI_INVALID;
}
else
{
/* Mark the interfaces as valid */
NextInterface->Flags &= ~ACPI_OSI_INVALID;
}
}
NextInterface = NextInterface->Next;
}
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: AcpiUtGetInterface

View File

@ -497,6 +497,40 @@ AcpiInstallInterfaceHandler (
ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
/*****************************************************************************
*
* FUNCTION: AcpiUpdateInterfaces
*
* PARAMETERS: Action - Actions to be performed during the
* update
*
* RETURN: Status
*
* DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
* string or/and feature group strings.
*
****************************************************************************/
ACPI_STATUS
AcpiUpdateInterfaces (
UINT8 Action)
{
ACPI_STATUS Status;
Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
if (ACPI_FAILURE (Status))
{
return (Status);
}
Status = AcpiUtUpdateInterfaces (Action);
AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
return (Status);
}
/*****************************************************************************
*
* FUNCTION: AcpiCheckAddressRange

View File

@ -140,6 +140,12 @@ UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE);
*/
UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE);
/*
* We keep track of the latest version of Windows that has been requested by
* the BIOS.
*/
UINT8 ACPI_INIT_GLOBAL (AcpiGbl_OsiData, 0);
/* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */
@ -290,7 +296,6 @@ ACPI_EXTERN UINT8 AcpiGbl_DebuggerConfiguration;
ACPI_EXTERN BOOLEAN AcpiGbl_StepToNextCall;
ACPI_EXTERN BOOLEAN AcpiGbl_AcpiHardwarePresent;
ACPI_EXTERN BOOLEAN AcpiGbl_EventsInitialized;
ACPI_EXTERN UINT8 AcpiGbl_OsiData;
ACPI_EXTERN ACPI_INTERFACE_INFO *AcpiGbl_SupportedInterfaces;
ACPI_EXTERN ACPI_ADDRESS_RANGE *AcpiGbl_AddressRangeList[ACPI_ADDRESS_RANGE_MAX];

View File

@ -1100,19 +1100,6 @@ typedef struct acpi_bit_register_info
/* Structs and definitions for _OSI support and I/O port validation */
#define ACPI_OSI_WIN_2000 0x01
#define ACPI_OSI_WIN_XP 0x02
#define ACPI_OSI_WIN_XP_SP1 0x03
#define ACPI_OSI_WINSRV_2003 0x04
#define ACPI_OSI_WIN_XP_SP2 0x05
#define ACPI_OSI_WINSRV_2003_SP1 0x06
#define ACPI_OSI_WIN_VISTA 0x07
#define ACPI_OSI_WINSRV_2008 0x08
#define ACPI_OSI_WIN_VISTA_SP1 0x09
#define ACPI_OSI_WIN_VISTA_SP2 0x0A
#define ACPI_OSI_WIN_7 0x0B
#define ACPI_OSI_WIN_8 0x0C
#define ACPI_ALWAYS_ILLEGAL 0x00
typedef struct acpi_interface_info
@ -1126,6 +1113,9 @@ typedef struct acpi_interface_info
#define ACPI_OSI_INVALID 0x01
#define ACPI_OSI_DYNAMIC 0x02
#define ACPI_OSI_FEATURE 0x04
#define ACPI_OSI_DEFAULT_INVALID 0x08
#define ACPI_OSI_OPTIONAL_FEATURE (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
typedef struct acpi_port_info
{
@ -1221,6 +1211,7 @@ typedef struct acpi_external_list
UINT8 Type;
UINT8 Flags;
BOOLEAN Resolved;
BOOLEAN Emitted;
} ACPI_EXTERNAL_LIST;

View File

@ -117,8 +117,8 @@ AcpiNsWalkNamespace (
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
UINT32 Flags,
ACPI_WALK_CALLBACK PreOrderVisit,
ACPI_WALK_CALLBACK PostOrderVisit,
ACPI_WALK_CALLBACK DescendingCallback,
ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue);

View File

@ -47,7 +47,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20130626
#define ACPI_CA_VERSION 0x20130725
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h>
@ -61,6 +61,7 @@ extern UINT32 AcpiCurrentGpeCount;
extern ACPI_TABLE_FADT AcpiGbl_FADT;
extern BOOLEAN AcpiGbl_SystemAwakeAndRunning;
extern BOOLEAN AcpiGbl_ReducedHardware; /* ACPI 5.0 */
extern UINT8 AcpiGbl_OsiData;
/* Runtime configuration of debug print levels */
@ -177,6 +178,10 @@ ACPI_STATUS
AcpiRemoveInterface (
ACPI_STRING InterfaceName);
ACPI_STATUS
AcpiUpdateInterfaces (
UINT8 Action);
UINT32
AcpiCheckAddressRange (
ACPI_ADR_SPACE_TYPE SpaceId,
@ -268,8 +273,8 @@ AcpiWalkNamespace (
ACPI_OBJECT_TYPE Type,
ACPI_HANDLE StartObject,
UINT32 MaxDepth,
ACPI_WALK_CALLBACK PreOrderVisit,
ACPI_WALK_CALLBACK PostOrderVisit,
ACPI_WALK_CALLBACK DescendingCallback,
ACPI_WALK_CALLBACK AscendingCallback,
void *Context,
void **ReturnValue);

View File

@ -52,6 +52,10 @@ AcpiAllocateRootTable (
/*
* tbxfroot - Root pointer utilities
*/
ACPI_STATUS
AcpiTbValidateRsdp (
ACPI_TABLE_RSDP *Rsdp);
UINT8 *
AcpiTbScanMemoryForRsdp (
UINT8 *StartAddress,

View File

@ -1244,4 +1244,32 @@ typedef struct acpi_memory_list
} ACPI_MEMORY_LIST;
/* Definitions of _OSI support */
#define ACPI_VENDOR_STRINGS 0x01
#define ACPI_FEATURE_STRINGS 0x02
#define ACPI_ENABLE_INTERFACES 0x00
#define ACPI_DISABLE_INTERFACES 0x04
#define ACPI_DISABLE_ALL_VENDOR_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
#define ACPI_DISABLE_ALL_FEATURE_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
#define ACPI_DISABLE_ALL_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
#define ACPI_ENABLE_ALL_VENDOR_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
#define ACPI_ENABLE_ALL_FEATURE_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
#define ACPI_ENABLE_ALL_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
#define ACPI_OSI_WIN_2000 0x01
#define ACPI_OSI_WIN_XP 0x02
#define ACPI_OSI_WIN_XP_SP1 0x03
#define ACPI_OSI_WINSRV_2003 0x04
#define ACPI_OSI_WIN_XP_SP2 0x05
#define ACPI_OSI_WINSRV_2003_SP1 0x06
#define ACPI_OSI_WIN_VISTA 0x07
#define ACPI_OSI_WINSRV_2008 0x08
#define ACPI_OSI_WIN_VISTA_SP1 0x09
#define ACPI_OSI_WIN_VISTA_SP2 0x0A
#define ACPI_OSI_WIN_7 0x0B
#define ACPI_OSI_WIN_8 0x0C
#endif /* __ACTYPES_H__ */

View File

@ -670,6 +670,10 @@ ACPI_STATUS
AcpiUtRemoveInterface (
ACPI_STRING InterfaceName);
ACPI_STATUS
AcpiUtUpdateInterfaces (
UINT8 Action);
ACPI_INTERFACE_INFO *
AcpiUtGetInterface (
ACPI_STRING InterfaceName);