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
)
hifive-unleashed-5.1
parent
53b1631e3a
commit
2cf9f5bcc8
|
@ -942,6 +942,9 @@ struct acpi_interface_info {
|
||||||
|
|
||||||
#define ACPI_OSI_INVALID 0x01
|
#define ACPI_OSI_INVALID 0x01
|
||||||
#define ACPI_OSI_DYNAMIC 0x02
|
#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 {
|
struct acpi_port_info {
|
||||||
char *name;
|
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_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);
|
struct acpi_interface_info *acpi_ut_get_interface(acpi_string interface_name);
|
||||||
|
|
||||||
acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state);
|
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 */
|
/* 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
|
* All "optional" feature group strings (features that are implemented
|
||||||
* by the host) should be dynamically added by the host via
|
* by the host) should be dynamically modified to VALID by the host via
|
||||||
* acpi_install_interface and should not be manually added here.
|
* acpi_install_interface or acpi_update_interfaces. Such optional feature
|
||||||
*
|
* group strings are set as INVALID by default here.
|
||||||
* Examples of optional feature group strings:
|
|
||||||
*
|
|
||||||
* "Module Device"
|
|
||||||
* "Processor Device"
|
|
||||||
* "3.0 Thermal Model"
|
|
||||||
* "3.0 _SCP Extensions"
|
|
||||||
* "Processor Aggregator Device"
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
{"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) {
|
while (next_interface) {
|
||||||
acpi_gbl_supported_interfaces = next_interface->next;
|
acpi_gbl_supported_interfaces = next_interface->next;
|
||||||
|
|
||||||
|
if (next_interface->flags & ACPI_OSI_DYNAMIC) {
|
||||||
|
|
||||||
/* Only interfaces added at runtime can be freed */
|
/* Only interfaces added at runtime can be freed */
|
||||||
|
|
||||||
if (next_interface->flags & ACPI_OSI_DYNAMIC) {
|
|
||||||
ACPI_FREE(next_interface->name);
|
ACPI_FREE(next_interface->name);
|
||||||
ACPI_FREE(next_interface);
|
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;
|
next_interface = acpi_gbl_supported_interfaces;
|
||||||
|
@ -276,6 +284,49 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
|
||||||
return (AE_NOT_EXIST);
|
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
|
* 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)
|
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
|
* FUNCTION: acpi_check_address_range
|
||||||
|
@ -402,6 +430,7 @@ ACPI_EXPORT_SYMBOL(acpi_install_interface_handler)
|
||||||
* ASL operation region address ranges.
|
* ASL operation region address ranges.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
u32
|
u32
|
||||||
acpi_check_address_range(acpi_adr_space_type space_id,
|
acpi_check_address_range(acpi_adr_space_type space_id,
|
||||||
acpi_physical_address address,
|
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_remove_interface(acpi_string interface_name);
|
||||||
|
|
||||||
|
acpi_status acpi_update_interfaces(u8 action);
|
||||||
|
|
||||||
u32
|
u32
|
||||||
acpi_check_address_range(acpi_adr_space_type space_id,
|
acpi_check_address_range(acpi_adr_space_type space_id,
|
||||||
acpi_physical_address address,
|
acpi_physical_address address,
|
||||||
|
|
|
@ -1152,4 +1152,18 @@ struct acpi_memory_list {
|
||||||
#define ACPI_OSI_WIN_7 0x0B
|
#define ACPI_OSI_WIN_7 0x0B
|
||||||
#define ACPI_OSI_WIN_8 0x0C
|
#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__ */
|
#endif /* __ACTYPES_H__ */
|
||||||
|
|
Loading…
Reference in New Issue