Merge tag 'pci-v4.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI updates from Bjorn Helgaas: "PCI changes: - add support for PCI on ARM64 boxes with ACPI. We already had this for theoretical spec-compliant hardware; now we're adding quirks for the actual hardware (Cavium, HiSilicon, Qualcomm, X-Gene) - add runtime PM support for hotplug ports - enable runtime suspend for Intel UHCI that uses platform-specific wakeup signaling - add yet another host bridge registration interface. We hope this is extensible enough to subsume the others - expose device revision in sysfs for DRM - to avoid device conflicts, make sure any VF BAR updates are done before enabling the VF - avoid unnecessary link retrains for ASPM - allow INTx masking on Mellanox devices that support it - allow access to non-standard VPD for Chelsio devices - update Broadcom iProc support for PAXB v2, PAXC v2, inbound DMA, etc - update Rockchip support for max-link-speed - add NVIDIA Tegra210 support - add Layerscape LS1046a support - update R-Car compatibility strings - add Qualcomm MSM8996 support - remove some uninformative bootup messages" * tag 'pci-v4.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (115 commits) PCI: Enable access to non-standard VPD for Chelsio devices (cxgb3) PCI: Expand "VPD access disabled" quirk message PCI: pciehp: Remove loading message PCI: hotplug: Remove hotplug core message PCI: Remove service driver load/unload messages PCI/AER: Log AER IRQ when claiming Root Port PCI/AER: Log errors with PCI device, not PCIe service device PCI/AER: Remove unused version macros PCI/PME: Log PME IRQ when claiming Root Port PCI/PME: Drop unused support for PMEs from Root Complex Event Collectors PCI: Move config space size macros to pci_regs.h x86/platform/intel-mid: Constify mid_pci_platform_pm PCI/ASPM: Don't retrain link if ASPM not possible PCI: iproc: Skip check for legacy IRQ on PAXC buses PCI: pciehp: Leave power indicator on when enabling already-enabled slot PCI: pciehp: Prioritize data-link event over presence detect PCI: rcar: Add gen3 fallback compatibility string for pcie-rcar PCI: rcar: Use gen2 fallback compatibility last PCI: rcar-gen2: Use gen2 fallback compatibility last PCI: rockchip: Move the deassert of pm/aclk/pclk after phy_init() ..
This commit is contained in:
@@ -30,13 +30,6 @@
|
||||
#include "aerdrv.h"
|
||||
#include "../../pci.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.0"
|
||||
#define DRIVER_AUTHOR "tom.l.nguyen@intel.com"
|
||||
#define DRIVER_DESC "Root Port Advanced Error Reporting Driver"
|
||||
|
||||
static int aer_probe(struct pcie_device *dev);
|
||||
static void aer_remove(struct pcie_device *dev);
|
||||
static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
|
||||
@@ -297,12 +290,12 @@ static int aer_probe(struct pcie_device *dev)
|
||||
{
|
||||
int status;
|
||||
struct aer_rpc *rpc;
|
||||
struct device *device = &dev->device;
|
||||
struct device *device = &dev->port->dev;
|
||||
|
||||
/* Alloc rpc data structure */
|
||||
rpc = aer_alloc_rpc(dev);
|
||||
if (!rpc) {
|
||||
dev_printk(KERN_DEBUG, device, "alloc rpc failed\n");
|
||||
dev_printk(KERN_DEBUG, device, "alloc AER rpc failed\n");
|
||||
aer_remove(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -310,7 +303,8 @@ static int aer_probe(struct pcie_device *dev)
|
||||
/* Request IRQ ISR */
|
||||
status = request_irq(dev->irq, aer_irq, IRQF_SHARED, "aerdrv", dev);
|
||||
if (status) {
|
||||
dev_printk(KERN_DEBUG, device, "request IRQ failed\n");
|
||||
dev_printk(KERN_DEBUG, device, "request AER IRQ %d failed\n",
|
||||
dev->irq);
|
||||
aer_remove(dev);
|
||||
return status;
|
||||
}
|
||||
@@ -318,8 +312,8 @@ static int aer_probe(struct pcie_device *dev)
|
||||
rpc->isr = 1;
|
||||
|
||||
aer_enable_rootport(rpc);
|
||||
|
||||
return status;
|
||||
dev_info(device, "AER enabled with IRQ %d\n", dev->irq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -351,14 +351,28 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Configure common clock before checking latencies */
|
||||
pcie_aspm_configure_common_clock(link);
|
||||
|
||||
/* Get upstream/downstream components' register state */
|
||||
pcie_get_aspm_reg(parent, &upreg);
|
||||
child = list_entry(linkbus->devices.next, struct pci_dev, bus_list);
|
||||
pcie_get_aspm_reg(child, &dwreg);
|
||||
|
||||
/*
|
||||
* If ASPM not supported, don't mess with the clocks and link,
|
||||
* bail out now.
|
||||
*/
|
||||
if (!(upreg.support & dwreg.support))
|
||||
return;
|
||||
|
||||
/* Configure common clock before checking latencies */
|
||||
pcie_aspm_configure_common_clock(link);
|
||||
|
||||
/*
|
||||
* Re-read upstream/downstream components' register state
|
||||
* after clock configuration
|
||||
*/
|
||||
pcie_get_aspm_reg(parent, &upreg);
|
||||
pcie_get_aspm_reg(child, &dwreg);
|
||||
|
||||
/*
|
||||
* Setup L0s state
|
||||
*
|
||||
@@ -886,8 +900,8 @@ static ssize_t clk_ctl_store(struct device *dev,
|
||||
return n;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(link_state, 0644, link_state_show, link_state_store);
|
||||
static DEVICE_ATTR(clk_ctl, 0644, clk_ctl_show, clk_ctl_store);
|
||||
static DEVICE_ATTR_RW(link_state);
|
||||
static DEVICE_ATTR_RW(clk_ctl);
|
||||
|
||||
static char power_group[] = "power";
|
||||
void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)
|
||||
|
@@ -300,8 +300,6 @@ static irqreturn_t pcie_pme_irq(int irq, void *context)
|
||||
*/
|
||||
static int pcie_pme_set_native(struct pci_dev *dev, void *ign)
|
||||
{
|
||||
dev_info(&dev->dev, "Signaling PME through PCIe PME interrupt\n");
|
||||
|
||||
device_set_run_wake(&dev->dev, true);
|
||||
dev->pme_interrupt = true;
|
||||
return 0;
|
||||
@@ -319,23 +317,8 @@ static int pcie_pme_set_native(struct pci_dev *dev, void *ign)
|
||||
static void pcie_pme_mark_devices(struct pci_dev *port)
|
||||
{
|
||||
pcie_pme_set_native(port, NULL);
|
||||
if (port->subordinate) {
|
||||
if (port->subordinate)
|
||||
pci_walk_bus(port->subordinate, pcie_pme_set_native, NULL);
|
||||
} else {
|
||||
struct pci_bus *bus = port->bus;
|
||||
struct pci_dev *dev;
|
||||
|
||||
/* Check if this is a root port event collector. */
|
||||
if (pci_pcie_type(port) != PCI_EXP_TYPE_RC_EC || !bus)
|
||||
return;
|
||||
|
||||
down_read(&pci_bus_sem);
|
||||
list_for_each_entry(dev, &bus->devices, bus_list)
|
||||
if (pci_is_pcie(dev)
|
||||
&& pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END)
|
||||
pcie_pme_set_native(dev, NULL);
|
||||
up_read(&pci_bus_sem);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -364,12 +347,14 @@ static int pcie_pme_probe(struct pcie_device *srv)
|
||||
ret = request_irq(srv->irq, pcie_pme_irq, IRQF_SHARED, "PCIe PME", srv);
|
||||
if (ret) {
|
||||
kfree(data);
|
||||
} else {
|
||||
pcie_pme_mark_devices(port);
|
||||
pcie_pme_interrupt_enable(port, true);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
dev_info(&port->dev, "Signaling PME with IRQ %d\n", srv->irq);
|
||||
|
||||
pcie_pme_mark_devices(port);
|
||||
pcie_pme_interrupt_enable(port, true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool pcie_pme_check_wakeup(struct pci_bus *bus)
|
||||
|
@@ -499,7 +499,6 @@ static int pcie_port_probe_service(struct device *dev)
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
dev_printk(KERN_DEBUG, dev, "service driver %s loaded\n", driver->name);
|
||||
get_device(dev);
|
||||
return 0;
|
||||
}
|
||||
@@ -524,8 +523,6 @@ static int pcie_port_remove_service(struct device *dev)
|
||||
pciedev = to_pcie_device(dev);
|
||||
driver = to_service_driver(dev->driver);
|
||||
if (driver && driver->remove) {
|
||||
dev_printk(KERN_DEBUG, dev, "unloading service driver %s\n",
|
||||
driver->name);
|
||||
driver->remove(pciedev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
@@ -19,6 +19,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
|
||||
#include "../pci.h"
|
||||
#include "portdrv.h"
|
||||
#include "aer/aerdrv.h"
|
||||
|
||||
@@ -149,15 +150,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
|
||||
|
||||
pci_save_state(dev);
|
||||
|
||||
/*
|
||||
* Prevent runtime PM if the port is advertising support for PCIe
|
||||
* hotplug. Otherwise the BIOS hotplug SMI code might not be able
|
||||
* to enumerate devices behind this port properly (the port is
|
||||
* powered down preventing all config space accesses to the
|
||||
* subordinate devices). We can't be sure for native PCIe hotplug
|
||||
* either so prevent that as well.
|
||||
*/
|
||||
if (!dev->is_hotplug_bridge) {
|
||||
if (pci_bridge_d3_possible(dev)) {
|
||||
/*
|
||||
* Keep the port resumed 100ms to make sure things like
|
||||
* config space accesses from userspace (lspci) will not
|
||||
@@ -175,7 +168,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
|
||||
|
||||
static void pcie_portdrv_remove(struct pci_dev *dev)
|
||||
{
|
||||
if (!dev->is_hotplug_bridge) {
|
||||
if (pci_bridge_d3_possible(dev)) {
|
||||
pm_runtime_forbid(&dev->dev);
|
||||
pm_runtime_get_noresume(&dev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&dev->dev);
|
||||
|
Reference in New Issue
Block a user