提交 ff163da9 编写于 作者: B Bjorn Helgaas

Merge branch 'pci/pm'

- Add sysfs attribute for device power state (Maximilian Luz)

- Rename pci_wakeup_bus() to pci_resume_bus() (Mika Westerberg)

- Do not generate wakeup event when runtime resuming bus (Mika Westerberg)

* pci/pm:
  PCI/PM: Do not generate wakeup event when runtime resuming device
  PCI/PM: Rename pci_wakeup_bus() to pci_resume_bus()
  PCI: Add sysfs attribute for device power state
...@@ -366,3 +366,12 @@ Contact: Heiner Kallweit <hkallweit1@gmail.com> ...@@ -366,3 +366,12 @@ Contact: Heiner Kallweit <hkallweit1@gmail.com>
Description: If ASPM is supported for an endpoint, these files can be Description: If ASPM is supported for an endpoint, these files can be
used to disable or enable the individual power management used to disable or enable the individual power management
states. Write y/1/on to enable, n/0/off to disable. states. Write y/1/on to enable, n/0/off to disable.
What: /sys/bus/pci/devices/.../power_state
Date: November 2020
Contact: Linux PCI developers <linux-pci@vger.kernel.org>
Description:
This file contains the current PCI power state of the device.
The value comes from the PCI kernel device state and can be one
of: "unknown", "error", "D0", D1", "D2", "D3hot", "D3cold".
The file is read only.
...@@ -1039,7 +1039,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev) ...@@ -1039,7 +1039,7 @@ static int vga_switcheroo_runtime_resume(struct device *dev)
mutex_lock(&vgasr_mutex); mutex_lock(&vgasr_mutex);
vga_switcheroo_power_switch(pdev, VGA_SWITCHEROO_ON); vga_switcheroo_power_switch(pdev, VGA_SWITCHEROO_ON);
mutex_unlock(&vgasr_mutex); mutex_unlock(&vgasr_mutex);
pci_wakeup_bus(pdev->bus); pci_resume_bus(pdev->bus);
ret = dev->bus->pm->runtime_resume(dev); ret = dev->bus->pm->runtime_resume(dev);
if (ret) if (ret)
return ret; return ret;
......
...@@ -124,6 +124,15 @@ static ssize_t cpulistaffinity_show(struct device *dev, ...@@ -124,6 +124,15 @@ static ssize_t cpulistaffinity_show(struct device *dev,
} }
static DEVICE_ATTR_RO(cpulistaffinity); static DEVICE_ATTR_RO(cpulistaffinity);
static ssize_t power_state_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
return sprintf(buf, "%s\n", pci_power_name(pdev->current_state));
}
static DEVICE_ATTR_RO(power_state);
/* show resources */ /* show resources */
static ssize_t resource_show(struct device *dev, struct device_attribute *attr, static ssize_t resource_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
...@@ -581,6 +590,7 @@ static ssize_t driver_override_show(struct device *dev, ...@@ -581,6 +590,7 @@ static ssize_t driver_override_show(struct device *dev,
static DEVICE_ATTR_RW(driver_override); static DEVICE_ATTR_RW(driver_override);
static struct attribute *pci_dev_attrs[] = { static struct attribute *pci_dev_attrs[] = {
&dev_attr_power_state.attr,
&dev_attr_resource.attr, &dev_attr_resource.attr,
&dev_attr_vendor.attr, &dev_attr_vendor.attr,
&dev_attr_device.attr, &dev_attr_device.attr,
......
...@@ -1174,26 +1174,20 @@ int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) ...@@ -1174,26 +1174,20 @@ int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state)
} }
EXPORT_SYMBOL_GPL(pci_platform_power_transition); EXPORT_SYMBOL_GPL(pci_platform_power_transition);
/** static int pci_resume_one(struct pci_dev *pci_dev, void *ign)
* pci_wakeup - Wake up a PCI device
* @pci_dev: Device to handle.
* @ign: ignored parameter
*/
static int pci_wakeup(struct pci_dev *pci_dev, void *ign)
{ {
pci_wakeup_event(pci_dev);
pm_request_resume(&pci_dev->dev); pm_request_resume(&pci_dev->dev);
return 0; return 0;
} }
/** /**
* pci_wakeup_bus - Walk given bus and wake up devices on it * pci_resume_bus - Walk given bus and runtime resume devices on it
* @bus: Top bus of the subtree to walk. * @bus: Top bus of the subtree to walk.
*/ */
void pci_wakeup_bus(struct pci_bus *bus) void pci_resume_bus(struct pci_bus *bus)
{ {
if (bus) if (bus)
pci_walk_bus(bus, pci_wakeup, NULL); pci_walk_bus(bus, pci_resume_one, NULL);
} }
static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout) static int pci_dev_wait(struct pci_dev *dev, char *reset_type, int timeout)
...@@ -1256,7 +1250,7 @@ int pci_power_up(struct pci_dev *dev) ...@@ -1256,7 +1250,7 @@ int pci_power_up(struct pci_dev *dev)
* may be powered on into D0uninitialized state, resume them to * may be powered on into D0uninitialized state, resume them to
* give them a chance to suspend again * give them a chance to suspend again
*/ */
pci_wakeup_bus(dev->subordinate); pci_resume_bus(dev->subordinate);
} }
return pci_raw_set_power_state(dev, PCI_D0); return pci_raw_set_power_state(dev, PCI_D0);
......
...@@ -1277,7 +1277,7 @@ bool pci_dev_run_wake(struct pci_dev *dev); ...@@ -1277,7 +1277,7 @@ bool pci_dev_run_wake(struct pci_dev *dev);
void pci_d3cold_enable(struct pci_dev *dev); void pci_d3cold_enable(struct pci_dev *dev);
void pci_d3cold_disable(struct pci_dev *dev); void pci_d3cold_disable(struct pci_dev *dev);
bool pcie_relaxed_ordering_enabled(struct pci_dev *dev); bool pcie_relaxed_ordering_enabled(struct pci_dev *dev);
void pci_wakeup_bus(struct pci_bus *bus); void pci_resume_bus(struct pci_bus *bus);
void pci_bus_set_current_state(struct pci_bus *bus, pci_power_t state); void pci_bus_set_current_state(struct pci_bus *bus, pci_power_t state);
/* For use by arch with custom probe code */ /* For use by arch with custom probe code */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册