diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 0c4f641b7be1..177a50ff6454 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1151,8 +1151,7 @@ int pci_reenable_device(struct pci_dev *dev) | |||
1151 | return 0; | 1151 | return 0; |
1152 | } | 1152 | } |
1153 | 1153 | ||
1154 | static int __pci_enable_device_flags(struct pci_dev *dev, | 1154 | static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) |
1155 | resource_size_t flags) | ||
1156 | { | 1155 | { |
1157 | int err; | 1156 | int err; |
1158 | int i, bars = 0; | 1157 | int i, bars = 0; |
@@ -1196,7 +1195,7 @@ static int __pci_enable_device_flags(struct pci_dev *dev, | |||
1196 | */ | 1195 | */ |
1197 | int pci_enable_device_io(struct pci_dev *dev) | 1196 | int pci_enable_device_io(struct pci_dev *dev) |
1198 | { | 1197 | { |
1199 | return __pci_enable_device_flags(dev, IORESOURCE_IO); | 1198 | return pci_enable_device_flags(dev, IORESOURCE_IO); |
1200 | } | 1199 | } |
1201 | 1200 | ||
1202 | /** | 1201 | /** |
@@ -1209,7 +1208,7 @@ int pci_enable_device_io(struct pci_dev *dev) | |||
1209 | */ | 1208 | */ |
1210 | int pci_enable_device_mem(struct pci_dev *dev) | 1209 | int pci_enable_device_mem(struct pci_dev *dev) |
1211 | { | 1210 | { |
1212 | return __pci_enable_device_flags(dev, IORESOURCE_MEM); | 1211 | return pci_enable_device_flags(dev, IORESOURCE_MEM); |
1213 | } | 1212 | } |
1214 | 1213 | ||
1215 | /** | 1214 | /** |
@@ -1225,7 +1224,7 @@ int pci_enable_device_mem(struct pci_dev *dev) | |||
1225 | */ | 1224 | */ |
1226 | int pci_enable_device(struct pci_dev *dev) | 1225 | int pci_enable_device(struct pci_dev *dev) |
1227 | { | 1226 | { |
1228 | return __pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO); | 1227 | return pci_enable_device_flags(dev, IORESOURCE_MEM | IORESOURCE_IO); |
1229 | } | 1228 | } |
1230 | 1229 | ||
1231 | /* | 1230 | /* |
@@ -2043,10 +2042,13 @@ void pci_free_cap_save_buffers(struct pci_dev *dev) | |||
2043 | } | 2042 | } |
2044 | 2043 | ||
2045 | /** | 2044 | /** |
2046 | * pci_enable_ari - enable ARI forwarding if hardware support it | 2045 | * pci_configure_ari - enable or disable ARI forwarding |
2047 | * @dev: the PCI device | 2046 | * @dev: the PCI device |
2047 | * | ||
2048 | * If @dev and its upstream bridge both support ARI, enable ARI in the | ||
2049 | * bridge. Otherwise, disable ARI in the bridge. | ||
2048 | */ | 2050 | */ |
2049 | void pci_enable_ari(struct pci_dev *dev) | 2051 | void pci_configure_ari(struct pci_dev *dev) |
2050 | { | 2052 | { |
2051 | u32 cap; | 2053 | u32 cap; |
2052 | struct pci_dev *bridge; | 2054 | struct pci_dev *bridge; |
@@ -2054,9 +2056,6 @@ void pci_enable_ari(struct pci_dev *dev) | |||
2054 | if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) | 2056 | if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) |
2055 | return; | 2057 | return; |
2056 | 2058 | ||
2057 | if (!pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI)) | ||
2058 | return; | ||
2059 | |||
2060 | bridge = dev->bus->self; | 2059 | bridge = dev->bus->self; |
2061 | if (!bridge) | 2060 | if (!bridge) |
2062 | return; | 2061 | return; |
@@ -2065,8 +2064,15 @@ void pci_enable_ari(struct pci_dev *dev) | |||
2065 | if (!(cap & PCI_EXP_DEVCAP2_ARI)) | 2064 | if (!(cap & PCI_EXP_DEVCAP2_ARI)) |
2066 | return; | 2065 | return; |
2067 | 2066 | ||
2068 | pcie_capability_set_word(bridge, PCI_EXP_DEVCTL2, PCI_EXP_DEVCTL2_ARI); | 2067 | if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI)) { |
2069 | bridge->ari_enabled = 1; | 2068 | pcie_capability_set_word(bridge, PCI_EXP_DEVCTL2, |
2069 | PCI_EXP_DEVCTL2_ARI); | ||
2070 | bridge->ari_enabled = 1; | ||
2071 | } else { | ||
2072 | pcie_capability_clear_word(bridge, PCI_EXP_DEVCTL2, | ||
2073 | PCI_EXP_DEVCTL2_ARI); | ||
2074 | bridge->ari_enabled = 0; | ||
2075 | } | ||
2070 | } | 2076 | } |
2071 | 2077 | ||
2072 | /** | 2078 | /** |