Commit eef445ee authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm+acpi-3.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes from Rafael Wysocki:
 "These include a fix for a recent intel_pstate regression, a fix for a
  regression in the ACPI-based PCI hotplug (ACPIPHP) code introduced
  during the 3.12 cycle, fixes for two bugs in the ACPI core introduced
  recently and a MAINTAINERS update related to cpufreq.

  Specifics:

   - Fix for a recent regression in the intel_pstate driver that
     introduced a race condition causing systems to crash during
     initialization in some situations.  This removes the affected code
     altogether.  From Dirk Brandewie.

   - ACPIPHP fix for a regression introduced during the 3.12 cycle
     causing devices to be dropped as a result of bus check
     notifications after system resume on some systems due to the way
     ACPIPHP interprets _STA return values (arguably incorrectly).  From
     Mika Westerberg.

   - ACPI dock driver fix for a problem causing docking to fail due to a
     check that always fails after recent ACPI core changes (found by
     code inspection).

   - ACPI container driver fix to prevent memory from being leaked in an
     error code path after device_register() failures.

   - Update of the arm_big_little cpufreq driver maintainer's e-mail
     address"

* tag 'pm+acpi-3.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  MAINTAINERS / cpufreq: update Sudeep's email address
  intel_pstate: Remove energy reporting from pstate_sample tracepoint
  ACPI / container: Fix error code path in container_device_attach()
  ACPI / hotplug / PCI: Relax the checking of _STA return values
  ACPI / dock: Use acpi_device_enumerated() to check if dock is present
parents 3bd354ab 465e5fc4
...@@ -2367,7 +2367,7 @@ F: include/linux/cpufreq.h ...@@ -2367,7 +2367,7 @@ F: include/linux/cpufreq.h
CPU FREQUENCY DRIVERS - ARM BIG LITTLE CPU FREQUENCY DRIVERS - ARM BIG LITTLE
M: Viresh Kumar <viresh.kumar@linaro.org> M: Viresh Kumar <viresh.kumar@linaro.org>
M: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com> M: Sudeep Holla <sudeep.holla@arm.com>
L: cpufreq@vger.kernel.org L: cpufreq@vger.kernel.org
L: linux-pm@vger.kernel.org L: linux-pm@vger.kernel.org
W: http://www.arm.com/products/processors/technologies/biglittleprocessing.php W: http://www.arm.com/products/processors/technologies/biglittleprocessing.php
......
...@@ -79,9 +79,10 @@ static int container_device_attach(struct acpi_device *adev, ...@@ -79,9 +79,10 @@ static int container_device_attach(struct acpi_device *adev,
ACPI_COMPANION_SET(dev, adev); ACPI_COMPANION_SET(dev, adev);
dev->release = acpi_container_release; dev->release = acpi_container_release;
ret = device_register(dev); ret = device_register(dev);
if (ret) if (ret) {
put_device(dev);
return ret; return ret;
}
adev->driver_data = dev; adev->driver_data = dev;
return 1; return 1;
} }
......
...@@ -609,7 +609,7 @@ static int handle_eject_request(struct dock_station *ds, u32 event) ...@@ -609,7 +609,7 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
static void dock_notify(struct dock_station *ds, u32 event) static void dock_notify(struct dock_station *ds, u32 event)
{ {
acpi_handle handle = ds->handle; acpi_handle handle = ds->handle;
struct acpi_device *ad; struct acpi_device *adev = NULL;
int surprise_removal = 0; int surprise_removal = 0;
/* /*
...@@ -632,7 +632,8 @@ static void dock_notify(struct dock_station *ds, u32 event) ...@@ -632,7 +632,8 @@ static void dock_notify(struct dock_station *ds, u32 event)
switch (event) { switch (event) {
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
case ACPI_NOTIFY_DEVICE_CHECK: case ACPI_NOTIFY_DEVICE_CHECK:
if (!dock_in_progress(ds) && acpi_bus_get_device(handle, &ad)) { acpi_bus_get_device(handle, &adev);
if (!dock_in_progress(ds) && !acpi_device_enumerated(adev)) {
begin_dock(ds); begin_dock(ds);
dock(ds); dock(ds);
if (!dock_present(ds)) { if (!dock_present(ds)) {
......
...@@ -51,8 +51,6 @@ static inline int32_t div_fp(int32_t x, int32_t y) ...@@ -51,8 +51,6 @@ static inline int32_t div_fp(int32_t x, int32_t y)
return div_s64((int64_t)x << FRAC_BITS, (int64_t)y); return div_s64((int64_t)x << FRAC_BITS, (int64_t)y);
} }
static u64 energy_divisor;
struct sample { struct sample {
int32_t core_pct_busy; int32_t core_pct_busy;
u64 aperf; u64 aperf;
...@@ -630,12 +628,10 @@ static void intel_pstate_timer_func(unsigned long __data) ...@@ -630,12 +628,10 @@ static void intel_pstate_timer_func(unsigned long __data)
{ {
struct cpudata *cpu = (struct cpudata *) __data; struct cpudata *cpu = (struct cpudata *) __data;
struct sample *sample; struct sample *sample;
u64 energy;
intel_pstate_sample(cpu); intel_pstate_sample(cpu);
sample = &cpu->samples[cpu->sample_ptr]; sample = &cpu->samples[cpu->sample_ptr];
rdmsrl(MSR_PKG_ENERGY_STATUS, energy);
intel_pstate_adjust_busy_pstate(cpu); intel_pstate_adjust_busy_pstate(cpu);
...@@ -644,7 +640,6 @@ static void intel_pstate_timer_func(unsigned long __data) ...@@ -644,7 +640,6 @@ static void intel_pstate_timer_func(unsigned long __data)
cpu->pstate.current_pstate, cpu->pstate.current_pstate,
sample->mperf, sample->mperf,
sample->aperf, sample->aperf,
div64_u64(energy, energy_divisor),
sample->freq); sample->freq);
intel_pstate_set_sample_time(cpu); intel_pstate_set_sample_time(cpu);
...@@ -926,7 +921,6 @@ static int __init intel_pstate_init(void) ...@@ -926,7 +921,6 @@ static int __init intel_pstate_init(void)
int cpu, rc = 0; int cpu, rc = 0;
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
struct cpu_defaults *cpu_info; struct cpu_defaults *cpu_info;
u64 units;
if (no_load) if (no_load)
return -ENODEV; return -ENODEV;
...@@ -960,9 +954,6 @@ static int __init intel_pstate_init(void) ...@@ -960,9 +954,6 @@ static int __init intel_pstate_init(void)
if (rc) if (rc)
goto out; goto out;
rdmsrl(MSR_RAPL_POWER_UNIT, units);
energy_divisor = 1 << ((units >> 8) & 0x1f); /* bits{12:8} */
intel_pstate_debug_expose_params(); intel_pstate_debug_expose_params();
intel_pstate_sysfs_expose_params(); intel_pstate_sysfs_expose_params();
......
...@@ -730,6 +730,17 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot) ...@@ -730,6 +730,17 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
return (unsigned int)sta; return (unsigned int)sta;
} }
static inline bool device_status_valid(unsigned int sta)
{
/*
* ACPI spec says that _STA may return bit 0 clear with bit 3 set
* if the device is valid but does not require a device driver to be
* loaded (Section 6.3.7 of ACPI 5.0A).
*/
unsigned int mask = ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_FUNCTIONING;
return (sta & mask) == mask;
}
/** /**
* trim_stale_devices - remove PCI devices that are not responding. * trim_stale_devices - remove PCI devices that are not responding.
* @dev: PCI device to start walking the hierarchy from. * @dev: PCI device to start walking the hierarchy from.
...@@ -745,7 +756,7 @@ static void trim_stale_devices(struct pci_dev *dev) ...@@ -745,7 +756,7 @@ static void trim_stale_devices(struct pci_dev *dev)
unsigned long long sta; unsigned long long sta;
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL) alive = (ACPI_SUCCESS(status) && device_status_valid(sta))
|| acpiphp_no_hotplug(handle); || acpiphp_no_hotplug(handle);
} }
if (!alive) { if (!alive) {
...@@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge) ...@@ -792,7 +803,7 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
mutex_lock(&slot->crit_sect); mutex_lock(&slot->crit_sect);
if (slot_no_hotplug(slot)) { if (slot_no_hotplug(slot)) {
; /* do nothing */ ; /* do nothing */
} else if (get_slot_status(slot) == ACPI_STA_ALL) { } else if (device_status_valid(get_slot_status(slot))) {
/* remove stale devices if any */ /* remove stale devices if any */
list_for_each_entry_safe_reverse(dev, tmp, list_for_each_entry_safe_reverse(dev, tmp,
&bus->devices, bus_list) &bus->devices, bus_list)
......
...@@ -42,7 +42,6 @@ TRACE_EVENT(pstate_sample, ...@@ -42,7 +42,6 @@ TRACE_EVENT(pstate_sample,
u32 state, u32 state,
u64 mperf, u64 mperf,
u64 aperf, u64 aperf,
u32 energy,
u32 freq u32 freq
), ),
...@@ -51,7 +50,6 @@ TRACE_EVENT(pstate_sample, ...@@ -51,7 +50,6 @@ TRACE_EVENT(pstate_sample,
state, state,
mperf, mperf,
aperf, aperf,
energy,
freq freq
), ),
...@@ -61,7 +59,6 @@ TRACE_EVENT(pstate_sample, ...@@ -61,7 +59,6 @@ TRACE_EVENT(pstate_sample,
__field(u32, state) __field(u32, state)
__field(u64, mperf) __field(u64, mperf)
__field(u64, aperf) __field(u64, aperf)
__field(u32, energy)
__field(u32, freq) __field(u32, freq)
), ),
...@@ -72,17 +69,15 @@ TRACE_EVENT(pstate_sample, ...@@ -72,17 +69,15 @@ TRACE_EVENT(pstate_sample,
__entry->state = state; __entry->state = state;
__entry->mperf = mperf; __entry->mperf = mperf;
__entry->aperf = aperf; __entry->aperf = aperf;
__entry->energy = energy;
__entry->freq = freq; __entry->freq = freq;
), ),
TP_printk("core_busy=%lu scaled=%lu state=%lu mperf=%llu aperf=%llu energy=%lu freq=%lu ", TP_printk("core_busy=%lu scaled=%lu state=%lu mperf=%llu aperf=%llu freq=%lu ",
(unsigned long)__entry->core_busy, (unsigned long)__entry->core_busy,
(unsigned long)__entry->scaled_busy, (unsigned long)__entry->scaled_busy,
(unsigned long)__entry->state, (unsigned long)__entry->state,
(unsigned long long)__entry->mperf, (unsigned long long)__entry->mperf,
(unsigned long long)__entry->aperf, (unsigned long long)__entry->aperf,
(unsigned long)__entry->energy,
(unsigned long)__entry->freq (unsigned long)__entry->freq
) )
......
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