diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 358 |
1 files changed, 94 insertions, 264 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index ab4bf5a4c2f1..54858838f098 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -254,52 +254,17 @@ int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap) | |||
254 | } | 254 | } |
255 | 255 | ||
256 | /** | 256 | /** |
257 | * pci_pcie_cap2 - query for devices' PCI_CAP_ID_EXP v2 capability structure | 257 | * pci_find_next_ext_capability - Find an extended capability |
258 | * @dev: PCI device to check | ||
259 | * | ||
260 | * Like pci_pcie_cap() but also checks that the PCIe capability version is | ||
261 | * >= 2. Note that v1 capability structures could be sparse in that not | ||
262 | * all register fields were required. v2 requires the entire structure to | ||
263 | * be present size wise, while still allowing for non-implemented registers | ||
264 | * to exist but they must be hardwired to 0. | ||
265 | * | ||
266 | * Due to the differences in the versions of capability structures, one | ||
267 | * must be careful not to try and access non-existant registers that may | ||
268 | * exist in early versions - v1 - of Express devices. | ||
269 | * | ||
270 | * Returns the offset of the PCIe capability structure as long as the | ||
271 | * capability version is >= 2; otherwise 0 is returned. | ||
272 | */ | ||
273 | static int pci_pcie_cap2(struct pci_dev *dev) | ||
274 | { | ||
275 | u16 flags; | ||
276 | int pos; | ||
277 | |||
278 | pos = pci_pcie_cap(dev); | ||
279 | if (pos) { | ||
280 | pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags); | ||
281 | if ((flags & PCI_EXP_FLAGS_VERS) < 2) | ||
282 | pos = 0; | ||
283 | } | ||
284 | |||
285 | return pos; | ||
286 | } | ||
287 | |||
288 | /** | ||
289 | * pci_find_ext_capability - Find an extended capability | ||
290 | * @dev: PCI device to query | 258 | * @dev: PCI device to query |
259 | * @start: address at which to start looking (0 to start at beginning of list) | ||
291 | * @cap: capability code | 260 | * @cap: capability code |
292 | * | 261 | * |
293 | * Returns the address of the requested extended capability structure | 262 | * Returns the address of the next matching extended capability structure |
294 | * within the device's PCI configuration space or 0 if the device does | 263 | * within the device's PCI configuration space or 0 if the device does |
295 | * not support it. Possible values for @cap: | 264 | * not support it. Some capabilities can occur several times, e.g., the |
296 | * | 265 | * vendor-specific capability, and this provides a way to find them all. |
297 | * %PCI_EXT_CAP_ID_ERR Advanced Error Reporting | ||
298 | * %PCI_EXT_CAP_ID_VC Virtual Channel | ||
299 | * %PCI_EXT_CAP_ID_DSN Device Serial Number | ||
300 | * %PCI_EXT_CAP_ID_PWR Power Budgeting | ||
301 | */ | 266 | */ |
302 | int pci_find_ext_capability(struct pci_dev *dev, int cap) | 267 | int pci_find_next_ext_capability(struct pci_dev *dev, int start, int cap) |
303 | { | 268 | { |
304 | u32 header; | 269 | u32 header; |
305 | int ttl; | 270 | int ttl; |
@@ -311,6 +276,9 @@ int pci_find_ext_capability(struct pci_dev *dev, int cap) | |||
311 | if (dev->cfg_size <= PCI_CFG_SPACE_SIZE) | 276 | if (dev->cfg_size <= PCI_CFG_SPACE_SIZE) |
312 | return 0; | 277 | return 0; |
313 | 278 | ||
279 | if (start) | ||
280 | pos = start; | ||
281 | |||
314 | if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL) | 282 | if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL) |
315 | return 0; | 283 | return 0; |
316 | 284 | ||
@@ -322,7 +290,7 @@ int pci_find_ext_capability(struct pci_dev *dev, int cap) | |||
322 | return 0; | 290 | return 0; |
323 | 291 | ||
324 | while (ttl-- > 0) { | 292 | while (ttl-- > 0) { |
325 | if (PCI_EXT_CAP_ID(header) == cap) | 293 | if (PCI_EXT_CAP_ID(header) == cap && pos != start) |
326 | return pos; | 294 | return pos; |
327 | 295 | ||
328 | pos = PCI_EXT_CAP_NEXT(header); | 296 | pos = PCI_EXT_CAP_NEXT(header); |
@@ -335,6 +303,26 @@ int pci_find_ext_capability(struct pci_dev *dev, int cap) | |||
335 | 303 | ||
336 | return 0; | 304 | return 0; |
337 | } | 305 | } |
306 | EXPORT_SYMBOL_GPL(pci_find_next_ext_capability); | ||
307 | |||
308 | /** | ||
309 | * pci_find_ext_capability - Find an extended capability | ||
310 | * @dev: PCI device to query | ||
311 | * @cap: capability code | ||
312 | * | ||
313 | * Returns the address of the requested extended capability structure | ||
314 | * within the device's PCI configuration space or 0 if the device does | ||
315 | * not support it. Possible values for @cap: | ||
316 | * | ||
317 | * %PCI_EXT_CAP_ID_ERR Advanced Error Reporting | ||
318 | * %PCI_EXT_CAP_ID_VC Virtual Channel | ||
319 | * %PCI_EXT_CAP_ID_DSN Device Serial Number | ||
320 | * %PCI_EXT_CAP_ID_PWR Power Budgeting | ||
321 | */ | ||
322 | int pci_find_ext_capability(struct pci_dev *dev, int cap) | ||
323 | { | ||
324 | return pci_find_next_ext_capability(dev, 0, cap); | ||
325 | } | ||
338 | EXPORT_SYMBOL_GPL(pci_find_ext_capability); | 326 | EXPORT_SYMBOL_GPL(pci_find_ext_capability); |
339 | 327 | ||
340 | static int __pci_find_next_ht_cap(struct pci_dev *dev, int pos, int ht_cap) | 328 | static int __pci_find_next_ht_cap(struct pci_dev *dev, int pos, int ht_cap) |
@@ -854,21 +842,6 @@ EXPORT_SYMBOL(pci_choose_state); | |||
854 | 842 | ||
855 | #define PCI_EXP_SAVE_REGS 7 | 843 | #define PCI_EXP_SAVE_REGS 7 |
856 | 844 | ||
857 | #define pcie_cap_has_devctl(type, flags) 1 | ||
858 | #define pcie_cap_has_lnkctl(type, flags) \ | ||
859 | ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ | ||
860 | (type == PCI_EXP_TYPE_ROOT_PORT || \ | ||
861 | type == PCI_EXP_TYPE_ENDPOINT || \ | ||
862 | type == PCI_EXP_TYPE_LEG_END)) | ||
863 | #define pcie_cap_has_sltctl(type, flags) \ | ||
864 | ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ | ||
865 | ((type == PCI_EXP_TYPE_ROOT_PORT) || \ | ||
866 | (type == PCI_EXP_TYPE_DOWNSTREAM && \ | ||
867 | (flags & PCI_EXP_FLAGS_SLOT)))) | ||
868 | #define pcie_cap_has_rtctl(type, flags) \ | ||
869 | ((flags & PCI_EXP_FLAGS_VERS) > 1 || \ | ||
870 | (type == PCI_EXP_TYPE_ROOT_PORT || \ | ||
871 | type == PCI_EXP_TYPE_RC_EC)) | ||
872 | 845 | ||
873 | static struct pci_cap_saved_state *pci_find_saved_cap( | 846 | static struct pci_cap_saved_state *pci_find_saved_cap( |
874 | struct pci_dev *pci_dev, char cap) | 847 | struct pci_dev *pci_dev, char cap) |
@@ -885,13 +858,11 @@ static struct pci_cap_saved_state *pci_find_saved_cap( | |||
885 | 858 | ||
886 | static int pci_save_pcie_state(struct pci_dev *dev) | 859 | static int pci_save_pcie_state(struct pci_dev *dev) |
887 | { | 860 | { |
888 | int pos, i = 0; | 861 | int i = 0; |
889 | struct pci_cap_saved_state *save_state; | 862 | struct pci_cap_saved_state *save_state; |
890 | u16 *cap; | 863 | u16 *cap; |
891 | u16 flags; | ||
892 | 864 | ||
893 | pos = pci_pcie_cap(dev); | 865 | if (!pci_is_pcie(dev)) |
894 | if (!pos) | ||
895 | return 0; | 866 | return 0; |
896 | 867 | ||
897 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); | 868 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
@@ -899,60 +870,37 @@ static int pci_save_pcie_state(struct pci_dev *dev) | |||
899 | dev_err(&dev->dev, "buffer not found in %s\n", __func__); | 870 | dev_err(&dev->dev, "buffer not found in %s\n", __func__); |
900 | return -ENOMEM; | 871 | return -ENOMEM; |
901 | } | 872 | } |
902 | cap = (u16 *)&save_state->cap.data[0]; | ||
903 | |||
904 | pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags); | ||
905 | 873 | ||
906 | if (pcie_cap_has_devctl(dev->pcie_type, flags)) | 874 | cap = (u16 *)&save_state->cap.data[0]; |
907 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &cap[i++]); | 875 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &cap[i++]); |
908 | if (pcie_cap_has_lnkctl(dev->pcie_type, flags)) | 876 | pcie_capability_read_word(dev, PCI_EXP_LNKCTL, &cap[i++]); |
909 | pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]); | 877 | pcie_capability_read_word(dev, PCI_EXP_SLTCTL, &cap[i++]); |
910 | if (pcie_cap_has_sltctl(dev->pcie_type, flags)) | 878 | pcie_capability_read_word(dev, PCI_EXP_RTCTL, &cap[i++]); |
911 | pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]); | 879 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL2, &cap[i++]); |
912 | if (pcie_cap_has_rtctl(dev->pcie_type, flags)) | 880 | pcie_capability_read_word(dev, PCI_EXP_LNKCTL2, &cap[i++]); |
913 | pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]); | 881 | pcie_capability_read_word(dev, PCI_EXP_SLTCTL2, &cap[i++]); |
914 | |||
915 | pos = pci_pcie_cap2(dev); | ||
916 | if (!pos) | ||
917 | return 0; | ||
918 | 882 | ||
919 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &cap[i++]); | ||
920 | pci_read_config_word(dev, pos + PCI_EXP_LNKCTL2, &cap[i++]); | ||
921 | pci_read_config_word(dev, pos + PCI_EXP_SLTCTL2, &cap[i++]); | ||
922 | return 0; | 883 | return 0; |
923 | } | 884 | } |
924 | 885 | ||
925 | static void pci_restore_pcie_state(struct pci_dev *dev) | 886 | static void pci_restore_pcie_state(struct pci_dev *dev) |
926 | { | 887 | { |
927 | int i = 0, pos; | 888 | int i = 0; |
928 | struct pci_cap_saved_state *save_state; | 889 | struct pci_cap_saved_state *save_state; |
929 | u16 *cap; | 890 | u16 *cap; |
930 | u16 flags; | ||
931 | 891 | ||
932 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); | 892 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
933 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | 893 | if (!save_state) |
934 | if (!save_state || pos <= 0) | ||
935 | return; | ||
936 | cap = (u16 *)&save_state->cap.data[0]; | ||
937 | |||
938 | pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags); | ||
939 | |||
940 | if (pcie_cap_has_devctl(dev->pcie_type, flags)) | ||
941 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, cap[i++]); | ||
942 | if (pcie_cap_has_lnkctl(dev->pcie_type, flags)) | ||
943 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); | ||
944 | if (pcie_cap_has_sltctl(dev->pcie_type, flags)) | ||
945 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); | ||
946 | if (pcie_cap_has_rtctl(dev->pcie_type, flags)) | ||
947 | pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); | ||
948 | |||
949 | pos = pci_pcie_cap2(dev); | ||
950 | if (!pos) | ||
951 | return; | 894 | return; |
952 | 895 | ||
953 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, cap[i++]); | 896 | cap = (u16 *)&save_state->cap.data[0]; |
954 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL2, cap[i++]); | 897 | pcie_capability_write_word(dev, PCI_EXP_DEVCTL, cap[i++]); |
955 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL2, cap[i++]); | 898 | pcie_capability_write_word(dev, PCI_EXP_LNKCTL, cap[i++]); |
899 | pcie_capability_write_word(dev, PCI_EXP_SLTCTL, cap[i++]); | ||
900 | pcie_capability_write_word(dev, PCI_EXP_RTCTL, cap[i++]); | ||
901 | pcie_capability_write_word(dev, PCI_EXP_DEVCTL2, cap[i++]); | ||
902 | pcie_capability_write_word(dev, PCI_EXP_LNKCTL2, cap[i++]); | ||
903 | pcie_capability_write_word(dev, PCI_EXP_SLTCTL2, cap[i++]); | ||
956 | } | 904 | } |
957 | 905 | ||
958 | 906 | ||
@@ -1543,7 +1491,7 @@ void pci_pme_wakeup_bus(struct pci_bus *bus) | |||
1543 | 1491 | ||
1544 | /** | 1492 | /** |
1545 | * pci_wakeup - Wake up a PCI device | 1493 | * pci_wakeup - Wake up a PCI device |
1546 | * @dev: Device to handle. | 1494 | * @pci_dev: Device to handle. |
1547 | * @ign: ignored parameter | 1495 | * @ign: ignored parameter |
1548 | */ | 1496 | */ |
1549 | static int pci_wakeup(struct pci_dev *pci_dev, void *ign) | 1497 | static int pci_wakeup(struct pci_dev *pci_dev, void *ign) |
@@ -2067,35 +2015,24 @@ void pci_free_cap_save_buffers(struct pci_dev *dev) | |||
2067 | */ | 2015 | */ |
2068 | void pci_enable_ari(struct pci_dev *dev) | 2016 | void pci_enable_ari(struct pci_dev *dev) |
2069 | { | 2017 | { |
2070 | int pos; | ||
2071 | u32 cap; | 2018 | u32 cap; |
2072 | u16 ctrl; | ||
2073 | struct pci_dev *bridge; | 2019 | struct pci_dev *bridge; |
2074 | 2020 | ||
2075 | if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) | 2021 | if (pcie_ari_disabled || !pci_is_pcie(dev) || dev->devfn) |
2076 | return; | 2022 | return; |
2077 | 2023 | ||
2078 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI); | 2024 | if (!pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ARI)) |
2079 | if (!pos) | ||
2080 | return; | 2025 | return; |
2081 | 2026 | ||
2082 | bridge = dev->bus->self; | 2027 | bridge = dev->bus->self; |
2083 | if (!bridge) | 2028 | if (!bridge) |
2084 | return; | 2029 | return; |
2085 | 2030 | ||
2086 | /* ARI is a PCIe cap v2 feature */ | 2031 | pcie_capability_read_dword(bridge, PCI_EXP_DEVCAP2, &cap); |
2087 | pos = pci_pcie_cap2(bridge); | ||
2088 | if (!pos) | ||
2089 | return; | ||
2090 | |||
2091 | pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap); | ||
2092 | if (!(cap & PCI_EXP_DEVCAP2_ARI)) | 2032 | if (!(cap & PCI_EXP_DEVCAP2_ARI)) |
2093 | return; | 2033 | return; |
2094 | 2034 | ||
2095 | pci_read_config_word(bridge, pos + PCI_EXP_DEVCTL2, &ctrl); | 2035 | pcie_capability_set_word(bridge, PCI_EXP_DEVCTL2, PCI_EXP_DEVCTL2_ARI); |
2096 | ctrl |= PCI_EXP_DEVCTL2_ARI; | ||
2097 | pci_write_config_word(bridge, pos + PCI_EXP_DEVCTL2, ctrl); | ||
2098 | |||
2099 | bridge->ari_enabled = 1; | 2036 | bridge->ari_enabled = 1; |
2100 | } | 2037 | } |
2101 | 2038 | ||
@@ -2110,20 +2047,14 @@ void pci_enable_ari(struct pci_dev *dev) | |||
2110 | */ | 2047 | */ |
2111 | void pci_enable_ido(struct pci_dev *dev, unsigned long type) | 2048 | void pci_enable_ido(struct pci_dev *dev, unsigned long type) |
2112 | { | 2049 | { |
2113 | int pos; | 2050 | u16 ctrl = 0; |
2114 | u16 ctrl; | ||
2115 | 2051 | ||
2116 | /* ID-based Ordering is a PCIe cap v2 feature */ | ||
2117 | pos = pci_pcie_cap2(dev); | ||
2118 | if (!pos) | ||
2119 | return; | ||
2120 | |||
2121 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | ||
2122 | if (type & PCI_EXP_IDO_REQUEST) | 2052 | if (type & PCI_EXP_IDO_REQUEST) |
2123 | ctrl |= PCI_EXP_IDO_REQ_EN; | 2053 | ctrl |= PCI_EXP_IDO_REQ_EN; |
2124 | if (type & PCI_EXP_IDO_COMPLETION) | 2054 | if (type & PCI_EXP_IDO_COMPLETION) |
2125 | ctrl |= PCI_EXP_IDO_CMP_EN; | 2055 | ctrl |= PCI_EXP_IDO_CMP_EN; |
2126 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | 2056 | if (ctrl) |
2057 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL2, ctrl); | ||
2127 | } | 2058 | } |
2128 | EXPORT_SYMBOL(pci_enable_ido); | 2059 | EXPORT_SYMBOL(pci_enable_ido); |
2129 | 2060 | ||
@@ -2134,20 +2065,14 @@ EXPORT_SYMBOL(pci_enable_ido); | |||
2134 | */ | 2065 | */ |
2135 | void pci_disable_ido(struct pci_dev *dev, unsigned long type) | 2066 | void pci_disable_ido(struct pci_dev *dev, unsigned long type) |
2136 | { | 2067 | { |
2137 | int pos; | 2068 | u16 ctrl = 0; |
2138 | u16 ctrl; | ||
2139 | 2069 | ||
2140 | /* ID-based Ordering is a PCIe cap v2 feature */ | ||
2141 | pos = pci_pcie_cap2(dev); | ||
2142 | if (!pos) | ||
2143 | return; | ||
2144 | |||
2145 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | ||
2146 | if (type & PCI_EXP_IDO_REQUEST) | 2070 | if (type & PCI_EXP_IDO_REQUEST) |
2147 | ctrl &= ~PCI_EXP_IDO_REQ_EN; | 2071 | ctrl |= PCI_EXP_IDO_REQ_EN; |
2148 | if (type & PCI_EXP_IDO_COMPLETION) | 2072 | if (type & PCI_EXP_IDO_COMPLETION) |
2149 | ctrl &= ~PCI_EXP_IDO_CMP_EN; | 2073 | ctrl |= PCI_EXP_IDO_CMP_EN; |
2150 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | 2074 | if (ctrl) |
2075 | pcie_capability_clear_word(dev, PCI_EXP_DEVCTL2, ctrl); | ||
2151 | } | 2076 | } |
2152 | EXPORT_SYMBOL(pci_disable_ido); | 2077 | EXPORT_SYMBOL(pci_disable_ido); |
2153 | 2078 | ||
@@ -2172,17 +2097,11 @@ EXPORT_SYMBOL(pci_disable_ido); | |||
2172 | */ | 2097 | */ |
2173 | int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type type) | 2098 | int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type type) |
2174 | { | 2099 | { |
2175 | int pos; | ||
2176 | u32 cap; | 2100 | u32 cap; |
2177 | u16 ctrl; | 2101 | u16 ctrl; |
2178 | int ret; | 2102 | int ret; |
2179 | 2103 | ||
2180 | /* OBFF is a PCIe cap v2 feature */ | 2104 | pcie_capability_read_dword(dev, PCI_EXP_DEVCAP2, &cap); |
2181 | pos = pci_pcie_cap2(dev); | ||
2182 | if (!pos) | ||
2183 | return -ENOTSUPP; | ||
2184 | |||
2185 | pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap); | ||
2186 | if (!(cap & PCI_EXP_OBFF_MASK)) | 2105 | if (!(cap & PCI_EXP_OBFF_MASK)) |
2187 | return -ENOTSUPP; /* no OBFF support at all */ | 2106 | return -ENOTSUPP; /* no OBFF support at all */ |
2188 | 2107 | ||
@@ -2193,7 +2112,7 @@ int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type type) | |||
2193 | return ret; | 2112 | return ret; |
2194 | } | 2113 | } |
2195 | 2114 | ||
2196 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | 2115 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL2, &ctrl); |
2197 | if (cap & PCI_EXP_OBFF_WAKE) | 2116 | if (cap & PCI_EXP_OBFF_WAKE) |
2198 | ctrl |= PCI_EXP_OBFF_WAKE_EN; | 2117 | ctrl |= PCI_EXP_OBFF_WAKE_EN; |
2199 | else { | 2118 | else { |
@@ -2211,7 +2130,7 @@ int pci_enable_obff(struct pci_dev *dev, enum pci_obff_signal_type type) | |||
2211 | return -ENOTSUPP; | 2130 | return -ENOTSUPP; |
2212 | } | 2131 | } |
2213 | } | 2132 | } |
2214 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | 2133 | pcie_capability_write_word(dev, PCI_EXP_DEVCTL2, ctrl); |
2215 | 2134 | ||
2216 | return 0; | 2135 | return 0; |
2217 | } | 2136 | } |
@@ -2225,17 +2144,7 @@ EXPORT_SYMBOL(pci_enable_obff); | |||
2225 | */ | 2144 | */ |
2226 | void pci_disable_obff(struct pci_dev *dev) | 2145 | void pci_disable_obff(struct pci_dev *dev) |
2227 | { | 2146 | { |
2228 | int pos; | 2147 | pcie_capability_clear_word(dev, PCI_EXP_DEVCTL2, PCI_EXP_OBFF_WAKE_EN); |
2229 | u16 ctrl; | ||
2230 | |||
2231 | /* OBFF is a PCIe cap v2 feature */ | ||
2232 | pos = pci_pcie_cap2(dev); | ||
2233 | if (!pos) | ||
2234 | return; | ||
2235 | |||
2236 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | ||
2237 | ctrl &= ~PCI_EXP_OBFF_WAKE_EN; | ||
2238 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | ||
2239 | } | 2148 | } |
2240 | EXPORT_SYMBOL(pci_disable_obff); | 2149 | EXPORT_SYMBOL(pci_disable_obff); |
2241 | 2150 | ||
@@ -2248,15 +2157,9 @@ EXPORT_SYMBOL(pci_disable_obff); | |||
2248 | */ | 2157 | */ |
2249 | static bool pci_ltr_supported(struct pci_dev *dev) | 2158 | static bool pci_ltr_supported(struct pci_dev *dev) |
2250 | { | 2159 | { |
2251 | int pos; | ||
2252 | u32 cap; | 2160 | u32 cap; |
2253 | 2161 | ||
2254 | /* LTR is a PCIe cap v2 feature */ | 2162 | pcie_capability_read_dword(dev, PCI_EXP_DEVCAP2, &cap); |
2255 | pos = pci_pcie_cap2(dev); | ||
2256 | if (!pos) | ||
2257 | return false; | ||
2258 | |||
2259 | pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP2, &cap); | ||
2260 | 2163 | ||
2261 | return cap & PCI_EXP_DEVCAP2_LTR; | 2164 | return cap & PCI_EXP_DEVCAP2_LTR; |
2262 | } | 2165 | } |
@@ -2273,22 +2176,15 @@ static bool pci_ltr_supported(struct pci_dev *dev) | |||
2273 | */ | 2176 | */ |
2274 | int pci_enable_ltr(struct pci_dev *dev) | 2177 | int pci_enable_ltr(struct pci_dev *dev) |
2275 | { | 2178 | { |
2276 | int pos; | ||
2277 | u16 ctrl; | ||
2278 | int ret; | 2179 | int ret; |
2279 | 2180 | ||
2280 | if (!pci_ltr_supported(dev)) | ||
2281 | return -ENOTSUPP; | ||
2282 | |||
2283 | /* LTR is a PCIe cap v2 feature */ | ||
2284 | pos = pci_pcie_cap2(dev); | ||
2285 | if (!pos) | ||
2286 | return -ENOTSUPP; | ||
2287 | |||
2288 | /* Only primary function can enable/disable LTR */ | 2181 | /* Only primary function can enable/disable LTR */ |
2289 | if (PCI_FUNC(dev->devfn) != 0) | 2182 | if (PCI_FUNC(dev->devfn) != 0) |
2290 | return -EINVAL; | 2183 | return -EINVAL; |
2291 | 2184 | ||
2185 | if (!pci_ltr_supported(dev)) | ||
2186 | return -ENOTSUPP; | ||
2187 | |||
2292 | /* Enable upstream ports first */ | 2188 | /* Enable upstream ports first */ |
2293 | if (dev->bus->self) { | 2189 | if (dev->bus->self) { |
2294 | ret = pci_enable_ltr(dev->bus->self); | 2190 | ret = pci_enable_ltr(dev->bus->self); |
@@ -2296,11 +2192,7 @@ int pci_enable_ltr(struct pci_dev *dev) | |||
2296 | return ret; | 2192 | return ret; |
2297 | } | 2193 | } |
2298 | 2194 | ||
2299 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | 2195 | return pcie_capability_set_word(dev, PCI_EXP_DEVCTL2, PCI_EXP_LTR_EN); |
2300 | ctrl |= PCI_EXP_LTR_EN; | ||
2301 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | ||
2302 | |||
2303 | return 0; | ||
2304 | } | 2196 | } |
2305 | EXPORT_SYMBOL(pci_enable_ltr); | 2197 | EXPORT_SYMBOL(pci_enable_ltr); |
2306 | 2198 | ||
@@ -2310,24 +2202,14 @@ EXPORT_SYMBOL(pci_enable_ltr); | |||
2310 | */ | 2202 | */ |
2311 | void pci_disable_ltr(struct pci_dev *dev) | 2203 | void pci_disable_ltr(struct pci_dev *dev) |
2312 | { | 2204 | { |
2313 | int pos; | ||
2314 | u16 ctrl; | ||
2315 | |||
2316 | if (!pci_ltr_supported(dev)) | ||
2317 | return; | ||
2318 | |||
2319 | /* LTR is a PCIe cap v2 feature */ | ||
2320 | pos = pci_pcie_cap2(dev); | ||
2321 | if (!pos) | ||
2322 | return; | ||
2323 | |||
2324 | /* Only primary function can enable/disable LTR */ | 2205 | /* Only primary function can enable/disable LTR */ |
2325 | if (PCI_FUNC(dev->devfn) != 0) | 2206 | if (PCI_FUNC(dev->devfn) != 0) |
2326 | return; | 2207 | return; |
2327 | 2208 | ||
2328 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &ctrl); | 2209 | if (!pci_ltr_supported(dev)) |
2329 | ctrl &= ~PCI_EXP_LTR_EN; | 2210 | return; |
2330 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, ctrl); | 2211 | |
2212 | pcie_capability_clear_word(dev, PCI_EXP_DEVCTL2, PCI_EXP_LTR_EN); | ||
2331 | } | 2213 | } |
2332 | EXPORT_SYMBOL(pci_disable_ltr); | 2214 | EXPORT_SYMBOL(pci_disable_ltr); |
2333 | 2215 | ||
@@ -2410,9 +2292,6 @@ void pci_enable_acs(struct pci_dev *dev) | |||
2410 | if (!pci_acs_enable) | 2292 | if (!pci_acs_enable) |
2411 | return; | 2293 | return; |
2412 | 2294 | ||
2413 | if (!pci_is_pcie(dev)) | ||
2414 | return; | ||
2415 | |||
2416 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS); | 2295 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS); |
2417 | if (!pos) | 2296 | if (!pos) |
2418 | return; | 2297 | return; |
@@ -2460,8 +2339,8 @@ bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags) | |||
2460 | acs_flags &= (PCI_ACS_RR | PCI_ACS_CR | | 2339 | acs_flags &= (PCI_ACS_RR | PCI_ACS_CR | |
2461 | PCI_ACS_EC | PCI_ACS_DT); | 2340 | PCI_ACS_EC | PCI_ACS_DT); |
2462 | 2341 | ||
2463 | if (pdev->pcie_type == PCI_EXP_TYPE_DOWNSTREAM || | 2342 | if (pci_pcie_type(pdev) == PCI_EXP_TYPE_DOWNSTREAM || |
2464 | pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT || | 2343 | pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT || |
2465 | pdev->multifunction) { | 2344 | pdev->multifunction) { |
2466 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS); | 2345 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS); |
2467 | if (!pos) | 2346 | if (!pos) |
@@ -3177,15 +3056,10 @@ EXPORT_SYMBOL(pci_set_dma_seg_boundary); | |||
3177 | static int pcie_flr(struct pci_dev *dev, int probe) | 3056 | static int pcie_flr(struct pci_dev *dev, int probe) |
3178 | { | 3057 | { |
3179 | int i; | 3058 | int i; |
3180 | int pos; | ||
3181 | u32 cap; | 3059 | u32 cap; |
3182 | u16 status, control; | 3060 | u16 status; |
3183 | |||
3184 | pos = pci_pcie_cap(dev); | ||
3185 | if (!pos) | ||
3186 | return -ENOTTY; | ||
3187 | 3061 | ||
3188 | pci_read_config_dword(dev, pos + PCI_EXP_DEVCAP, &cap); | 3062 | pcie_capability_read_dword(dev, PCI_EXP_DEVCAP, &cap); |
3189 | if (!(cap & PCI_EXP_DEVCAP_FLR)) | 3063 | if (!(cap & PCI_EXP_DEVCAP_FLR)) |
3190 | return -ENOTTY; | 3064 | return -ENOTTY; |
3191 | 3065 | ||
@@ -3197,7 +3071,7 @@ static int pcie_flr(struct pci_dev *dev, int probe) | |||
3197 | if (i) | 3071 | if (i) |
3198 | msleep((1 << (i - 1)) * 100); | 3072 | msleep((1 << (i - 1)) * 100); |
3199 | 3073 | ||
3200 | pci_read_config_word(dev, pos + PCI_EXP_DEVSTA, &status); | 3074 | pcie_capability_read_word(dev, PCI_EXP_DEVSTA, &status); |
3201 | if (!(status & PCI_EXP_DEVSTA_TRPND)) | 3075 | if (!(status & PCI_EXP_DEVSTA_TRPND)) |
3202 | goto clear; | 3076 | goto clear; |
3203 | } | 3077 | } |
@@ -3206,9 +3080,7 @@ static int pcie_flr(struct pci_dev *dev, int probe) | |||
3206 | "proceeding with reset anyway\n"); | 3080 | "proceeding with reset anyway\n"); |
3207 | 3081 | ||
3208 | clear: | 3082 | clear: |
3209 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &control); | 3083 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR); |
3210 | control |= PCI_EXP_DEVCTL_BCR_FLR; | ||
3211 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, control); | ||
3212 | 3084 | ||
3213 | msleep(100); | 3085 | msleep(100); |
3214 | 3086 | ||
@@ -3576,18 +3448,11 @@ EXPORT_SYMBOL(pcix_set_mmrbc); | |||
3576 | */ | 3448 | */ |
3577 | int pcie_get_readrq(struct pci_dev *dev) | 3449 | int pcie_get_readrq(struct pci_dev *dev) |
3578 | { | 3450 | { |
3579 | int ret, cap; | ||
3580 | u16 ctl; | 3451 | u16 ctl; |
3581 | 3452 | ||
3582 | cap = pci_pcie_cap(dev); | 3453 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &ctl); |
3583 | if (!cap) | ||
3584 | return -EINVAL; | ||
3585 | |||
3586 | ret = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl); | ||
3587 | if (!ret) | ||
3588 | ret = 128 << ((ctl & PCI_EXP_DEVCTL_READRQ) >> 12); | ||
3589 | 3454 | ||
3590 | return ret; | 3455 | return 128 << ((ctl & PCI_EXP_DEVCTL_READRQ) >> 12); |
3591 | } | 3456 | } |
3592 | EXPORT_SYMBOL(pcie_get_readrq); | 3457 | EXPORT_SYMBOL(pcie_get_readrq); |
3593 | 3458 | ||
@@ -3601,19 +3466,11 @@ EXPORT_SYMBOL(pcie_get_readrq); | |||
3601 | */ | 3466 | */ |
3602 | int pcie_set_readrq(struct pci_dev *dev, int rq) | 3467 | int pcie_set_readrq(struct pci_dev *dev, int rq) |
3603 | { | 3468 | { |
3604 | int cap, err = -EINVAL; | 3469 | u16 v; |
3605 | u16 ctl, v; | ||
3606 | 3470 | ||
3607 | if (rq < 128 || rq > 4096 || !is_power_of_2(rq)) | 3471 | if (rq < 128 || rq > 4096 || !is_power_of_2(rq)) |
3608 | goto out; | 3472 | return -EINVAL; |
3609 | |||
3610 | cap = pci_pcie_cap(dev); | ||
3611 | if (!cap) | ||
3612 | goto out; | ||
3613 | 3473 | ||
3614 | err = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl); | ||
3615 | if (err) | ||
3616 | goto out; | ||
3617 | /* | 3474 | /* |
3618 | * If using the "performance" PCIe config, we clamp the | 3475 | * If using the "performance" PCIe config, we clamp the |
3619 | * read rq size to the max packet size to prevent the | 3476 | * read rq size to the max packet size to prevent the |
@@ -3631,14 +3488,8 @@ int pcie_set_readrq(struct pci_dev *dev, int rq) | |||
3631 | 3488 | ||
3632 | v = (ffs(rq) - 8) << 12; | 3489 | v = (ffs(rq) - 8) << 12; |
3633 | 3490 | ||
3634 | if ((ctl & PCI_EXP_DEVCTL_READRQ) != v) { | 3491 | return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, |
3635 | ctl &= ~PCI_EXP_DEVCTL_READRQ; | 3492 | PCI_EXP_DEVCTL_READRQ, v); |
3636 | ctl |= v; | ||
3637 | err = pci_write_config_word(dev, cap + PCI_EXP_DEVCTL, ctl); | ||
3638 | } | ||
3639 | |||
3640 | out: | ||
3641 | return err; | ||
3642 | } | 3493 | } |
3643 | EXPORT_SYMBOL(pcie_set_readrq); | 3494 | EXPORT_SYMBOL(pcie_set_readrq); |
3644 | 3495 | ||
@@ -3651,18 +3502,11 @@ EXPORT_SYMBOL(pcie_set_readrq); | |||
3651 | */ | 3502 | */ |
3652 | int pcie_get_mps(struct pci_dev *dev) | 3503 | int pcie_get_mps(struct pci_dev *dev) |
3653 | { | 3504 | { |
3654 | int ret, cap; | ||
3655 | u16 ctl; | 3505 | u16 ctl; |
3656 | 3506 | ||
3657 | cap = pci_pcie_cap(dev); | 3507 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &ctl); |
3658 | if (!cap) | ||
3659 | return -EINVAL; | ||
3660 | |||
3661 | ret = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl); | ||
3662 | if (!ret) | ||
3663 | ret = 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); | ||
3664 | 3508 | ||
3665 | return ret; | 3509 | return 128 << ((ctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5); |
3666 | } | 3510 | } |
3667 | 3511 | ||
3668 | /** | 3512 | /** |
@@ -3675,32 +3519,18 @@ int pcie_get_mps(struct pci_dev *dev) | |||
3675 | */ | 3519 | */ |
3676 | int pcie_set_mps(struct pci_dev *dev, int mps) | 3520 | int pcie_set_mps(struct pci_dev *dev, int mps) |
3677 | { | 3521 | { |
3678 | int cap, err = -EINVAL; | 3522 | u16 v; |
3679 | u16 ctl, v; | ||
3680 | 3523 | ||
3681 | if (mps < 128 || mps > 4096 || !is_power_of_2(mps)) | 3524 | if (mps < 128 || mps > 4096 || !is_power_of_2(mps)) |
3682 | goto out; | 3525 | return -EINVAL; |
3683 | 3526 | ||
3684 | v = ffs(mps) - 8; | 3527 | v = ffs(mps) - 8; |
3685 | if (v > dev->pcie_mpss) | 3528 | if (v > dev->pcie_mpss) |
3686 | goto out; | 3529 | return -EINVAL; |
3687 | v <<= 5; | 3530 | v <<= 5; |
3688 | 3531 | ||
3689 | cap = pci_pcie_cap(dev); | 3532 | return pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, |
3690 | if (!cap) | 3533 | PCI_EXP_DEVCTL_PAYLOAD, v); |
3691 | goto out; | ||
3692 | |||
3693 | err = pci_read_config_word(dev, cap + PCI_EXP_DEVCTL, &ctl); | ||
3694 | if (err) | ||
3695 | goto out; | ||
3696 | |||
3697 | if ((ctl & PCI_EXP_DEVCTL_PAYLOAD) != v) { | ||
3698 | ctl &= ~PCI_EXP_DEVCTL_PAYLOAD; | ||
3699 | ctl |= v; | ||
3700 | err = pci_write_config_word(dev, cap + PCI_EXP_DEVCTL, ctl); | ||
3701 | } | ||
3702 | out: | ||
3703 | return err; | ||
3704 | } | 3534 | } |
3705 | 3535 | ||
3706 | /** | 3536 | /** |