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
This commit is contained in:
@@ -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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
* 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);
|
|||||||
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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user