Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 009c4cbe authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

ACPICA: Add global pointer for FACS table to simplify FACS access



Use a global pointer instead of using AcpiGetTableByIndex for
each FACS access. This simplifies the code for the Global Lock
and the Firmware Waking Vector(s).

Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent c87609f3
Loading
Loading
Loading
Loading
+6 −16
Original line number Original line Diff line number Diff line
@@ -49,11 +49,7 @@
#define _COMPONENT          ACPI_EVENTS
#define _COMPONENT          ACPI_EVENTS
ACPI_MODULE_NAME("evmisc")
ACPI_MODULE_NAME("evmisc")


/* Pointer to FACS needed for the Global Lock */
static struct acpi_table_facs *facs = NULL;

/* Local prototypes */
/* Local prototypes */

static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);
static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);


static u32 acpi_ev_global_lock_handler(void *context);
static u32 acpi_ev_global_lock_handler(void *context);
@@ -299,7 +295,7 @@ static u32 acpi_ev_global_lock_handler(void *context)
	 * If we don't get it now, it will be marked pending and we will
	 * If we don't get it now, it will be marked pending and we will
	 * take another interrupt when it becomes free.
	 * take another interrupt when it becomes free.
	 */
	 */
	ACPI_ACQUIRE_GLOBAL_LOCK(facs, acquired);
	ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_FACS, acquired);
	if (acquired) {
	if (acquired) {


		/* Got the lock, now wake all threads waiting for it */
		/* Got the lock, now wake all threads waiting for it */
@@ -336,15 +332,8 @@ acpi_status acpi_ev_init_global_lock_handler(void)


	ACPI_FUNCTION_TRACE(ev_init_global_lock_handler);
	ACPI_FUNCTION_TRACE(ev_init_global_lock_handler);


	status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
	/* Attempt installation of the global lock handler */
					 ACPI_CAST_INDIRECT_PTR(struct
								acpi_table_header,
								&facs));
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}


	acpi_gbl_global_lock_present = TRUE;
	status = acpi_install_fixed_event_handler(ACPI_EVENT_GLOBAL,
	status = acpi_install_fixed_event_handler(ACPI_EVENT_GLOBAL,
						  acpi_ev_global_lock_handler,
						  acpi_ev_global_lock_handler,
						  NULL);
						  NULL);
@@ -361,9 +350,10 @@ acpi_status acpi_ev_init_global_lock_handler(void)
			    "No response from Global Lock hardware, disabling lock"));
			    "No response from Global Lock hardware, disabling lock"));


		acpi_gbl_global_lock_present = FALSE;
		acpi_gbl_global_lock_present = FALSE;
		status = AE_OK;
		return_ACPI_STATUS(AE_OK);
	}
	}


	acpi_gbl_global_lock_present = TRUE;
	return_ACPI_STATUS(status);
	return_ACPI_STATUS(status);
}
}


@@ -472,7 +462,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)


	/* Attempt to acquire the actual hardware lock */
	/* Attempt to acquire the actual hardware lock */


	ACPI_ACQUIRE_GLOBAL_LOCK(facs, acquired);
	ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_FACS, acquired);
	if (acquired) {
	if (acquired) {


		/* We got the lock */
		/* We got the lock */
@@ -536,7 +526,7 @@ acpi_status acpi_ev_release_global_lock(void)


		/* Allow any thread to release the lock */
		/* Allow any thread to release the lock */


		ACPI_RELEASE_GLOBAL_LOCK(facs, pending);
		ACPI_RELEASE_GLOBAL_LOCK(acpi_gbl_FACS, pending);


		/*
		/*
		 * If the pending bit was set, we must write GBL_RLS to the control
		 * If the pending bit was set, we must write GBL_RLS to the control
+6 −31
Original line number Original line Diff line number Diff line
@@ -63,20 +63,8 @@ ACPI_MODULE_NAME("hwsleep")
acpi_status
acpi_status
acpi_set_firmware_waking_vector(u32 physical_address)
acpi_set_firmware_waking_vector(u32 physical_address)
{
{
	struct acpi_table_facs *facs;
	acpi_status status;

	ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
	ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);


	/* Get the FACS */

	status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
					 ACPI_CAST_INDIRECT_PTR(struct
								acpi_table_header,
								&facs));
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}


	/*
	/*
	 * According to the ACPI specification 2.0c and later, the 64-bit
	 * According to the ACPI specification 2.0c and later, the 64-bit
@@ -88,12 +76,12 @@ acpi_set_firmware_waking_vector(u32 physical_address)


	/* Set the 32-bit vector */
	/* Set the 32-bit vector */


	facs->firmware_waking_vector = physical_address;
	acpi_gbl_FACS->firmware_waking_vector = physical_address;


	/* Clear the 64-bit vector if it exists */
	/* Clear the 64-bit vector if it exists */


	if ((facs->length > 32) && (facs->version >= 1)) {
	if ((acpi_gbl_FACS->length > 32) && (acpi_gbl_FACS->version >= 1)) {
		facs->xfirmware_waking_vector = 0;
		acpi_gbl_FACS->xfirmware_waking_vector = 0;
	}
	}


	return_ACPI_STATUS(AE_OK);
	return_ACPI_STATUS(AE_OK);
@@ -117,32 +105,19 @@ ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
acpi_status
acpi_status
acpi_set_firmware_waking_vector64(u64 physical_address)
acpi_set_firmware_waking_vector64(u64 physical_address)
{
{
	struct acpi_table_facs *facs;
	acpi_status status;

	ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
	ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);




	/* Get the FACS */

	status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
					 ACPI_CAST_INDIRECT_PTR(struct
								acpi_table_header,
								&facs));
	if (ACPI_FAILURE(status)) {
		return_ACPI_STATUS(status);
	}

	/* Determine if the 64-bit vector actually exists */
	/* Determine if the 64-bit vector actually exists */


	if ((facs->length <= 32) || (facs->version < 1)) {
	if ((acpi_gbl_FACS->length <= 32) || (acpi_gbl_FACS->version < 1)) {
		return_ACPI_STATUS(AE_NOT_EXIST);
		return_ACPI_STATUS(AE_NOT_EXIST);
	}
	}


	/* Clear 32-bit vector, set the 64-bit X_ vector */
	/* Clear 32-bit vector, set the 64-bit X_ vector */


	facs->firmware_waking_vector = 0;
	acpi_gbl_FACS->firmware_waking_vector = 0;
	facs->xfirmware_waking_vector = physical_address;
	acpi_gbl_FACS->xfirmware_waking_vector = physical_address;


	return_ACPI_STATUS(AE_OK);
	return_ACPI_STATUS(AE_OK);
}
}
+24 −0
Original line number Original line Diff line number Diff line
@@ -111,6 +111,30 @@ acpi_tb_check_xsdt(acpi_physical_address address)
		return AE_OK;
		return AE_OK;
}
}


/*******************************************************************************
 *
 * FUNCTION:    acpi_tb_initialize_facs
 *
 * PARAMETERS:  None
 *
 * RETURN:      Status
 *
 * DESCRIPTION: Create a permanent mapping for the FADT and save it in a global
 *              for accessing the Global Lock and Firmware Waking Vector
 *
 ******************************************************************************/

acpi_status acpi_tb_initialize_facs(void)
{
	acpi_status status;

	status = acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
					 ACPI_CAST_INDIRECT_PTR(struct
								acpi_table_header,
								&acpi_gbl_FACS));
	return status;
}

/*******************************************************************************
/*******************************************************************************
 *
 *
 * FUNCTION:    acpi_tb_tables_loaded
 * FUNCTION:    acpi_tb_tables_loaded
+1 −0
Original line number Original line Diff line number Diff line
@@ -771,6 +771,7 @@ acpi_status acpi_ut_init_globals(void)
	acpi_gbl_global_lock_mutex = NULL;
	acpi_gbl_global_lock_mutex = NULL;
	acpi_gbl_global_lock_acquired = FALSE;
	acpi_gbl_global_lock_acquired = FALSE;
	acpi_gbl_global_lock_handle = 0;
	acpi_gbl_global_lock_handle = 0;
	acpi_gbl_global_lock_present = FALSE;


	/* Miscellaneous variables */
	/* Miscellaneous variables */


+11 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@
#include <acpi/acevents.h>
#include <acpi/acevents.h>
#include <acpi/acnamesp.h>
#include <acpi/acnamesp.h>
#include <acpi/acdebug.h>
#include <acpi/acdebug.h>
#include <acpi/actables.h>


#define _COMPONENT          ACPI_UTILITIES
#define _COMPONENT          ACPI_UTILITIES
ACPI_MODULE_NAME("utxface")
ACPI_MODULE_NAME("utxface")
@@ -147,6 +148,16 @@ acpi_status acpi_enable_subsystem(u32 flags)
		}
		}
	}
	}


	/*
	 * Obtain a permanent mapping for the FACS. This is required for the
	 * Global Lock and the Firmware Waking Vector
	 */
	status = acpi_tb_initialize_facs();
	if (ACPI_FAILURE(status)) {
		ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
		return_ACPI_STATUS(status);
	}

	/*
	/*
	 * Install the default op_region handlers. These are installed unless
	 * Install the default op_region handlers. These are installed unless
	 * other handlers have already been installed via the
	 * other handlers have already been installed via the
Loading