summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Kaneda <erik.kaneda@intel.com>2020-09-01 10:59:25 -0700
committerErik Kaneda <erik.kaneda@intel.com>2021-05-25 12:55:08 -0700
commitcdf48b141d7da38e47fe4020310033ddd1971f9e (patch)
tree381cd4a55217e62cc408de3dc50bc04b3bdfd740
parent3140cf712f50046a67518ac217e740249b14f34f (diff)
downloadacpica-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.c2
-rw-r--r--source/compiler/asluuid.c47
-rw-r--r--source/components/executer/exfield.c6
-rw-r--r--source/components/executer/exserial.c12
-rw-r--r--source/components/utilities/utuuid.c48
-rw-r--r--source/include/acconfig.h1
-rw-r--r--source/include/acutils.h5
-rw-r--r--source/tools/acpiexec/aeinstall.c1
-rw-r--r--source/tools/acpiexec/aeregion.c17
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;
}