diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-15 15:46:48 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-15 15:46:48 -0500 |
commit | 0ab7b12c49b6fbf2d4d0381374b82935f949be5f (patch) | |
tree | 7a1b48e644638c6a0a275e65715d8db37d20c88e /drivers/pci/pci-acpi.c | |
parent | a9a16a6d136593c9e6f72e481b2b86ae1d8d1fce (diff) | |
parent | b08d2e61a6f9ebf5210a047868362a5a4ff37144 (diff) |
Merge tag 'pci-v4.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI updates from Bjorn Helgaas:
"PCI changes:
- add support for PCI on ARM64 boxes with ACPI. We already had this
for theoretical spec-compliant hardware; now we're adding quirks
for the actual hardware (Cavium, HiSilicon, Qualcomm, X-Gene)
- add runtime PM support for hotplug ports
- enable runtime suspend for Intel UHCI that uses platform-specific
wakeup signaling
- add yet another host bridge registration interface. We hope this is
extensible enough to subsume the others
- expose device revision in sysfs for DRM
- to avoid device conflicts, make sure any VF BAR updates are done
before enabling the VF
- avoid unnecessary link retrains for ASPM
- allow INTx masking on Mellanox devices that support it
- allow access to non-standard VPD for Chelsio devices
- update Broadcom iProc support for PAXB v2, PAXC v2, inbound DMA,
etc
- update Rockchip support for max-link-speed
- add NVIDIA Tegra210 support
- add Layerscape LS1046a support
- update R-Car compatibility strings
- add Qualcomm MSM8996 support
- remove some uninformative bootup messages"
* tag 'pci-v4.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (115 commits)
PCI: Enable access to non-standard VPD for Chelsio devices (cxgb3)
PCI: Expand "VPD access disabled" quirk message
PCI: pciehp: Remove loading message
PCI: hotplug: Remove hotplug core message
PCI: Remove service driver load/unload messages
PCI/AER: Log AER IRQ when claiming Root Port
PCI/AER: Log errors with PCI device, not PCIe service device
PCI/AER: Remove unused version macros
PCI/PME: Log PME IRQ when claiming Root Port
PCI/PME: Drop unused support for PMEs from Root Complex Event Collectors
PCI: Move config space size macros to pci_regs.h
x86/platform/intel-mid: Constify mid_pci_platform_pm
PCI/ASPM: Don't retrain link if ASPM not possible
PCI: iproc: Skip check for legacy IRQ on PAXC buses
PCI: pciehp: Leave power indicator on when enabling already-enabled slot
PCI: pciehp: Prioritize data-link event over presence detect
PCI: rcar: Add gen3 fallback compatibility string for pcie-rcar
PCI: rcar: Use gen2 fallback compatibility last
PCI: rcar-gen2: Use gen2 fallback compatibility last
PCI: rockchip: Move the deassert of pm/aclk/pclk after phy_init()
..
Diffstat (limited to 'drivers/pci/pci-acpi.c')
-rw-r--r-- | drivers/pci/pci-acpi.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index d966d47c9e80..001860361434 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -29,6 +29,82 @@ const u8 pci_acpi_dsm_uuid[] = { | |||
29 | 0x91, 0x17, 0xea, 0x4d, 0x19, 0xc3, 0x43, 0x4d | 29 | 0x91, 0x17, 0xea, 0x4d, 0x19, 0xc3, 0x43, 0x4d |
30 | }; | 30 | }; |
31 | 31 | ||
32 | #if defined(CONFIG_PCI_QUIRKS) && defined(CONFIG_ARM64) | ||
33 | static int acpi_get_rc_addr(struct acpi_device *adev, struct resource *res) | ||
34 | { | ||
35 | struct device *dev = &adev->dev; | ||
36 | struct resource_entry *entry; | ||
37 | struct list_head list; | ||
38 | unsigned long flags; | ||
39 | int ret; | ||
40 | |||
41 | INIT_LIST_HEAD(&list); | ||
42 | flags = IORESOURCE_MEM; | ||
43 | ret = acpi_dev_get_resources(adev, &list, | ||
44 | acpi_dev_filter_resource_type_cb, | ||
45 | (void *) flags); | ||
46 | if (ret < 0) { | ||
47 | dev_err(dev, "failed to parse _CRS method, error code %d\n", | ||
48 | ret); | ||
49 | return ret; | ||
50 | } | ||
51 | |||
52 | if (ret == 0) { | ||
53 | dev_err(dev, "no IO and memory resources present in _CRS\n"); | ||
54 | return -EINVAL; | ||
55 | } | ||
56 | |||
57 | entry = list_first_entry(&list, struct resource_entry, node); | ||
58 | *res = *entry->res; | ||
59 | acpi_dev_free_resource_list(&list); | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | static acpi_status acpi_match_rc(acpi_handle handle, u32 lvl, void *context, | ||
64 | void **retval) | ||
65 | { | ||
66 | u16 *segment = context; | ||
67 | unsigned long long uid; | ||
68 | acpi_status status; | ||
69 | |||
70 | status = acpi_evaluate_integer(handle, "_UID", NULL, &uid); | ||
71 | if (ACPI_FAILURE(status) || uid != *segment) | ||
72 | return AE_CTRL_DEPTH; | ||
73 | |||
74 | *(acpi_handle *)retval = handle; | ||
75 | return AE_CTRL_TERMINATE; | ||
76 | } | ||
77 | |||
78 | int acpi_get_rc_resources(struct device *dev, const char *hid, u16 segment, | ||
79 | struct resource *res) | ||
80 | { | ||
81 | struct acpi_device *adev; | ||
82 | acpi_status status; | ||
83 | acpi_handle handle; | ||
84 | int ret; | ||
85 | |||
86 | status = acpi_get_devices(hid, acpi_match_rc, &segment, &handle); | ||
87 | if (ACPI_FAILURE(status)) { | ||
88 | dev_err(dev, "can't find _HID %s device to locate resources\n", | ||
89 | hid); | ||
90 | return -ENODEV; | ||
91 | } | ||
92 | |||
93 | ret = acpi_bus_get_device(handle, &adev); | ||
94 | if (ret) | ||
95 | return ret; | ||
96 | |||
97 | ret = acpi_get_rc_addr(adev, res); | ||
98 | if (ret) { | ||
99 | dev_err(dev, "can't get resource from %s\n", | ||
100 | dev_name(&adev->dev)); | ||
101 | return ret; | ||
102 | } | ||
103 | |||
104 | return 0; | ||
105 | } | ||
106 | #endif | ||
107 | |||
32 | phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle) | 108 | phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle) |
33 | { | 109 | { |
34 | acpi_status status = AE_NOT_EXIST; | 110 | acpi_status status = AE_NOT_EXIST; |
@@ -294,6 +370,30 @@ int pci_get_hp_params(struct pci_dev *dev, struct hotplug_params *hpp) | |||
294 | EXPORT_SYMBOL_GPL(pci_get_hp_params); | 370 | EXPORT_SYMBOL_GPL(pci_get_hp_params); |
295 | 371 | ||
296 | /** | 372 | /** |
373 | * pciehp_is_native - Check whether a hotplug port is handled by the OS | ||
374 | * @pdev: Hotplug port to check | ||
375 | * | ||
376 | * Walk up from @pdev to the host bridge, obtain its cached _OSC Control Field | ||
377 | * and return the value of the "PCI Express Native Hot Plug control" bit. | ||
378 | * On failure to obtain the _OSC Control Field return %false. | ||
379 | */ | ||
380 | bool pciehp_is_native(struct pci_dev *pdev) | ||
381 | { | ||
382 | struct acpi_pci_root *root; | ||
383 | acpi_handle handle; | ||
384 | |||
385 | handle = acpi_find_root_bridge_handle(pdev); | ||
386 | if (!handle) | ||
387 | return false; | ||
388 | |||
389 | root = acpi_pci_find_root(handle); | ||
390 | if (!root) | ||
391 | return false; | ||
392 | |||
393 | return root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL; | ||
394 | } | ||
395 | |||
396 | /** | ||
297 | * pci_acpi_wake_bus - Root bus wakeup notification fork function. | 397 | * pci_acpi_wake_bus - Root bus wakeup notification fork function. |
298 | * @work: Work item to handle. | 398 | * @work: Work item to handle. |
299 | */ | 399 | */ |