diff options
| author | Mark Brown <broonie@kernel.org> | 2020-12-11 17:48:50 +0000 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2020-12-11 17:48:50 +0000 | 
| commit | 58f7553fa424fd0fd74e8b796d50c66014cebebe (patch) | |
| tree | 8aecb1d047b1df2abbfa1ef323d2a724a6a61c77 /drivers/pci/pci.c | |
| parent | dd91c555461261fed220ae29a508f508a0afeb43 (diff) | |
| parent | 9326e4f1e5dd1a4410c429638d3c412b6fc17040 (diff) | |
Merge remote-tracking branch 'spi/for-5.10' into spi-linus
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 54 | 
1 files changed, 30 insertions, 24 deletions
| diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e39c5499770f..6d4d5a2f923d 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -15,7 +15,6 @@  #include <linux/init.h>  #include <linux/msi.h>  #include <linux/of.h> -#include <linux/of_pci.h>  #include <linux/pci.h>  #include <linux/pm.h>  #include <linux/slab.h> @@ -30,8 +29,6 @@  #include <linux/pm_runtime.h>  #include <linux/pci_hotplug.h>  #include <linux/vmalloc.h> -#include <linux/pci-ats.h> -#include <asm/setup.h>  #include <asm/dma.h>  #include <linux/aer.h>  #include "pci.h" @@ -49,7 +46,7 @@ EXPORT_SYMBOL(isa_dma_bridge_buggy);  int pci_pci_problems;  EXPORT_SYMBOL(pci_pci_problems); -unsigned int pci_pm_d3_delay; +unsigned int pci_pm_d3hot_delay;  static void pci_pme_list_scan(struct work_struct *work); @@ -66,10 +63,10 @@ struct pci_pme_device {  static void pci_dev_d3_sleep(struct pci_dev *dev)  { -	unsigned int delay = dev->d3_delay; +	unsigned int delay = dev->d3hot_delay; -	if (delay < pci_pm_d3_delay) -		delay = pci_pm_d3_delay; +	if (delay < pci_pm_d3hot_delay) +		delay = pci_pm_d3hot_delay;  	if (delay)  		msleep(delay); @@ -101,7 +98,19 @@ unsigned long pci_hotplug_mmio_pref_size = DEFAULT_HOTPLUG_MMIO_PREF_SIZE;  #define DEFAULT_HOTPLUG_BUS_SIZE	1  unsigned long pci_hotplug_bus_size = DEFAULT_HOTPLUG_BUS_SIZE; + +/* PCIe MPS/MRRS strategy; can be overridden by kernel command-line param */ +#ifdef CONFIG_PCIE_BUS_TUNE_OFF +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_TUNE_OFF; +#elif defined CONFIG_PCIE_BUS_SAFE +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_SAFE; +#elif defined CONFIG_PCIE_BUS_PERFORMANCE +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_PERFORMANCE; +#elif defined CONFIG_PCIE_BUS_PEER2PEER +enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_PEER2PEER; +#else  enum pcie_bus_config_types pcie_bus_config = PCIE_BUS_DEFAULT; +#endif  /*   * The default CLS is used if arch didn't set CLS explicitly and not @@ -876,6 +885,10 @@ static void pci_std_enable_acs(struct pci_dev *dev)  	/* Upstream Forwarding */  	ctrl |= (cap & PCI_ACS_UF); +	/* Enable Translation Blocking for external devices */ +	if (dev->external_facing || dev->untrusted) +		ctrl |= (cap & PCI_ACS_TB); +  	pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl);  } @@ -1065,7 +1078,7 @@ static int pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state)  	if (state == PCI_D3hot || dev->current_state == PCI_D3hot)  		pci_dev_d3_sleep(dev);  	else if (state == PCI_D2 || dev->current_state == PCI_D2) -		msleep(PCI_PM_D2_DELAY); +		udelay(PCI_PM_D2_DELAY);  	pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);  	dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); @@ -3013,7 +3026,7 @@ void pci_pm_init(struct pci_dev *dev)  	}  	dev->pm_cap = pm; -	dev->d3_delay = PCI_PM_D3_WAIT; +	dev->d3hot_delay = PCI_PM_D3HOT_WAIT;  	dev->d3cold_delay = PCI_PM_D3COLD_WAIT;  	dev->bridge_d3 = pci_bridge_d3_possible(dev);  	dev->d3cold_allowed = true; @@ -3038,7 +3051,7 @@ void pci_pm_init(struct pci_dev *dev)  			 (pmc & PCI_PM_CAP_PME_D0) ? " D0" : "",  			 (pmc & PCI_PM_CAP_PME_D1) ? " D1" : "",  			 (pmc & PCI_PM_CAP_PME_D2) ? " D2" : "", -			 (pmc & PCI_PM_CAP_PME_D3) ? " D3hot" : "", +			 (pmc & PCI_PM_CAP_PME_D3hot) ? " D3hot" : "",  			 (pmc & PCI_PM_CAP_PME_D3cold) ? " D3cold" : "");  		dev->pme_support = pmc >> PCI_PM_CAP_PME_SHIFT;  		dev->pme_poll = true; @@ -4621,7 +4634,7 @@ static int pci_af_flr(struct pci_dev *dev, int probe)   *   * NOTE: This causes the caller to sleep for twice the device power transition   * cooldown period, which for the D0->D3hot and D3hot->D0 transitions is 10 ms - * by default (i.e. unless the @dev's d3_delay field has a different value). + * by default (i.e. unless the @dev's d3hot_delay field has a different value).   * Moreover, only devices in D0 can be reset by this function.   */  static int pci_pm_reset(struct pci_dev *dev, int probe) @@ -4701,9 +4714,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,  	}  	if (active && ret)  		msleep(delay); -	else if (ret != active) -		pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n", -			active ? "set" : "cleared"); +  	return ret == active;  } @@ -4828,6 +4839,7 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev)  			delay);  		if (!pcie_wait_for_link_delay(dev, true, delay)) {  			/* Did not train, no need to wait any further */ +			pci_info(dev, "Data Link Layer Link Active not set in 1000 msec\n");  			return;  		}  	} @@ -4920,16 +4932,10 @@ static int pci_reset_hotplug_slot(struct hotplug_slot *hotplug, int probe)  static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe)  { -	struct pci_dev *pdev; - -	if (dev->subordinate || !dev->slot || +	if (dev->multifunction || dev->subordinate || !dev->slot ||  	    dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)  		return -ENOTTY; -	list_for_each_entry(pdev, &dev->bus->devices, bus_list) -		if (pdev != dev && pdev->slot == dev->slot) -			return -ENOTTY; -  	return pci_reset_hotplug_slot(dev->slot->hotplug, probe);  } @@ -6005,7 +6011,7 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode,  	if (flags & PCI_VGA_STATE_CHANGE_DECODES) {  		pci_read_config_word(dev, PCI_COMMAND, &cmd); -		if (decode == true) +		if (decode)  			cmd |= command_bits;  		else  			cmd &= ~command_bits; @@ -6021,7 +6027,7 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode,  		if (bridge) {  			pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,  					     &cmd); -			if (decode == true) +			if (decode)  				cmd |= PCI_BRIDGE_CTL_VGA;  			else  				cmd &= ~PCI_BRIDGE_CTL_VGA; @@ -6350,7 +6356,7 @@ static ssize_t resource_alignment_show(struct bus_type *bus, char *buf)  	spin_lock(&resource_alignment_lock);  	if (resource_alignment_param) -		count = snprintf(buf, PAGE_SIZE, "%s", resource_alignment_param); +		count = scnprintf(buf, PAGE_SIZE, "%s", resource_alignment_param);  	spin_unlock(&resource_alignment_lock);  	/* | 
