Commit fa81e66e authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'pm-cpufreq', 'pm-cpuidle' and 'acpi-cppc'

* pm-cpufreq:
  cpufreq: dt: Drop stale comment
  cpufreq: intel_pstate: Documenation for structures
  cpufreq: intel_pstate: fix inconsistency in setting policy limits
  intel_pstate: Avoid extra invocation of intel_pstate_sample()
  intel_pstate: Do not set utilization update hook too early

* pm-cpuidle:
  intel_idle: Add KBL support
  intel_idle: Add SKX support
  intel_idle: Clean up all registered devices on exit.
  intel_idle: Propagate hot plug errors.
  intel_idle: Don't overreact to a cpuidle registration failure.
  intel_idle: Setup the timer broadcast only on successful driver load.
  intel_idle: Avoid a double free of the per-CPU data.
  intel_idle: Fix dangling registration on error path.
  intel_idle: Fix deallocation order on the driver exit path.
  intel_idle: Remove redundant initialization calls.
  intel_idle: Fix a helper function's return value.
  intel_idle: remove useless return from void function.

* acpi-cppc:
  mailbox: pcc: Don't access an unmapped memory address space
...@@ -4,9 +4,6 @@ ...@@ -4,9 +4,6 @@
* Copyright (C) 2014 Linaro. * Copyright (C) 2014 Linaro.
* Viresh Kumar <viresh.kumar@linaro.org> * Viresh Kumar <viresh.kumar@linaro.org>
* *
* The OPP code in function set_target() is reused from
* drivers/cpufreq/omap-cpufreq.c
*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
......
This diff is collapsed.
...@@ -660,6 +660,35 @@ static struct cpuidle_state skl_cstates[] = { ...@@ -660,6 +660,35 @@ static struct cpuidle_state skl_cstates[] = {
.enter = NULL } .enter = NULL }
}; };
static struct cpuidle_state skx_cstates[] = {
{
.name = "C1-SKX",
.desc = "MWAIT 0x00",
.flags = MWAIT2flg(0x00),
.exit_latency = 2,
.target_residency = 2,
.enter = &intel_idle,
.enter_freeze = intel_idle_freeze, },
{
.name = "C1E-SKX",
.desc = "MWAIT 0x01",
.flags = MWAIT2flg(0x01),
.exit_latency = 10,
.target_residency = 20,
.enter = &intel_idle,
.enter_freeze = intel_idle_freeze, },
{
.name = "C6-SKX",
.desc = "MWAIT 0x20",
.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
.exit_latency = 133,
.target_residency = 600,
.enter = &intel_idle,
.enter_freeze = intel_idle_freeze, },
{
.enter = NULL }
};
static struct cpuidle_state atom_cstates[] = { static struct cpuidle_state atom_cstates[] = {
{ {
.name = "C1E-ATM", .name = "C1E-ATM",
...@@ -818,8 +847,11 @@ static int cpu_hotplug_notify(struct notifier_block *n, ...@@ -818,8 +847,11 @@ static int cpu_hotplug_notify(struct notifier_block *n,
* driver in this case * driver in this case
*/ */
dev = per_cpu_ptr(intel_idle_cpuidle_devices, hotcpu); dev = per_cpu_ptr(intel_idle_cpuidle_devices, hotcpu);
if (!dev->registered) if (dev->registered)
intel_idle_cpu_init(hotcpu); break;
if (intel_idle_cpu_init(hotcpu))
return NOTIFY_BAD;
break; break;
} }
...@@ -904,6 +936,10 @@ static const struct idle_cpu idle_cpu_skl = { ...@@ -904,6 +936,10 @@ static const struct idle_cpu idle_cpu_skl = {
.disable_promotion_to_c1e = true, .disable_promotion_to_c1e = true,
}; };
static const struct idle_cpu idle_cpu_skx = {
.state_table = skx_cstates,
.disable_promotion_to_c1e = true,
};
static const struct idle_cpu idle_cpu_avn = { static const struct idle_cpu idle_cpu_avn = {
.state_table = avn_cstates, .state_table = avn_cstates,
...@@ -945,6 +981,9 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = { ...@@ -945,6 +981,9 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = {
ICPU(0x56, idle_cpu_bdw), ICPU(0x56, idle_cpu_bdw),
ICPU(0x4e, idle_cpu_skl), ICPU(0x4e, idle_cpu_skl),
ICPU(0x5e, idle_cpu_skl), ICPU(0x5e, idle_cpu_skl),
ICPU(0x8e, idle_cpu_skl),
ICPU(0x9e, idle_cpu_skl),
ICPU(0x55, idle_cpu_skx),
ICPU(0x57, idle_cpu_knl), ICPU(0x57, idle_cpu_knl),
{} {}
}; };
...@@ -987,22 +1026,15 @@ static int __init intel_idle_probe(void) ...@@ -987,22 +1026,15 @@ static int __init intel_idle_probe(void)
icpu = (const struct idle_cpu *)id->driver_data; icpu = (const struct idle_cpu *)id->driver_data;
cpuidle_state_table = icpu->state_table; cpuidle_state_table = icpu->state_table;
if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE;
else
on_each_cpu(__setup_broadcast_timer, (void *)true, 1);
pr_debug(PREFIX "v" INTEL_IDLE_VERSION pr_debug(PREFIX "v" INTEL_IDLE_VERSION
" model 0x%X\n", boot_cpu_data.x86_model); " model 0x%X\n", boot_cpu_data.x86_model);
pr_debug(PREFIX "lapic_timer_reliable_states 0x%x\n",
lapic_timer_reliable_states);
return 0; return 0;
} }
/* /*
* intel_idle_cpuidle_devices_uninit() * intel_idle_cpuidle_devices_uninit()
* unregister, free cpuidle_devices * Unregisters the cpuidle devices.
*/ */
static void intel_idle_cpuidle_devices_uninit(void) static void intel_idle_cpuidle_devices_uninit(void)
{ {
...@@ -1013,9 +1045,6 @@ static void intel_idle_cpuidle_devices_uninit(void) ...@@ -1013,9 +1045,6 @@ static void intel_idle_cpuidle_devices_uninit(void)
dev = per_cpu_ptr(intel_idle_cpuidle_devices, i); dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
cpuidle_unregister_device(dev); cpuidle_unregister_device(dev);
} }
free_percpu(intel_idle_cpuidle_devices);
return;
} }
/* /*
...@@ -1111,7 +1140,7 @@ static void intel_idle_state_table_update(void) ...@@ -1111,7 +1140,7 @@ static void intel_idle_state_table_update(void)
* intel_idle_cpuidle_driver_init() * intel_idle_cpuidle_driver_init()
* allocate, initialize cpuidle_states * allocate, initialize cpuidle_states
*/ */
static int __init intel_idle_cpuidle_driver_init(void) static void __init intel_idle_cpuidle_driver_init(void)
{ {
int cstate; int cstate;
struct cpuidle_driver *drv = &intel_idle_driver; struct cpuidle_driver *drv = &intel_idle_driver;
...@@ -1163,18 +1192,10 @@ static int __init intel_idle_cpuidle_driver_init(void) ...@@ -1163,18 +1192,10 @@ static int __init intel_idle_cpuidle_driver_init(void)
drv->state_count += 1; drv->state_count += 1;
} }
if (icpu->auto_demotion_disable_flags)
on_each_cpu(auto_demotion_disable, NULL, 1);
if (icpu->byt_auto_demotion_disable_flag) { if (icpu->byt_auto_demotion_disable_flag) {
wrmsrl(MSR_CC6_DEMOTION_POLICY_CONFIG, 0); wrmsrl(MSR_CC6_DEMOTION_POLICY_CONFIG, 0);
wrmsrl(MSR_MC6_DEMOTION_POLICY_CONFIG, 0); wrmsrl(MSR_MC6_DEMOTION_POLICY_CONFIG, 0);
} }
if (icpu->disable_promotion_to_c1e) /* each-cpu is redundant */
on_each_cpu(c1e_promotion_disable, NULL, 1);
return 0;
} }
...@@ -1193,7 +1214,6 @@ static int intel_idle_cpu_init(int cpu) ...@@ -1193,7 +1214,6 @@ static int intel_idle_cpu_init(int cpu)
if (cpuidle_register_device(dev)) { if (cpuidle_register_device(dev)) {
pr_debug(PREFIX "cpuidle_register_device %d failed!\n", cpu); pr_debug(PREFIX "cpuidle_register_device %d failed!\n", cpu);
intel_idle_cpuidle_devices_uninit();
return -EIO; return -EIO;
} }
...@@ -1218,40 +1238,51 @@ static int __init intel_idle_init(void) ...@@ -1218,40 +1238,51 @@ static int __init intel_idle_init(void)
if (retval) if (retval)
return retval; return retval;
intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
if (intel_idle_cpuidle_devices == NULL)
return -ENOMEM;
intel_idle_cpuidle_driver_init(); intel_idle_cpuidle_driver_init();
retval = cpuidle_register_driver(&intel_idle_driver); retval = cpuidle_register_driver(&intel_idle_driver);
if (retval) { if (retval) {
struct cpuidle_driver *drv = cpuidle_get_driver(); struct cpuidle_driver *drv = cpuidle_get_driver();
printk(KERN_DEBUG PREFIX "intel_idle yielding to %s", printk(KERN_DEBUG PREFIX "intel_idle yielding to %s",
drv ? drv->name : "none"); drv ? drv->name : "none");
free_percpu(intel_idle_cpuidle_devices);
return retval; return retval;
} }
intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device);
if (intel_idle_cpuidle_devices == NULL)
return -ENOMEM;
cpu_notifier_register_begin(); cpu_notifier_register_begin();
for_each_online_cpu(i) { for_each_online_cpu(i) {
retval = intel_idle_cpu_init(i); retval = intel_idle_cpu_init(i);
if (retval) { if (retval) {
intel_idle_cpuidle_devices_uninit();
cpu_notifier_register_done(); cpu_notifier_register_done();
cpuidle_unregister_driver(&intel_idle_driver); cpuidle_unregister_driver(&intel_idle_driver);
free_percpu(intel_idle_cpuidle_devices);
return retval; return retval;
} }
} }
__register_cpu_notifier(&cpu_hotplug_notifier); __register_cpu_notifier(&cpu_hotplug_notifier);
if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
lapic_timer_reliable_states = LAPIC_TIMER_ALWAYS_RELIABLE;
else
on_each_cpu(__setup_broadcast_timer, (void *)true, 1);
cpu_notifier_register_done(); cpu_notifier_register_done();
pr_debug(PREFIX "lapic_timer_reliable_states 0x%x\n",
lapic_timer_reliable_states);
return 0; return 0;
} }
static void __exit intel_idle_exit(void) static void __exit intel_idle_exit(void)
{ {
intel_idle_cpuidle_devices_uninit(); struct cpuidle_device *dev;
cpuidle_unregister_driver(&intel_idle_driver); int i;
cpu_notifier_register_begin(); cpu_notifier_register_begin();
...@@ -1259,9 +1290,15 @@ static void __exit intel_idle_exit(void) ...@@ -1259,9 +1290,15 @@ static void __exit intel_idle_exit(void)
on_each_cpu(__setup_broadcast_timer, (void *)false, 1); on_each_cpu(__setup_broadcast_timer, (void *)false, 1);
__unregister_cpu_notifier(&cpu_hotplug_notifier); __unregister_cpu_notifier(&cpu_hotplug_notifier);
for_each_possible_cpu(i) {
dev = per_cpu_ptr(intel_idle_cpuidle_devices, i);
cpuidle_unregister_device(dev);
}
cpu_notifier_register_done(); cpu_notifier_register_done();
return; cpuidle_unregister_driver(&intel_idle_driver);
free_percpu(intel_idle_cpuidle_devices);
} }
module_init(intel_idle_init); module_init(intel_idle_init);
......
...@@ -361,8 +361,6 @@ static int __init acpi_pcc_probe(void) ...@@ -361,8 +361,6 @@ static int __init acpi_pcc_probe(void)
struct acpi_generic_address *db_reg; struct acpi_generic_address *db_reg;
struct acpi_pcct_hw_reduced *pcct_ss; struct acpi_pcct_hw_reduced *pcct_ss;
pcc_mbox_channels[i].con_priv = pcct_entry; pcc_mbox_channels[i].con_priv = pcct_entry;
pcct_entry = (struct acpi_subtable_header *)
((unsigned long) pcct_entry + pcct_entry->length);
/* If doorbell is in system memory cache the virt address */ /* If doorbell is in system memory cache the virt address */
pcct_ss = (struct acpi_pcct_hw_reduced *)pcct_entry; pcct_ss = (struct acpi_pcct_hw_reduced *)pcct_entry;
...@@ -370,6 +368,8 @@ static int __init acpi_pcc_probe(void) ...@@ -370,6 +368,8 @@ static int __init acpi_pcc_probe(void)
if (db_reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) if (db_reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
pcc_doorbell_vaddr[i] = acpi_os_ioremap(db_reg->address, pcc_doorbell_vaddr[i] = acpi_os_ioremap(db_reg->address,
db_reg->bit_width/8); db_reg->bit_width/8);
pcct_entry = (struct acpi_subtable_header *)
((unsigned long) pcct_entry + pcct_entry->length);
} }
pcc_mbox_ctrl.num_chans = count; pcc_mbox_ctrl.num_chans = count;
......
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