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

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
...@@ -49,11 +49,7 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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
......
...@@ -63,20 +63,8 @@ ACPI_MODULE_NAME("hwsleep") ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
...@@ -111,6 +111,30 @@ acpi_tb_check_xsdt(acpi_physical_address address) ...@@ -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
......
...@@ -771,6 +771,7 @@ acpi_status acpi_ut_init_globals(void) ...@@ -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 */
......
...@@ -45,6 +45,7 @@ ...@@ -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) ...@@ -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
......
...@@ -140,6 +140,7 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags; ...@@ -140,6 +140,7 @@ ACPI_EXTERN u32 acpi_gbl_trace_flags;
*/ */
ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list; ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list;
ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT; ACPI_EXTERN struct acpi_table_fadt acpi_gbl_FADT;
ACPI_EXTERN struct acpi_table_facs *acpi_gbl_FACS;
extern u8 acpi_gbl_permanent_mmap; extern u8 acpi_gbl_permanent_mmap;
/* These addresses are calculated from FADT address values */ /* These addresses are calculated from FADT address values */
......
...@@ -94,6 +94,8 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded); ...@@ -94,6 +94,8 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
/* /*
* tbutils - table manager utilities * tbutils - table manager utilities
*/ */
acpi_status acpi_tb_initialize_facs(void);
u8 acpi_tb_tables_loaded(void); u8 acpi_tb_tables_loaded(void);
void void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment