Merge branches 'acpica', 'pm-domains' and 'pm-cpufreq'
* acpica: ACPICA: Tables: Fix FADT dependency regression * pm-domains: PM / Domains: Fix validation of latency constraints in genpd governor * pm-cpufreq: cpufreq: intel_pstate: Fix divide by zero on Knights Landing (KNL)
This commit is contained in:
commit
fa54823732
|
@ -61,6 +61,7 @@ ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header);
|
||||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_dsdt_index, ACPI_INVALID_TABLE_INDEX);
|
ACPI_INIT_GLOBAL(u32, acpi_gbl_dsdt_index, ACPI_INVALID_TABLE_INDEX);
|
||||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_facs_index, ACPI_INVALID_TABLE_INDEX);
|
ACPI_INIT_GLOBAL(u32, acpi_gbl_facs_index, ACPI_INVALID_TABLE_INDEX);
|
||||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_xfacs_index, ACPI_INVALID_TABLE_INDEX);
|
ACPI_INIT_GLOBAL(u32, acpi_gbl_xfacs_index, ACPI_INVALID_TABLE_INDEX);
|
||||||
|
ACPI_INIT_GLOBAL(u32, acpi_gbl_fadt_index, ACPI_INVALID_TABLE_INDEX);
|
||||||
|
|
||||||
#if (!ACPI_REDUCED_HARDWARE)
|
#if (!ACPI_REDUCED_HARDWARE)
|
||||||
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS);
|
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS);
|
||||||
|
|
|
@ -85,7 +85,7 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded);
|
||||||
/*
|
/*
|
||||||
* tbfadt - FADT parse/convert/validate
|
* tbfadt - FADT parse/convert/validate
|
||||||
*/
|
*/
|
||||||
void acpi_tb_parse_fadt(u32 table_index);
|
void acpi_tb_parse_fadt(void);
|
||||||
|
|
||||||
void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);
|
void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);
|
||||||
|
|
||||||
|
@ -138,8 +138,6 @@ acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id);
|
||||||
*/
|
*/
|
||||||
acpi_status acpi_tb_initialize_facs(void);
|
acpi_status acpi_tb_initialize_facs(void);
|
||||||
|
|
||||||
u8 acpi_tb_tables_loaded(void);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
acpi_tb_print_table_header(acpi_physical_address address,
|
acpi_tb_print_table_header(acpi_physical_address address,
|
||||||
struct acpi_table_header *header);
|
struct acpi_table_header *header);
|
||||||
|
|
|
@ -71,7 +71,7 @@ acpi_status acpi_enable(void)
|
||||||
|
|
||||||
/* ACPI tables must be present */
|
/* ACPI tables must be present */
|
||||||
|
|
||||||
if (!acpi_tb_tables_loaded()) {
|
if (acpi_gbl_fadt_index == ACPI_INVALID_TABLE_INDEX) {
|
||||||
return_ACPI_STATUS(AE_NO_ACPI_TABLES);
|
return_ACPI_STATUS(AE_NO_ACPI_TABLES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,7 +298,7 @@ acpi_tb_select_address(char *register_name, u32 address32, u64 address64)
|
||||||
*
|
*
|
||||||
* FUNCTION: acpi_tb_parse_fadt
|
* FUNCTION: acpi_tb_parse_fadt
|
||||||
*
|
*
|
||||||
* PARAMETERS: table_index - Index for the FADT
|
* PARAMETERS: None
|
||||||
*
|
*
|
||||||
* RETURN: None
|
* RETURN: None
|
||||||
*
|
*
|
||||||
|
@ -307,7 +307,7 @@ acpi_tb_select_address(char *register_name, u32 address32, u64 address64)
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
void acpi_tb_parse_fadt(u32 table_index)
|
void acpi_tb_parse_fadt(void)
|
||||||
{
|
{
|
||||||
u32 length;
|
u32 length;
|
||||||
struct acpi_table_header *table;
|
struct acpi_table_header *table;
|
||||||
|
@ -319,11 +319,11 @@ void acpi_tb_parse_fadt(u32 table_index)
|
||||||
* Get a local copy of the FADT and convert it to a common format
|
* Get a local copy of the FADT and convert it to a common format
|
||||||
* Map entire FADT, assumed to be smaller than one page.
|
* Map entire FADT, assumed to be smaller than one page.
|
||||||
*/
|
*/
|
||||||
length = acpi_gbl_root_table_list.tables[table_index].length;
|
length = acpi_gbl_root_table_list.tables[acpi_gbl_fadt_index].length;
|
||||||
|
|
||||||
table =
|
table =
|
||||||
acpi_os_map_memory(acpi_gbl_root_table_list.tables[table_index].
|
acpi_os_map_memory(acpi_gbl_root_table_list.
|
||||||
address, length);
|
tables[acpi_gbl_fadt_index].address, length);
|
||||||
if (!table) {
|
if (!table) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,29 +97,6 @@ acpi_status acpi_tb_initialize_facs(void)
|
||||||
}
|
}
|
||||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
*
|
|
||||||
* FUNCTION: acpi_tb_tables_loaded
|
|
||||||
*
|
|
||||||
* PARAMETERS: None
|
|
||||||
*
|
|
||||||
* RETURN: TRUE if required ACPI tables are loaded
|
|
||||||
*
|
|
||||||
* DESCRIPTION: Determine if the minimum required ACPI tables are present
|
|
||||||
* (FADT, FACS, DSDT)
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
u8 acpi_tb_tables_loaded(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (acpi_gbl_root_table_list.current_table_count >= 4) {
|
|
||||||
return (TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* FUNCTION: acpi_tb_check_dsdt_header
|
* FUNCTION: acpi_tb_check_dsdt_header
|
||||||
|
@ -392,7 +369,8 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
||||||
ACPI_COMPARE_NAME(&acpi_gbl_root_table_list.
|
ACPI_COMPARE_NAME(&acpi_gbl_root_table_list.
|
||||||
tables[table_index].signature,
|
tables[table_index].signature,
|
||||||
ACPI_SIG_FADT)) {
|
ACPI_SIG_FADT)) {
|
||||||
acpi_tb_parse_fadt(table_index);
|
acpi_gbl_fadt_index = table_index;
|
||||||
|
acpi_tb_parse_fadt();
|
||||||
}
|
}
|
||||||
|
|
||||||
next_table:
|
next_table:
|
||||||
|
|
|
@ -77,13 +77,16 @@ static bool default_stop_ok(struct device *dev)
|
||||||
dev_update_qos_constraint);
|
dev_update_qos_constraint);
|
||||||
|
|
||||||
if (constraint_ns > 0) {
|
if (constraint_ns > 0) {
|
||||||
constraint_ns -= td->start_latency_ns;
|
constraint_ns -= td->save_state_latency_ns +
|
||||||
|
td->stop_latency_ns +
|
||||||
|
td->start_latency_ns +
|
||||||
|
td->restore_state_latency_ns;
|
||||||
if (constraint_ns == 0)
|
if (constraint_ns == 0)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
td->effective_constraint_ns = constraint_ns;
|
td->effective_constraint_ns = constraint_ns;
|
||||||
td->cached_stop_ok = constraint_ns > td->stop_latency_ns ||
|
td->cached_stop_ok = constraint_ns >= 0;
|
||||||
constraint_ns == 0;
|
|
||||||
/*
|
/*
|
||||||
* The children have been suspended already, so we don't need to take
|
* The children have been suspended already, so we don't need to take
|
||||||
* their stop latencies into account here.
|
* their stop latencies into account here.
|
||||||
|
@ -126,18 +129,6 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
|
||||||
|
|
||||||
off_on_time_ns = genpd->power_off_latency_ns +
|
off_on_time_ns = genpd->power_off_latency_ns +
|
||||||
genpd->power_on_latency_ns;
|
genpd->power_on_latency_ns;
|
||||||
/*
|
|
||||||
* It doesn't make sense to remove power from the domain if saving
|
|
||||||
* the state of all devices in it and the power off/power on operations
|
|
||||||
* take too much time.
|
|
||||||
*
|
|
||||||
* All devices in this domain have been stopped already at this point.
|
|
||||||
*/
|
|
||||||
list_for_each_entry(pdd, &genpd->dev_list, list_node) {
|
|
||||||
if (pdd->dev->driver)
|
|
||||||
off_on_time_ns +=
|
|
||||||
to_gpd_data(pdd)->td.save_state_latency_ns;
|
|
||||||
}
|
|
||||||
|
|
||||||
min_off_time_ns = -1;
|
min_off_time_ns = -1;
|
||||||
/*
|
/*
|
||||||
|
@ -193,7 +184,6 @@ static bool default_power_down_ok(struct dev_pm_domain *pd)
|
||||||
* constraint_ns cannot be negative here, because the device has
|
* constraint_ns cannot be negative here, because the device has
|
||||||
* been suspended.
|
* been suspended.
|
||||||
*/
|
*/
|
||||||
constraint_ns -= td->restore_state_latency_ns;
|
|
||||||
if (constraint_ns <= off_on_time_ns)
|
if (constraint_ns <= off_on_time_ns)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -776,6 +776,11 @@ static inline void intel_pstate_sample(struct cpudata *cpu)
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
rdmsrl(MSR_IA32_APERF, aperf);
|
rdmsrl(MSR_IA32_APERF, aperf);
|
||||||
rdmsrl(MSR_IA32_MPERF, mperf);
|
rdmsrl(MSR_IA32_MPERF, mperf);
|
||||||
|
if (cpu->prev_mperf == mperf) {
|
||||||
|
local_irq_restore(flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tsc = rdtsc();
|
tsc = rdtsc();
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue