summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Moore <Robert.Moore@intel.com>2023-02-07 10:20:43 -0800
committerGitHub <noreply@github.com>2023-02-07 10:20:43 -0800
commit2b00f7329bc3e1bf971ed475d0717c00110c059e (patch)
tree5ccfc72bf19c0599245a0473898923cec488a5a8
parent26691f7adcfbed6b408dd369431ecf0a45a6c932 (diff)
parentead772dd15412719e033617966ec7e3a14bd4d89 (diff)
downloadacpica-2b00f7329bc3e1bf971ed475d0717c00110c059e.tar.gz
Merge pull request #786 from jwrdegoede/split-acpi_install_address_space_handler
Make AddressSpaceHandler Install and _REG execution 2 separate steps
-rw-r--r--source/components/events/evxfregn.c101
-rw-r--r--source/include/acpixf.h15
2 files changed, 110 insertions, 6 deletions
diff --git a/source/components/events/evxfregn.c b/source/components/events/evxfregn.c
index 0b89814d3..00fe86209 100644
--- a/source/components/events/evxfregn.c
+++ b/source/components/events/evxfregn.c
@@ -163,13 +163,14 @@
/*******************************************************************************
*
- * FUNCTION: AcpiInstallAddressSpaceHandler
+ * FUNCTION: AcpiInstallAddressSpaceHandlerInternal
*
* PARAMETERS: Device - Handle for the device
* SpaceId - The address space ID
* Handler - Address of the handler
* Setup - Address of the setup function
* Context - Value passed to the handler on each access
+ * Run_Reg - Run _REG methods for this address space?
*
* RETURN: Status
*
@@ -180,16 +181,19 @@
* are executed here, and these methods can only be safely executed after
* the default handlers have been installed and the hardware has been
* initialized (via AcpiEnableSubsystem.)
+ * To avoid this problem pass FALSE for Run_Reg and later on call
+ * AcpiExecuteRegMethods() to execute _REG.
*
******************************************************************************/
-ACPI_STATUS
-AcpiInstallAddressSpaceHandler (
+static ACPI_STATUS
+AcpiInstallAddressSpaceHandlerInternal (
ACPI_HANDLE Device,
ACPI_ADR_SPACE_TYPE SpaceId,
ACPI_ADR_SPACE_HANDLER Handler,
ACPI_ADR_SPACE_SETUP Setup,
- void *Context)
+ void *Context,
+ BOOLEAN Run_Reg)
{
ACPI_NAMESPACE_NODE *Node;
ACPI_STATUS Status;
@@ -231,16 +235,42 @@ AcpiInstallAddressSpaceHandler (
/* Run all _REG methods for this address space */
- AcpiEvExecuteRegMethods (Node, SpaceId, ACPI_REG_CONNECT);
-
+ if (Run_Reg)
+ {
+ AcpiEvExecuteRegMethods (Node, SpaceId, ACPI_REG_CONNECT);
+ }
UnlockAndExit:
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (Status);
}
+ACPI_STATUS
+AcpiInstallAddressSpaceHandler (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context)
+{
+ return AcpiInstallAddressSpaceHandlerInternal (Device, SpaceId, Handler, Setup, Context, TRUE);
+}
+
ACPI_EXPORT_SYMBOL (AcpiInstallAddressSpaceHandler)
+ACPI_STATUS
+AcpiInstallAddressSpaceHandlerNo_Reg (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context)
+{
+ return AcpiInstallAddressSpaceHandlerInternal (Device, SpaceId, Handler, Setup, Context, FALSE);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallAddressSpaceHandlerNo_Reg)
+
/*******************************************************************************
*
@@ -387,3 +417,62 @@ UnlockAndExit:
}
ACPI_EXPORT_SYMBOL (AcpiRemoveAddressSpaceHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExecuteRegMethods
+ *
+ * PARAMETERS: Device - Handle for the device
+ * SpaceId - The address space ID
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute _REG for all OpRegions of a given SpaceId.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExecuteRegMethods (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiExecuteRegMethods);
+
+
+ /* Parameter validation */
+
+ if (!Device)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsValidateHandle (Device);
+ if (Node)
+ {
+ /* Run all _REG methods for this address space */
+
+ AcpiEvExecuteRegMethods (Node, SpaceId, ACPI_REG_CONNECT);
+ }
+ else
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiExecuteRegMethods)
diff --git a/source/include/acpixf.h b/source/include/acpixf.h
index 0d8c594ff..f23f4603d 100644
--- a/source/include/acpixf.h
+++ b/source/include/acpixf.h
@@ -944,6 +944,21 @@ AcpiInstallAddressSpaceHandler (
ACPI_EXTERNAL_RETURN_STATUS (
ACPI_STATUS
+AcpiInstallAddressSpaceHandlerNo_Reg(
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context))
+
+ACPI_EXTERNAL_RETURN_STATUS (
+ACPI_STATUS
+AcpiExecuteRegMethods (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId))
+
+ACPI_EXTERNAL_RETURN_STATUS (
+ACPI_STATUS
AcpiRemoveAddressSpaceHandler (
ACPI_HANDLE Device,
ACPI_ADR_SPACE_TYPE SpaceId,