diff options
| -rw-r--r-- | drivers/pci/ats.c | 1 | ||||
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 30 | ||||
| -rw-r--r-- | drivers/pci/iov.c | 7 | ||||
| -rw-r--r-- | drivers/pci/pci.c | 5 |
4 files changed, 24 insertions, 19 deletions
diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index 7ec56fb0bd78..b0dd08e6a9da 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/export.h> | 13 | #include <linux/export.h> |
| 14 | #include <linux/pci-ats.h> | 14 | #include <linux/pci-ats.h> |
| 15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
| 16 | #include <linux/slab.h> | ||
| 16 | 17 | ||
| 17 | #include "pci.h" | 18 | #include "pci.h" |
| 18 | 19 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index fce1c54a0c8d..9ddf69e3bbef 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -132,6 +132,18 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 132 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) | 132 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) |
| 133 | return AE_OK; | 133 | return AE_OK; |
| 134 | 134 | ||
| 135 | pdev = pbus->self; | ||
| 136 | if (pdev && pci_is_pcie(pdev)) { | ||
| 137 | tmp = acpi_find_root_bridge_handle(pdev); | ||
| 138 | if (tmp) { | ||
| 139 | struct acpi_pci_root *root = acpi_pci_find_root(tmp); | ||
| 140 | |||
| 141 | if (root && (root->osc_control_set & | ||
| 142 | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) | ||
| 143 | return AE_OK; | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 135 | acpi_evaluate_integer(handle, "_ADR", NULL, &adr); | 147 | acpi_evaluate_integer(handle, "_ADR", NULL, &adr); |
| 136 | device = (adr >> 16) & 0xffff; | 148 | device = (adr >> 16) & 0xffff; |
| 137 | function = adr & 0xffff; | 149 | function = adr & 0xffff; |
| @@ -213,7 +225,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 213 | 225 | ||
| 214 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); | 226 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); |
| 215 | if (pdev) { | 227 | if (pdev) { |
| 216 | pdev->current_state = PCI_D0; | ||
| 217 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); | 228 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); |
| 218 | pci_dev_put(pdev); | 229 | pci_dev_put(pdev); |
| 219 | } | 230 | } |
| @@ -459,17 +470,8 @@ static int add_bridge(acpi_handle handle) | |||
| 459 | { | 470 | { |
| 460 | acpi_status status; | 471 | acpi_status status; |
| 461 | unsigned long long tmp; | 472 | unsigned long long tmp; |
| 462 | struct acpi_pci_root *root; | ||
| 463 | acpi_handle dummy_handle; | 473 | acpi_handle dummy_handle; |
| 464 | 474 | ||
| 465 | /* | ||
| 466 | * We shouldn't use this bridge if PCIe native hotplug control has been | ||
| 467 | * granted by the BIOS for it. | ||
| 468 | */ | ||
| 469 | root = acpi_pci_find_root(handle); | ||
| 470 | if (root && (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) | ||
| 471 | return -ENODEV; | ||
| 472 | |||
| 473 | /* if the bridge doesn't have _STA, we assume it is always there */ | 475 | /* if the bridge doesn't have _STA, we assume it is always there */ |
| 474 | status = acpi_get_handle(handle, "_STA", &dummy_handle); | 476 | status = acpi_get_handle(handle, "_STA", &dummy_handle); |
| 475 | if (ACPI_SUCCESS(status)) { | 477 | if (ACPI_SUCCESS(status)) { |
| @@ -1385,19 +1387,11 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, | |||
| 1385 | static acpi_status | 1387 | static acpi_status |
| 1386 | find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) | 1388 | find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) |
| 1387 | { | 1389 | { |
| 1388 | struct acpi_pci_root *root; | ||
| 1389 | int *count = (int *)context; | 1390 | int *count = (int *)context; |
| 1390 | 1391 | ||
| 1391 | if (!acpi_is_root_bridge(handle)) | 1392 | if (!acpi_is_root_bridge(handle)) |
| 1392 | return AE_OK; | 1393 | return AE_OK; |
| 1393 | 1394 | ||
| 1394 | root = acpi_pci_find_root(handle); | ||
| 1395 | if (!root) | ||
| 1396 | return AE_OK; | ||
| 1397 | |||
| 1398 | if (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL) | ||
| 1399 | return AE_OK; | ||
| 1400 | |||
| 1401 | (*count)++; | 1395 | (*count)++; |
| 1402 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 1396 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
| 1403 | handle_hotplug_event_bridge, NULL); | 1397 | handle_hotplug_event_bridge, NULL); |
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index b82c155d7b37..1969a3ee3058 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
| @@ -283,6 +283,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 283 | struct resource *res; | 283 | struct resource *res; |
| 284 | struct pci_dev *pdev; | 284 | struct pci_dev *pdev; |
| 285 | struct pci_sriov *iov = dev->sriov; | 285 | struct pci_sriov *iov = dev->sriov; |
| 286 | int bars = 0; | ||
| 286 | 287 | ||
| 287 | if (!nr_virtfn) | 288 | if (!nr_virtfn) |
| 288 | return 0; | 289 | return 0; |
| @@ -307,6 +308,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 307 | 308 | ||
| 308 | nres = 0; | 309 | nres = 0; |
| 309 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { | 310 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { |
| 311 | bars |= (1 << (i + PCI_IOV_RESOURCES)); | ||
| 310 | res = dev->resource + PCI_IOV_RESOURCES + i; | 312 | res = dev->resource + PCI_IOV_RESOURCES + i; |
| 311 | if (res->parent) | 313 | if (res->parent) |
| 312 | nres++; | 314 | nres++; |
| @@ -324,6 +326,11 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 324 | return -ENOMEM; | 326 | return -ENOMEM; |
| 325 | } | 327 | } |
| 326 | 328 | ||
| 329 | if (pci_enable_resources(dev, bars)) { | ||
| 330 | dev_err(&dev->dev, "SR-IOV: IOV BARS not allocated\n"); | ||
| 331 | return -ENOMEM; | ||
| 332 | } | ||
| 333 | |||
| 327 | if (iov->link != dev->devfn) { | 334 | if (iov->link != dev->devfn) { |
| 328 | pdev = pci_get_slot(dev->bus, iov->link); | 335 | pdev = pci_get_slot(dev->bus, iov->link); |
| 329 | if (!pdev) | 336 | if (!pdev) |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 6f45a73c6e9f..faccb8937706 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -664,6 +664,9 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) | |||
| 664 | error = platform_pci_set_power_state(dev, state); | 664 | error = platform_pci_set_power_state(dev, state); |
| 665 | if (!error) | 665 | if (!error) |
| 666 | pci_update_current_state(dev, state); | 666 | pci_update_current_state(dev, state); |
| 667 | /* Fall back to PCI_D0 if native PM is not supported */ | ||
| 668 | if (!dev->pm_cap) | ||
| 669 | dev->current_state = PCI_D0; | ||
| 667 | } else { | 670 | } else { |
| 668 | error = -ENODEV; | 671 | error = -ENODEV; |
| 669 | /* Fall back to PCI_D0 if native PM is not supported */ | 672 | /* Fall back to PCI_D0 if native PM is not supported */ |
| @@ -1126,7 +1129,7 @@ static int __pci_enable_device_flags(struct pci_dev *dev, | |||
| 1126 | if (atomic_add_return(1, &dev->enable_cnt) > 1) | 1129 | if (atomic_add_return(1, &dev->enable_cnt) > 1) |
| 1127 | return 0; /* already enabled */ | 1130 | return 0; /* already enabled */ |
| 1128 | 1131 | ||
| 1129 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) | 1132 | for (i = 0; i < PCI_ROM_RESOURCE; i++) |
| 1130 | if (dev->resource[i].flags & flags) | 1133 | if (dev->resource[i].flags & flags) |
| 1131 | bars |= (1 << i); | 1134 | bars |= (1 << i); |
| 1132 | 1135 | ||
