diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 73 |
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; | |||
450 | int pci_set_platform_pm(struct pci_platform_pm_ops *ops) | 450 | int 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 | ||
476 | static 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 | |||
481 | static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) | 476 | static 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 | ||
1159 | static int __pci_enable_device_flags(struct pci_dev *dev, | 1154 | static 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 | */ |
1202 | int pci_enable_device_io(struct pci_dev *dev) | 1196 | int 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 | */ |
1215 | int pci_enable_device_mem(struct pci_dev *dev) | 1209 | int 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 | */ |
1231 | int pci_enable_device(struct pci_dev *dev) | 1225 | int 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 | */ | ||
2001 | void 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 | |||
2010 | static void pci_add_saved_cap(struct pci_dev *pci_dev, | 1985 | static 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 | */ |
2076 | void pci_enable_ari(struct pci_dev *dev) | 2054 | void 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 | */ | ||
3779 | int 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)) |