diff options
author | Erik Kaneda <erik.kaneda@intel.com> | 2020-09-01 10:59:25 -0700 |
---|---|---|
committer | Erik Kaneda <erik.kaneda@intel.com> | 2021-05-25 12:55:08 -0700 |
commit | cdf48b141d7da38e47fe4020310033ddd1971f9e (patch) | |
tree | 381cd4a55217e62cc408de3dc50bc04b3bdfd740 | |
parent | 3140cf712f50046a67518ac217e740249b14f34f (diff) | |
download | acpica-cdf48b141d7da38e47fe4020310033ddd1971f9e.tar.gz |
Add support for PlatformRtMechanism OperationRegion handler
Writing a buffer to a PlatformRtMechanism fieldunit invokes a
bidirectional transaction. The input buffer contains 26 bytes
containing 9 bytes of status, a command byte and a 16-byte UUID.
This change will will simply pass this incoming buffer to a handler
registered by the OS.
Signed-off-by: Erik Kaneda <erik.kaneda@intel.com>
-rw-r--r-- | source/common/dmtable.c | 2 | ||||
-rw-r--r-- | source/compiler/asluuid.c | 47 | ||||
-rw-r--r-- | source/components/executer/exfield.c | 6 | ||||
-rw-r--r-- | source/components/executer/exserial.c | 12 | ||||
-rw-r--r-- | source/components/utilities/utuuid.c | 48 | ||||
-rw-r--r-- | source/include/acconfig.h | 1 | ||||
-rw-r--r-- | source/include/acutils.h | 5 | ||||
-rw-r--r-- | source/tools/acpiexec/aeinstall.c | 1 | ||||
-rw-r--r-- | source/tools/acpiexec/aeregion.c | 17 |
9 files changed, 89 insertions, 50 deletions
diff --git a/source/common/dmtable.c b/source/common/dmtable.c index 516c638de..1221540db 100644 --- a/source/common/dmtable.c +++ b/source/common/dmtable.c @@ -1309,7 +1309,7 @@ AcpiDmDumpTable ( /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */ - (void) AuConvertUuidToString ((char *) Target, AslGbl_MsgBuffer); + (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer); AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer); break; diff --git a/source/compiler/asluuid.c b/source/compiler/asluuid.c index c8dd4a464..30540acda 100644 --- a/source/compiler/asluuid.c +++ b/source/compiler/asluuid.c @@ -212,50 +212,3 @@ AuValidateUuid ( return (AE_OK); } - -/******************************************************************************* - * - * FUNCTION: AuConvertUuidToString - * - * PARAMETERS: UuidBuffer - 16-byte UUID buffer - * OutString - 36-byte formatted UUID string - * - * RETURN: Status - * - * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string - * OutString must be 37 bytes to include null terminator. - * - ******************************************************************************/ - -ACPI_STATUS -AuConvertUuidToString ( - char *UuidBuffer, - char *OutString) -{ - UINT32 i; - - - if (!UuidBuffer || !OutString) - { - return (AE_BAD_PARAMETER); - } - - for (i = 0; i < UUID_BUFFER_LENGTH; i++) - { - OutString[AcpiGbl_MapToUuidOffset[i]] = - AcpiUtHexToAsciiChar (UuidBuffer[i], 4); - - OutString[AcpiGbl_MapToUuidOffset[i] + 1] = - AcpiUtHexToAsciiChar (UuidBuffer[i], 0); - } - - /* Insert required hyphens (dashes) */ - - OutString[UUID_HYPHEN1_OFFSET] = - OutString[UUID_HYPHEN2_OFFSET] = - OutString[UUID_HYPHEN3_OFFSET] = - OutString[UUID_HYPHEN4_OFFSET] = '-'; - - OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */ - return (AE_OK); -} diff --git a/source/components/executer/exfield.c b/source/components/executer/exfield.c index 585d21cc9..7871e3502 100644 --- a/source/components/executer/exfield.c +++ b/source/components/executer/exfield.c @@ -295,7 +295,8 @@ AcpiExReadDataFromField ( 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_GSBUS || - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) { /* SMBus, GSBus, IPMI serial */ @@ -467,7 +468,8 @@ AcpiExWriteDataToField ( 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_GSBUS || - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI)) + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) { /* SMBus, GSBus, IPMI serial */ diff --git a/source/components/executer/exserial.c b/source/components/executer/exserial.c index 69ce5316d..776409db7 100644 --- a/source/components/executer/exserial.c +++ b/source/components/executer/exserial.c @@ -353,6 +353,12 @@ AcpiExReadSerialBus ( Function = ACPI_READ | (AccessorType << 16); break; + case ACPI_ADR_SPACE_PLATFORM_RT: + + BufferLength = ACPI_PRM_INPUT_BUFFER_SIZE; + Function = ACPI_READ; + break; + default: return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); } @@ -472,6 +478,12 @@ AcpiExWriteSerialBus ( Function = ACPI_WRITE | (AccessorType << 16); break; + case ACPI_ADR_SPACE_PLATFORM_RT: + + BufferLength = ACPI_PRM_INPUT_BUFFER_SIZE; + Function = ACPI_WRITE; + break; + default: return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); } diff --git a/source/components/utilities/utuuid.c b/source/components/utilities/utuuid.c index 97ae40be1..299353cce 100644 --- a/source/components/utilities/utuuid.c +++ b/source/components/utilities/utuuid.c @@ -208,4 +208,52 @@ AcpiUtConvertStringToUuid ( InString[AcpiGbl_MapToUuidOffset[i] + 1]); } } + + +/******************************************************************************* + * + * FUNCTION: AcpiUtConvertUuidToString + * + * PARAMETERS: UuidBuffer - 16-byte UUID buffer + * OutString - 36-byte formatted UUID string + * + * RETURN: Status + * + * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string + * OutString must be 37 bytes to include null terminator. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtConvertUuidToString ( + char *UuidBuffer, + char *OutString) +{ + UINT32 i; + + + if (!UuidBuffer || !OutString) + { + return (AE_BAD_PARAMETER); + } + + for (i = 0; i < UUID_BUFFER_LENGTH; i++) + { + OutString[AcpiGbl_MapToUuidOffset[i]] = + AcpiUtHexToAsciiChar (UuidBuffer[i], 4); + + OutString[AcpiGbl_MapToUuidOffset[i] + 1] = + AcpiUtHexToAsciiChar (UuidBuffer[i], 0); + } + + /* Insert required hyphens (dashes) */ + + OutString[UUID_HYPHEN1_OFFSET] = + OutString[UUID_HYPHEN2_OFFSET] = + OutString[UUID_HYPHEN3_OFFSET] = + OutString[UUID_HYPHEN4_OFFSET] = '-'; + + OutString[UUID_STRING_LENGTH] = 0; /* Null terminate */ + return (AE_OK); +} #endif diff --git a/source/include/acconfig.h b/source/include/acconfig.h index b320a97e3..a58085269 100644 --- a/source/include/acconfig.h +++ b/source/include/acconfig.h @@ -333,6 +333,7 @@ #define ACPI_MAX_GSBUS_DATA_SIZE 255 #define ACPI_MAX_GSBUS_BUFFER_SIZE ACPI_SERIAL_HEADER_SIZE + ACPI_MAX_GSBUS_DATA_SIZE +#define ACPI_PRM_INPUT_BUFFER_SIZE 26 /* _SxD and _SxW control methods */ diff --git a/source/include/acutils.h b/source/include/acutils.h index 4d4854227..791b7d9ce 100644 --- a/source/include/acutils.h +++ b/source/include/acutils.h @@ -1268,6 +1268,11 @@ void AcpiUtConvertStringToUuid ( char *InString, UINT8 *UuidBuffer); + +ACPI_STATUS +AcpiUtConvertUuidToString ( + char *UuidBuffer, + char *OutString); #endif #endif /* _ACUTILS_H */ diff --git a/source/tools/acpiexec/aeinstall.c b/source/tools/acpiexec/aeinstall.c index e39c683db..1d32443b1 100644 --- a/source/tools/acpiexec/aeinstall.c +++ b/source/tools/acpiexec/aeinstall.c @@ -216,6 +216,7 @@ static ACPI_ADR_SPACE_TYPE SpaceIdList[] = ACPI_ADR_SPACE_GPIO, ACPI_ADR_SPACE_GSBUS, ACPI_ADR_SPACE_PLATFORM_COMM, + ACPI_ADR_SPACE_PLATFORM_RT, ACPI_ADR_SPACE_FIXED_HARDWARE, ACPI_ADR_SPACE_USER_DEFINED1, ACPI_ADR_SPACE_USER_DEFINED2 diff --git a/source/tools/acpiexec/aeregion.c b/source/tools/acpiexec/aeregion.c index faae73472..decd17f7f 100644 --- a/source/tools/acpiexec/aeregion.c +++ b/source/tools/acpiexec/aeregion.c @@ -205,6 +205,7 @@ AeRegionHandler ( UINT32 Value1; UINT32 Value2; ACPI_RESOURCE *Resource; + char Uuid[ACPI_PRM_INPUT_BUFFER_SIZE + 1]; ACPI_FUNCTION_NAME (AeRegionHandler); @@ -446,6 +447,7 @@ AeRegionHandler ( * default values. Note: ASLTS will depend on these values. */ case ACPI_ADR_SPACE_PLATFORM_COMM: /* ACPI 6.3 */ + if (AcpiGbl_DisplayRegionAccess) { AcpiOsPrintf ("AcpiExec: PCC Write : Addr %.4X Width %X\n", @@ -457,6 +459,21 @@ AeRegionHandler ( } return (AE_OK); + case ACPI_ADR_SPACE_PLATFORM_RT: + + AcpiOsPrintf ("Acpiexec: PRM %s invoked\n", + (Function & ACPI_IO_MASK) ? "Write" : "Read "); + + if ((Function & ACPI_IO_MASK) == ACPI_WRITE) + { + AcpiUtConvertUuidToString((char *) Buffer + 10, Uuid); + AcpiOsPrintf ("Mode: %u GUID: %s\n", Buffer[0], Uuid); + } + + /* Unpack the input buffer and print the contents for debug */ + + break; + default: break; } |