Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make AddressSpaceHandler Install and _REG execution 2 separate steps #786

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
101 changes: 95 additions & 6 deletions source/components/events/evxfregn.c
Expand Up @@ -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
*
Expand All @@ -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;
Expand Down Expand Up @@ -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)


/*******************************************************************************
*
Expand Down Expand Up @@ -387,3 +417,62 @@ AcpiRemoveAddressSpaceHandler (
}

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)
15 changes: 15 additions & 0 deletions source/include/acpixf.h
Expand Up @@ -942,6 +942,21 @@ AcpiInstallAddressSpaceHandler (
ACPI_ADR_SPACE_SETUP Setup,
void *Context))

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 (
Expand Down