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.c183
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};
30EXPORT_SYMBOL_GPL(pci_power_names); 30EXPORT_SYMBOL_GPL(pci_power_names);
31 31
32int isa_dma_bridge_buggy;
33EXPORT_SYMBOL(isa_dma_bridge_buggy);
34
35int pci_pci_problems;
36EXPORT_SYMBOL(pci_pci_problems);
37
32unsigned int pci_pm_d3_delay; 38unsigned int pci_pm_d3_delay;
33 39
34static void pci_dev_d3_sleep(struct pci_dev *dev) 40static 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
508static 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 */
1254bool 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 */
1289static 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 */
1300void 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 */
1294int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) 1366int __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}
1408EXPORT_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 */
1524int 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 */
1550bool 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}
1575EXPORT_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 */
2801static arch_set_vga_state_t arch_set_vga_state;
2802
2803void __init pci_register_set_vga_state(arch_set_vga_state_t func)
2804{
2805 arch_set_vga_state = func; /* NULL disables */
2806}
2807
2808static 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);
2888EXPORT_SYMBOL(pci_disable_device); 3050EXPORT_SYMBOL(pci_disable_device);
2889EXPORT_SYMBOL(pci_find_capability); 3051EXPORT_SYMBOL(pci_find_capability);
2890EXPORT_SYMBOL(pci_bus_find_capability); 3052EXPORT_SYMBOL(pci_bus_find_capability);
3053EXPORT_SYMBOL(pci_register_set_vga_state);
2891EXPORT_SYMBOL(pci_release_regions); 3054EXPORT_SYMBOL(pci_release_regions);
2892EXPORT_SYMBOL(pci_request_regions); 3055EXPORT_SYMBOL(pci_request_regions);
2893EXPORT_SYMBOL(pci_request_regions_exclusive); 3056EXPORT_SYMBOL(pci_request_regions_exclusive);
@@ -2914,10 +3077,8 @@ EXPORT_SYMBOL(pci_save_state);
2914EXPORT_SYMBOL(pci_restore_state); 3077EXPORT_SYMBOL(pci_restore_state);
2915EXPORT_SYMBOL(pci_pme_capable); 3078EXPORT_SYMBOL(pci_pme_capable);
2916EXPORT_SYMBOL(pci_pme_active); 3079EXPORT_SYMBOL(pci_pme_active);
2917EXPORT_SYMBOL(pci_enable_wake);
2918EXPORT_SYMBOL(pci_wake_from_d3); 3080EXPORT_SYMBOL(pci_wake_from_d3);
2919EXPORT_SYMBOL(pci_target_state); 3081EXPORT_SYMBOL(pci_target_state);
2920EXPORT_SYMBOL(pci_prepare_to_sleep); 3082EXPORT_SYMBOL(pci_prepare_to_sleep);
2921EXPORT_SYMBOL(pci_back_from_sleep); 3083EXPORT_SYMBOL(pci_back_from_sleep);
2922EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); 3084EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state);
2923