mirror of https://gitee.com/openkylin/linux.git
ACPICA: Add acpi_update_interfaces() public interface
Add new API to allow OSPM to disable/enable specific types of _OSI
interface strings.
ACPICA does not have the knowledge about whether an _OSI interface
string is an OS vendor string or a feature group string and there
isn't any API interface to allow OSPM to install a new interface
string as a feature group string.
This patch simply adds all feature group strings defined by ACPI
specification into the acpi_default_supported_interfaces with
ACPI_OSI_FEATURE flag set to fix this gap. This patch also adds
codes to keep their default states as ACPI_OSI_INVALID before the
initialization and after the termination.
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Acked-by: Len Brown <len.brown@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Conflicts:
include/acpi/actypes.h (with commit 242b228
)
This commit is contained in:
parent
53b1631e3a
commit
2cf9f5bcc8
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1152,4 +1152,18 @@ struct acpi_memory_list {
|
|||
#define ACPI_OSI_WIN_7 0x0B
|
||||
#define ACPI_OSI_WIN_8 0x0C
|
||||
|
||||
/* _OSI update actions */
|
||||
|
||||
#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)
|
||||
|
||||
#endif /* __ACTYPES_H__ */
|
||||
|
|
Loading…
Reference in New Issue