Merge branch 'acpica'
* acpica: ACPICA: Update version to 20130725. ACPICA: Update names for walk_namespace callbacks to clarify usage. ACPICA: Return error if DerefOf resolves to a null package element. ACPICA: Make ACPI Power Management Timer (PM Timer) optional. ACPICA: Fix divergences of the commit - ACPICA: Expose OSI version. ACPICA: Fix possible fault for methods that optionally have no return value. ACPICA: DeRefOf operator: Update to fully resolve FieldUnit and BufferField refs. ACPICA: Emit all unresolved method externals in a text block ACPICA: Export acpi_tb_validate_rsdp(). ACPI: Add facility to remove all _OSI strings ACPI: Add facility to disable all _OSI OS vendor strings ACPICA: Add acpi_update_interfaces() public interface ACPICA: Update version to 20130626 ACPICA: Fix compiler warnings for casting issues (only some compilers) ACPICA: Remove restriction of 256 maximum GPEs in any GPE block ACPICA: Disassembler: Expand maximum output string length to 64K ACPICA: TableManager: Export acpi_tb_scan_memory_for_rsdp() ACPICA: Update comments about behavior when _STA does not exist
This commit is contained in:
Коммит
afdca01c98
|
@ -235,10 +235,61 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
Format: To spoof as Windows 98: ="Microsoft Windows"
|
||||
|
||||
acpi_osi= [HW,ACPI] Modify list of supported OS interface strings
|
||||
acpi_osi="string1" # add string1 -- only one string
|
||||
acpi_osi="!string2" # remove built-in string2
|
||||
acpi_osi="string1" # add string1
|
||||
acpi_osi="!string2" # remove string2
|
||||
acpi_osi=!* # remove all strings
|
||||
acpi_osi=! # disable all built-in OS vendor
|
||||
strings
|
||||
acpi_osi= # disable all strings
|
||||
|
||||
'acpi_osi=!' can be used in combination with single or
|
||||
multiple 'acpi_osi="string1"' to support specific OS
|
||||
vendor string(s). Note that such command can only
|
||||
affect the default state of the OS vendor strings, thus
|
||||
it cannot affect the default state of the feature group
|
||||
strings and the current state of the OS vendor strings,
|
||||
specifying it multiple times through kernel command line
|
||||
is meaningless. This command is useful when one do not
|
||||
care about the state of the feature group strings which
|
||||
should be controlled by the OSPM.
|
||||
Examples:
|
||||
1. 'acpi_osi=! acpi_osi="Windows 2000"' is equivalent
|
||||
to 'acpi_osi="Windows 2000" acpi_osi=!', they all
|
||||
can make '_OSI("Windows 2000")' TRUE.
|
||||
|
||||
'acpi_osi=' cannot be used in combination with other
|
||||
'acpi_osi=' command lines, the _OSI method will not
|
||||
exist in the ACPI namespace. NOTE that such command can
|
||||
only affect the _OSI support state, thus specifying it
|
||||
multiple times through kernel command line is also
|
||||
meaningless.
|
||||
Examples:
|
||||
1. 'acpi_osi=' can make 'CondRefOf(_OSI, Local1)'
|
||||
FALSE.
|
||||
|
||||
'acpi_osi=!*' can be used in combination with single or
|
||||
multiple 'acpi_osi="string1"' to support specific
|
||||
string(s). Note that such command can affect the
|
||||
current state of both the OS vendor strings and the
|
||||
feature group strings, thus specifying it multiple times
|
||||
through kernel command line is meaningful. But it may
|
||||
still not able to affect the final state of a string if
|
||||
there are quirks related to this string. This command
|
||||
is useful when one want to control the state of the
|
||||
feature group strings to debug BIOS issues related to
|
||||
the OSPM features.
|
||||
Examples:
|
||||
1. 'acpi_osi="Module Device" acpi_osi=!*' can make
|
||||
'_OSI("Module Device")' FALSE.
|
||||
2. 'acpi_osi=!* acpi_osi="Module Device"' can make
|
||||
'_OSI("Module Device")' TRUE.
|
||||
3. 'acpi_osi=! acpi_osi=!* acpi_osi="Windows 2000"' is
|
||||
equivalent to
|
||||
'acpi_osi=!* acpi_osi=! acpi_osi="Windows 2000"'
|
||||
and
|
||||
'acpi_osi=!* acpi_osi="Windows 2000" acpi_osi=!',
|
||||
they all will make '_OSI("Windows 2000")' TRUE.
|
||||
|
||||
acpi_pm_good [X86]
|
||||
Override the pmtimer bug detection: force the kernel
|
||||
to assume that this machine's pmtimer latches its value
|
||||
|
|
|
@ -138,6 +138,12 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE);
|
|||
*/
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_ssdt_table_load, FALSE);
|
||||
|
||||
/*
|
||||
* We keep track of the latest version of Windows that has been requested by
|
||||
* the BIOS.
|
||||
*/
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_osi_data, 0);
|
||||
|
||||
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
|
||||
|
||||
struct acpi_table_fadt acpi_gbl_FADT;
|
||||
|
@ -285,7 +291,6 @@ ACPI_EXTERN u8 acpi_gbl_debugger_configuration;
|
|||
ACPI_EXTERN u8 acpi_gbl_step_to_next_call;
|
||||
ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present;
|
||||
ACPI_EXTERN u8 acpi_gbl_events_initialized;
|
||||
ACPI_EXTERN u8 acpi_gbl_osi_data;
|
||||
ACPI_EXTERN struct acpi_interface_info *acpi_gbl_supported_interfaces;
|
||||
ACPI_EXTERN struct acpi_address_range
|
||||
*acpi_gbl_address_range_list[ACPI_ADDRESS_RANGE_MAX];
|
||||
|
|
|
@ -942,6 +942,9 @@ struct acpi_interface_info {
|
|||
|
||||
#define ACPI_OSI_INVALID 0x01
|
||||
#define ACPI_OSI_DYNAMIC 0x02
|
||||
#define ACPI_OSI_FEATURE 0x04
|
||||
#define ACPI_OSI_DEFAULT_INVALID 0x08
|
||||
#define ACPI_OSI_OPTIONAL_FEATURE (ACPI_OSI_FEATURE | ACPI_OSI_DEFAULT_INVALID | ACPI_OSI_INVALID)
|
||||
|
||||
struct acpi_port_info {
|
||||
char *name;
|
||||
|
@ -1030,6 +1033,7 @@ struct acpi_external_list {
|
|||
u8 type;
|
||||
u8 flags;
|
||||
u8 resolved;
|
||||
u8 emitted;
|
||||
};
|
||||
|
||||
/* Values for Flags field above */
|
||||
|
|
|
@ -104,8 +104,8 @@ acpi_ns_walk_namespace(acpi_object_type type,
|
|||
acpi_handle start_object,
|
||||
u32 max_depth,
|
||||
u32 flags,
|
||||
acpi_walk_callback pre_order_visit,
|
||||
acpi_walk_callback post_order_visit,
|
||||
acpi_walk_callback descending_callback,
|
||||
acpi_walk_callback ascending_callback,
|
||||
void *context, void **return_value);
|
||||
|
||||
struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
|
||||
|
|
|
@ -46,6 +46,13 @@
|
|||
|
||||
acpi_status acpi_allocate_root_table(u32 initial_table_count);
|
||||
|
||||
/*
|
||||
* tbxfroot - Root pointer utilities
|
||||
*/
|
||||
acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp);
|
||||
|
||||
u8 *acpi_tb_scan_memory_for_rsdp(u8 *start_address, u32 length);
|
||||
|
||||
/*
|
||||
* tbfadt - FADT parse/convert/validate
|
||||
*/
|
||||
|
|
|
@ -470,6 +470,8 @@ acpi_status acpi_ut_install_interface(acpi_string interface_name);
|
|||
|
||||
acpi_status acpi_ut_remove_interface(acpi_string interface_name);
|
||||
|
||||
acpi_status acpi_ut_update_interfaces(u8 action);
|
||||
|
||||
struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name);
|
||||
|
||||
acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
|
||||
|
@ -616,7 +618,7 @@ int acpi_ut_stricmp(char *string1, char *string2);
|
|||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer);
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length);
|
||||
void acpi_ut_print_string(char *string, u16 max_length);
|
||||
|
||||
void ut_convert_backslashes(char *pathname);
|
||||
|
||||
|
|
|
@ -125,7 +125,6 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
/* GPE block 0 exists (has both length and address > 0) */
|
||||
|
||||
register_count0 = (u16)(acpi_gbl_FADT.gpe0_block_length / 2);
|
||||
|
||||
gpe_number_max =
|
||||
(register_count0 * ACPI_GPE_REGISTER_WIDTH) - 1;
|
||||
|
||||
|
@ -204,16 +203,6 @@ acpi_status acpi_ev_gpe_initialize(void)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Check for Max GPE number out-of-range */
|
||||
|
||||
if (gpe_number_max > ACPI_GPE_MAX) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Maximum GPE number from FADT is too large: 0x%X",
|
||||
gpe_number_max));
|
||||
status = AE_BAD_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
|
|
@ -338,6 +338,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
|||
{
|
||||
u8 *target;
|
||||
char *name;
|
||||
const char *reference_name;
|
||||
u8 count;
|
||||
|
||||
if (!info) {
|
||||
|
@ -426,10 +427,9 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
|||
|
||||
case ACPI_EXD_REFERENCE:
|
||||
|
||||
reference_name = acpi_ut_get_reference_name(obj_desc);
|
||||
acpi_ex_out_string("Class Name",
|
||||
ACPI_CAST_PTR(char,
|
||||
acpi_ut_get_reference_name
|
||||
(obj_desc)));
|
||||
ACPI_CAST_PTR(char, reference_name));
|
||||
acpi_ex_dump_reference_obj(obj_desc);
|
||||
break;
|
||||
|
||||
|
|
|
@ -962,10 +962,17 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
return_desc =
|
||||
*(operand[0]->reference.where);
|
||||
if (return_desc) {
|
||||
acpi_ut_add_reference
|
||||
(return_desc);
|
||||
if (!return_desc) {
|
||||
/*
|
||||
* Element is NULL, do not allow the dereference.
|
||||
* This provides compatibility with other ACPI
|
||||
* implementations.
|
||||
*/
|
||||
return_ACPI_STATUS
|
||||
(AE_AML_UNINITIALIZED_ELEMENT);
|
||||
}
|
||||
|
||||
acpi_ut_add_reference(return_desc);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -990,11 +997,40 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
acpi_namespace_node
|
||||
*)
|
||||
return_desc);
|
||||
if (!return_desc) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* June 2013:
|
||||
* buffer_fields/field_units require additional resolution
|
||||
*/
|
||||
switch (return_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
case ACPI_TYPE_LOCAL_REGION_FIELD:
|
||||
case ACPI_TYPE_LOCAL_BANK_FIELD:
|
||||
case ACPI_TYPE_LOCAL_INDEX_FIELD:
|
||||
|
||||
status =
|
||||
acpi_ex_read_data_from_field
|
||||
(walk_state, return_desc,
|
||||
&temp_desc);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
return_desc = temp_desc;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Add another reference to the object */
|
||||
|
||||
acpi_ut_add_reference
|
||||
(return_desc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add another reference to the object! */
|
||||
|
||||
acpi_ut_add_reference(return_desc);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -100,8 +100,13 @@ acpi_status acpi_get_timer(u32 * ticks)
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
status = acpi_hw_read(ticks, &acpi_gbl_FADT.xpm_timer_block);
|
||||
/* ACPI 5.0A: PM Timer is optional */
|
||||
|
||||
if (!acpi_gbl_FADT.xpm_timer_block.address) {
|
||||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
status = acpi_hw_read(ticks, &acpi_gbl_FADT.xpm_timer_block);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -148,6 +153,12 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* ACPI 5.0A: PM Timer is optional */
|
||||
|
||||
if (!acpi_gbl_FADT.xpm_timer_block.address) {
|
||||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute Tick Delta:
|
||||
* Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
|
||||
|
|
|
@ -150,6 +150,15 @@ acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* 4) If there is no return value and it is optional, just return
|
||||
* AE_OK (_WAK).
|
||||
*/
|
||||
if (!(*return_object_ptr)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* For returned Package objects, check the type of all sub-objects.
|
||||
* Note: Package may have been newly created by call above.
|
||||
|
@ -268,7 +277,12 @@ acpi_ns_check_object_type(struct acpi_evaluate_info *info,
|
|||
|
||||
acpi_ut_get_expected_return_types(type_buffer, expected_btypes);
|
||||
|
||||
if (package_index == ACPI_NOT_PACKAGE_ELEMENT) {
|
||||
if (!return_object) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Expected return object of type %s",
|
||||
type_buffer));
|
||||
} else if (package_index == ACPI_NOT_PACKAGE_ELEMENT) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Return type mismatch - found %s, expected %s",
|
||||
|
|
|
@ -156,9 +156,9 @@ struct acpi_namespace_node *acpi_ns_get_next_node_typed(acpi_object_type type,
|
|||
* max_depth - Depth to which search is to reach
|
||||
* flags - Whether to unlock the NS before invoking
|
||||
* the callback routine
|
||||
* pre_order_visit - Called during tree pre-order visit
|
||||
* descending_callback - Called during tree descent
|
||||
* when an object of "Type" is found
|
||||
* post_order_visit - Called during tree post-order visit
|
||||
* ascending_callback - Called during tree ascent
|
||||
* when an object of "Type" is found
|
||||
* context - Passed to user function(s) above
|
||||
* return_value - from the user_function if terminated
|
||||
|
@ -185,8 +185,8 @@ acpi_ns_walk_namespace(acpi_object_type type,
|
|||
acpi_handle start_node,
|
||||
u32 max_depth,
|
||||
u32 flags,
|
||||
acpi_walk_callback pre_order_visit,
|
||||
acpi_walk_callback post_order_visit,
|
||||
acpi_walk_callback descending_callback,
|
||||
acpi_walk_callback ascending_callback,
|
||||
void *context, void **return_value)
|
||||
{
|
||||
acpi_status status;
|
||||
|
@ -255,22 +255,22 @@ acpi_ns_walk_namespace(acpi_object_type type,
|
|||
}
|
||||
|
||||
/*
|
||||
* Invoke the user function, either pre-order or post-order
|
||||
* Invoke the user function, either descending, ascending,
|
||||
* or both.
|
||||
*/
|
||||
if (!node_previously_visited) {
|
||||
if (pre_order_visit) {
|
||||
if (descending_callback) {
|
||||
status =
|
||||
pre_order_visit(child_node, level,
|
||||
context,
|
||||
return_value);
|
||||
descending_callback(child_node,
|
||||
level, context,
|
||||
return_value);
|
||||
}
|
||||
} else {
|
||||
if (post_order_visit) {
|
||||
if (ascending_callback) {
|
||||
status =
|
||||
post_order_visit(child_node, level,
|
||||
context,
|
||||
return_value);
|
||||
ascending_callback(child_node,
|
||||
level, context,
|
||||
return_value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -533,9 +533,9 @@ static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
|
|||
* PARAMETERS: type - acpi_object_type to search for
|
||||
* start_object - Handle in namespace where search begins
|
||||
* max_depth - Depth to which search is to reach
|
||||
* pre_order_visit - Called during tree pre-order visit
|
||||
* descending_callback - Called during tree descent
|
||||
* when an object of "Type" is found
|
||||
* post_order_visit - Called during tree post-order visit
|
||||
* ascending_callback - Called during tree ascent
|
||||
* when an object of "Type" is found
|
||||
* context - Passed to user function(s) above
|
||||
* return_value - Location where return value of
|
||||
|
@ -563,8 +563,8 @@ acpi_status
|
|||
acpi_walk_namespace(acpi_object_type type,
|
||||
acpi_handle start_object,
|
||||
u32 max_depth,
|
||||
acpi_walk_callback pre_order_visit,
|
||||
acpi_walk_callback post_order_visit,
|
||||
acpi_walk_callback descending_callback,
|
||||
acpi_walk_callback ascending_callback,
|
||||
void *context, void **return_value)
|
||||
{
|
||||
acpi_status status;
|
||||
|
@ -574,7 +574,7 @@ acpi_walk_namespace(acpi_object_type type,
|
|||
/* Parameter validation */
|
||||
|
||||
if ((type > ACPI_TYPE_LOCAL_MAX) ||
|
||||
(!max_depth) || (!pre_order_visit && !post_order_visit)) {
|
||||
(!max_depth) || (!descending_callback && !ascending_callback)) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -606,9 +606,9 @@ acpi_walk_namespace(acpi_object_type type,
|
|||
}
|
||||
|
||||
status = acpi_ns_walk_namespace(type, start_object, max_depth,
|
||||
ACPI_NS_WALK_UNLOCK, pre_order_visit,
|
||||
post_order_visit, context,
|
||||
return_value);
|
||||
ACPI_NS_WALK_UNLOCK,
|
||||
descending_callback, ascending_callback,
|
||||
context, return_value);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
|
|
|
@ -158,6 +158,7 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer)
|
|||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
char *node_name;
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
|
@ -202,7 +203,8 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer)
|
|||
|
||||
/* Just copy the ACPI name from the Node and zero terminate it */
|
||||
|
||||
ACPI_MOVE_NAME(buffer->pointer, acpi_ut_get_node_name(node));
|
||||
node_name = acpi_ut_get_node_name(node);
|
||||
ACPI_MOVE_NAME(buffer->pointer, node_name);
|
||||
((char *)buffer->pointer)[ACPI_NAME_SIZE] = 0;
|
||||
status = AE_OK;
|
||||
|
||||
|
@ -379,9 +381,14 @@ acpi_get_object_info(acpi_handle handle,
|
|||
* Get extra info for ACPI Device/Processor objects only:
|
||||
* Run the _STA, _ADR and, sx_w, and _sx_d methods.
|
||||
*
|
||||
* Note: none of these methods are required, so they may or may
|
||||
* Notes: none of these methods are required, so they may or may
|
||||
* not be present for this device. The Info->Valid bitfield is used
|
||||
* to indicate which methods were found and run successfully.
|
||||
*
|
||||
* For _STA, if the method does not exist, then (as per the ACPI
|
||||
* specification), the returned current_status flags will indicate
|
||||
* that the device is present/functional/enabled. Otherwise, the
|
||||
* current_status flags reflect the value returned from _STA.
|
||||
*/
|
||||
|
||||
/* Execute the Device._STA method */
|
||||
|
|
|
@ -117,7 +117,7 @@ static struct acpi_fadt_info fadt_info_table[] = {
|
|||
ACPI_FADT_OFFSET(pm_timer_block),
|
||||
ACPI_FADT_OFFSET(pm_timer_length),
|
||||
ACPI_PM_TIMER_WIDTH,
|
||||
ACPI_FADT_REQUIRED},
|
||||
ACPI_FADT_SEPARATE_LENGTH}, /* ACPI 5.0A: Timer is optional */
|
||||
|
||||
{"Gpe0Block",
|
||||
ACPI_FADT_OFFSET(xgpe0_block),
|
||||
|
@ -574,7 +574,7 @@ static void acpi_tb_validate_fadt(void)
|
|||
|
||||
if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
|
||||
/*
|
||||
* Field is required (Pm1a_event, Pm1a_control, pm_timer).
|
||||
* Field is required (Pm1a_event, Pm1a_control).
|
||||
* Both the address and length must be non-zero.
|
||||
*/
|
||||
if (!address64->address || !length) {
|
||||
|
|
|
@ -48,11 +48,6 @@
|
|||
#define _COMPONENT ACPI_TABLES
|
||||
ACPI_MODULE_NAME("tbxfroot")
|
||||
|
||||
/* Local prototypes */
|
||||
static u8 *acpi_tb_scan_memory_for_rsdp(u8 * start_address, u32 length);
|
||||
|
||||
static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_rsdp
|
||||
|
@ -64,8 +59,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp);
|
|||
* DESCRIPTION: Validate the RSDP (ptr)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
||||
acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
||||
{
|
||||
|
||||
/*
|
||||
|
@ -74,7 +68,7 @@ static acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
|||
* Note: Sometimes there exists more than one RSDP in memory; the valid
|
||||
* RSDP has a valid checksum, all others have an invalid checksum.
|
||||
*/
|
||||
if (ACPI_STRNCMP((char *)rsdp, ACPI_SIG_RSDP,
|
||||
if (ACPI_STRNCMP((char *)rsdp->signature, ACPI_SIG_RSDP,
|
||||
sizeof(ACPI_SIG_RSDP) - 1) != 0) {
|
||||
|
||||
/* Nope, BAD Signature */
|
||||
|
@ -231,7 +225,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address)
|
|||
* DESCRIPTION: Search a block of memory for the RSDP signature
|
||||
*
|
||||
******************************************************************************/
|
||||
static u8 *acpi_tb_scan_memory_for_rsdp(u8 * start_address, u32 length)
|
||||
u8 *acpi_tb_scan_memory_for_rsdp(u8 *start_address, u32 length)
|
||||
{
|
||||
acpi_status status;
|
||||
u8 *mem_rover;
|
||||
|
|
|
@ -239,7 +239,8 @@ acpi_ut_evaluate_numeric_object(char *object_name,
|
|||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Executes _STA for selected device and stores results in
|
||||
* *Flags.
|
||||
* *Flags. If _STA does not exist, then the device is assumed
|
||||
* to be present/functional/enabled (as per the ACPI spec).
|
||||
*
|
||||
* NOTE: Internal function, no parameter validation
|
||||
*
|
||||
|
@ -257,6 +258,11 @@ acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
|
|||
ACPI_BTYPE_INTEGER, &obj_desc);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (AE_NOT_FOUND == status) {
|
||||
/*
|
||||
* if _STA does not exist, then (as per the ACPI specification),
|
||||
* the returned flags will indicate that the device is present,
|
||||
* functional, and enabled.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"_STA on %4.4s was not found, assuming device is present\n",
|
||||
acpi_ut_get_node_name(device_node)));
|
||||
|
|
|
@ -336,7 +336,6 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_trace_dbg_layer = 0;
|
||||
acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
|
||||
acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
|
||||
acpi_gbl_osi_data = 0;
|
||||
acpi_gbl_osi_mutex = NULL;
|
||||
acpi_gbl_reg_methods_executed = FALSE;
|
||||
|
||||
|
|
|
@ -77,21 +77,20 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
|
|||
|
||||
/* Feature Group Strings */
|
||||
|
||||
{"Extended Address Space Descriptor", NULL, 0, 0}
|
||||
{"Extended Address Space Descriptor", NULL, ACPI_OSI_FEATURE, 0},
|
||||
|
||||
/*
|
||||
* All "optional" feature group strings (features that are implemented
|
||||
* by the host) should be dynamically added by the host via
|
||||
* acpi_install_interface and should not be manually added here.
|
||||
*
|
||||
* Examples of optional feature group strings:
|
||||
*
|
||||
* "Module Device"
|
||||
* "Processor Device"
|
||||
* "3.0 Thermal Model"
|
||||
* "3.0 _SCP Extensions"
|
||||
* "Processor Aggregator Device"
|
||||
* by the host) should be dynamically modified to VALID by the host via
|
||||
* acpi_install_interface or acpi_update_interfaces. Such optional feature
|
||||
* group strings are set as INVALID by default here.
|
||||
*/
|
||||
|
||||
{"Module Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
|
||||
{"Processor Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
|
||||
{"3.0 Thermal Model", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
|
||||
{"3.0 _SCP Extensions", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0},
|
||||
{"Processor Aggregator Device", NULL, ACPI_OSI_OPTIONAL_FEATURE, 0}
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -158,11 +157,20 @@ acpi_status acpi_ut_interface_terminate(void)
|
|||
while (next_interface) {
|
||||
acpi_gbl_supported_interfaces = next_interface->next;
|
||||
|
||||
/* Only interfaces added at runtime can be freed */
|
||||
|
||||
if (next_interface->flags & ACPI_OSI_DYNAMIC) {
|
||||
|
||||
/* Only interfaces added at runtime can be freed */
|
||||
|
||||
ACPI_FREE(next_interface->name);
|
||||
ACPI_FREE(next_interface);
|
||||
} else {
|
||||
/* Interface is in static list. Reset it to invalid or valid. */
|
||||
|
||||
if (next_interface->flags & ACPI_OSI_DEFAULT_INVALID) {
|
||||
next_interface->flags |= ACPI_OSI_INVALID;
|
||||
} else {
|
||||
next_interface->flags &= ~ACPI_OSI_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
next_interface = acpi_gbl_supported_interfaces;
|
||||
|
@ -276,6 +284,49 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
|
|||
return (AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_update_interfaces
|
||||
*
|
||||
* PARAMETERS: action - Actions to be performed during the
|
||||
* update
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
|
||||
* strings or/and feature group strings.
|
||||
* Caller MUST hold acpi_gbl_osi_mutex
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_update_interfaces(u8 action)
|
||||
{
|
||||
struct acpi_interface_info *next_interface;
|
||||
|
||||
next_interface = acpi_gbl_supported_interfaces;
|
||||
while (next_interface) {
|
||||
if (((next_interface->flags & ACPI_OSI_FEATURE) &&
|
||||
(action & ACPI_FEATURE_STRINGS)) ||
|
||||
(!(next_interface->flags & ACPI_OSI_FEATURE) &&
|
||||
(action & ACPI_VENDOR_STRINGS))) {
|
||||
if (action & ACPI_DISABLE_INTERFACES) {
|
||||
|
||||
/* Mark the interfaces as invalid */
|
||||
|
||||
next_interface->flags |= ACPI_OSI_INVALID;
|
||||
} else {
|
||||
/* Mark the interfaces as valid */
|
||||
|
||||
next_interface->flags &= ~ACPI_OSI_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
next_interface = next_interface->next;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_get_interface
|
||||
|
|
|
@ -333,7 +333,8 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
|||
* FUNCTION: acpi_ut_print_string
|
||||
*
|
||||
* PARAMETERS: string - Null terminated ASCII string
|
||||
* max_length - Maximum output length
|
||||
* max_length - Maximum output length. Used to constrain the
|
||||
* length of strings during debug output only.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
|
@ -342,7 +343,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length)
|
||||
void acpi_ut_print_string(char *string, u16 max_length)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
|
|
|
@ -387,6 +387,34 @@ acpi_status acpi_install_interface_handler(acpi_interface_handler handler)
|
|||
|
||||
ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_update_interfaces
|
||||
*
|
||||
* PARAMETERS: action - Actions to be performed during the
|
||||
* update
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Update _OSI interface strings, disabling or enabling OS vendor
|
||||
* string or/and feature group strings.
|
||||
*
|
||||
****************************************************************************/
|
||||
acpi_status acpi_update_interfaces(u8 action)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
status = acpi_ut_update_interfaces(action);
|
||||
|
||||
acpi_os_release_mutex(acpi_gbl_osi_mutex);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_check_address_range
|
||||
|
@ -402,6 +430,7 @@ ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
|
|||
* ASL operation region address ranges.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
u32
|
||||
acpi_check_address_range(acpi_adr_space_type space_id,
|
||||
acpi_physical_address address,
|
||||
|
|
|
@ -142,7 +142,8 @@ static struct osi_linux {
|
|||
unsigned int enable:1;
|
||||
unsigned int dmi:1;
|
||||
unsigned int cmdline:1;
|
||||
} osi_linux = {0, 0, 0};
|
||||
unsigned int default_disabling:1;
|
||||
} osi_linux = {0, 0, 0, 0};
|
||||
|
||||
static u32 acpi_osi_handler(acpi_string interface, u32 supported)
|
||||
{
|
||||
|
@ -1378,6 +1379,17 @@ void __init acpi_osi_setup(char *str)
|
|||
|
||||
if (*str == '!') {
|
||||
str++;
|
||||
if (*str == '\0') {
|
||||
osi_linux.default_disabling = 1;
|
||||
return;
|
||||
} else if (*str == '*') {
|
||||
acpi_update_interfaces(ACPI_DISABLE_ALL_STRINGS);
|
||||
for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
||||
osi = &osi_setup_entries[i];
|
||||
osi->enable = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
enable = false;
|
||||
}
|
||||
|
||||
|
@ -1443,6 +1455,13 @@ static void __init acpi_osi_setup_late(void)
|
|||
int i;
|
||||
acpi_status status;
|
||||
|
||||
if (osi_linux.default_disabling) {
|
||||
status = acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
|
||||
|
||||
if (ACPI_SUCCESS(status))
|
||||
printk(KERN_INFO PREFIX "Disabled all _OSI OS vendors\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
||||
osi = &osi_setup_entries[i];
|
||||
str = osi->string;
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20130517
|
||||
#define ACPI_CA_VERSION 0x20130725
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -147,6 +147,8 @@ acpi_status acpi_install_interface(acpi_string interface_name);
|
|||
|
||||
acpi_status acpi_remove_interface(acpi_string interface_name);
|
||||
|
||||
acpi_status acpi_update_interfaces(u8 action);
|
||||
|
||||
u32
|
||||
acpi_check_address_range(acpi_adr_space_type space_id,
|
||||
acpi_physical_address address,
|
||||
|
@ -210,8 +212,8 @@ acpi_status
|
|||
acpi_walk_namespace(acpi_object_type type,
|
||||
acpi_handle start_object,
|
||||
u32 max_depth,
|
||||
acpi_walk_callback pre_order_visit,
|
||||
acpi_walk_callback post_order_visit,
|
||||
acpi_walk_callback descending_callback,
|
||||
acpi_walk_callback ascending_callback,
|
||||
void *context, void **return_value);
|
||||
|
||||
acpi_status
|
||||
|
|
|
@ -668,13 +668,6 @@ typedef u32 acpi_event_status;
|
|||
#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04
|
||||
#define ACPI_EVENT_FLAG_HANDLE (acpi_event_status) 0x08
|
||||
|
||||
/*
|
||||
* General Purpose Events (GPE)
|
||||
*/
|
||||
#define ACPI_GPE_INVALID 0xFF
|
||||
#define ACPI_GPE_MAX 0xFF
|
||||
#define ACPI_NUM_GPE 256
|
||||
|
||||
/* Actions for acpi_set_gpe, acpi_gpe_wakeup, acpi_hw_low_set_gpe */
|
||||
|
||||
#define ACPI_GPE_ENABLE 0
|
||||
|
@ -1144,7 +1137,19 @@ struct acpi_memory_list {
|
|||
#endif
|
||||
};
|
||||
|
||||
/* Definitions for _OSI support */
|
||||
/* Definitions of _OSI support */
|
||||
|
||||
#define ACPI_VENDOR_STRINGS 0x01
|
||||
#define ACPI_FEATURE_STRINGS 0x02
|
||||
#define ACPI_ENABLE_INTERFACES 0x00
|
||||
#define ACPI_DISABLE_INTERFACES 0x04
|
||||
|
||||
#define ACPI_DISABLE_ALL_VENDOR_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS)
|
||||
#define ACPI_DISABLE_ALL_FEATURE_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_FEATURE_STRINGS)
|
||||
#define ACPI_DISABLE_ALL_STRINGS (ACPI_DISABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
|
||||
#define ACPI_ENABLE_ALL_VENDOR_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS)
|
||||
#define ACPI_ENABLE_ALL_FEATURE_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_FEATURE_STRINGS)
|
||||
#define ACPI_ENABLE_ALL_STRINGS (ACPI_ENABLE_INTERFACES | ACPI_VENDOR_STRINGS | ACPI_FEATURE_STRINGS)
|
||||
|
||||
#define ACPI_OSI_WIN_2000 0x01
|
||||
#define ACPI_OSI_WIN_XP 0x02
|
||||
|
|
Загрузка…
Ссылка в новой задаче