[ACPICA] Update to version 20181003. CORE-15222

This commit is contained in:
Thomas Faber 2018-10-25 12:11:45 +02:00
parent 6847cc3ae0
commit b062d28bc6
No known key found for this signature in database
GPG key ID: 076E7C3D44720826
29 changed files with 739 additions and 345 deletions

View file

@ -59,6 +59,7 @@ list(APPEND ACPICA_SOURCE
acpica/executer/exresnte.c acpica/executer/exresnte.c
acpica/executer/exresolv.c acpica/executer/exresolv.c
acpica/executer/exresop.c acpica/executer/exresop.c
acpica/executer/exserial.c
acpica/executer/exstore.c acpica/executer/exstore.c
acpica/executer/exstoren.c acpica/executer/exstoren.c
acpica/executer/exstorob.c acpica/executer/exstorob.c

View file

@ -49,6 +49,10 @@
#include "acnamesp.h" #include "acnamesp.h"
#include "acparser.h" #include "acparser.h"
#ifdef ACPI_EXEC_APP
#include "aecommon.h"
#endif
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsfield") ACPI_MODULE_NAME ("dsfield")
@ -322,6 +326,13 @@ AcpiDsGetFieldNames (
UINT64 Position; UINT64 Position;
ACPI_PARSE_OBJECT *Child; ACPI_PARSE_OBJECT *Child;
#ifdef ACPI_EXEC_APP
UINT64 Value = 0;
ACPI_OPERAND_OBJECT *ResultDesc;
ACPI_OPERAND_OBJECT *ObjDesc;
char *NamePath;
#endif
ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info); ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
@ -456,6 +467,18 @@ AcpiDsGetFieldNames (
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
#ifdef ACPI_EXEC_APP
NamePath = AcpiNsGetExternalPathname (Info->FieldNode);
ObjDesc = AcpiUtCreateIntegerObject (Value);
if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &Value)))
{
AcpiExWriteDataToField (ObjDesc,
AcpiNsGetAttachedObject (Info->FieldNode),
&ResultDesc);
}
AcpiUtRemoveReference (ObjDesc);
ACPI_FREE (NamePath);
#endif
} }
} }
@ -648,6 +671,9 @@ AcpiDsInitFieldObjects (
Flags |= ACPI_NS_TEMPORARY; Flags |= ACPI_NS_TEMPORARY;
} }
#ifdef ACPI_EXEC_APP
Flags |= ACPI_NS_OVERRIDE_IF_FOUND;
#endif
/* /*
* Walk the list of entries in the FieldList * Walk the list of entries in the FieldList
* Note: FieldList can be of zero length. In this case, Arg will be NULL. * Note: FieldList can be of zero length. In this case, Arg will be NULL.

View file

@ -730,6 +730,20 @@ AcpiEvExecuteRegMethods (
ACPI_FUNCTION_TRACE (EvExecuteRegMethods); ACPI_FUNCTION_TRACE (EvExecuteRegMethods);
/*
* These address spaces do not need a call to _REG, since the ACPI
* specification defines them as: "must always be accessible". Since
* they never change state (never become unavailable), no need to ever
* call _REG on them. Also, a DataTable is not a "real" address space,
* so do not call _REG. September 2018.
*/
if ((SpaceId == ACPI_ADR_SPACE_SYSTEM_MEMORY) ||
(SpaceId == ACPI_ADR_SPACE_SYSTEM_IO) ||
(SpaceId == ACPI_ADR_SPACE_DATA_TABLE))
{
return_VOID;
}
Info.SpaceId = SpaceId; Info.SpaceId = SpaceId;
Info.Function = Function; Info.Function = Function;
Info.RegRunCount = 0; Info.RegRunCount = 0;
@ -796,8 +810,8 @@ AcpiEvRegRun (
} }
/* /*
* We only care about regions.and objects that are allowed to have address * We only care about regions and objects that are allowed to have
* space handlers * address space handlers
*/ */
if ((Node->Type != ACPI_TYPE_REGION) && if ((Node->Type != ACPI_TYPE_REGION) &&
(Node != AcpiGbl_RootNode)) (Node != AcpiGbl_RootNode))

View file

@ -50,12 +50,6 @@
#define _COMPONENT ACPI_EVENTS #define _COMPONENT ACPI_EVENTS
ACPI_MODULE_NAME ("evrgnini") ACPI_MODULE_NAME ("evrgnini")
/* Local prototypes */
static BOOLEAN
AcpiEvIsPciRootBridge (
ACPI_NAMESPACE_NODE *Node);
/******************************************************************************* /*******************************************************************************
* *
@ -382,7 +376,7 @@ AcpiEvPciConfigRegionSetup (
* *
******************************************************************************/ ******************************************************************************/
static BOOLEAN BOOLEAN
AcpiEvIsPciRootBridge ( AcpiEvIsPciRootBridge (
ACPI_NAMESPACE_NODE *Node) ACPI_NAMESPACE_NODE *Node)
{ {

View file

@ -246,7 +246,6 @@ AcpiRemoveAddressSpaceHandler (
* DetachRegion removed the previous head. * DetachRegion removed the previous head.
*/ */
RegionObj = HandlerObj->AddressSpace.RegionList; RegionObj = HandlerObj->AddressSpace.RegionList;
} }
/* Remove this Handler object from the list */ /* Remove this Handler object from the list */

View file

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: exfield - ACPI AML (p-code) execution - field manipulation * Module Name: exfield - AML execution - FieldUnit read/write
* *
*****************************************************************************/ *****************************************************************************/
@ -51,72 +51,68 @@
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME ("exfield") ACPI_MODULE_NAME ("exfield")
/* Local prototypes */
static UINT32 /*
AcpiExGetSerialAccessLength ( * This table maps the various Attrib protocols to the byte transfer
UINT32 AccessorType, * length. Used for the generic serial bus.
UINT32 AccessLength); */
#define ACPI_INVALID_PROTOCOL_ID 0x80
#define ACPI_MAX_PROTOCOL_ID 0x0F
const UINT8 AcpiProtocolLengths[] =
{
ACPI_INVALID_PROTOCOL_ID, /* 0 - reserved */
ACPI_INVALID_PROTOCOL_ID, /* 1 - reserved */
0x00, /* 2 - ATTRIB_QUICK */
ACPI_INVALID_PROTOCOL_ID, /* 3 - reserved */
0x01, /* 4 - ATTRIB_SEND_RECEIVE */
ACPI_INVALID_PROTOCOL_ID, /* 5 - reserved */
0x01, /* 6 - ATTRIB_BYTE */
ACPI_INVALID_PROTOCOL_ID, /* 7 - reserved */
0x02, /* 8 - ATTRIB_WORD */
ACPI_INVALID_PROTOCOL_ID, /* 9 - reserved */
0xFF, /* A - ATTRIB_BLOCK */
0xFF, /* B - ATTRIB_BYTES */
0x02, /* C - ATTRIB_PROCESS_CALL */
0xFF, /* D - ATTRIB_BLOCK_PROCESS_CALL */
0xFF, /* E - ATTRIB_RAW_BYTES */
0xFF /* F - ATTRIB_RAW_PROCESS_BYTES */
};
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: AcpiExGetSerialAccessLength * FUNCTION: AcpiExGetProtocolBufferLength
* *
* PARAMETERS: AccessorType - The type of the protocol indicated by region * PARAMETERS: ProtocolId - The type of the protocol indicated by region
* field access attributes * field access attributes
* AccessLength - The access length of the region field * ReturnLength - Where the protocol byte transfer length is
* returned
* *
* RETURN: Decoded access length * RETURN: Status and decoded byte transfer length
* *
* DESCRIPTION: This routine returns the length of the GenericSerialBus * DESCRIPTION: This routine returns the length of the GenericSerialBus
* protocol bytes * protocol bytes
* *
******************************************************************************/ ******************************************************************************/
static UINT32 ACPI_STATUS
AcpiExGetSerialAccessLength ( AcpiExGetProtocolBufferLength (
UINT32 AccessorType, UINT32 ProtocolId,
UINT32 AccessLength) UINT32 *ReturnLength)
{ {
UINT32 Length;
if ((ProtocolId > ACPI_MAX_PROTOCOL_ID) ||
switch (AccessorType) (AcpiProtocolLengths[ProtocolId] == ACPI_INVALID_PROTOCOL_ID))
{ {
case AML_FIELD_ATTRIB_QUICK: ACPI_ERROR ((AE_INFO,
"Invalid Field/AccessAs protocol ID: 0x%4.4X", ProtocolId));
Length = 0; return (AE_AML_PROTOCOL);
break;
case AML_FIELD_ATTRIB_SEND_RCV:
case AML_FIELD_ATTRIB_BYTE:
Length = 1;
break;
case AML_FIELD_ATTRIB_WORD:
case AML_FIELD_ATTRIB_WORD_CALL:
Length = 2;
break;
case AML_FIELD_ATTRIB_MULTIBYTE:
case AML_FIELD_ATTRIB_RAW_BYTES:
case AML_FIELD_ATTRIB_RAW_PROCESS:
Length = AccessLength;
break;
case AML_FIELD_ATTRIB_BLOCK:
case AML_FIELD_ATTRIB_BLOCK_CALL:
default:
Length = ACPI_GSBUS_BUFFER_SIZE - 2;
break;
} }
return (Length); *ReturnLength = AcpiProtocolLengths[ProtocolId];
return (AE_OK);
} }
@ -143,10 +139,8 @@ AcpiExReadDataFromField (
{ {
ACPI_STATUS Status; ACPI_STATUS Status;
ACPI_OPERAND_OBJECT *BufferDesc; ACPI_OPERAND_OBJECT *BufferDesc;
ACPI_SIZE Length;
void *Buffer; void *Buffer;
UINT32 Function; UINT32 BufferLength;
UINT16 AccessorType;
ACPI_FUNCTION_TRACE_PTR (ExReadDataFromField, ObjDesc); ACPI_FUNCTION_TRACE_PTR (ExReadDataFromField, ObjDesc);
@ -183,59 +177,10 @@ AcpiExReadDataFromField (
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI))
{ {
/* /* SMBus, GSBus, IPMI serial */
* This is an SMBus, GSBus or IPMI read. We must create a buffer to
* hold the data and then directly access the region handler.
*
* Note: SMBus and GSBus protocol value is passed in upper 16-bits
* of Function
*/
if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_SMBUS)
{
Length = ACPI_SMBUS_BUFFER_SIZE;
Function = ACPI_READ | (ObjDesc->Field.Attribute << 16);
}
else if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_GSBUS)
{
AccessorType = ObjDesc->Field.Attribute;
Length = AcpiExGetSerialAccessLength (
AccessorType, ObjDesc->Field.AccessLength);
/* Status = AcpiExReadSerialBus (ObjDesc, RetBufferDesc);
* Add additional 2 bytes for the GenericSerialBus data buffer: return_ACPI_STATUS (Status);
*
* Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer)
* Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/
Length += 2;
Function = ACPI_READ | (AccessorType << 16);
}
else /* IPMI */
{
Length = ACPI_IPMI_BUFFER_SIZE;
Function = ACPI_READ;
}
BufferDesc = AcpiUtCreateBufferObject (Length);
if (!BufferDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Call the region handler for the read */
Status = AcpiExAccessRegion (ObjDesc, 0,
ACPI_CAST_PTR (UINT64, BufferDesc->Buffer.Pointer), Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
goto Exit;
} }
/* /*
@ -248,14 +193,14 @@ AcpiExReadDataFromField (
* *
* Note: Field.length is in bits. * Note: Field.length is in bits.
*/ */
Length = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES ( BufferLength = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (
ObjDesc->Field.BitLength); ObjDesc->Field.BitLength);
if (Length > AcpiGbl_IntegerByteWidth) if (BufferLength > AcpiGbl_IntegerByteWidth)
{ {
/* Field is too large for an Integer, create a Buffer instead */ /* Field is too large for an Integer, create a Buffer instead */
BufferDesc = AcpiUtCreateBufferObject (Length); BufferDesc = AcpiUtCreateBufferObject (BufferLength);
if (!BufferDesc) if (!BufferDesc)
{ {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
@ -272,47 +217,22 @@ AcpiExReadDataFromField (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
Length = AcpiGbl_IntegerByteWidth; BufferLength = AcpiGbl_IntegerByteWidth;
Buffer = &BufferDesc->Integer.Value; Buffer = &BufferDesc->Integer.Value;
} }
if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) && if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
(ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO)) (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO))
{ {
/* /* General Purpose I/O */
* For GPIO (GeneralPurposeIo), the Address will be the bit offset
* from the previous Connection() operator, making it effectively a
* pin number index. The BitLength is the length of the field, which
* is thus the number of pins.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"GPIO FieldRead [FROM]: Pin %u Bits %u\n",
ObjDesc->Field.PinNumberIndex, ObjDesc->Field.BitLength));
/* Lock entire transaction if requested */ Status = AcpiExReadGpio (ObjDesc, Buffer);
goto Exit;
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Perform the write */
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, ACPI_READ);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
if (ACPI_FAILURE (Status))
{
AcpiUtRemoveReference (BufferDesc);
}
else
{
*RetBufferDesc = BufferDesc;
}
return_ACPI_STATUS (Status);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n", "FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
ObjDesc, ObjDesc->Common.Type, Buffer, (UINT32) Length)); ObjDesc, ObjDesc->Common.Type, Buffer, BufferLength));
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"FieldRead [FROM]: BitLen %X, BitOff %X, ByteOff %X\n", "FieldRead [FROM]: BitLen %X, BitOff %X, ByteOff %X\n",
ObjDesc->CommonField.BitLength, ObjDesc->CommonField.BitLength,
@ -325,7 +245,7 @@ AcpiExReadDataFromField (
/* Read from the field */ /* Read from the field */
Status = AcpiExExtractFromField (ObjDesc, Buffer, (UINT32) Length); Status = AcpiExExtractFromField (ObjDesc, Buffer, BufferLength);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
@ -364,11 +284,8 @@ AcpiExWriteDataToField (
ACPI_OPERAND_OBJECT **ResultDesc) ACPI_OPERAND_OBJECT **ResultDesc)
{ {
ACPI_STATUS Status; ACPI_STATUS Status;
UINT32 Length; UINT32 BufferLength;
void *Buffer; void *Buffer;
ACPI_OPERAND_OBJECT *BufferDesc;
UINT32 Function;
UINT16 AccessorType;
ACPI_FUNCTION_TRACE_PTR (ExWriteDataToField, ObjDesc); ACPI_FUNCTION_TRACE_PTR (ExWriteDataToField, ObjDesc);
@ -396,132 +313,22 @@ AcpiExWriteDataToField (
} }
} }
} }
else if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
(ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO))
{
/* General Purpose I/O */
Status = AcpiExWriteGpio (SourceDesc, ObjDesc, ResultDesc);
return_ACPI_STATUS (Status);
}
else if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) && else if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
(ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS || (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS ||
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS ||
ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI))
{ {
/* /* SMBus, GSBus, IPMI serial */
* This is an SMBus, GSBus or IPMI write. We will bypass the entire
* field mechanism and handoff the buffer directly to the handler.
* For these address spaces, the buffer is bi-directional; on a
* write, return data is returned in the same buffer.
*
* Source must be a buffer of sufficient size:
* ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or
* ACPI_IPMI_BUFFER_SIZE.
*
* Note: SMBus and GSBus protocol type is passed in upper 16-bits
* of Function
*/
if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER)
{
ACPI_ERROR ((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires "
"Buffer, found type %s",
AcpiUtGetObjectTypeName (SourceDesc)));
return_ACPI_STATUS (AE_AML_OPERAND_TYPE); Status = AcpiExWriteSerialBus (SourceDesc, ObjDesc, ResultDesc);
}
if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_SMBUS)
{
Length = ACPI_SMBUS_BUFFER_SIZE;
Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16);
}
else if (ObjDesc->Field.RegionObj->Region.SpaceId ==
ACPI_ADR_SPACE_GSBUS)
{
AccessorType = ObjDesc->Field.Attribute;
Length = AcpiExGetSerialAccessLength (
AccessorType, ObjDesc->Field.AccessLength);
/*
* Add additional 2 bytes for the GenericSerialBus data buffer:
*
* Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer)
* Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/
Length += 2;
Function = ACPI_WRITE | (AccessorType << 16);
}
else /* IPMI */
{
Length = ACPI_IPMI_BUFFER_SIZE;
Function = ACPI_WRITE;
}
if (SourceDesc->Buffer.Length < Length)
{
ACPI_ERROR ((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires "
"Buffer of length %u, found length %u",
Length, SourceDesc->Buffer.Length));
return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
}
/* Create the bi-directional buffer */
BufferDesc = AcpiUtCreateBufferObject (Length);
if (!BufferDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
Buffer = BufferDesc->Buffer.Pointer;
memcpy (Buffer, SourceDesc->Buffer.Pointer, Length);
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/*
* Perform the write (returns status and perhaps data in the
* same buffer)
*/
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
*ResultDesc = BufferDesc;
return_ACPI_STATUS (Status);
}
else if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REGION_FIELD) &&
(ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GPIO))
{
/*
* For GPIO (GeneralPurposeIo), we will bypass the entire field
* mechanism and handoff the bit address and bit width directly to
* the handler. The Address will be the bit offset
* from the previous Connection() operator, making it effectively a
* pin number index. The BitLength is the length of the field, which
* is thus the number of pins.
*/
if (SourceDesc->Common.Type != ACPI_TYPE_INTEGER)
{
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"GPIO FieldWrite [FROM]: (%s:%X), Val %.8X [TO]: Pin %u Bits %u\n",
AcpiUtGetTypeName (SourceDesc->Common.Type),
SourceDesc->Common.Type, (UINT32) SourceDesc->Integer.Value,
ObjDesc->Field.PinNumberIndex, ObjDesc->Field.BitLength));
Buffer = &SourceDesc->Integer.Value;
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Perform the write */
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, ACPI_WRITE);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
@ -532,30 +339,29 @@ AcpiExWriteDataToField (
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
Buffer = &SourceDesc->Integer.Value; Buffer = &SourceDesc->Integer.Value;
Length = sizeof (SourceDesc->Integer.Value); BufferLength = sizeof (SourceDesc->Integer.Value);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
Buffer = SourceDesc->Buffer.Pointer; Buffer = SourceDesc->Buffer.Pointer;
Length = SourceDesc->Buffer.Length; BufferLength = SourceDesc->Buffer.Length;
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
Buffer = SourceDesc->String.Pointer; Buffer = SourceDesc->String.Pointer;
Length = SourceDesc->String.Length; BufferLength = SourceDesc->String.Length;
break; break;
default: default:
return_ACPI_STATUS (AE_AML_OPERAND_TYPE); return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"FieldWrite [FROM]: Obj %p (%s:%X), Buf %p, ByteLen %X\n", "FieldWrite [FROM]: Obj %p (%s:%X), Buf %p, ByteLen %X\n",
SourceDesc, AcpiUtGetTypeName (SourceDesc->Common.Type), SourceDesc, AcpiUtGetTypeName (SourceDesc->Common.Type),
SourceDesc->Common.Type, Buffer, Length)); SourceDesc->Common.Type, Buffer, BufferLength));
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"FieldWrite [TO]: Obj %p (%s:%X), BitLen %X, BitOff %X, ByteOff %X\n", "FieldWrite [TO]: Obj %p (%s:%X), BitLen %X, BitOff %X, ByteOff %X\n",
@ -571,8 +377,7 @@ AcpiExWriteDataToField (
/* Write to the field */ /* Write to the field */
Status = AcpiExInsertIntoField (ObjDesc, Buffer, Length); Status = AcpiExInsertIntoField (ObjDesc, Buffer, BufferLength);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }

View file

@ -0,0 +1,416 @@
/******************************************************************************
*
* Module Name: exserial - FieldUnit support for serial address spaces
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2018, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*/
#include "acpi.h"
#include "accommon.h"
#include "acdispat.h"
#include "acinterp.h"
#include "amlcode.h"
#define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME ("exserial")
/*******************************************************************************
*
* FUNCTION: AcpiExReadGpio
*
* PARAMETERS: ObjDesc - The named field to read
* Buffer - Where the return data is returnd
*
* RETURN: Status
*
* DESCRIPTION: Read from a named field that references a Generic Serial Bus
* field
*
******************************************************************************/
ACPI_STATUS
AcpiExReadGpio (
ACPI_OPERAND_OBJECT *ObjDesc,
void *Buffer)
{
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE_PTR (ExReadGpio, ObjDesc);
/*
* For GPIO (GeneralPurposeIo), the Address will be the bit offset
* from the previous Connection() operator, making it effectively a
* pin number index. The BitLength is the length of the field, which
* is thus the number of pins.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"GPIO FieldRead [FROM]: Pin %u Bits %u\n",
ObjDesc->Field.PinNumberIndex, ObjDesc->Field.BitLength));
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Perform the read */
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, ACPI_READ);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiExWriteGpio
*
* PARAMETERS: SourceDesc - Contains data to write. Expect to be
* an Integer object.
* ObjDesc - The named field
* ResultDesc - Where the return value is returned, if any
*
* RETURN: Status
*
* DESCRIPTION: Write to a named field that references a General Purpose I/O
* field.
*
******************************************************************************/
ACPI_STATUS
AcpiExWriteGpio (
ACPI_OPERAND_OBJECT *SourceDesc,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer)
{
ACPI_STATUS Status;
void *Buffer;
ACPI_FUNCTION_TRACE_PTR (ExWriteGpio, ObjDesc);
/*
* For GPIO (GeneralPurposeIo), we will bypass the entire field
* mechanism and handoff the bit address and bit width directly to
* the handler. The Address will be the bit offset
* from the previous Connection() operator, making it effectively a
* pin number index. The BitLength is the length of the field, which
* is thus the number of pins.
*/
if (SourceDesc->Common.Type != ACPI_TYPE_INTEGER)
{
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
"GPIO FieldWrite [FROM]: (%s:%X), Value %.8X [TO]: Pin %u Bits %u\n",
AcpiUtGetTypeName (SourceDesc->Common.Type),
SourceDesc->Common.Type, (UINT32) SourceDesc->Integer.Value,
ObjDesc->Field.PinNumberIndex, ObjDesc->Field.BitLength));
Buffer = &SourceDesc->Integer.Value;
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Perform the write */
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, ACPI_WRITE);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiExReadSerialBus
*
* PARAMETERS: ObjDesc - The named field to read
* ReturnBuffer - Where the return value is returned, if any
*
* RETURN: Status
*
* DESCRIPTION: Read from a named field that references a serial bus
* (SMBus, IPMI, or GSBus).
*
******************************************************************************/
ACPI_STATUS
AcpiExReadSerialBus (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer)
{
ACPI_STATUS Status;
UINT32 BufferLength;
ACPI_OPERAND_OBJECT *BufferDesc;
UINT32 Function;
UINT16 AccessorType;
ACPI_FUNCTION_TRACE_PTR (ExReadSerialBus, ObjDesc);
/*
* This is an SMBus, GSBus or IPMI read. We must create a buffer to
* hold the data and then directly access the region handler.
*
* Note: SMBus and GSBus protocol value is passed in upper 16-bits
* of Function
*
* Common buffer format:
* Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer)
* Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/
switch (ObjDesc->Field.RegionObj->Region.SpaceId)
{
case ACPI_ADR_SPACE_SMBUS:
BufferLength = ACPI_SMBUS_BUFFER_SIZE;
Function = ACPI_READ | (ObjDesc->Field.Attribute << 16);
break;
case ACPI_ADR_SPACE_IPMI:
BufferLength = ACPI_IPMI_BUFFER_SIZE;
Function = ACPI_READ;
break;
case ACPI_ADR_SPACE_GSBUS:
AccessorType = ObjDesc->Field.Attribute;
if (AccessorType == AML_FIELD_ATTRIB_RAW_PROCESS_BYTES)
{
ACPI_ERROR ((AE_INFO,
"Invalid direct read using bidirectional write-then-read protocol"));
return_ACPI_STATUS (AE_AML_PROTOCOL);
}
Status = AcpiExGetProtocolBufferLength (AccessorType, &BufferLength);
if (ACPI_FAILURE (Status))
{
ACPI_ERROR ((AE_INFO,
"Invalid protocol ID for GSBus: 0x%4.4X", AccessorType));
return_ACPI_STATUS (Status);
}
/* Add header length to get the full size of the buffer */
BufferLength += ACPI_SERIAL_HEADER_SIZE;
Function = ACPI_READ | (AccessorType << 16);
break;
default:
return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
}
/* Create the local transfer buffer that is returned to the caller */
BufferDesc = AcpiUtCreateBufferObject (BufferLength);
if (!BufferDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/* Call the region handler for the write-then-read */
Status = AcpiExAccessRegion (ObjDesc, 0,
ACPI_CAST_PTR (UINT64, BufferDesc->Buffer.Pointer), Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
*ReturnBuffer = BufferDesc;
return_ACPI_STATUS (Status);
}
/*******************************************************************************
*
* FUNCTION: AcpiExWriteSerialBus
*
* PARAMETERS: SourceDesc - Contains data to write
* ObjDesc - The named field
* ReturnBuffer - Where the return value is returned, if any
*
* RETURN: Status
*
* DESCRIPTION: Write to a named field that references a serial bus
* (SMBus, IPMI, GSBus).
*
******************************************************************************/
ACPI_STATUS
AcpiExWriteSerialBus (
ACPI_OPERAND_OBJECT *SourceDesc,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer)
{
ACPI_STATUS Status;
UINT32 BufferLength;
UINT32 DataLength;
void *Buffer;
ACPI_OPERAND_OBJECT *BufferDesc;
UINT32 Function;
UINT16 AccessorType;
ACPI_FUNCTION_TRACE_PTR (ExWriteSerialBus, ObjDesc);
/*
* This is an SMBus, GSBus or IPMI write. We will bypass the entire
* field mechanism and handoff the buffer directly to the handler.
* For these address spaces, the buffer is bidirectional; on a
* write, return data is returned in the same buffer.
*
* Source must be a buffer of sufficient size, these are fixed size:
* ACPI_SMBUS_BUFFER_SIZE, or ACPI_IPMI_BUFFER_SIZE.
*
* Note: SMBus and GSBus protocol type is passed in upper 16-bits
* of Function
*
* Common buffer format:
* Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer)
* Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/
if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER)
{
ACPI_ERROR ((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires "
"Buffer, found type %s",
AcpiUtGetObjectTypeName (SourceDesc)));
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
switch (ObjDesc->Field.RegionObj->Region.SpaceId)
{
case ACPI_ADR_SPACE_SMBUS:
BufferLength = ACPI_SMBUS_BUFFER_SIZE;
DataLength = ACPI_SMBUS_DATA_SIZE;
Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16);
break;
case ACPI_ADR_SPACE_IPMI:
BufferLength = ACPI_IPMI_BUFFER_SIZE;
DataLength = ACPI_IPMI_DATA_SIZE;
Function = ACPI_WRITE;
break;
case ACPI_ADR_SPACE_GSBUS:
AccessorType = ObjDesc->Field.Attribute;
Status = AcpiExGetProtocolBufferLength (AccessorType, &BufferLength);
if (ACPI_FAILURE (Status))
{
ACPI_ERROR ((AE_INFO,
"Invalid protocol ID for GSBus: 0x%4.4X", AccessorType));
return_ACPI_STATUS (Status);
}
/* Add header length to get the full size of the buffer */
BufferLength += ACPI_SERIAL_HEADER_SIZE;
DataLength = SourceDesc->Buffer.Pointer[1];
Function = ACPI_WRITE | (AccessorType << 16);
break;
default:
return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
}
#if 0
OBSOLETE?
/* Check for possible buffer overflow */
if (DataLength > SourceDesc->Buffer.Length)
{
ACPI_ERROR ((AE_INFO,
"Length in buffer header (%u)(%u) is greater than "
"the physical buffer length (%u) and will overflow",
DataLength, BufferLength, SourceDesc->Buffer.Length));
return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
}
#endif
/* Create the transfer/bidirectional/return buffer */
BufferDesc = AcpiUtCreateBufferObject (BufferLength);
if (!BufferDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Copy the input buffer data to the transfer buffer */
Buffer = BufferDesc->Buffer.Pointer;
memcpy (Buffer, SourceDesc->Buffer.Pointer, DataLength);
/* Lock entire transaction if requested */
AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
/*
* Perform the write (returns status and perhaps data in the
* same buffer)
*/
Status = AcpiExAccessRegion (
ObjDesc, 0, (UINT64 *) Buffer, Function);
AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
*ReturnBuffer = BufferDesc;
return_ACPI_STATUS (Status);
}

View file

@ -616,13 +616,20 @@ AcpiHwRegisterRead (
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock); Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock);
if (ACPI_SUCCESS (Status))
{
Value = (UINT32) Value64; Value = (UINT32) Value64;
}
break; break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock); Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock);
if (ACPI_SUCCESS (Status))
{
Value = (UINT32) Value64; Value = (UINT32) Value64;
}
break; break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */

View file

@ -90,17 +90,22 @@ AcpiHwLegacySleep (
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
/* /* Disable all GPEs */
* 1) Disable all GPEs
* 2) Enable all wakeup GPEs
*/
Status = AcpiHwDisableAllGpes (); Status = AcpiHwDisableAllGpes ();
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
Status = AcpiHwClearAcpiStatus();
if (ACPI_FAILURE(Status))
{
return_ACPI_STATUS(Status);
}
AcpiGbl_SystemAwakeAndRunning = FALSE; AcpiGbl_SystemAwakeAndRunning = FALSE;
/* Enable all wakeup GPEs */
Status = AcpiHwEnableAllWakeupGpes (); Status = AcpiHwEnableAllWakeupGpes ();
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {

View file

@ -76,17 +76,17 @@ AcpiHwSleepDispatch (
static ACPI_SLEEP_FUNCTIONS AcpiSleepDispatch[] = static ACPI_SLEEP_FUNCTIONS AcpiSleepDispatch[] =
{ {
{ACPI_STRUCT_INIT (legacy_function, {ACPI_STRUCT_INIT (LegacyFunction,
ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacySleep)), ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacySleep)),
ACPI_STRUCT_INIT (extended_function, ACPI_STRUCT_INIT (ExtendedFunction,
AcpiHwExtendedSleep) }, AcpiHwExtendedSleep) },
{ACPI_STRUCT_INIT (legacy_function, {ACPI_STRUCT_INIT (LegacyFunction,
ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWakePrep)), ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWakePrep)),
ACPI_STRUCT_INIT (extended_function, ACPI_STRUCT_INIT (ExtendedFunction,
AcpiHwExtendedWakePrep) }, AcpiHwExtendedWakePrep) },
{ACPI_STRUCT_INIT (legacy_function, {ACPI_STRUCT_INIT (Legacy_function,
ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWake)), ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWake)),
ACPI_STRUCT_INIT (extended_function, ACPI_STRUCT_INIT (ExtendedFunction,
AcpiHwExtendedWake) } AcpiHwExtendedWake) }
}; };

View file

@ -125,7 +125,7 @@
/* Maximum object reference count (detects object deletion issues) */ /* Maximum object reference count (detects object deletion issues) */
#define ACPI_MAX_REFERENCE_COUNT 0x800 #define ACPI_MAX_REFERENCE_COUNT 0x4000
/* Default page size for use in mapping memory for operation regions */ /* Default page size for use in mapping memory for operation regions */
@ -210,11 +210,21 @@
#define ACPI_RSDP_CHECKSUM_LENGTH 20 #define ACPI_RSDP_CHECKSUM_LENGTH 20
#define ACPI_RSDP_XCHECKSUM_LENGTH 36 #define ACPI_RSDP_XCHECKSUM_LENGTH 36
/* SMBus, GSBus and IPMI bidirectional buffer size */ /*
* SMBus, GSBus and IPMI buffer sizes. All have a 2-byte header,
* containing both Status and Length.
*/
#define ACPI_SERIAL_HEADER_SIZE 2 /* Common for below. Status and Length fields */
#define ACPI_SMBUS_DATA_SIZE 32
#define ACPI_SMBUS_BUFFER_SIZE ACPI_SERIAL_HEADER_SIZE + ACPI_SMBUS_DATA_SIZE
#define ACPI_IPMI_DATA_SIZE 64
#define ACPI_IPMI_BUFFER_SIZE ACPI_SERIAL_HEADER_SIZE + ACPI_IPMI_DATA_SIZE
#define ACPI_MAX_GSBUS_DATA_SIZE 255
#define ACPI_MAX_GSBUS_BUFFER_SIZE ACPI_SERIAL_HEADER_SIZE + ACPI_MAX_GSBUS_DATA_SIZE
#define ACPI_SMBUS_BUFFER_SIZE 34
#define ACPI_GSBUS_BUFFER_SIZE 34
#define ACPI_IPMI_BUFFER_SIZE 66
/* _SxD and _SxW control methods */ /* _SxD and _SxW control methods */

View file

@ -472,7 +472,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoGeneric[][2];
* dmtable and ahtable * dmtable and ahtable
*/ */
extern const ACPI_DMTABLE_DATA AcpiDmTableData[]; extern const ACPI_DMTABLE_DATA AcpiDmTableData[];
extern const AH_TABLE Gbl_AcpiSupportedTables[]; extern const AH_TABLE AcpiGbl_SupportedTables[];
UINT8 UINT8
AcpiDmGenerateChecksum ( AcpiDmGenerateChecksum (

View file

@ -359,6 +359,10 @@ ACPI_STATUS
AcpiEvInitializeRegion ( AcpiEvInitializeRegion (
ACPI_OPERAND_OBJECT *RegionObj); ACPI_OPERAND_OBJECT *RegionObj);
BOOLEAN
AcpiEvIsPciRootBridge (
ACPI_NAMESPACE_NODE *Node);
/* /*
* evsci - SCI (System Control Interrupt) handling/dispatch * evsci - SCI (System Control Interrupt) handling/dispatch

View file

@ -96,6 +96,13 @@ typedef struct acpi_exception_info
#define AE_OK (ACPI_STATUS) 0x0000 #define AE_OK (ACPI_STATUS) 0x0000
#define ACPI_ENV_EXCEPTION(Status) (Status & AE_CODE_ENVIRONMENTAL)
#define ACPI_AML_EXCEPTION(Status) (Status & AE_CODE_AML)
#define ACPI_PROG_EXCEPTION(Status) (Status & AE_CODE_PROGRAMMER)
#define ACPI_TABLE_EXCEPTION(Status) (Status & AE_CODE_ACPI_TABLES)
#define ACPI_CNTL_EXCEPTION(Status) (Status & AE_CODE_CONTROL)
/* /*
* Environmental exceptions * Environmental exceptions
*/ */
@ -205,8 +212,10 @@ typedef struct acpi_exception_info
#define AE_AML_LOOP_TIMEOUT EXCEP_AML (0x0021) #define AE_AML_LOOP_TIMEOUT EXCEP_AML (0x0021)
#define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022) #define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022)
#define AE_AML_TARGET_TYPE EXCEP_AML (0x0023) #define AE_AML_TARGET_TYPE EXCEP_AML (0x0023)
#define AE_AML_PROTOCOL EXCEP_AML (0x0024)
#define AE_AML_BUFFER_LENGTH EXCEP_AML (0x0025)
#define AE_CODE_AML_MAX 0x0023 #define AE_CODE_AML_MAX 0x0025
/* /*
@ -337,7 +346,9 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Aml[] =
EXCEP_TXT ("AE_AML_ILLEGAL_ADDRESS", "A memory, I/O, or PCI configuration address is invalid"), EXCEP_TXT ("AE_AML_ILLEGAL_ADDRESS", "A memory, I/O, or PCI configuration address is invalid"),
EXCEP_TXT ("AE_AML_LOOP_TIMEOUT", "An AML While loop exceeded the maximum execution time"), EXCEP_TXT ("AE_AML_LOOP_TIMEOUT", "An AML While loop exceeded the maximum execution time"),
EXCEP_TXT ("AE_AML_UNINITIALIZED_NODE", "A namespace node is uninitialized or unresolved"), EXCEP_TXT ("AE_AML_UNINITIALIZED_NODE", "A namespace node is uninitialized or unresolved"),
EXCEP_TXT ("AE_AML_TARGET_TYPE", "A target operand of an incorrect type was encountered") EXCEP_TXT ("AE_AML_TARGET_TYPE", "A target operand of an incorrect type was encountered"),
EXCEP_TXT ("AE_AML_PROTOCOL", "Violation of a fixed ACPI protocol"),
EXCEP_TXT ("AE_AML_BUFFER_LENGTH", "The length of the buffer is invalid/incorrect")
}; };
static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Ctrl[] = static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Ctrl[] =

View file

@ -177,6 +177,11 @@ AcpiExTracePoint (
* exfield - ACPI AML (p-code) execution - field manipulation * exfield - ACPI AML (p-code) execution - field manipulation
*/ */
ACPI_STATUS ACPI_STATUS
AcpiExGetProtocolBufferLength (
UINT32 ProtocolId,
UINT32 *ReturnLength);
ACPI_STATUS
AcpiExCommonBufferSetup ( AcpiExCommonBufferSetup (
ACPI_OPERAND_OBJECT *ObjDesc, ACPI_OPERAND_OBJECT *ObjDesc,
UINT32 BufferLength, UINT32 BufferLength,
@ -386,6 +391,32 @@ AcpiExPrepFieldValue (
ACPI_CREATE_FIELD_INFO *Info); ACPI_CREATE_FIELD_INFO *Info);
/*
* exserial - FieldUnit support for serial address spaces
*/
ACPI_STATUS
AcpiExReadSerialBus (
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer);
ACPI_STATUS
AcpiExWriteSerialBus (
ACPI_OPERAND_OBJECT *SourceDesc,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer);
ACPI_STATUS
AcpiExReadGpio (
ACPI_OPERAND_OBJECT *ObjDesc,
void *Buffer);
ACPI_STATUS
AcpiExWriteGpio (
ACPI_OPERAND_OBJECT *SourceDesc,
ACPI_OPERAND_OBJECT *ObjDesc,
ACPI_OPERAND_OBJECT **ReturnBuffer);
/* /*
* exsystem - Interface to OS services * exsystem - Interface to OS services
*/ */

View file

@ -219,8 +219,8 @@ typedef struct acpi_namespace_node
#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */ #define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */
#define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */ #define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */
#define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (InstallMethod) */ #define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (InstallMethod) */
#define ANOBJ_NODE_EARLY_INIT 0x80 /* AcpiExec only: Node was create via init file (-fi) */
#define IMPLICIT_EXTERNAL 0x02 /* iASL only: This object created implicitly via External */
#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */ #define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */ #define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */
#define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* iASL only: Method has at least one return value */ #define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* iASL only: Method has at least one return value */
@ -489,9 +489,9 @@ typedef struct acpi_simple_repair_info
typedef struct acpi_reg_walk_info typedef struct acpi_reg_walk_info
{ {
ACPI_ADR_SPACE_TYPE SpaceId;
UINT32 Function; UINT32 Function;
UINT32 RegRunCount; UINT32 RegRunCount;
ACPI_ADR_SPACE_TYPE SpaceId;
} ACPI_REG_WALK_INFO; } ACPI_REG_WALK_INFO;

View file

@ -60,14 +60,15 @@
/* Flags for AcpiNsLookup, AcpiNsSearchAndEnter */ /* Flags for AcpiNsLookup, AcpiNsSearchAndEnter */
#define ACPI_NS_NO_UPSEARCH 0 #define ACPI_NS_NO_UPSEARCH 0
#define ACPI_NS_SEARCH_PARENT 0x01 #define ACPI_NS_SEARCH_PARENT 0x0001
#define ACPI_NS_DONT_OPEN_SCOPE 0x02 #define ACPI_NS_DONT_OPEN_SCOPE 0x0002
#define ACPI_NS_NO_PEER_SEARCH 0x04 #define ACPI_NS_NO_PEER_SEARCH 0x0004
#define ACPI_NS_ERROR_IF_FOUND 0x08 #define ACPI_NS_ERROR_IF_FOUND 0x0008
#define ACPI_NS_PREFIX_IS_SCOPE 0x10 #define ACPI_NS_PREFIX_IS_SCOPE 0x0010
#define ACPI_NS_EXTERNAL 0x20 #define ACPI_NS_EXTERNAL 0x0020
#define ACPI_NS_TEMPORARY 0x40 #define ACPI_NS_TEMPORARY 0x0040
#define ACPI_NS_OVERRIDE_IF_FOUND 0x80 #define ACPI_NS_OVERRIDE_IF_FOUND 0x0080
#define ACPI_NS_EARLY_INIT 0x0100
/* Flags for AcpiNsWalkNamespace */ /* Flags for AcpiNsWalkNamespace */

View file

@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20180531 #define ACPI_CA_VERSION 0x20181003
#include "acconfig.h" #include "acconfig.h"
#include "actypes.h" #include "actypes.h"

View file

@ -254,6 +254,10 @@ BOOLEAN
AcpiUtDetectHexPrefix ( AcpiUtDetectHexPrefix (
char **String); char **String);
void
AcpiUtRemoveHexPrefix (
char **String);
BOOLEAN BOOLEAN
AcpiUtDetectOctalPrefix ( AcpiUtDetectOctalPrefix (
char **String); char **String);

View file

@ -487,15 +487,15 @@ typedef enum
typedef enum typedef enum
{ {
AML_FIELD_ATTRIB_QUICK = 0x02, AML_FIELD_ATTRIB_QUICK = 0x02,
AML_FIELD_ATTRIB_SEND_RCV = 0x04, AML_FIELD_ATTRIB_SEND_RECEIVE = 0x04,
AML_FIELD_ATTRIB_BYTE = 0x06, AML_FIELD_ATTRIB_BYTE = 0x06,
AML_FIELD_ATTRIB_WORD = 0x08, AML_FIELD_ATTRIB_WORD = 0x08,
AML_FIELD_ATTRIB_BLOCK = 0x0A, AML_FIELD_ATTRIB_BLOCK = 0x0A,
AML_FIELD_ATTRIB_MULTIBYTE = 0x0B, AML_FIELD_ATTRIB_BYTES = 0x0B,
AML_FIELD_ATTRIB_WORD_CALL = 0x0C, AML_FIELD_ATTRIB_PROCESS_CALL = 0x0C,
AML_FIELD_ATTRIB_BLOCK_CALL = 0x0D, AML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 0x0D,
AML_FIELD_ATTRIB_RAW_BYTES = 0x0E, AML_FIELD_ATTRIB_RAW_BYTES = 0x0E,
AML_FIELD_ATTRIB_RAW_PROCESS = 0x0F AML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 0x0F
} AML_ACCESS_ATTRIBUTE; } AML_ACCESS_ATTRIBUTE;

View file

@ -616,6 +616,15 @@ AcpiNsLookup (
CurrentNode)); CurrentNode));
} }
#ifdef ACPI_EXEC_APP
if ((Status == AE_ALREADY_EXISTS) &&
(ThisNode->Flags & ANOBJ_NODE_EARLY_INIT))
{
ThisNode->Flags &= ~ANOBJ_NODE_EARLY_INIT;
Status = AE_OK;
}
#endif
#ifdef ACPI_ASL_COMPILER #ifdef ACPI_ASL_COMPILER
/* /*
* If this ACPI name already exists within the namespace as an * If this ACPI name already exists within the namespace as an
@ -673,13 +682,6 @@ AcpiNsLookup (
else else
{ {
#ifdef ACPI_ASL_COMPILER
if (!AcpiGbl_DisasmFlag && (ThisNode->Flags & ANOBJ_IS_EXTERNAL))
{
ThisNode->Flags &= ~IMPLICIT_EXTERNAL;
}
#endif
/* /*
* Sanity typecheck of the target object: * Sanity typecheck of the target object:
* *
@ -744,6 +746,13 @@ AcpiNsLookup (
} }
} }
#ifdef ACPI_EXEC_APP
if (Flags & ACPI_NS_EARLY_INIT)
{
ThisNode->Flags |= ANOBJ_NODE_EARLY_INIT;
}
#endif
*ReturnNode = ThisNode; *ReturnNode = ThisNode;
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }

View file

@ -437,7 +437,6 @@ AcpiNsSearchAndEnter (
(WalkState && WalkState->Opcode == AML_SCOPE_OP)) (WalkState && WalkState->Opcode == AML_SCOPE_OP))
{ {
NewNode->Flags |= ANOBJ_IS_EXTERNAL; NewNode->Flags |= ANOBJ_IS_EXTERNAL;
NewNode->Flags |= IMPLICIT_EXTERNAL;
} }
#endif #endif

View file

@ -56,6 +56,7 @@
#include "acdispat.h" #include "acdispat.h"
#include "amlcode.h" #include "amlcode.h"
#include "acconvert.h" #include "acconvert.h"
#include "acnamesp.h"
#define _COMPONENT ACPI_PARSER #define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME ("psloop") ACPI_MODULE_NAME ("psloop")
@ -537,6 +538,18 @@ AcpiPsParseLoop (
Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op); Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);
if (ACPI_FAILURE (Status)) if (ACPI_FAILURE (Status))
{ {
/*
* ACPI_PARSE_MODULE_LEVEL means that we are loading a table by
* executing it as a control method. However, if we encounter
* an error while loading the table, we need to keep trying to
* load the table rather than aborting the table load. Set the
* status to AE_OK to proceed with the table load.
*/
if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
Status == AE_ALREADY_EXISTS)
{
Status = AE_OK;
}
if (Status == AE_CTRL_PARSE_CONTINUE) if (Status == AE_CTRL_PARSE_CONTINUE)
{ {
continue; continue;
@ -557,18 +570,20 @@ AcpiPsParseLoop (
{ {
return_ACPI_STATUS (Status); return_ACPI_STATUS (Status);
} }
if (WalkState->Opcode == AML_SCOPE_OP) if (AcpiNsOpensScope (
AcpiPsGetOpcodeInfo (WalkState->Opcode)->ObjectType))
{ {
/* /*
* If the scope op fails to parse, skip the body of the * If the scope/device op fails to parse, skip the body of
* scope op because the parse failure indicates that the * the scope op because the parse failure indicates that
* device may not exist. * the device may not exist.
*/ */
ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s",
AcpiPsGetOpcodeName (WalkState->Opcode)));
WalkState->ParserState.Aml = WalkState->Aml + 1; WalkState->ParserState.Aml = WalkState->Aml + 1;
WalkState->ParserState.Aml = WalkState->ParserState.Aml =
AcpiPsGetNextPackageEnd(&WalkState->ParserState); AcpiPsGetNextPackageEnd(&WalkState->ParserState);
WalkState->Aml = WalkState->ParserState.Aml; WalkState->Aml = WalkState->ParserState.Aml;
ACPI_ERROR ((AE_INFO, "Skipping Scope block"));
} }
continue; continue;
@ -726,6 +741,22 @@ AcpiPsParseLoop (
{ {
Status = AE_OK; Status = AE_OK;
} }
else if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
(ACPI_AML_EXCEPTION(Status) || Status == AE_ALREADY_EXISTS ||
Status == AE_NOT_FOUND))
{
/*
* ACPI_PARSE_MODULE_LEVEL flag means that we are currently
* loading a table by executing it as a control method.
* However, if we encounter an error while loading the table,
* we need to keep trying to load the table rather than
* aborting the table load (setting the status to AE_OK
* continues the table load). If we get a failure at this
* point, it means that the dispatcher got an error while
* trying to execute the Op.
*/
Status = AE_OK;
}
} }
Status = AcpiPsCompleteOp (WalkState, &Op, Status); Status = AcpiPsCompleteOp (WalkState, &Op, Status);

View file

@ -603,9 +603,9 @@ AcpiTbVerifyTempTable (
{ {
if (Status != AE_CTRL_TERMINATE) if (Status != AE_CTRL_TERMINATE)
{ {
ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY, ACPI_EXCEPTION ((AE_INFO, Status,
"%4.4s 0x%8.8X%8.8X" "%4.4s 0x%8.8X%8.8X"
" Table is duplicated", " Table is already loaded",
AcpiUtValidNameseg (TableDesc->Signature.Ascii) ? AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
TableDesc->Signature.Ascii : "????", TableDesc->Signature.Ascii : "????",
ACPI_FORMAT_UINT64 (TableDesc->Address))); ACPI_FORMAT_UINT64 (TableDesc->Address)));

View file

@ -412,6 +412,7 @@ AcpiUtUpdateRefCount (
UINT16 OriginalCount; UINT16 OriginalCount;
UINT16 NewCount = 0; UINT16 NewCount = 0;
ACPI_CPU_FLAGS LockFlags; ACPI_CPU_FLAGS LockFlags;
char *Message;
ACPI_FUNCTION_NAME (UtUpdateRefCount); ACPI_FUNCTION_NAME (UtUpdateRefCount);
@ -452,6 +453,7 @@ AcpiUtUpdateRefCount (
"Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n", "Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n",
Object, Object->Common.Type, Object, Object->Common.Type,
AcpiUtGetObjectTypeName (Object), NewCount)); AcpiUtGetObjectTypeName (Object), NewCount));
Message = "Incremement";
break; break;
case REF_DECREMENT: case REF_DECREMENT:
@ -483,6 +485,7 @@ AcpiUtUpdateRefCount (
{ {
AcpiUtDeleteInternalObj (Object); AcpiUtDeleteInternalObj (Object);
} }
Message = "Decrement";
break; break;
default: default:
@ -500,8 +503,8 @@ AcpiUtUpdateRefCount (
if (NewCount > ACPI_MAX_REFERENCE_COUNT) if (NewCount > ACPI_MAX_REFERENCE_COUNT)
{ {
ACPI_WARNING ((AE_INFO, ACPI_WARNING ((AE_INFO,
"Large Reference Count (0x%X) in object %p, Type=0x%.2X", "Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s",
NewCount, Object, Object->Common.Type)); NewCount, Object, Object->Common.Type, Message));
} }
} }

View file

@ -244,19 +244,19 @@ AcpiUtPrefixedNamespaceError (
{ {
case AE_ALREADY_EXISTS: case AE_ALREADY_EXISTS:
AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR); AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Failure creating"; Message = "Failure creating";
break; break;
case AE_NOT_FOUND: case AE_NOT_FOUND:
AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR); AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Could not resolve"; Message = "Could not resolve";
break; break;
default: default:
AcpiOsPrintf ("\n" ACPI_MSG_ERROR); AcpiOsPrintf (ACPI_MSG_ERROR);
Message = "Failure resolving"; Message = "Failure resolving";
break; break;
} }

View file

@ -311,15 +311,39 @@ BOOLEAN
AcpiUtDetectHexPrefix ( AcpiUtDetectHexPrefix (
char **String) char **String)
{ {
char *InitialPosition = *String;
AcpiUtRemoveHexPrefix (String);
if (*String != InitialPosition)
{
return (TRUE); /* String is past leading 0x */
}
return (FALSE); /* Not a hex string */
}
/*******************************************************************************
*
* FUNCTION: AcpiUtRemoveHexPrefix
*
* PARAMETERS: String - Pointer to input ASCII string
*
* RETURN: none
*
* DESCRIPTION: Remove a hex "0x" prefix
*
******************************************************************************/
void
AcpiUtRemoveHexPrefix (
char **String)
{
if ((**String == ACPI_ASCII_ZERO) && if ((**String == ACPI_ASCII_ZERO) &&
(tolower ((int) *(*String + 1)) == 'x')) (tolower ((int) *(*String + 1)) == 'x'))
{ {
*String += 2; /* Go past the leading 0x */ *String += 2; /* Go past the leading 0x */
return (TRUE);
} }
return (FALSE); /* Not a hex string */
} }

View file

@ -275,7 +275,7 @@ AcpiUtImplicitStrtoul64 (
* implicit conversions, and the "0x" prefix is "not allowed". * implicit conversions, and the "0x" prefix is "not allowed".
* However, allow a "0x" prefix as an ACPI extension. * However, allow a "0x" prefix as an ACPI extension.
*/ */
AcpiUtDetectHexPrefix (&String); AcpiUtRemoveHexPrefix (&String);
if (!AcpiUtRemoveLeadingZeros (&String)) if (!AcpiUtRemoveLeadingZeros (&String))
{ {