aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r--drivers/pci/pci.c73
1 files changed, 22 insertions, 51 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index c746b04afd6a..924e4665bd57 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -450,7 +450,7 @@ static struct pci_platform_pm_ops *pci_platform_pm;
450int pci_set_platform_pm(struct pci_platform_pm_ops *ops) 450int pci_set_platform_pm(struct pci_platform_pm_ops *ops)
451{ 451{
452 if (!ops->is_manageable || !ops->set_state || !ops->choose_state 452 if (!ops->is_manageable || !ops->set_state || !ops->choose_state
453 || !ops->sleep_wake || !ops->can_wakeup) 453 || !ops->sleep_wake)
454 return -EINVAL; 454 return -EINVAL;
455 pci_platform_pm = ops; 455 pci_platform_pm = ops;
456 return 0; 456 return 0;
@@ -473,11 +473,6 @@ static inline pci_power_t platform_pci_choose_state(struct pci_dev *dev)
473 pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR; 473 pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR;
474} 474}
475 475
476static inline bool platform_pci_can_wakeup(struct pci_dev *dev)
477{
478 return pci_platform_pm ? pci_platform_pm->can_wakeup(dev) : false;
479}
480
481static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) 476static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable)
482{ 477{
483 return pci_platform_pm ? 478 return pci_platform_pm ?
@@ -1156,8 +1151,7 @@ int pci_reenable_device(struct pci_dev *dev)
1156 return 0; 1151 return 0;
1157} 1152}
1158 1153
1159static int __pci_enable_device_flags(struct pci_dev *dev, 1154static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
1160 resource_size_t flags)
1161{ 1155{
1162 int err; 1156 int err;
1163 int i, bars = 0; 1157 int i, bars = 0;
@@ -1201,7 +1195,7 @@ static int __pci_enable_device_flags(struct pci_dev *dev,
1201 */ 1195 */
1202int pci_enable_device_io(struct pci_dev *dev) 1196int pci_enable_device_io(struct pci_dev *dev)
1203{ 1197{
1204 return __pci_enable_device_flags(dev, IORESOURCE_IO); 1198 return pci_enable_device_flags(dev, IORESOURCE_IO);
1205} 1199}
1206 1200
1207/** 1201/**
@@ -1214,7 +1208,7 @@ int pci_enable_device_io(struct pci_dev *dev)
1214 */ 1208 */
1215int pci_enable_device_mem(struct pci_dev *dev) 1209int pci_enable_device_mem(struct pci_dev *dev)
1216{ 1210{
1217 return __pci_enable_device_flags(dev, IORESOURCE_MEM); 1211 return pci_enable_device_flags(dev, IORESOURCE_MEM);
1218} 1212}
1219 1213
1220/** 1214/**
@@ -1230,7 +1224,7 @@ int pci_enable_device_mem(struct pci_dev *dev)
1230 */ 1224 */
1231int pci_enable_device(struct pci_dev *dev) 1225int pci_enable_device(struct pci_dev *dev)
1232{ 1226{
1233 return __pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO); 1227 return pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO);
1234} 1228}
1235 1229
1236/* 1230/*
@@ -1988,25 +1982,6 @@ void pci_pm_init(struct pci_dev *dev)
1988 } 1982 }
1989} 1983}
1990 1984
1991/**
1992 * platform_pci_wakeup_init - init platform wakeup if present
1993 * @dev: PCI device
1994 *
1995 * Some devices don't have PCI PM caps but can still generate wakeup
1996 * events through platform methods (like ACPI events). If @dev supports
1997 * platform wakeup events, set the device flag to indicate as much. This
1998 * may be redundant if the device also supports PCI PM caps, but double
1999 * initialization should be safe in that case.
2000 */
2001void platform_pci_wakeup_init(struct pci_dev *dev)
2002{
2003 if (!platform_pci_can_wakeup(dev))
2004 return;
2005
2006 device_set_wakeup_capable(&dev->dev, true);
2007 platform_pci_sleep_wake(dev, false);
2008}
2009
2010static void pci_add_saved_cap(struct pci_dev *pci_dev, 1985static void pci_add_saved_cap(struct pci_dev *pci_dev,
2011 struct pci_cap_saved_state *new_cap) 1986 struct pci_cap_saved_state *new_cap)
2012{ 1987{
@@ -2070,10 +2045,13 @@ void pci_free_cap_save_buffers(struct pci_dev *dev)
2070} 2045}
2071 2046
2072/** 2047/**
2073 * pci_enable_ari - enable ARI forwarding if hardware support it 2048 * pci_configure_ari - enable or disable ARI forwarding
2074 * @dev: the PCI device 2049 * @dev: the PCI device
2050 *
2051 * If @dev and its upstream bridge both support ARI, enable ARI in the
2052 * bridge. Otherwise, disable ARI in the bridge.
2075 */ 2053 */
2076void pci_enable_ari(struct pci_dev *dev) 2054void pci_configure_ari(struct pci_dev *dev)
2077{ 2055{
2078 u32 cap; 2056 u32 cap;
2079 struct pci_dev *bridge; 2057 struct pci_dev *bridge;
@@ -2081,9 +2059,6 @@ void pci_enable_ari(struct pci_dev *dev)
2081 if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) 2059 if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn)
2082 return; 2060 return;
2083 2061
2084 if (!pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI))
2085 return;
2086
2087 bridge = dev->bus->self; 2062 bridge = dev->bus->self;
2088 if (!bridge) 2063 if (!bridge)
2089 return; 2064 return;
@@ -2092,8 +2067,15 @@ void pci_enable_ari(struct pci_dev *dev)
2092 if (!(cap & PCI_EXP_DEVCAP2_ARI)) 2067 if (!(cap & PCI_EXP_DEVCAP2_ARI))
2093 return; 2068 return;
2094 2069
2095 pcie_capability_set_word(bridge, PCI_EXP_DEVCTL2, PCI_EXP_DEVCTL2_ARI); 2070 if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI)) {
2096 bridge->ari_enabled = 1; 2071 pcie_capability_set_word(bridge, PCI_EXP_DEVCTL2,
2072 PCI_EXP_DEVCTL2_ARI);
2073 bridge->ari_enabled = 1;
2074 } else {
2075 pcie_capability_clear_word(bridge, PCI_EXP_DEVCTL2,
2076 PCI_EXP_DEVCTL2_ARI);
2077 bridge->ari_enabled = 0;
2078 }
2097} 2079}
2098 2080
2099/** 2081/**
@@ -3769,18 +3751,6 @@ resource_size_t pci_specified_resource_alignment(struct pci_dev *dev)
3769 return align; 3751 return align;
3770} 3752}
3771 3753
3772/**
3773 * pci_is_reassigndev - check if specified PCI is target device to reassign
3774 * @dev: the PCI device to check
3775 *
3776 * RETURNS: non-zero for PCI device is a target device to reassign,
3777 * or zero is not.
3778 */
3779int pci_is_reassigndev(struct pci_dev *dev)
3780{
3781 return (pci_specified_resource_alignment(dev) != 0);
3782}
3783
3784/* 3754/*
3785 * This function disables memory decoding and releases memory resources 3755 * This function disables memory decoding and releases memory resources
3786 * of the device specified by kernel's boot parameter 'pci=resource_alignment='. 3756 * of the device specified by kernel's boot parameter 'pci=resource_alignment='.
@@ -3795,7 +3765,9 @@ void pci_reassigndev_resource_alignment(struct pci_dev *dev)
3795 resource_size_t align, size; 3765 resource_size_t align, size;
3796 u16 command; 3766 u16 command;
3797 3767
3798 if (!pci_is_reassigndev(dev)) 3768 /* check if specified PCI is target device to reassign */
3769 align = pci_specified_resource_alignment(dev);
3770 if (!align)
3799 return; 3771 return;
3800 3772
3801 if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL && 3773 if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL &&
@@ -3811,7 +3783,6 @@ void pci_reassigndev_resource_alignment(struct pci_dev *dev)
3811 command &= ~PCI_COMMAND_MEMORY; 3783 command &= ~PCI_COMMAND_MEMORY;
3812 pci_write_config_word(dev, PCI_COMMAND, command); 3784 pci_write_config_word(dev, PCI_COMMAND, command);
3813 3785
3814 align = pci_specified_resource_alignment(dev);
3815 for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) { 3786 for (i = 0; i < PCI_BRIDGE_RESOURCES; i++) {
3816 r = &dev->resource[i]; 3787 r = &dev->resource[i];
3817 if (!(r->flags & IORESOURCE_MEM)) 3788 if (!(r->flags & IORESOURCE_MEM))