Commit d9a799d1 authored by Len Brown's avatar Len Brown

Merge branch 'acpica-cherry-pick' into release

parents a48ecc77 b681f7d9
...@@ -119,6 +119,10 @@ ...@@ -119,6 +119,10 @@
#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF #define ACPI_MAX_LOOP_ITERATIONS 0xFFFF
/* Maximum sleep allowed via Sleep() operator */
#define ACPI_MAX_SLEEP 20000 /* Two seconds */
/****************************************************************************** /******************************************************************************
* *
* ACPI Specification constants (Do not change unless the specification changes) * ACPI Specification constants (Do not change unless the specification changes)
......
...@@ -125,6 +125,14 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); ...@@ -125,6 +125,14 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE);
*/ */
u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE);
/*
* Optionally truncate I/O addresses to 16 bits. Provides compatibility
* with other ACPI implementations. NOTE: During ACPICA initialization,
* this value is set to TRUE if any Windows OSI strings have been
* requested by the BIOS.
*/
u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE);
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
struct acpi_table_fadt acpi_gbl_FADT; struct acpi_table_fadt acpi_gbl_FADT;
......
...@@ -201,6 +201,14 @@ acpi_status acpi_ex_system_do_sleep(u64 how_long) ...@@ -201,6 +201,14 @@ acpi_status acpi_ex_system_do_sleep(u64 how_long)
acpi_ex_relinquish_interpreter(); acpi_ex_relinquish_interpreter();
/*
* For compatibility with other ACPI implementations and to prevent
* accidental deep sleeps, limit the sleep time to something reasonable.
*/
if (how_long > ACPI_MAX_SLEEP) {
how_long = ACPI_MAX_SLEEP;
}
acpi_os_sleep(how_long); acpi_os_sleep(how_long);
/* And now we must get the interpreter again */ /* And now we must get the interpreter again */
......
...@@ -222,6 +222,12 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) ...@@ -222,6 +222,12 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width)
u32 one_byte; u32 one_byte;
u32 i; u32 i;
/* Truncate address to 16 bits if requested */
if (acpi_gbl_truncate_io_addresses) {
address &= ACPI_UINT16_MAX;
}
/* Validate the entire request and perform the I/O */ /* Validate the entire request and perform the I/O */
status = acpi_hw_validate_io_request(address, width); status = acpi_hw_validate_io_request(address, width);
...@@ -279,6 +285,12 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width) ...@@ -279,6 +285,12 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width)
acpi_status status; acpi_status status;
u32 i; u32 i;
/* Truncate address to 16 bits if requested */
if (acpi_gbl_truncate_io_addresses) {
address &= ACPI_UINT16_MAX;
}
/* Validate the entire request and perform the I/O */ /* Validate the entire request and perform the I/O */
status = acpi_hw_validate_io_request(address, width); status = acpi_hw_validate_io_request(address, width);
......
...@@ -193,6 +193,15 @@ acpi_status acpi_ns_initialize_devices(void) ...@@ -193,6 +193,15 @@ acpi_status acpi_ns_initialize_devices(void)
acpi_ns_init_one_device, NULL, &info, acpi_ns_init_one_device, NULL, &info,
NULL); NULL);
/*
* Any _OSI requests should be completed by now. If the BIOS has
* requested any Windows OSI strings, we will always truncate
* I/O addresses to 16 bits -- for Windows compatibility.
*/
if (acpi_gbl_osi_data >= ACPI_OSI_WIN_2000) {
acpi_gbl_truncate_io_addresses = TRUE;
}
ACPI_FREE(info.evaluate_info); ACPI_FREE(info.evaluate_info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto error_exit; goto error_exit;
......
...@@ -212,7 +212,7 @@ char const *acpi_gbl_exception_names_env[] = { ...@@ -212,7 +212,7 @@ char const *acpi_gbl_exception_names_env[] = {
"AE_NO_GLOBAL_LOCK", "AE_NO_GLOBAL_LOCK",
"AE_ABORT_METHOD", "AE_ABORT_METHOD",
"AE_SAME_HANDLER", "AE_SAME_HANDLER",
"AE_WAKE_ONLY_GPE", "AE_NO_HANDLER",
"AE_OWNER_ID_LIMIT" "AE_OWNER_ID_LIMIT"
}; };
......
...@@ -69,6 +69,7 @@ extern acpi_name acpi_gbl_trace_method_name; ...@@ -69,6 +69,7 @@ extern acpi_name acpi_gbl_trace_method_name;
extern u32 acpi_gbl_trace_flags; extern u32 acpi_gbl_trace_flags;
extern u8 acpi_gbl_enable_aml_debug_object; extern u8 acpi_gbl_enable_aml_debug_object;
extern u8 acpi_gbl_copy_dsdt_locally; extern u8 acpi_gbl_copy_dsdt_locally;
extern u8 acpi_gbl_truncate_io_addresses;
extern u32 acpi_current_gpe_count; extern u32 acpi_current_gpe_count;
extern struct acpi_table_fadt acpi_gbl_FADT; extern struct acpi_table_fadt acpi_gbl_FADT;
......
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