diff options
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 479 |
1 files changed, 350 insertions, 129 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e4548ab2a93c..44a46c92b721 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1,6 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: pci.c,v 1.91 1999/01/21 13:34:01 davem Exp $ | ||
| 3 | * | ||
| 4 | * PCI Bus Services, see include/linux/pci.h for further explanation. | 2 | * PCI Bus Services, see include/linux/pci.h for further explanation. |
| 5 | * | 3 | * |
| 6 | * Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter, | 4 | * Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter, |
| @@ -19,6 +17,7 @@ | |||
| 19 | #include <linux/string.h> | 17 | #include <linux/string.h> |
| 20 | #include <linux/log2.h> | 18 | #include <linux/log2.h> |
| 21 | #include <linux/pci-aspm.h> | 19 | #include <linux/pci-aspm.h> |
| 20 | #include <linux/pm_wakeup.h> | ||
| 22 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ | 21 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ |
| 23 | #include "pci.h" | 22 | #include "pci.h" |
| 24 | 23 | ||
| @@ -378,74 +377,90 @@ pci_restore_bars(struct pci_dev *dev) | |||
| 378 | pci_update_resource(dev, &dev->resource[i], i); | 377 | pci_update_resource(dev, &dev->resource[i], i); |
| 379 | } | 378 | } |
| 380 | 379 | ||
| 381 | int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t t); | 380 | static struct pci_platform_pm_ops *pci_platform_pm; |
| 382 | 381 | ||
| 383 | /** | 382 | int pci_set_platform_pm(struct pci_platform_pm_ops *ops) |
| 384 | * pci_set_power_state - Set the power state of a PCI device | ||
| 385 | * @dev: PCI device to be suspended | ||
| 386 | * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering | ||
| 387 | * | ||
| 388 | * Transition a device to a new power state, using the Power Management | ||
| 389 | * Capabilities in the device's config space. | ||
| 390 | * | ||
| 391 | * RETURN VALUE: | ||
| 392 | * -EINVAL if trying to enter a lower state than we're already in. | ||
| 393 | * 0 if we're already in the requested state. | ||
| 394 | * -EIO if device does not support PCI PM. | ||
| 395 | * 0 if we can successfully change the power state. | ||
| 396 | */ | ||
| 397 | int | ||
| 398 | pci_set_power_state(struct pci_dev *dev, pci_power_t state) | ||
| 399 | { | 383 | { |
| 400 | int pm, need_restore = 0; | 384 | if (!ops->is_manageable || !ops->set_state || !ops->choose_state |
| 401 | u16 pmcsr, pmc; | 385 | || !ops->sleep_wake || !ops->can_wakeup) |
| 386 | return -EINVAL; | ||
| 387 | pci_platform_pm = ops; | ||
| 388 | return 0; | ||
| 389 | } | ||
| 402 | 390 | ||
| 403 | /* bound the state we're entering */ | 391 | static inline bool platform_pci_power_manageable(struct pci_dev *dev) |
| 404 | if (state > PCI_D3hot) | 392 | { |
| 405 | state = PCI_D3hot; | 393 | return pci_platform_pm ? pci_platform_pm->is_manageable(dev) : false; |
| 394 | } | ||
| 406 | 395 | ||
| 407 | /* | 396 | static inline int platform_pci_set_power_state(struct pci_dev *dev, |
| 408 | * If the device or the parent bridge can't support PCI PM, ignore | 397 | pci_power_t t) |
| 409 | * the request if we're doing anything besides putting it into D0 | 398 | { |
| 410 | * (which would only happen on boot). | 399 | return pci_platform_pm ? pci_platform_pm->set_state(dev, t) : -ENOSYS; |
| 411 | */ | 400 | } |
| 412 | if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev)) | ||
| 413 | return 0; | ||
| 414 | 401 | ||
| 415 | /* find PCI PM capability in list */ | 402 | static inline pci_power_t platform_pci_choose_state(struct pci_dev *dev) |
| 416 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); | 403 | { |
| 404 | return pci_platform_pm ? | ||
| 405 | pci_platform_pm->choose_state(dev) : PCI_POWER_ERROR; | ||
| 406 | } | ||
| 417 | 407 | ||
| 418 | /* abort if the device doesn't support PM capabilities */ | 408 | static inline bool platform_pci_can_wakeup(struct pci_dev *dev) |
| 419 | if (!pm) | 409 | { |
| 410 | return pci_platform_pm ? pci_platform_pm->can_wakeup(dev) : false; | ||
| 411 | } | ||
| 412 | |||
| 413 | static inline int platform_pci_sleep_wake(struct pci_dev *dev, bool enable) | ||
| 414 | { | ||
| 415 | return pci_platform_pm ? | ||
| 416 | pci_platform_pm->sleep_wake(dev, enable) : -ENODEV; | ||
| 417 | } | ||
| 418 | |||
| 419 | /** | ||
| 420 | * pci_raw_set_power_state - Use PCI PM registers to set the power state of | ||
| 421 | * given PCI device | ||
| 422 | * @dev: PCI device to handle. | ||
| 423 | * @state: PCI power state (D0, D1, D2, D3hot) to put the device into. | ||
| 424 | * | ||
| 425 | * RETURN VALUE: | ||
| 426 | * -EINVAL if the requested state is invalid. | ||
| 427 | * -EIO if device does not support PCI PM or its PM capabilities register has a | ||
| 428 | * wrong version, or device doesn't support the requested state. | ||
| 429 | * 0 if device already is in the requested state. | ||
| 430 | * 0 if device's power state has been successfully changed. | ||
| 431 | */ | ||
| 432 | static int | ||
| 433 | pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state) | ||
| 434 | { | ||
| 435 | u16 pmcsr; | ||
| 436 | bool need_restore = false; | ||
| 437 | |||
| 438 | if (!dev->pm_cap) | ||
| 420 | return -EIO; | 439 | return -EIO; |
| 421 | 440 | ||
| 441 | if (state < PCI_D0 || state > PCI_D3hot) | ||
| 442 | return -EINVAL; | ||
| 443 | |||
| 422 | /* Validate current state: | 444 | /* Validate current state: |
| 423 | * Can enter D0 from any state, but if we can only go deeper | 445 | * Can enter D0 from any state, but if we can only go deeper |
| 424 | * to sleep if we're already in a low power state | 446 | * to sleep if we're already in a low power state |
| 425 | */ | 447 | */ |
| 426 | if (state != PCI_D0 && dev->current_state > state) { | 448 | if (dev->current_state == state) { |
| 427 | printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n", | 449 | /* we're already there */ |
| 428 | __func__, pci_name(dev), state, dev->current_state); | 450 | return 0; |
| 451 | } else if (state != PCI_D0 && dev->current_state <= PCI_D3cold | ||
| 452 | && dev->current_state > state) { | ||
| 453 | dev_err(&dev->dev, "invalid power transition " | ||
| 454 | "(from state %d to %d)\n", dev->current_state, state); | ||
| 429 | return -EINVAL; | 455 | return -EINVAL; |
| 430 | } else if (dev->current_state == state) | ||
| 431 | return 0; /* we're already there */ | ||
| 432 | |||
| 433 | |||
| 434 | pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); | ||
| 435 | if ((pmc & PCI_PM_CAP_VER_MASK) > 3) { | ||
| 436 | printk(KERN_DEBUG | ||
| 437 | "PCI: %s has unsupported PM cap regs version (%u)\n", | ||
| 438 | pci_name(dev), pmc & PCI_PM_CAP_VER_MASK); | ||
| 439 | return -EIO; | ||
| 440 | } | 456 | } |
| 441 | 457 | ||
| 442 | /* check if this device supports the desired state */ | 458 | /* check if this device supports the desired state */ |
| 443 | if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1)) | 459 | if ((state == PCI_D1 && !dev->d1_support) |
| 444 | return -EIO; | 460 | || (state == PCI_D2 && !dev->d2_support)) |
| 445 | else if (state == PCI_D2 && !(pmc & PCI_PM_CAP_D2)) | ||
| 446 | return -EIO; | 461 | return -EIO; |
| 447 | 462 | ||
| 448 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); | 463 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); |
| 449 | 464 | ||
| 450 | /* If we're (effectively) in D3, force entire word to 0. | 465 | /* If we're (effectively) in D3, force entire word to 0. |
| 451 | * This doesn't affect PME_Status, disables PME_En, and | 466 | * This doesn't affect PME_Status, disables PME_En, and |
| @@ -461,7 +476,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 461 | case PCI_UNKNOWN: /* Boot-up */ | 476 | case PCI_UNKNOWN: /* Boot-up */ |
| 462 | if ((pmcsr & PCI_PM_CTRL_STATE_MASK) == PCI_D3hot | 477 | if ((pmcsr & PCI_PM_CTRL_STATE_MASK) == PCI_D3hot |
| 463 | && !(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) | 478 | && !(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) |
| 464 | need_restore = 1; | 479 | need_restore = true; |
| 465 | /* Fall-through: force to D0 */ | 480 | /* Fall-through: force to D0 */ |
| 466 | default: | 481 | default: |
| 467 | pmcsr = 0; | 482 | pmcsr = 0; |
| @@ -469,7 +484,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 469 | } | 484 | } |
| 470 | 485 | ||
| 471 | /* enter specified state */ | 486 | /* enter specified state */ |
| 472 | pci_write_config_word(dev, pm + PCI_PM_CTRL, pmcsr); | 487 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); |
| 473 | 488 | ||
| 474 | /* Mandatory power management transition delays */ | 489 | /* Mandatory power management transition delays */ |
| 475 | /* see PCI PM 1.1 5.6.1 table 18 */ | 490 | /* see PCI PM 1.1 5.6.1 table 18 */ |
| @@ -478,13 +493,6 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 478 | else if (state == PCI_D2 || dev->current_state == PCI_D2) | 493 | else if (state == PCI_D2 || dev->current_state == PCI_D2) |
| 479 | udelay(200); | 494 | udelay(200); |
| 480 | 495 | ||
| 481 | /* | ||
| 482 | * Give firmware a chance to be called, such as ACPI _PRx, _PSx | ||
| 483 | * Firmware method after native method ? | ||
| 484 | */ | ||
| 485 | if (platform_pci_set_power_state) | ||
| 486 | platform_pci_set_power_state(dev, state); | ||
| 487 | |||
| 488 | dev->current_state = state; | 496 | dev->current_state = state; |
| 489 | 497 | ||
| 490 | /* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT | 498 | /* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT |
| @@ -508,8 +516,77 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 508 | return 0; | 516 | return 0; |
| 509 | } | 517 | } |
| 510 | 518 | ||
| 511 | pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state); | 519 | /** |
| 512 | 520 | * pci_update_current_state - Read PCI power state of given device from its | |
| 521 | * PCI PM registers and cache it | ||
| 522 | * @dev: PCI device to handle. | ||
| 523 | */ | ||
| 524 | static void pci_update_current_state(struct pci_dev *dev) | ||
| 525 | { | ||
| 526 | if (dev->pm_cap) { | ||
| 527 | u16 pmcsr; | ||
| 528 | |||
| 529 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); | ||
| 530 | dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); | ||
| 531 | } | ||
| 532 | } | ||
| 533 | |||
| 534 | /** | ||
| 535 | * pci_set_power_state - Set the power state of a PCI device | ||
| 536 | * @dev: PCI device to handle. | ||
| 537 | * @state: PCI power state (D0, D1, D2, D3hot) to put the device into. | ||
| 538 | * | ||
| 539 | * Transition a device to a new power state, using the platform formware and/or | ||
| 540 | * the device's PCI PM registers. | ||
| 541 | * | ||
| 542 | * RETURN VALUE: | ||
| 543 | * -EINVAL if the requested state is invalid. | ||
| 544 | * -EIO if device does not support PCI PM or its PM capabilities register has a | ||
| 545 | * wrong version, or device doesn't support the requested state. | ||
| 546 | * 0 if device already is in the requested state. | ||
| 547 | * 0 if device's power state has been successfully changed. | ||
| 548 | */ | ||
| 549 | int pci_set_power_state(struct pci_dev *dev, pci_power_t state) | ||
| 550 | { | ||
| 551 | int error; | ||
| 552 | |||
| 553 | /* bound the state we're entering */ | ||
| 554 | if (state > PCI_D3hot) | ||
| 555 | state = PCI_D3hot; | ||
| 556 | else if (state < PCI_D0) | ||
| 557 | state = PCI_D0; | ||
| 558 | else if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev)) | ||
| 559 | /* | ||
| 560 | * If the device or the parent bridge do not support PCI PM, | ||
| 561 | * ignore the request if we're doing anything other than putting | ||
| 562 | * it into D0 (which would only happen on boot). | ||
| 563 | */ | ||
| 564 | return 0; | ||
| 565 | |||
| 566 | if (state == PCI_D0 && platform_pci_power_manageable(dev)) { | ||
| 567 | /* | ||
| 568 | * Allow the platform to change the state, for example via ACPI | ||
| 569 | * _PR0, _PS0 and some such, but do not trust it. | ||
| 570 | */ | ||
| 571 | int ret = platform_pci_set_power_state(dev, PCI_D0); | ||
| 572 | if (!ret) | ||
| 573 | pci_update_current_state(dev); | ||
| 574 | } | ||
| 575 | |||
| 576 | error = pci_raw_set_power_state(dev, state); | ||
| 577 | |||
| 578 | if (state > PCI_D0 && platform_pci_power_manageable(dev)) { | ||
| 579 | /* Allow the platform to finalize the transition */ | ||
| 580 | int ret = platform_pci_set_power_state(dev, state); | ||
| 581 | if (!ret) { | ||
| 582 | pci_update_current_state(dev); | ||
| 583 | error = 0; | ||
| 584 | } | ||
| 585 | } | ||
| 586 | |||
| 587 | return error; | ||
| 588 | } | ||
| 589 | |||
| 513 | /** | 590 | /** |
| 514 | * pci_choose_state - Choose the power state of a PCI device | 591 | * pci_choose_state - Choose the power state of a PCI device |
| 515 | * @dev: PCI device to be suspended | 592 | * @dev: PCI device to be suspended |
| @@ -527,11 +604,9 @@ pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state) | |||
| 527 | if (!pci_find_capability(dev, PCI_CAP_ID_PM)) | 604 | if (!pci_find_capability(dev, PCI_CAP_ID_PM)) |
| 528 | return PCI_D0; | 605 | return PCI_D0; |
| 529 | 606 | ||
| 530 | if (platform_pci_choose_state) { | 607 | ret = platform_pci_choose_state(dev); |
| 531 | ret = platform_pci_choose_state(dev, state); | 608 | if (ret != PCI_POWER_ERROR) |
| 532 | if (ret != PCI_POWER_ERROR) | 609 | return ret; |
| 533 | return ret; | ||
| 534 | } | ||
| 535 | 610 | ||
| 536 | switch (state.event) { | 611 | switch (state.event) { |
| 537 | case PM_EVENT_ON: | 612 | case PM_EVENT_ON: |
| @@ -543,7 +618,8 @@ pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state) | |||
| 543 | case PM_EVENT_HIBERNATE: | 618 | case PM_EVENT_HIBERNATE: |
| 544 | return PCI_D3hot; | 619 | return PCI_D3hot; |
| 545 | default: | 620 | default: |
| 546 | printk("Unrecognized suspend event %d\n", state.event); | 621 | dev_info(&dev->dev, "unrecognized suspend event %d\n", |
| 622 | state.event); | ||
| 547 | BUG(); | 623 | BUG(); |
| 548 | } | 624 | } |
| 549 | return PCI_D0; | 625 | return PCI_D0; |
| @@ -568,7 +644,7 @@ static int pci_save_pcie_state(struct pci_dev *dev) | |||
| 568 | else | 644 | else |
| 569 | found = 1; | 645 | found = 1; |
| 570 | if (!save_state) { | 646 | if (!save_state) { |
| 571 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 647 | dev_err(&dev->dev, "out of memory in pci_save_pcie_state\n"); |
| 572 | return -ENOMEM; | 648 | return -ENOMEM; |
| 573 | } | 649 | } |
| 574 | cap = (u16 *)&save_state->data[0]; | 650 | cap = (u16 *)&save_state->data[0]; |
| @@ -619,7 +695,7 @@ static int pci_save_pcix_state(struct pci_dev *dev) | |||
| 619 | else | 695 | else |
| 620 | found = 1; | 696 | found = 1; |
| 621 | if (!save_state) { | 697 | if (!save_state) { |
| 622 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 698 | dev_err(&dev->dev, "out of memory in pci_save_pcie_state\n"); |
| 623 | return -ENOMEM; | 699 | return -ENOMEM; |
| 624 | } | 700 | } |
| 625 | cap = (u16 *)&save_state->data[0]; | 701 | cap = (u16 *)&save_state->data[0]; |
| @@ -685,10 +761,9 @@ pci_restore_state(struct pci_dev *dev) | |||
| 685 | for (i = 15; i >= 0; i--) { | 761 | for (i = 15; i >= 0; i--) { |
| 686 | pci_read_config_dword(dev, i * 4, &val); | 762 | pci_read_config_dword(dev, i * 4, &val); |
| 687 | if (val != dev->saved_config_space[i]) { | 763 | if (val != dev->saved_config_space[i]) { |
| 688 | printk(KERN_DEBUG "PM: Writing back config space on " | 764 | dev_printk(KERN_DEBUG, &dev->dev, "restoring config " |
| 689 | "device %s at offset %x (was %x, writing %x)\n", | 765 | "space at offset %#x (was %#x, writing %#x)\n", |
| 690 | pci_name(dev), i, | 766 | i, val, (int)dev->saved_config_space[i]); |
| 691 | val, (int)dev->saved_config_space[i]); | ||
| 692 | pci_write_config_dword(dev,i * 4, | 767 | pci_write_config_dword(dev,i * 4, |
| 693 | dev->saved_config_space[i]); | 768 | dev->saved_config_space[i]); |
| 694 | } | 769 | } |
| @@ -961,6 +1036,46 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state) | |||
| 961 | } | 1036 | } |
| 962 | 1037 | ||
| 963 | /** | 1038 | /** |
| 1039 | * pci_pme_capable - check the capability of PCI device to generate PME# | ||
| 1040 | * @dev: PCI device to handle. | ||
| 1041 | * @state: PCI state from which device will issue PME#. | ||
| 1042 | */ | ||
| 1043 | static bool pci_pme_capable(struct pci_dev *dev, pci_power_t state) | ||
| 1044 | { | ||
| 1045 | if (!dev->pm_cap) | ||
| 1046 | return false; | ||
| 1047 | |||
| 1048 | return !!(dev->pme_support & (1 << state)); | ||
| 1049 | } | ||
| 1050 | |||
| 1051 | /** | ||
| 1052 | * pci_pme_active - enable or disable PCI device's PME# function | ||
| 1053 | * @dev: PCI device to handle. | ||
| 1054 | * @enable: 'true' to enable PME# generation; 'false' to disable it. | ||
| 1055 | * | ||
| 1056 | * The caller must verify that the device is capable of generating PME# before | ||
| 1057 | * calling this function with @enable equal to 'true'. | ||
| 1058 | */ | ||
| 1059 | static void pci_pme_active(struct pci_dev *dev, bool enable) | ||
| 1060 | { | ||
| 1061 | u16 pmcsr; | ||
| 1062 | |||
| 1063 | if (!dev->pm_cap) | ||
| 1064 | return; | ||
| 1065 | |||
| 1066 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); | ||
| 1067 | /* Clear PME_Status by writing 1 to it and enable PME# */ | ||
| 1068 | pmcsr |= PCI_PM_CTRL_PME_STATUS | PCI_PM_CTRL_PME_ENABLE; | ||
| 1069 | if (!enable) | ||
| 1070 | pmcsr &= ~PCI_PM_CTRL_PME_ENABLE; | ||
| 1071 | |||
| 1072 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); | ||
| 1073 | |||
| 1074 | dev_printk(KERN_INFO, &dev->dev, "PME# %s\n", | ||
| 1075 | enable ? "enabled" : "disabled"); | ||
| 1076 | } | ||
| 1077 | |||
| 1078 | /** | ||
| 964 | * pci_enable_wake - enable PCI device as wakeup event source | 1079 | * pci_enable_wake - enable PCI device as wakeup event source |
| 965 | * @dev: PCI device affected | 1080 | * @dev: PCI device affected |
| 966 | * @state: PCI state from which device will issue wakeup events | 1081 | * @state: PCI state from which device will issue wakeup events |
| @@ -971,66 +1086,173 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state) | |||
| 971 | * called automatically by this routine. | 1086 | * called automatically by this routine. |
| 972 | * | 1087 | * |
| 973 | * Devices with legacy power management (no standard PCI PM capabilities) | 1088 | * Devices with legacy power management (no standard PCI PM capabilities) |
| 974 | * always require such platform hooks. Depending on the platform, devices | 1089 | * always require such platform hooks. |
| 975 | * supporting the standard PCI PME# signal may require such platform hooks; | ||
| 976 | * they always update bits in config space to allow PME# generation. | ||
| 977 | * | 1090 | * |
| 978 | * -EIO is returned if the device can't ever be a wakeup event source. | 1091 | * RETURN VALUE: |
| 979 | * -EINVAL is returned if the device can't generate wakeup events from | 1092 | * 0 is returned on success |
| 980 | * the specified PCI state. Returns zero if the operation is successful. | 1093 | * -EINVAL is returned if device is not supposed to wake up the system |
| 1094 | * Error code depending on the platform is returned if both the platform and | ||
| 1095 | * the native mechanism fail to enable the generation of wake-up events | ||
| 981 | */ | 1096 | */ |
| 982 | int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable) | 1097 | int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable) |
| 983 | { | 1098 | { |
| 984 | int pm; | 1099 | int error = 0; |
| 985 | int status; | 1100 | bool pme_done = false; |
| 986 | u16 value; | 1101 | |
| 987 | 1102 | if (!device_may_wakeup(&dev->dev)) | |
| 988 | /* Note that drivers should verify device_may_wakeup(&dev->dev) | 1103 | return -EINVAL; |
| 989 | * before calling this function. Platform code should report | 1104 | |
| 990 | * errors when drivers try to enable wakeup on devices that | 1105 | /* |
| 991 | * can't issue wakeups, or on which wakeups were disabled by | 1106 | * According to "PCI System Architecture" 4th ed. by Tom Shanley & Don |
| 992 | * userspace updating the /sys/devices.../power/wakeup file. | 1107 | * Anderson we should be doing PME# wake enable followed by ACPI wake |
| 1108 | * enable. To disable wake-up we call the platform first, for symmetry. | ||
| 993 | */ | 1109 | */ |
| 994 | 1110 | ||
| 995 | status = call_platform_enable_wakeup(&dev->dev, enable); | 1111 | if (!enable && platform_pci_can_wakeup(dev)) |
| 1112 | error = platform_pci_sleep_wake(dev, false); | ||
| 996 | 1113 | ||
| 997 | /* find PCI PM capability in list */ | 1114 | if (!enable || pci_pme_capable(dev, state)) { |
| 998 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); | 1115 | pci_pme_active(dev, enable); |
| 1116 | pme_done = true; | ||
| 1117 | } | ||
| 999 | 1118 | ||
| 1000 | /* If device doesn't support PM Capabilities, but caller wants to | 1119 | if (enable && platform_pci_can_wakeup(dev)) |
| 1001 | * disable wake events, it's a NOP. Otherwise fail unless the | 1120 | error = platform_pci_sleep_wake(dev, true); |
| 1002 | * platform hooks handled this legacy device already. | ||
| 1003 | */ | ||
| 1004 | if (!pm) | ||
| 1005 | return enable ? status : 0; | ||
| 1006 | 1121 | ||
| 1007 | /* Check device's ability to generate PME# */ | 1122 | return pme_done ? 0 : error; |
| 1008 | pci_read_config_word(dev,pm+PCI_PM_PMC,&value); | 1123 | } |
| 1009 | 1124 | ||
| 1010 | value &= PCI_PM_CAP_PME_MASK; | 1125 | /** |
| 1011 | value >>= ffs(PCI_PM_CAP_PME_MASK) - 1; /* First bit of mask */ | 1126 | * pci_prepare_to_sleep - prepare PCI device for system-wide transition into |
| 1127 | * a sleep state | ||
| 1128 | * @dev: Device to handle. | ||
| 1129 | * | ||
| 1130 | * Choose the power state appropriate for the device depending on whether | ||
| 1131 | * it can wake up the system and/or is power manageable by the platform | ||
| 1132 | * (PCI_D3hot is the default) and put the device into that state. | ||
| 1133 | */ | ||
| 1134 | int pci_prepare_to_sleep(struct pci_dev *dev) | ||
| 1135 | { | ||
| 1136 | pci_power_t target_state = PCI_D3hot; | ||
| 1137 | int error; | ||
| 1012 | 1138 | ||
| 1013 | /* Check if it can generate PME# from requested state. */ | 1139 | if (platform_pci_power_manageable(dev)) { |
| 1014 | if (!value || !(value & (1 << state))) { | 1140 | /* |
| 1015 | /* if it can't, revert what the platform hook changed, | 1141 | * Call the platform to choose the target state of the device |
| 1016 | * always reporting the base "EINVAL, can't PME#" error | 1142 | * and enable wake-up from this state if supported. |
| 1017 | */ | 1143 | */ |
| 1018 | if (enable) | 1144 | pci_power_t state = platform_pci_choose_state(dev); |
| 1019 | call_platform_enable_wakeup(&dev->dev, 0); | 1145 | |
| 1020 | return enable ? -EINVAL : 0; | 1146 | switch (state) { |
| 1147 | case PCI_POWER_ERROR: | ||
| 1148 | case PCI_UNKNOWN: | ||
| 1149 | break; | ||
| 1150 | case PCI_D1: | ||
| 1151 | case PCI_D2: | ||
| 1152 | if (pci_no_d1d2(dev)) | ||
| 1153 | break; | ||
| 1154 | default: | ||
| 1155 | target_state = state; | ||
| 1156 | } | ||
| 1157 | } else if (device_may_wakeup(&dev->dev)) { | ||
| 1158 | /* | ||
| 1159 | * Find the deepest state from which the device can generate | ||
| 1160 | * wake-up events, make it the target state and enable device | ||
| 1161 | * to generate PME#. | ||
| 1162 | */ | ||
| 1163 | if (!dev->pm_cap) | ||
| 1164 | return -EIO; | ||
| 1165 | |||
| 1166 | if (dev->pme_support) { | ||
| 1167 | while (target_state | ||
| 1168 | && !(dev->pme_support & (1 << target_state))) | ||
| 1169 | target_state--; | ||
| 1170 | } | ||
| 1021 | } | 1171 | } |
| 1022 | 1172 | ||
| 1023 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &value); | 1173 | pci_enable_wake(dev, target_state, true); |
| 1024 | 1174 | ||
| 1025 | /* Clear PME_Status by writing 1 to it and enable PME# */ | 1175 | error = pci_set_power_state(dev, target_state); |
| 1026 | value |= PCI_PM_CTRL_PME_STATUS | PCI_PM_CTRL_PME_ENABLE; | ||
| 1027 | 1176 | ||
| 1028 | if (!enable) | 1177 | if (error) |
| 1029 | value &= ~PCI_PM_CTRL_PME_ENABLE; | 1178 | pci_enable_wake(dev, target_state, false); |
| 1030 | 1179 | ||
| 1031 | pci_write_config_word(dev, pm + PCI_PM_CTRL, value); | 1180 | return error; |
| 1181 | } | ||
| 1032 | 1182 | ||
| 1033 | return 0; | 1183 | /** |
| 1184 | * pci_back_from_sleep - turn PCI device on during system-wide transition into | ||
| 1185 | * the working state a sleep state | ||
| 1186 | * @dev: Device to handle. | ||
| 1187 | * | ||
| 1188 | * Disable device's sytem wake-up capability and put it into D0. | ||
| 1189 | */ | ||
| 1190 | int pci_back_from_sleep(struct pci_dev *dev) | ||
| 1191 | { | ||
| 1192 | pci_enable_wake(dev, PCI_D0, false); | ||
| 1193 | return pci_set_power_state(dev, PCI_D0); | ||
| 1194 | } | ||
| 1195 | |||
| 1196 | /** | ||
| 1197 | * pci_pm_init - Initialize PM functions of given PCI device | ||
| 1198 | * @dev: PCI device to handle. | ||
| 1199 | */ | ||
| 1200 | void pci_pm_init(struct pci_dev *dev) | ||
| 1201 | { | ||
| 1202 | int pm; | ||
| 1203 | u16 pmc; | ||
| 1204 | |||
| 1205 | dev->pm_cap = 0; | ||
| 1206 | |||
| 1207 | /* find PCI PM capability in list */ | ||
| 1208 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); | ||
| 1209 | if (!pm) | ||
| 1210 | return; | ||
| 1211 | /* Check device's ability to generate PME# */ | ||
| 1212 | pci_read_config_word(dev, pm + PCI_PM_PMC, &pmc); | ||
| 1213 | |||
| 1214 | if ((pmc & PCI_PM_CAP_VER_MASK) > 3) { | ||
| 1215 | dev_err(&dev->dev, "unsupported PM cap regs version (%u)\n", | ||
| 1216 | pmc & PCI_PM_CAP_VER_MASK); | ||
| 1217 | return; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | dev->pm_cap = pm; | ||
| 1221 | |||
| 1222 | dev->d1_support = false; | ||
| 1223 | dev->d2_support = false; | ||
| 1224 | if (!pci_no_d1d2(dev)) { | ||
| 1225 | if (pmc & PCI_PM_CAP_D1) { | ||
| 1226 | dev_printk(KERN_DEBUG, &dev->dev, "supports D1\n"); | ||
| 1227 | dev->d1_support = true; | ||
| 1228 | } | ||
| 1229 | if (pmc & PCI_PM_CAP_D2) { | ||
| 1230 | dev_printk(KERN_DEBUG, &dev->dev, "supports D2\n"); | ||
| 1231 | dev->d2_support = true; | ||
| 1232 | } | ||
| 1233 | } | ||
| 1234 | |||
| 1235 | pmc &= PCI_PM_CAP_PME_MASK; | ||
| 1236 | if (pmc) { | ||
| 1237 | dev_printk(KERN_INFO, &dev->dev, | ||
| 1238 | "PME# supported from%s%s%s%s%s\n", | ||
| 1239 | (pmc & PCI_PM_CAP_PME_D0) ? " D0" : "", | ||
| 1240 | (pmc & PCI_PM_CAP_PME_D1) ? " D1" : "", | ||
| 1241 | (pmc & PCI_PM_CAP_PME_D2) ? " D2" : "", | ||
| 1242 | (pmc & PCI_PM_CAP_PME_D3) ? " D3hot" : "", | ||
| 1243 | (pmc & PCI_PM_CAP_PME_D3cold) ? " D3cold" : ""); | ||
| 1244 | dev->pme_support = pmc >> PCI_PM_CAP_PME_SHIFT; | ||
| 1245 | /* | ||
| 1246 | * Make device's PM flags reflect the wake-up capability, but | ||
| 1247 | * let the user space enable it to wake up the system as needed. | ||
| 1248 | */ | ||
| 1249 | device_set_wakeup_capable(&dev->dev, true); | ||
| 1250 | device_set_wakeup_enable(&dev->dev, false); | ||
| 1251 | /* Disable the PME# generation functionality */ | ||
| 1252 | pci_pme_active(dev, false); | ||
| 1253 | } else { | ||
| 1254 | dev->pme_support = 0; | ||
| 1255 | } | ||
| 1034 | } | 1256 | } |
| 1035 | 1257 | ||
| 1036 | int | 1258 | int |
| @@ -1116,13 +1338,11 @@ int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name) | |||
| 1116 | return 0; | 1338 | return 0; |
| 1117 | 1339 | ||
| 1118 | err_out: | 1340 | err_out: |
| 1119 | printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%llx@%llx " | 1341 | dev_warn(&pdev->dev, "BAR %d: can't reserve %s region [%#llx-%#llx]\n", |
| 1120 | "for device %s\n", | 1342 | bar, |
| 1121 | pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", | 1343 | pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", |
| 1122 | bar + 1, /* PCI BAR # */ | 1344 | (unsigned long long)pci_resource_start(pdev, bar), |
| 1123 | (unsigned long long)pci_resource_len(pdev, bar), | 1345 | (unsigned long long)pci_resource_end(pdev, bar)); |
| 1124 | (unsigned long long)pci_resource_start(pdev, bar), | ||
| 1125 | pci_name(pdev)); | ||
| 1126 | return -EBUSY; | 1346 | return -EBUSY; |
| 1127 | } | 1347 | } |
| 1128 | 1348 | ||
| @@ -1214,7 +1434,7 @@ pci_set_master(struct pci_dev *dev) | |||
| 1214 | 1434 | ||
| 1215 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | 1435 | pci_read_config_word(dev, PCI_COMMAND, &cmd); |
| 1216 | if (! (cmd & PCI_COMMAND_MASTER)) { | 1436 | if (! (cmd & PCI_COMMAND_MASTER)) { |
| 1217 | pr_debug("PCI: Enabling bus mastering for device %s\n", pci_name(dev)); | 1437 | dev_dbg(&dev->dev, "enabling bus mastering\n"); |
| 1218 | cmd |= PCI_COMMAND_MASTER; | 1438 | cmd |= PCI_COMMAND_MASTER; |
| 1219 | pci_write_config_word(dev, PCI_COMMAND, cmd); | 1439 | pci_write_config_word(dev, PCI_COMMAND, cmd); |
| 1220 | } | 1440 | } |
| @@ -1279,8 +1499,8 @@ pci_set_cacheline_size(struct pci_dev *dev) | |||
| 1279 | if (cacheline_size == pci_cache_line_size) | 1499 | if (cacheline_size == pci_cache_line_size) |
| 1280 | return 0; | 1500 | return 0; |
| 1281 | 1501 | ||
| 1282 | printk(KERN_DEBUG "PCI: cache line size of %d is not supported " | 1502 | dev_printk(KERN_DEBUG, &dev->dev, "cache line size of %d is not " |
| 1283 | "by device %s\n", pci_cache_line_size << 2, pci_name(dev)); | 1503 | "supported\n", pci_cache_line_size << 2); |
| 1284 | 1504 | ||
| 1285 | return -EINVAL; | 1505 | return -EINVAL; |
| 1286 | } | 1506 | } |
| @@ -1305,8 +1525,7 @@ pci_set_mwi(struct pci_dev *dev) | |||
| 1305 | 1525 | ||
| 1306 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | 1526 | pci_read_config_word(dev, PCI_COMMAND, &cmd); |
| 1307 | if (! (cmd & PCI_COMMAND_INVALIDATE)) { | 1527 | if (! (cmd & PCI_COMMAND_INVALIDATE)) { |
| 1308 | pr_debug("PCI: Enabling Mem-Wr-Inval for device %s\n", | 1528 | dev_dbg(&dev->dev, "enabling Mem-Wr-Inval\n"); |
| 1309 | pci_name(dev)); | ||
| 1310 | cmd |= PCI_COMMAND_INVALIDATE; | 1529 | cmd |= PCI_COMMAND_INVALIDATE; |
| 1311 | pci_write_config_word(dev, PCI_COMMAND, cmd); | 1530 | pci_write_config_word(dev, PCI_COMMAND, cmd); |
| 1312 | } | 1531 | } |
| @@ -1702,5 +1921,7 @@ EXPORT_SYMBOL(pci_set_power_state); | |||
| 1702 | EXPORT_SYMBOL(pci_save_state); | 1921 | EXPORT_SYMBOL(pci_save_state); |
| 1703 | EXPORT_SYMBOL(pci_restore_state); | 1922 | EXPORT_SYMBOL(pci_restore_state); |
| 1704 | EXPORT_SYMBOL(pci_enable_wake); | 1923 | EXPORT_SYMBOL(pci_enable_wake); |
| 1924 | EXPORT_SYMBOL(pci_prepare_to_sleep); | ||
| 1925 | EXPORT_SYMBOL(pci_back_from_sleep); | ||
| 1705 | EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); | 1926 | EXPORT_SYMBOL_GPL(pci_set_pcie_reset_state); |
| 1706 | 1927 | ||
