diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 183 |
1 files changed, 172 insertions, 11 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index aad62af2b4c6..77b493b3d97b 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <linux/pci-aspm.h> | 19 | #include <linux/pci-aspm.h> |
20 | #include <linux/pm_wakeup.h> | 20 | #include <linux/pm_wakeup.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ | ||
23 | #include <linux/device.h> | 22 | #include <linux/device.h> |
23 | #include <linux/pm_runtime.h> | ||
24 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
25 | #include "pci.h" | 25 | #include "pci.h" |
26 | 26 | ||
@@ -29,6 +29,12 @@ const char *pci_power_names[] = { | |||
29 | }; | 29 | }; |
30 | EXPORT_SYMBOL_GPL(pci_power_names); | 30 | EXPORT_SYMBOL_GPL(pci_power_names); |
31 | 31 | ||
32 | int isa_dma_bridge_buggy; | ||
33 | EXPORT_SYMBOL(isa_dma_bridge_buggy); | ||
34 | |||
35 | int pci_pci_problems; | ||
36 | EXPORT_SYMBOL(pci_pci_problems); | ||
37 | |||
32 | unsigned int pci_pm_d3_delay; | 38 | unsigned int pci_pm_d3_delay; |
33 | 39 | ||
34 | static void pci_dev_d3_sleep(struct pci_dev *dev) | 40 | static void pci_dev_d3_sleep(struct pci_dev *dev) |
@@ -423,10 +429,9 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) | |||
423 | { | 429 | { |
424 | const struct pci_bus *bus = dev->bus; | 430 | const struct pci_bus *bus = dev->bus; |
425 | int i; | 431 | int i; |
426 | struct resource *best = NULL; | 432 | struct resource *best = NULL, *r; |
427 | 433 | ||
428 | for(i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | 434 | pci_bus_for_each_resource(bus, r, i) { |
429 | struct resource *r = bus->resource[i]; | ||
430 | if (!r) | 435 | if (!r) |
431 | continue; | 436 | continue; |
432 | if (res->start && !(res->start >= r->start && res->end <= r->end)) | 437 | if (res->start && !(res->start >= r->start && res->end <= r->end)) |
@@ -500,6 +505,12 @@ static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) | |||
500 | pci_platform_pm->sleep_wake(dev, enable) : -ENODEV; | 505 | pci_platform_pm->sleep_wake(dev, enable) : -ENODEV; |
501 | } | 506 | } |
502 | 507 | ||
508 | static inline int platform_pci_run_wake(struct pci_dev *dev, bool enable) | ||
509 | { | ||
510 | return pci_platform_pm ? | ||
511 | pci_platform_pm->run_wake(dev, enable) : -ENODEV; | ||
512 | } | ||
513 | |||
503 | /** | 514 | /** |
504 | * pci_raw_set_power_state - Use PCI PM registers to set the power state of | 515 | * pci_raw_set_power_state - Use PCI PM registers to set the power state of |
505 | * given PCI device | 516 | * given PCI device |
@@ -1233,6 +1244,66 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state) | |||
1233 | } | 1244 | } |
1234 | 1245 | ||
1235 | /** | 1246 | /** |
1247 | * pci_check_pme_status - Check if given device has generated PME. | ||
1248 | * @dev: Device to check. | ||
1249 | * | ||
1250 | * Check the PME status of the device and if set, clear it and clear PME enable | ||
1251 | * (if set). Return 'true' if PME status and PME enable were both set or | ||
1252 | * 'false' otherwise. | ||
1253 | */ | ||
1254 | bool pci_check_pme_status(struct pci_dev *dev) | ||
1255 | { | ||
1256 | int pmcsr_pos; | ||
1257 | u16 pmcsr; | ||
1258 | bool ret = false; | ||
1259 | |||
1260 | if (!dev->pm_cap) | ||
1261 | return false; | ||
1262 | |||
1263 | pmcsr_pos = dev->pm_cap + PCI_PM_CTRL; | ||
1264 | pci_read_config_word(dev, pmcsr_pos, &pmcsr); | ||
1265 | if (!(pmcsr & PCI_PM_CTRL_PME_STATUS)) | ||
1266 | return false; | ||
1267 | |||
1268 | /* Clear PME status. */ | ||
1269 | pmcsr |= PCI_PM_CTRL_PME_STATUS; | ||
1270 | if (pmcsr & PCI_PM_CTRL_PME_ENABLE) { | ||
1271 | /* Disable PME to avoid interrupt flood. */ | ||
1272 | pmcsr &= ~PCI_PM_CTRL_PME_ENABLE; | ||
1273 | ret = true; | ||
1274 | } | ||
1275 | |||
1276 | pci_write_config_word(dev, pmcsr_pos, pmcsr); | ||
1277 | |||
1278 | return ret; | ||
1279 | } | ||
1280 | |||
1281 | /** | ||
1282 | * pci_pme_wakeup - Wake up a PCI device if its PME Status bit is set. | ||
1283 | * @dev: Device to handle. | ||
1284 | * @ign: Ignored. | ||
1285 | * | ||
1286 | * Check if @dev has generated PME and queue a resume request for it in that | ||
1287 | * case. | ||
1288 | */ | ||
1289 | static int pci_pme_wakeup(struct pci_dev *dev, void *ign) | ||
1290 | { | ||
1291 | if (pci_check_pme_status(dev)) | ||
1292 | pm_request_resume(&dev->dev); | ||
1293 | return 0; | ||
1294 | } | ||
1295 | |||
1296 | /** | ||
1297 | * pci_pme_wakeup_bus - Walk given bus and wake up devices on it, if necessary. | ||
1298 | * @bus: Top bus of the subtree to walk. | ||
1299 | */ | ||
1300 | void pci_pme_wakeup_bus(struct pci_bus *bus) | ||
1301 | { | ||
1302 | if (bus) | ||
1303 | pci_walk_bus(bus, pci_pme_wakeup, NULL); | ||
1304 | } | ||
1305 | |||
1306 | /** | ||
1236 | * pci_pme_capable - check the capability of PCI device to generate PME# | 1307 | * pci_pme_capable - check the capability of PCI device to generate PME# |
1237 | * @dev: PCI device to handle. | 1308 | * @dev: PCI device to handle. |
1238 | * @state: PCI state from which device will issue PME#. | 1309 | * @state: PCI state from which device will issue PME#. |
@@ -1273,9 +1344,10 @@ void pci_pme_active(struct pci_dev *dev, bool enable) | |||
1273 | } | 1344 | } |
1274 | 1345 | ||
1275 | /** | 1346 | /** |
1276 | * pci_enable_wake - enable PCI device as wakeup event source | 1347 | * __pci_enable_wake - enable PCI device as wakeup event source |
1277 | * @dev: PCI device affected | 1348 | * @dev: PCI device affected |
1278 | * @state: PCI state from which device will issue wakeup events | 1349 | * @state: PCI state from which device will issue wakeup events |
1350 | * @runtime: True if the events are to be generated at run time | ||
1279 | * @enable: True to enable event generation; false to disable | 1351 | * @enable: True to enable event generation; false to disable |
1280 | * | 1352 | * |
1281 | * This enables the device as a wakeup event source, or disables it. | 1353 | * This enables the device as a wakeup event source, or disables it. |
@@ -1291,11 +1363,12 @@ void pci_pme_active(struct pci_dev *dev, bool enable) | |||
1291 | * Error code depending on the platform is returned if both the platform and | 1363 | * Error code depending on the platform is returned if both the platform and |
1292 | * the native mechanism fail to enable the generation of wake-up events | 1364 | * the native mechanism fail to enable the generation of wake-up events |
1293 | */ | 1365 | */ |
1294 | int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) | 1366 | int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, |
1367 | bool runtime, bool enable) | ||
1295 | { | 1368 | { |
1296 | int ret = 0; | 1369 | int ret = 0; |
1297 | 1370 | ||
1298 | if (enable && !device_may_wakeup(&dev->dev)) | 1371 | if (enable && !runtime && !device_may_wakeup(&dev->dev)) |
1299 | return -EINVAL; | 1372 | return -EINVAL; |
1300 | 1373 | ||
1301 | /* Don't do the same thing twice in a row for one device. */ | 1374 | /* Don't do the same thing twice in a row for one device. */ |
@@ -1315,19 +1388,24 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) | |||
1315 | pci_pme_active(dev, true); | 1388 | pci_pme_active(dev, true); |
1316 | else | 1389 | else |
1317 | ret = 1; | 1390 | ret = 1; |
1318 | error = platform_pci_sleep_wake(dev, true); | 1391 | error = runtime ? platform_pci_run_wake(dev, true) : |
1392 | platform_pci_sleep_wake(dev, true); | ||
1319 | if (ret) | 1393 | if (ret) |
1320 | ret = error; | 1394 | ret = error; |
1321 | if (!ret) | 1395 | if (!ret) |
1322 | dev->wakeup_prepared = true; | 1396 | dev->wakeup_prepared = true; |
1323 | } else { | 1397 | } else { |
1324 | platform_pci_sleep_wake(dev, false); | 1398 | if (runtime) |
1399 | platform_pci_run_wake(dev, false); | ||
1400 | else | ||
1401 | platform_pci_sleep_wake(dev, false); | ||
1325 | pci_pme_active(dev, false); | 1402 | pci_pme_active(dev, false); |
1326 | dev->wakeup_prepared = false; | 1403 | dev->wakeup_prepared = false; |
1327 | } | 1404 | } |
1328 | 1405 | ||
1329 | return ret; | 1406 | return ret; |
1330 | } | 1407 | } |
1408 | EXPORT_SYMBOL(__pci_enable_wake); | ||
1331 | 1409 | ||
1332 | /** | 1410 | /** |
1333 | * pci_wake_from_d3 - enable/disable device to wake up from D3_hot or D3_cold | 1411 | * pci_wake_from_d3 - enable/disable device to wake up from D3_hot or D3_cold |
@@ -1437,6 +1515,66 @@ int pci_back_from_sleep(struct pci_dev *dev) | |||
1437 | } | 1515 | } |
1438 | 1516 | ||
1439 | /** | 1517 | /** |
1518 | * pci_finish_runtime_suspend - Carry out PCI-specific part of runtime suspend. | ||
1519 | * @dev: PCI device being suspended. | ||
1520 | * | ||
1521 | * Prepare @dev to generate wake-up events at run time and put it into a low | ||
1522 | * power state. | ||
1523 | */ | ||
1524 | int pci_finish_runtime_suspend(struct pci_dev *dev) | ||
1525 | { | ||
1526 | pci_power_t target_state = pci_target_state(dev); | ||
1527 | int error; | ||
1528 | |||
1529 | if (target_state == PCI_POWER_ERROR) | ||
1530 | return -EIO; | ||
1531 | |||
1532 | __pci_enable_wake(dev, target_state, true, pci_dev_run_wake(dev)); | ||
1533 | |||
1534 | error = pci_set_power_state(dev, target_state); | ||
1535 | |||
1536 | if (error) | ||
1537 | __pci_enable_wake(dev, target_state, true, false); | ||
1538 | |||
1539 | return error; | ||
1540 | } | ||
1541 | |||
1542 | /** | ||
1543 | * pci_dev_run_wake - Check if device can generate run-time wake-up events. | ||
1544 | * @dev: Device to check. | ||
1545 | * | ||
1546 | * Return true if the device itself is cabable of generating wake-up events | ||
1547 | * (through the platform or using the native PCIe PME) or if the device supports | ||
1548 | * PME and one of its upstream bridges can generate wake-up events. | ||
1549 | */ | ||
1550 | bool pci_dev_run_wake(struct pci_dev *dev) | ||
1551 | { | ||
1552 | struct pci_bus *bus = dev->bus; | ||
1553 | |||
1554 | if (device_run_wake(&dev->dev)) | ||
1555 | return true; | ||
1556 | |||
1557 | if (!dev->pme_support) | ||
1558 | return false; | ||
1559 | |||
1560 | while (bus->parent) { | ||
1561 | struct pci_dev *bridge = bus->self; | ||
1562 | |||
1563 | if (device_run_wake(&bridge->dev)) | ||
1564 | return true; | ||
1565 | |||
1566 | bus = bus->parent; | ||
1567 | } | ||
1568 | |||
1569 | /* We have reached the root bus. */ | ||
1570 | if (bus->bridge) | ||
1571 | return device_run_wake(bus->bridge); | ||
1572 | |||
1573 | return false; | ||
1574 | } | ||
1575 | EXPORT_SYMBOL_GPL(pci_dev_run_wake); | ||
1576 | |||
1577 | /** | ||
1440 | * pci_pm_init - Initialize PM functions of given PCI device | 1578 | * pci_pm_init - Initialize PM functions of given PCI device |
1441 | * @dev: PCI device to handle. | 1579 | * @dev: PCI device to handle. |
1442 | */ | 1580 | */ |
@@ -1445,6 +1583,7 @@ void pci_pm_init(struct pci_dev *dev) | |||
1445 | int pm; | 1583 | int pm; |
1446 | u16 pmc; | 1584 | u16 pmc; |
1447 | 1585 | ||
1586 | device_enable_async_suspend(&dev->dev); | ||
1448 | dev->wakeup_prepared = false; | 1587 | dev->wakeup_prepared = false; |
1449 | dev->pm_cap = 0; | 1588 | dev->pm_cap = 0; |
1450 | 1589 | ||
@@ -2658,6 +2797,23 @@ int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type) | |||
2658 | return 0; | 2797 | return 0; |
2659 | } | 2798 | } |
2660 | 2799 | ||
2800 | /* Some architectures require additional programming to enable VGA */ | ||
2801 | static arch_set_vga_state_t arch_set_vga_state; | ||
2802 | |||
2803 | void __init pci_register_set_vga_state(arch_set_vga_state_t func) | ||
2804 | { | ||
2805 | arch_set_vga_state = func; /* NULL disables */ | ||
2806 | } | ||
2807 | |||
2808 | static int pci_set_vga_state_arch(struct pci_dev *dev, bool decode, | ||
2809 | unsigned int command_bits, bool change_bridge) | ||
2810 | { | ||
2811 | if (arch_set_vga_state) | ||
2812 | return arch_set_vga_state(dev, decode, command_bits, | ||
2813 | change_bridge); | ||
2814 | return 0; | ||
2815 | } | ||
2816 | |||
2661 | /** | 2817 | /** |
2662 | * pci_set_vga_state - set VGA decode state on device and parents if requested | 2818 | * pci_set_vga_state - set VGA decode state on device and parents if requested |
2663 | * @dev: the PCI device | 2819 | * @dev: the PCI device |
@@ -2671,9 +2827,15 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode, | |||
2671 | struct pci_bus *bus; | 2827 | struct pci_bus *bus; |
2672 | struct pci_dev *bridge; | 2828 | struct pci_dev *bridge; |
2673 | u16 cmd; | 2829 | u16 cmd; |
2830 | int rc; | ||
2674 | 2831 | ||
2675 | WARN_ON(command_bits & ~(PCI_COMMAND_IO|PCI_COMMAND_MEMORY)); | 2832 | WARN_ON(command_bits & ~(PCI_COMMAND_IO|PCI_COMMAND_MEMORY)); |
2676 | 2833 | ||
2834 | /* ARCH specific VGA enables */ | ||
2835 | rc = pci_set_vga_state_arch(dev, decode, command_bits, change_bridge); | ||
2836 | if (rc) | ||
2837 | return rc; | ||
2838 | |||
2677 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | 2839 | pci_read_config_word(dev, PCI_COMMAND, &cmd); |
2678 | if (decode == true) | 2840 | if (decode == true) |
2679 | cmd |= command_bits; | 2841 | cmd |= command_bits; |
@@ -2888,6 +3050,7 @@ EXPORT_SYMBOL(pcim_pin_device); | |||
2888 | EXPORT_SYMBOL(pci_disable_device); | 3050 | EXPORT_SYMBOL(pci_disable_device); |
2889 | EXPORT_SYMBOL(pci_find_capability); | 3051 | EXPORT_SYMBOL(pci_find_capability); |
2890 | EXPORT_SYMBOL(pci_bus_find_capability); | 3052 | EXPORT_SYMBOL(pci_bus_find_capability); |
3053 | EXPORT_SYMBOL(pci_register_set_vga_state); | ||
2891 | EXPORT_SYMBOL(pci_release_regions); | 3054 | EXPORT_SYMBOL(pci_release_regions); |
2892 | EXPORT_SYMBOL(pci_request_regions); | 3055 | EXPORT_SYMBOL(pci_request_regions); |
2893 | EXPORT_SYMBOL(pci_request_regions_exclusive); | 3056 | EXPORT_SYMBOL(pci_request_regions_exclusive); |
@@ -2914,10 +3077,8 @@ EXPORT_SYMBOL(pci_save_state); | |||
2914 | EXPORT_SYMBOL(pci_restore_state); | 3077 | EXPORT_SYMBOL(pci_restore_state); |
2915 | EXPORT_SYMBOL(pci_pme_capable); | 3078 | EXPORT_SYMBOL(pci_pme_capable); |
2916 | EXPORT_SYMBOL(pci_pme_active); | 3079 | EXPORT_SYMBOL(pci_pme_active); |
2917 | EXPORT_SYMBOL(pci_enable_wake); | ||
2918 | EXPORT_SYMBOL(pci_wake_from_d3); | 3080 | EXPORT_SYMBOL(pci_wake_from_d3); |
2919 | EXPORT_SYMBOL(pci_target_state); | 3081 | EXPORT_SYMBOL(pci_target_state); |
2920 | EXPORT_SYMBOL(pci_prepare_to_sleep); | 3082 | EXPORT_SYMBOL(pci_prepare_to_sleep); |
2921 | EXPORT_SYMBOL(pci_back_from_sleep); | 3083 | EXPORT_SYMBOL(pci_back_from_sleep); |
2922 | EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); | 3084 | EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); |
2923 | |||