30 Dec, 2020

1 commit

  • commit 7482c5cb90e5a7f9e9e12dd154d405e0219656e3 upstream.

    The idea behind acpi_pm_set_bridge_wakeup() was to allow bridges to
    be reference counted for wakeup enabling, because they may be enabled
    to signal wakeup on behalf of their subordinate devices and that
    may happen for multiple times in a row, whereas for the other devices
    it only makes sense to enable wakeup signaling once.

    However, this becomes problematic if the bridge itself is suspended,
    because it is treated as a "regular" device in that case and the
    reference counting doesn't work.

    For instance, suppose that there are two devices below a bridge and
    they both can signal wakeup. Every time one of them is suspended,
    wakeup signaling is enabled for the bridge, so when they both have
    been suspended, the bridge's wakeup reference counter value is 2.

    Say that the bridge is suspended subsequently and acpi_pci_wakeup()
    is called for it. Because the bridge can signal wakeup, that
    function will invoke acpi_pm_set_device_wakeup() to configure it
    and __acpi_pm_set_device_wakeup() will be called with the last
    argument equal to 1. This causes __acpi_device_wakeup_enable()
    invoked by it to omit the reference counting, because the reference
    counter of the target device (the bridge) is 2 at that time.

    Now say that the bridge resumes and one of the device below it
    resumes too, so the bridge's reference counter becomes 0 and
    wakeup signaling is disabled for it, but there is still the other
    suspended device which may need the bridge to signal wakeup on its
    behalf and that is not going to work.

    To address this scenario, use wakeup enable reference counting for
    all devices, not just for bridges, so drop the last argument from
    __acpi_device_wakeup_enable() and __acpi_pm_set_device_wakeup(),
    which causes acpi_pm_set_device_wakeup() and
    acpi_pm_set_bridge_wakeup() to become identical, so drop the latter
    and use the former instead of it everywhere.

    Fixes: 1ba51a7c1496 ("ACPI / PCI / PM: Rework acpi_pci_propagate_wakeup()")
    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Mika Westerberg
    Acked-by: Bjorn Helgaas
    Cc: 4.14+ # 4.14+
    Signed-off-by: Greg Kroah-Hartman

    Rafael J. Wysocki
     

23 Oct, 2020

1 commit

  • Pull PCI updates from Bjorn Helgaas:
    "Enumeration:
    - Print IRQ number used by PCIe Link Bandwidth Notification (Dongdong
    Liu)
    - Add schedule point in pci_read_config() to reduce max latency
    (Jiang Biao)
    - Add Kconfig options for MPS/MRRS strategy (Jim Quinlan)

    Resource management:
    - Fix pci_iounmap() memory leak when !CONFIG_GENERIC_IOMAP (Lorenzo
    Pieralisi)

    PCIe native device hotplug:
    - Reduce noisiness on hot removal (Lukas Wunner)

    Power management:
    - Revert "PCI/PM: Apply D2 delay as milliseconds, not microseconds"
    that was done on the basis of spec typo (Bjorn Helgaas)
    - Rename pci_dev.d3_delay to d3hot_delay to remove D3hot/D3cold
    ambiguity (Krzysztof Wilczyński)
    - Remove unused pcibios_pm_ops (Vaibhav Gupta)

    IOMMU:
    - Enable Translation Blocking for external devices to harden against
    DMA attacks (Rajat Jain)

    Error handling:
    - Add an ACPI APEI notifier chain for vendor CPER records to enable
    device-specific error handling (Shiju Jose)

    ASPM:
    - Remove struct aspm_register_info to simplify code (Saheed O.
    Bolarinwa)

    Amlogic Meson PCIe controller driver:
    - Build as module by default (Kevin Hilman)

    Ampere Altra PCIe controller driver:
    - Add MCFG quirk to work around non-standard ECAM implementation
    (Tuan Phan)

    Broadcom iProc PCIe controller driver:
    - Set affinity mask on MSI interrupts (Mark Tomlinson)

    Broadcom STB PCIe controller driver:
    - Make PCIE_BRCMSTB depend on ARCH_BRCMSTB (Jim Quinlan)
    - Add DT bindings for more Brcmstb chips (Jim Quinlan)
    - Add bcm7278 register info (Jim Quinlan)
    - Add bcm7278 PERST# support (Jim Quinlan)
    - Add suspend and resume pm_ops (Jim Quinlan)
    - Add control of rescal reset (Jim Quinlan)
    - Set additional internal memory DMA viewport sizes (Jim Quinlan)
    - Accommodate MSI for older chips (Jim Quinlan)
    - Set bus max burst size by chip type (Jim Quinlan)
    - Add support for bcm7211, bcm7216, bcm7445, bcm7278 (Jim Quinlan)

    Freescale i.MX6 PCIe controller driver:
    - Use dev_err_probe() to reduce redundant messages (Anson Huang)

    Freescale Layerscape PCIe controller driver:
    - Enforce 4K DMA buffer alignment in endpoint test (Hou Zhiqiang)
    - Add DT compatible strings for ls1088a, ls2088a (Xiaowei Bao)
    - Add endpoint support for ls1088a, ls2088a (Xiaowei Bao)
    - Add endpoint test support for lS1088a (Xiaowei Bao)
    - Add MSI-X support for ls1088a (Xiaowei Bao)

    HiSilicon HIP PCIe controller driver:
    - Handle HIP-specific errors via ACPI APEI (Yicong Yang)

    HiSilicon Kirin PCIe controller driver:
    - Return -EPROBE_DEFER if the GPIO isn't ready (Bean Huo)

    Intel VMD host bridge driver:
    - Factor out physical offset, bus offset, IRQ domain, IRQ allocation
    (Jon Derrick)
    - Use generic PCI PM correctly (Jon Derrick)

    Marvell Aardvark PCIe controller driver:
    - Fix compilation on s390 (Pali Rohár)
    - Implement driver 'remove' function and allow to build it as module
    (Pali Rohár)
    - Move PCIe reset card code to advk_pcie_train_link() (Pali Rohár)
    - Convert mvebu a3700 internal SMCC firmware return codes to errno
    (Pali Rohár)
    - Fix initialization with old Marvell's Arm Trusted Firmware (Pali
    Rohár)

    Microsoft Hyper-V host bridge driver:
    - Fix hibernation in case interrupts are not re-created (Dexuan Cui)

    NVIDIA Tegra PCIe controller driver:
    - Stop checking return value of debugfs_create() functions (Greg
    Kroah-Hartman)
    - Convert to use DEFINE_SEQ_ATTRIBUTE macro (Liu Shixin)

    Qualcomm PCIe controller driver:
    - Reset PCIe to work around Qsdk U-Boot issue (Ansuel Smith)

    Renesas R-Car PCIe controller driver:
    - Add DT documentation for r8a774a1, r8a774b1, r8a774e1 endpoints
    (Lad Prabhakar)
    - Add RZ/G2M, RZ/G2N, RZ/G2H IDs to endpoint test (Lad Prabhakar)
    - Add DT support for r8a7742 (Lad Prabhakar)

    Socionext UniPhier Pro5 controller driver:
    - Add DT descriptions of iATU register (host and endpoint) (Kunihiko
    Hayashi)

    Synopsys DesignWare PCIe controller driver:
    - Add link up check in dw_child_pcie_ops.map_bus() (racy, but seems
    unavoidable) (Hou Zhiqiang)
    - Fix endpoint Header Type check so multi-function devices work (Hou
    Zhiqiang)
    - Skip PCIE_MSI_INTR0* programming if MSI is disabled (Jisheng Zhang)
    - Stop leaking MSI page in suspend/resume (Jisheng Zhang)
    - Add common iATU register support instead of keystone-specific code
    (Kunihiko Hayashi)
    - Major config space access and other cleanups in dwc core and
    drivers that use it (al, exynos, histb, imx6, intel-gw, keystone,
    kirin, meson, qcom, tegra) (Rob Herring)
    - Add multiple PFs support for endpoint (Xiaowei Bao)
    - Add MSI-X doorbell mode in endpoint mode (Xiaowei Bao)

    Miscellaneous:
    - Use fallthrough pseudo-keyword (Gustavo A. R. Silva)
    - Fix "0 used as NULL pointer" warnings (Gustavo Pimentel)
    - Fix "cast truncates bits from constant value" warnings (Gustavo
    Pimentel)
    - Remove redundant zeroing for sg_init_table() (Julia Lawall)
    - Use scnprintf(), not snprintf(), in sysfs "show" functions
    (Krzysztof Wilczyński)
    - Remove unused assignments (Krzysztof Wilczyński)
    - Fix "0 used as NULL pointer" warning (Krzysztof Wilczyński)
    - Simplify bool comparisons (Krzysztof Wilczyński)
    - Use for_each_child_of_node() and for_each_node_by_name() (Qinglang
    Miao)
    - Simplify return expressions (Qinglang Miao)"

    * tag 'pci-v5.10-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (147 commits)
    PCI: vmd: Update VMD PM to correctly use generic PCI PM
    PCI: vmd: Create IRQ allocation helper
    PCI: vmd: Create IRQ Domain configuration helper
    PCI: vmd: Create bus offset configuration helper
    PCI: vmd: Create physical offset helper
    PCI: v3-semi: Remove unneeded break
    PCI: dwc: Add link up check in dw_child_pcie_ops.map_bus()
    PCI/ASPM: Remove struct pcie_link_state.l1ss
    PCI/ASPM: Remove struct aspm_register_info.l1ss_cap
    PCI/ASPM: Pass L1SS Capabilities value, not struct aspm_register_info
    PCI/ASPM: Remove struct aspm_register_info.l1ss_ctl1
    PCI/ASPM: Remove struct aspm_register_info.l1ss_ctl2 (unused)
    PCI/ASPM: Remove struct aspm_register_info.l1ss_cap_ptr
    PCI/ASPM: Remove struct aspm_register_info.latency_encoding
    PCI/ASPM: Remove struct aspm_register_info.enabled
    PCI/ASPM: Remove struct aspm_register_info.support
    PCI/ASPM: Use 'parent' and 'child' for readability
    PCI/ASPM: Move LTR path check to where it's used
    PCI/ASPM: Move pci_clear_and_set_dword() earlier
    PCI: dwc: Fix MSI page leakage in suspend/resume
    ...

    Linus Torvalds
     

06 Oct, 2020

1 commit

  • Recent laptops with dual AMD GPUs fail to suspend the discrete GPU, thus
    causing lockups on system sleep and high power consumption at runtime.
    The discrete GPU would normally be suspended to D3cold by turning off
    ACPI _PR3 Power Resources of the Root Port above the GPU.

    However on affected systems, the Root Port is hotplug-capable and
    pci_bridge_d3_possible() only allows hotplug ports to go to D3 if they
    belong to a Thunderbolt device or if the Root Port possesses a
    "HotPlugSupportInD3" ACPI property. Neither is the case on affected
    laptops. The reason for whitelisting only specific, known to work
    hotplug ports for D3 is that there have been reports of SkyLake Xeon-SP
    systems raising Hardware Error NMIs upon suspending their hotplug ports:
    https://lore.kernel.org/linux-pci/20170503180426.GA4058@otc-nc-03/

    But if a hotplug port is power manageable by ACPI (as can be detected
    through presence of Power Resources and corresponding _PS0 and _PS3
    methods) then it ought to be safe to suspend it to D3. To this end,
    amend acpi_pci_bridge_d3() to whitelist such ports for D3.

    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1222
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1252
    Link: https://gitlab.freedesktop.org/drm/amd/-/issues/1304
    Reported-and-tested-by: Arthur Borsboom
    Reported-and-tested-by: matoro
    Reported-by: Aaron Zakhrov
    Reported-by: Michal Rostecki
    Reported-by: Shai Coleman
    Signed-off-by: Lukas Wunner
    Acked-by: Alex Deucher
    Cc: 5.4+ # 5.4+
    Signed-off-by: Rafael J. Wysocki

    Lukas Wunner
     

30 Sep, 2020

1 commit

  • PCI devices support two variants of the D3 power state: D3hot (main power
    present) D3cold (main power removed). Previously struct pci_dev contained:

    unsigned int d3_delay; /* D3->D0 transition time in ms */
    unsigned int d3cold_delay; /* D3cold->D0 transition time in ms */

    "d3_delay" refers specifically to the D3hot state. Rename it to
    "d3hot_delay" to avoid ambiguity and align with the ACPI "_DSM for
    Specifying Device Readiness Durations" in the PCI Firmware spec r3.2,
    sec 4.6.9.

    There is no change to the functionality.

    Link: https://lore.kernel.org/r/20200730210848.1578826-1-kw@linux.com
    Signed-off-by: Krzysztof Wilczyński
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczyński
     

08 Aug, 2020

1 commit

  • Pull PCI updates from Bjorn Helgaas:
    "Enumeration:
    - Fix pci_cfg_wait queue locking problem (Bjorn Helgaas)
    - Convert PCIe capability PCIBIOS errors to errno (Bolarinwa Olayemi
    Saheed)
    - Align PCIe capability and PCI accessor return values (Bolarinwa
    Olayemi Saheed)
    - Fix pci_create_slot() reference count leak (Qiushi Wu)
    - Announce device after early fixups (Tiezhu Yang)

    PCI device hotplug:
    - Make rpadlpar functions static (Wei Yongjun)

    Driver binding:
    - Add device even if driver attach failed (Rajat Jain)

    Virtualization:
    - xen: Remove redundant initialization of irq (Colin Ian King)

    IOMMU:
    - Add pci_pri_supported() to check device or associated PF (Ashok Raj)
    - Release IVRS table in AMD ACS quirk (Hanjun Guo)
    - Mark AMD Navi10 GPU rev 0x00 ATS as broken (Kai-Heng Feng)
    - Treat "external-facing" devices themselves as internal (Rajat Jain)

    MSI:
    - Forward MSI-X error code in pci_alloc_irq_vectors_affinity() (Piotr
    Stankiewicz)

    Error handling:
    - Clear PCIe Device Status errors only if OS owns AER (Jonathan
    Cameron)
    - Log correctable errors as warning, not error (Matt Jolly)
    - Use 'pci_channel_state_t' instead of 'enum pci_channel_state' (Luc
    Van Oostenryck)

    Peer-to-peer DMA:
    - Allow P2PDMA on AMD Zen and newer CPUs (Logan Gunthorpe)

    ASPM:
    - Add missing newline in sysfs 'policy' (Xiongfeng Wang)

    Native PCIe controllers:
    - Convert to devm_platform_ioremap_resource_byname() (Dejin Zheng)
    - Convert to devm_platform_ioremap_resource() (Dejin Zheng)
    - Remove duplicate error message from devm_pci_remap_cfg_resource()
    callers (Dejin Zheng)
    - Fix runtime PM imbalance on error (Dinghao Liu)
    - Remove dev_err() when handing an error from platform_get_irq()
    (Krzysztof Wilczyński)
    - Use pci_host_bridge.windows list directly instead of splicing in a
    temporary list for cadence, mvebu, host-common (Rob Herring)
    - Use pci_host_probe() instead of open-coding all the pieces for
    altera, brcmstb, iproc, mobiveil, rcar, rockchip, tegra, v3,
    versatile, xgene, xilinx, xilinx-nwl (Rob Herring)
    - Default host bridge parent device to the platform device (Rob
    Herring)
    - Use pci_is_root_bus() instead of tracking root bus number
    separately in aardvark, designware (imx6, keystone,
    designware-host), mobiveil, xilinx-nwl, xilinx, rockchip, rcar (Rob
    Herring)
    - Set host bridge bus number in pci_scan_root_bus_bridge() instead of
    each driver for aardvark, designware-host, host-common, mediatek,
    rcar, tegra, v3-semi (Rob Herring)
    - Move DT resource setup into devm_pci_alloc_host_bridge() (Rob
    Herring)
    - Set bridge map_irq and swizzle_irq to default functions; drivers
    that don't support legacy IRQs (iproc) need to undo this (Rob
    Herring)

    ARM Versatile PCIe controller driver:
    - Drop flag PCI_ENABLE_PROC_DOMAINS (Rob Herring)

    Cadence PCIe controller driver:
    - Use "dma-ranges" instead of "cdns,no-bar-match-nbits" property
    (Kishon Vijay Abraham I)
    - Remove "mem" from reg binding (Kishon Vijay Abraham I)
    - Fix cdns_pcie_{host|ep}_setup() error path (Kishon Vijay Abraham I)
    - Convert all r/w accessors to perform only 32-bit accesses (Kishon
    Vijay Abraham I)
    - Add support to start link and verify link status (Kishon Vijay
    Abraham I)
    - Allow pci_host_bridge to have custom pci_ops (Kishon Vijay Abraham I)
    - Add new *ops* for CPU addr fixup (Kishon Vijay Abraham I)
    - Fix updating Vendor ID and Subsystem Vendor ID register (Kishon
    Vijay Abraham I)
    - Use bridge resources for outbound window setup (Rob Herring)
    - Remove private bus number and range storage (Rob Herring)

    Cadence PCIe endpoint driver:
    - Add MSI-X support (Alan Douglas)

    HiSilicon PCIe controller driver:
    - Remove non-ECAM HiSilicon hip05/hip06 driver (Rob Herring)

    Intel VMD host bridge driver:
    - Use Shadow MEMBAR registers for QEMU/KVM guests (Jon Derrick)

    Loongson PCIe controller driver:
    - Use DECLARE_PCI_FIXUP_EARLY for bridge_class_quirk() (Tiezhu Yang)

    Marvell Aardvark PCIe controller driver:
    - Indicate error in 'val' when config read fails (Pali Rohár)
    - Don't touch PCIe registers if no card connected (Pali Rohár)

    Marvell MVEBU PCIe controller driver:
    - Setup BAR0 in order to fix MSI (Shmuel Hazan)

    Microsoft Hyper-V host bridge driver:
    - Fix a timing issue which causes kdump to fail occasionally (Wei Hu)
    - Make some functions static (Wei Yongjun)

    NVIDIA Tegra PCIe controller driver:
    - Revert tegra124 raw_violation_fixup (Nicolas Chauvet)
    - Remove PLL power supplies (Thierry Reding)

    Qualcomm PCIe controller driver:
    - Change duplicate PCI reset to phy reset (Abhishek Sahu)
    - Add missing ipq806x clocks in PCIe driver (Ansuel Smith)
    - Add missing reset for ipq806x (Ansuel Smith)
    - Add ext reset (Ansuel Smith)
    - Use bulk clk API and assert on error (Ansuel Smith)
    - Add support for tx term offset for rev 2.1.0 (Ansuel Smith)
    - Define some PARF params needed for ipq8064 SoC (Ansuel Smith)
    - Add ipq8064 rev2 variant (Ansuel Smith)
    - Support PCI speed set for ipq806x (Sham Muthayyan)

    Renesas R-Car PCIe controller driver:
    - Use devm_pci_alloc_host_bridge() (Rob Herring)
    - Use struct pci_host_bridge.windows list directly (Rob Herring)
    - Convert rcar-gen2 to use modern host bridge probe functions (Rob
    Herring)

    TI J721E PCIe driver:
    - Add TI J721E PCIe host and endpoint driver (Kishon Vijay Abraham I)

    Xilinx Versal CPM PCIe controller driver:
    - Add Versal CPM Root Port driver and YAML schema (Bharat Kumar
    Gogada)

    MicroSemi Switchtec management driver:
    - Add missing __iomem and __user tags to fix sparse warnings (Logan
    Gunthorpe)

    Miscellaneous:
    - Replace http:// links with https:// (Alexander A. Klimov)
    - Replace lkml.org, spinics, gmane with lore.kernel.org (Bjorn
    Helgaas)
    - Remove unused pci_lost_interrupt() (Heiner Kallweit)
    - Move PCI_VENDOR_ID_REDHAT definition to pci_ids.h (Huacai Chen)
    - Fix kerneldoc warnings (Krzysztof Kozlowski)"

    * tag 'pci-v5.9-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (113 commits)
    PCI: Fix kerneldoc warnings
    PCI: xilinx-cpm: Add Versal CPM Root Port driver
    PCI: xilinx-cpm: Add YAML schemas for Versal CPM Root Port
    PCI: Set bridge map_irq and swizzle_irq to default functions
    PCI: Move DT resource setup into devm_pci_alloc_host_bridge()
    PCI: rcar-gen2: Convert to use modern host bridge probe functions
    PCI: Remove dev_err() when handing an error from platform_get_irq()
    MAINTAINERS: Add Kishon Vijay Abraham I for TI J721E SoC PCIe
    misc: pci_endpoint_test: Add J721E in pci_device_id table
    PCI: j721e: Add TI J721E PCIe driver
    PCI: switchtec: Add missing __iomem tag to fix sparse warnings
    PCI: switchtec: Add missing __iomem and __user tags to fix sparse warnings
    PCI: rpadlpar: Make functions static
    PCI/P2PDMA: Allow P2PDMA on AMD Zen and newer CPUs
    PCI: Release IVRS table in AMD ACS quirk
    PCI: Announce device after early fixups
    PCI: Mark AMD Navi10 GPU rev 0x00 ATS as broken
    PCI: Remove unused pci_lost_interrupt()
    dt-bindings: PCI: Add EP mode dt-bindings for TI's J721E SoC
    dt-bindings: PCI: Add host mode dt-bindings for TI's J721E SoC
    ...

    Linus Torvalds
     

11 Jul, 2020

1 commit

  • "External-facing" devices are internal devices that expose PCIe hierarchies
    such as Thunderbolt outside the platform [1]. Previously these internal
    devices were marked as "untrusted" the same as devices downstream from
    them.

    Use the ACPI or DT information to identify external-facing devices, but
    only mark the devices *downstream* from them as "untrusted" [2]. The
    external-facing device itself is no longer marked as untrusted.

    [1] https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-externally-exposed-pcie-root-ports
    [2] https://lore.kernel.org/linux-pci/20200610230906.GA1528594@bjorn-Precision-5520/
    Link: https://lore.kernel.org/r/20200707224604.3737893-3-rajatja@google.com
    Signed-off-by: Rajat Jain
    Signed-off-by: Bjorn Helgaas

    Rajat Jain
     

09 Jul, 2020

1 commit

  • Replace the existing /* fall through */ comments and its variants with
    the new pseudo-keyword macro fallthrough[1]. Also, remove unnecessary
    fall-through markings when it is the case.

    Link: https://www.kernel.org/doc/html/latest/process/deprecated.html?highlight=fallthrough#implicit-switch-case-fall-through # [1]
    Signed-off-by: Gustavo A. R. Silva
    Signed-off-by: Rafael J. Wysocki

    Gustavo A. R. Silva
     

28 May, 2020

1 commit


15 May, 2020

1 commit

  • Previously we used pcie_find_root_port() to find a Root Port from a PCIe
    device and pci_find_pcie_root_port() to find a Root Port from a
    Conventional PCI device.

    Unify the two functions and use pcie_find_root_port() to find a Root Port
    from either a Conventional PCI device or a PCIe device. Then there is no
    need to distinguish the type of the device.

    Link: https://lore.kernel.org/r/1589019568-5216-1-git-send-email-yangyicong@hisilicon.com
    Signed-off-by: Yicong Yang
    Signed-off-by: Bjorn Helgaas
    Acked-by: Kalle Valo # wireless
    Acked-by: Mika Westerberg # thunderbolt

    Yicong Yang
     

03 Apr, 2020

1 commit

  • - Move _HPX type array from stack to static data (Colin Ian King)

    - Avoid an ASMedia XHCI USB PME# defect; apparently it doesn't assert
    PME# when USB3.0 devices are hotplugged in D0 (Kai-Heng Feng)

    - Revert sysfs "rescan" file renames that broke an application (Kelsey
    Skunberg)

    * pci/misc:
    PCI: sysfs: Revert "rescan" file renames
    PCI: Avoid ASMedia XHCI USB PME# from D0 defect
    PCI/ACPI: Move pcie_to_hpx3_type[] from stack to static data

    Bjorn Helgaas
     

29 Mar, 2020

1 commit

  • Error Disconnect Recover (EDR) is a feature that allows ACPI firmware to
    notify OSPM that a device has been disconnected due to an error condition
    (ACPI v6.3, sec 5.6.6). OSPM advertises its support for EDR on PCI devices
    via _OSC (see [1], sec 4.5.1, table 4-4). The OSPM EDR notify handler
    should invalidate software state associated with disconnected devices and
    may attempt to recover them. OSPM communicates the status of recovery to
    the firmware via _OST (sec 6.3.5.2).

    For PCIe, firmware may use Downstream Port Containment (DPC) to support
    EDR. Per [1], sec 4.5.1, table 4-6, even if firmware has retained control
    of DPC, OSPM may read/write DPC control and status registers during the EDR
    notification processing window, i.e., from the time it receives an EDR
    notification until it clears the DPC Trigger Status.

    Note that per [1], sec 4.5.1 and 4.5.2.4,

    1. If the OS supports EDR, it should advertise that to firmware by
    setting OSC_PCI_EDR_SUPPORT in _OSC Support.

    2. If the OS sets OSC_PCI_EXPRESS_DPC_CONTROL in _OSC Control to request
    control of the DPC capability, it must also set OSC_PCI_EDR_SUPPORT in
    _OSC Support.

    Add an EDR notify handler to attempt recovery.

    [1] Downstream Port Containment Related Enhancements ECN, Jan 28, 2019,
    affecting PCI Firmware Specification, Rev. 3.2
    https://members.pcisig.com/wg/PCI-SIG/document/12888

    [bhelgaas: squash add/enable patches into one]
    Link: https://lore.kernel.org/r/90f91fe6d25c13f9d2255d2ce97ca15be307e1bb.1585000084.git.sathyanarayanan.kuppuswamy@linux.intel.com
    Signed-off-by: Kuppuswamy Sathyanarayanan
    Signed-off-by: Bjorn Helgaas
    Cc: "Rafael J. Wysocki"
    Cc: Len Brown

    Kuppuswamy Sathyanarayanan
     

11 Feb, 2020

1 commit


24 Sep, 2019

1 commit

  • - Consolidate _HPP & _HPX code in pci-acpi.h and remove unnecessary
    struct hotplug_program_ops (Krzysztof Wilczynski)

    - Fixup PCIe device types to remove the need for dev->has_secondary_link
    (Mika Westerberg)

    * pci/enumeration:
    PCI: Get rid of dev->has_secondary_link flag
    PCI: Make pcie_downstream_port() available outside of access.c
    PCI/ACPI: Remove unnecessary struct hotplug_program_ops
    PCI/ACPI: Move _HPP & _HPX functions to pci-acpi.c
    PCI/ACPI: Rename _HPX structs from hpp_* to hpx_*

    Bjorn Helgaas
     

29 Aug, 2019

3 commits

  • Move the ACPI-specific structs hpx_type0, hpx_type1, hpx_type2 and
    hpx_type3 to drivers/pci/pci-acpi.c as they are not used anywhere else.
    Then remove the struct hotplug_program_ops that has been shared between
    drivers/pci/probe.c and drivers/pci/pci-acpi.c from drivers/pci/pci.h as it
    is no longer needed.

    The struct hotplug_program_ops was added by 87fcf12e846a ("PCI/ACPI: Remove
    the need for 'struct hotplug_params'") and replaced previously used struct
    hotplug_params enabling the support for the _HPX Type 3 Setting Record that
    was added by f873c51a155a ("PCI/ACPI: Implement _HPX Type 3 Setting
    Record").

    The new struct allowed for the static functions such program_hpx_type0(),
    program_hpx_type1(), etc., from the drivers/pci/probe.c to be called from
    the function pci_acpi_program_hp_params() in the drivers/pci/pci-acpi.c.

    Previously a programming of _HPX Type 0 was as follows:

    drivers/pci/probe.c:

    program_hpx_type0()
    ...
    pci_configure_device()
    hp_ops = {
    .program_type0 = program_hpx_type0,
    ...
    }
    pci_acpi_program_hp_params(&hp_ops)

    drivers/pci/pci-acpi.c:

    pci_acpi_program_hp_params(&hp_ops)
    acpi_run_hpx(hp_ops)
    decode_type0_hpx_record()
    hp_ops->program_type0 # program_hpx_type0() called via hp_ops

    After the ACPI-specific functions, structs, enums, etc., have been moved to
    drivers/pci/pci-acpi.c there is no need for the hotplug_program_ops as all
    of the _HPX Type 0, 1, 2 and 3 are directly accessible.

    Link: https://lore.kernel.org/r/20190827094951.10613-4-kw@linux.com
    Signed-off-by: Krzysztof Wilczynski
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczynski
     
  • Move program_hpx_type0(), program_hpx_type1(), etc., and enums
    hpx_type3_dev_type, hpx_type3_fn_type and hpx_type3_cfg_loc to
    drivers/pci/pci-acpi.c as these functions and enums are ACPI-specific.

    Move structs hpx_type0, hpx_type1, hpx_type2 and hpx_type3 to
    drivers/pci/pci.h as these are shared between drivers/pci/pci-acpi.c and
    drivers/pci/probe.c.

    Link: https://lore.kernel.org/r/20190827094951.10613-3-kw@linux.com
    Signed-off-by: Krzysztof Wilczynski
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczynski
     
  • The names of the hpp_type0, hpp_type1 and hpp_type2 structs suggest that
    they're related to _HPP, when in fact they're related to _HPX.

    The struct hpp_type0 denotes an _HPX Type 0 setting record that supersedes
    the _HPP setting record, and it has been used interchangeably for _HPP as
    per the ACPI specification (see version 6.3, section 6.2.9.1) which states
    that it should be applied to PCI, PCI-X and PCI Express devices, with
    settings being ignored if they are not applicable.

    Rename them to hpx_type0, hpx_type1 and hpx_type2 to reflect their relation
    to _HPX rather than _HPP.

    Link: https://lore.kernel.org/r/20190827094951.10613-2-kw@linux.com
    Signed-off-by: Krzysztof Wilczynski
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczynski
     

28 Aug, 2019

1 commit

  • Move ASPM definitions and function prototypes from include/linux/pci-aspm.h
    to include/linux/pci.h so users only need to include :

    PCIE_LINK_STATE_L0S
    PCIE_LINK_STATE_L1
    PCIE_LINK_STATE_CLKPM
    pci_disable_link_state()
    pci_disable_link_state_locked()
    pcie_no_aspm()

    No functional changes intended.

    Link: https://lore.kernel.org/r/20190827095620.11213-1-kw@linux.com
    Signed-off-by: Krzysztof Wilczynski
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczynski
     

27 Jun, 2019

3 commits

  • In pci_pm_complete() there are checks to decide whether or not to
    resume devices that were left in runtime-suspend during the preceding
    system-wide transition into a sleep state. They involve checking the
    current power state of the device and comparing it with the power
    state of it set before the preceding system-wide transition, but the
    platform component of the device's power state is not handled
    correctly in there.

    Namely, on platforms with ACPI, the device power state information
    needs to be updated with care, so that the reference counters of
    power resources used by the device (if any) are set to ensure that
    the refreshed power state of it will be maintained going forward.

    To that end, introduce a new ->refresh_state() platform PM callback
    for PCI devices, for asking the platform to refresh the device power
    state data and ensure that the corresponding power state will be
    maintained going forward, make it invoke acpi_device_update_power()
    (for devices with ACPI PM) on platforms with ACPI and make
    pci_pm_complete() use it, through a new pci_refresh_power_state()
    wrapper function.

    Fixes: a0d2a959d3da (PCI: Avoid unnecessary resume after direct-complete)
    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Mika Westerberg

    Rafael J. Wysocki
     
  • If otherwise unrelated PCI devices share ACPI power resources turning
    them on causes the devices to enter D0uninitialized power state which may
    cause problems.

    For example in Intel Ice Lake two root ports (RP0 and RP1), Thunderbolt
    controller (NHI) and xHCI controller all share power resources as can be
    ween in the topology below where power resources are marked with []:

    Host bridge
    |
    +- RP0 ---\
    +- RP1 ---|--+--> [TBT]
    +- NHI --/ |
    | |
    | v
    +- xHCI --> [D3C]

    In a situation where all devices sharing the power resources are in
    D3cold (the power resources are turned off) and for example the
    Thunderbolt controller is runtime resumed resulting that the power
    resources are turned on. This means that the other devices sharing them
    (RP0, RP1 and xHCI) are transitioned into D0uninitialized state. If they
    were configured to trigger wake (PME) on a certain event that
    configuration gets lost after reset so we would need to re-initialize
    them to get the wakeup working as expected again. To do so we would need
    to runtime resume all of them to make sure their registers get restored
    properly before we can runtime suspend them again.

    Since we just added concept of "_PR0 dependent device" we can solve this
    by calling the relevant add/remove functions when the PCI device is bind
    to its ACPI representation. If it has power resources the PCI device
    will be added as dependent device to them and runtime resumed whenever
    they are physically turned on. This should make sure PCI core can
    reconfigure wakes after the device is transitioned into D0uninitialized.

    Signed-off-by: Mika Westerberg
    Signed-off-by: Rafael J. Wysocki

    Mika Westerberg
     
  • The ACPI power state returned by acpi_device_get_power() may depend on
    the configuration of ACPI power resources in the system which may change
    any time after acpi_device_get_power() has returned, unless the
    reference counters of the ACPI power resources in question are set to
    prevent that from happening. Thus it is invalid to use acpi_device_get_power()
    in acpi_pci_get_power_state() the way it is done now and the value of
    the ->power.state field in the corresponding struct acpi_device objects
    (which reflects the ACPI power resources reference counting, among other
    things) should be used instead.

    As an example where this becomes an issue is Intel Ice Lake where the
    Thunderbolt controller (NHI), two PCIe root ports (RP0 and RP1) and xHCI
    all share the same power resources. The following picture with power
    resources marked with [] shows the topology:

    Host bridge
    |
    +- RP0 ---\
    +- RP1 ---|--+--> [TBT]
    +- NHI --/ |
    | |
    | v
    +- xHCI --> [D3C]

    Here TBT and D3C are the shared ACPI power resources. ACPI _PR3() method
    of the devices in question returns either TBT or D3C or both.

    Say we runtime suspend first the root ports RP0 and RP1, then NHI. Now
    since the TBT power resource is still on when the root ports are runtime
    suspended their dev->current_state is set to D3hot. When NHI is runtime
    suspended TBT is finally turned off but state of the root ports remain
    to be D3hot. Now when the xHCI is runtime suspended D3C gets also turned
    off. PCI core thus has power states of these devices cached in their
    dev->current_state as follows:

    RP0 -> D3hot
    RP1 -> D3hot
    NHI -> D3cold
    xHCI -> D3cold

    If the user now runs lspci for instance, the result is all 1's like in
    the below output (00:07.0 is the first root port, RP0):

    00:07.0 PCI bridge: Intel Corporation Device 8a1d (rev ff) (prog-if ff)
    !!! Unknown header type 7f
    Kernel driver in use: pcieport

    In short the hardware state is not in sync with the software state
    anymore. The exact same thing happens with the PME polling thread which
    ends up bringing the root ports back into D0 after they are runtime
    suspended.

    For this reason, modify acpi_pci_get_power_state() so that it uses the
    ACPI device power state that was cached by the ACPI core. This makes the
    PCI device power state match the ACPI device power state regardless of
    state of the shared power resources which may still be on at this point.

    Link: https://lore.kernel.org/r/20190618161858.77834-2-mika.westerberg@linux.intel.com
    Signed-off-by: Mika Westerberg
    Signed-off-by: Rafael J. Wysocki

    Mika Westerberg
     

27 May, 2019

1 commit

  • Both acpi_pci_need_resume() and acpi_dev_needs_resume() check if the
    current ACPI wakeup configuration of the device matches what is
    expected as far as system wakeup from sleep states is concerned, as
    reflected by the device_may_wakeup() return value for the device.

    However, they only should do that if wakeup.flags.valid is set for
    the device's ACPI companion, because otherwise the wakeup.prepare_count
    value for it is meaningless.

    Add the missing wakeup.flags.valid checks to these functions.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Mika Westerberg

    Rafael J. Wysocki
     

14 May, 2019

1 commit


09 May, 2019

1 commit

  • Replace printk() with pr_*() to be more consistent with other logging and
    avoid checkpatch warnings.

    Link: https://lore.kernel.org/lkml/1555733026-19609-1-git-send-email-mohankumar718@gmail.com
    Link: https://lore.kernel.org/lkml/1555733130-19804-1-git-send-email-mohankumar718@gmail.com
    Signed-off-by: Mohan Kumar
    [bhelgaas: squash in similar changes from second patch in series]
    Signed-off-by: Bjorn Helgaas

    Mohan Kumar
     

24 Apr, 2019

3 commits

  • The _HPX Type 3 Setting Record is intended to be more generic and allow
    configuration of settings not possible with Type 2 records. For example,
    firmware could ensure that the completion timeout value is set accordingly
    throughout the PCI tree.

    Implement support for _HPX Type 3 Setting Records, which were added in the
    ACPI 6.3 spec.

    Link: https://lore.kernel.org/lkml/20190208162414.3996-4-mr.nuke.me@gmail.com
    Signed-off-by: Alexandru Gagniuc
    Signed-off-by: Bjorn Helgaas

    Alexandru Gagniuc
     
  • We used to first parse all the _HPP and _HPX tables before using the
    information to program registers of PCIe devices. Up through HPX Type 2,
    there was only one structure of each type, so we could cheat and store it
    on the stack.

    With HPX Type 3 we get an arbitrary number of entries, so the above model
    doesn't scale that well. Instead of parsing all tables at once, parse and
    program each entry separately. For _HPP and _HPX Types 0 through 2, this
    is functionally equivalent. The change enables the upcoming _HPX Type 3 to
    integrate more easily.

    Link: https://lore.kernel.org/lkml/20190208162414.3996-3-mr.nuke.me@gmail.com
    Signed-off-by: Alexandru Gagniuc
    [bhelgaas: fix build errors]
    Signed-off-by: Bjorn Helgaas

    Alexandru Gagniuc
     
  • pci_get_hp_params() is only used within drivers/pci, and there is no reason
    to make it available outside of the PCI core, so stop exporting it.

    Link: https://lore.kernel.org/lkml/20190208162414.3996-2-mr.nuke.me@gmail.com
    Signed-off-by: Alexandru Gagniuc
    Signed-off-by: Bjorn Helgaas

    Alexandru Gagniuc
     

05 Dec, 2018

1 commit

  • A malicious PCI device may use DMA to attack the system. An external
    Thunderbolt port is a convenient point to attach such a device. The OS
    may use IOMMU to defend against DMA attacks.

    Some BIOSes mark these externally facing root ports with this
    ACPI _DSD [1]:

    Name (_DSD, Package () {
    ToUUID ("efcc06cc-73ac-4bc3-bff0-76143807c389"),
    Package () {
    Package () {"ExternalFacingPort", 1},
    Package () {"UID", 0 }
    }
    })

    If we find such a root port, mark it and all its children as untrusted.
    The rest of the OS may use this information to enable DMA protection
    against malicious devices. For instance the device may be put behind an
    IOMMU to keep it from accessing memory outside of what the driver has
    allocated for it.

    While at it, add a comment on top of prp_guids array explaining the
    possible caveat resulting when these GUIDs are treated equivalent.

    [1] https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-externally-exposed-pcie-root-ports

    Signed-off-by: Mika Westerberg
    Acked-by: Rafael J. Wysocki
    Acked-by: Bjorn Helgaas

    Mika Westerberg
     

13 Nov, 2018

1 commit

  • This reverts commit bad7dcd94f3956bcfc0a69ef71fdf0fcca3de4a8.

    bad7dcd94f39 ("ACPI/PCI: Pay attention to device-specific _PXM node
    values") caused boot failures (no console output at all) for Martin [1]
    and Ingo [2] on AMD ThreadRipper systems.

    Revert the commit until we figure out how to safely use these
    device-specific _PXM values.

    [1] https://lore.kernel.org/linux-pci/20180912152140.3676-2-Jonathan.Cameron@huawei.com
    [2] https://lore.kernel.org/linux-pci/20181113071712.GA2353@gmail.com
    Fixes: bad7dcd94f39 ("ACPI/PCI: Pay attention to device-specific _PXM node values")
    Signed-off-by: Bjorn Helgaas

    Bjorn Helgaas
     

21 Oct, 2018

2 commits

  • - Remove unused Netronome NFP32xx Device IDs (Jakub Kicinski)

    - Use bitmap_zalloc() for dma_alias_mask (Andy Shevchenko)

    - Add switch fall-through annotations (Gustavo A. R. Silva)

    - Remove unused Switchtec quirk variable (Joshua Abraham)

    - Fix pci.c kernel-doc warning (Randy Dunlap)

    - Remove trivial PCI wrappers for DMA APIs (Christoph Hellwig)

    - Add Intel GPU device IDs to spurious interrupt quirk (Bin Meng)

    - Run Switchtec DMA aliasing quirk only on NTB endpoints to avoid useless
    dmesg errors (Logan Gunthorpe)

    - Update Switchtec NTB documentation (Wesley Yung)

    - Remove redundant "default n" from Kconfig (Bartlomiej Zolnierkiewicz)

    * pci/misc:
    PCI: pcie: Remove redundant 'default n' from Kconfig
    NTB: switchtec_ntb: Update switchtec documentation with prerequisites for NTB
    PCI: Fix Switchtec DMA aliasing quirk dmesg noise
    PCI: Add macro for Switchtec quirk declarations
    PCI: Add Device IDs for Intel GPU "spurious interrupt" quirk
    PCI: Remove pci_set_dma_max_seg_size()
    PCI: Remove pci_set_dma_seg_boundary()
    PCI: Remove pci_unmap_addr() wrappers for DMA API
    PCI / ACPI: Mark expected switch fall-through
    PCI: Remove set but unused variable
    PCI: Fix pci.c kernel-doc parameter warning
    PCI: Allocate dma_alias_mask with bitmap_zalloc()
    PCI: Remove unused NFP32xx IDs

    Bjorn Helgaas
     
  • - Differentiate between pciehp surprise and safe removal (Lukas Wunner)

    - Remove unnecessary pciehp includes (Lukas Wunner)

    - Drop pciehp hotplug_slot_ops wrappers (Lukas Wunner)

    - Tolerate PCIe Slot Presence Detect being hardwired to zero to
    workaround broken hardware, e.g., the Wilocity switch/wireless device
    (Lukas Wunner)

    - Unify pciehp controller & slot structs (Lukas Wunner)

    - Constify hotplug_slot_ops (Lukas Wunner)

    - Drop hotplug_slot_info (Lukas Wunner)

    - Embed hotplug_slot struct into users instead of allocating it
    separately (Lukas Wunner)

    - Initialize PCIe port service drivers directly instead of relying on
    initcall ordering (Keith Busch)

    - Restore PCI config state after a slot reset (Keith Busch)

    - Save/restore DPC config state along with other PCI config state (Keith
    Busch)

    - Reference count devices during AER handling to avoid race issue with
    concurrent hot removal (Keith Busch)

    - If an Upstream Port reports ERR_FATAL, don't try to read the Port's
    config space because it is probably unreachable (Keith Busch)

    - During error handling, use slot-specific reset instead of secondary
    bus reset to avoid link up/down issues on hotplug ports (Keith Busch)

    - Restore previous AER/DPC handling that does not remove and re-enumerate
    devices on ERR_FATAL (Keith Busch)

    - Notify all drivers that may be affected by error recovery resets (Keith
    Busch)

    - Always generate error recovery uevents, even if a driver doesn't have
    error callbacks (Keith Busch)

    - Make PCIe link active reporting detection generic (Keith Busch)

    - Support D3cold in PCIe hierarchies during system sleep and runtime,
    including hotplug and Thunderbolt ports (Mika Westerberg)

    - Handle hpmemsize/hpiosize kernel parameters uniformly, whether slots
    are empty or occupied (Jon Derrick)

    - Remove duplicated include from pci/pcie/err.c and unused variable from
    cpqphp (YueHaibing)

    - Remove driver pci_cleanup_aer_uncorrect_error_status() calls (Oza
    Pawandeep)

    - Uninline PCI bus accessors for better ftracing (Keith Busch)

    - Remove unused AER Root Port .error_resume method (Keith Busch)

    - Use kfifo in AER instead of a local version (Keith Busch)

    - Use threaded IRQ in AER bottom half (Keith Busch)

    - Use managed resources in AER core (Keith Busch)

    - Reuse pcie_port_find_device() for AER injection (Keith Busch)

    - Abstract AER interrupt handling to disconnect error injection (Keith
    Busch)

    - Refactor AER injection callbacks to simplify future improvments (Keith
    Busch)

    * pci/hotplug:
    PCI/AER: Refactor error injection fallbacks
    PCI/AER: Abstract AER interrupt handling
    PCI/AER: Reuse existing pcie_port_find_device() interface
    PCI/AER: Use managed resource allocations
    PCI/AER: Use threaded IRQ for bottom half
    PCI/AER: Use kfifo_in_spinlocked() to insert locked elements
    PCI/AER: Use kfifo for tracking events instead of reimplementing it
    PCI/AER: Remove error source from AER struct aer_rpc
    PCI/AER: Remove unused aer_error_resume()
    PCI: Uninline PCI bus accessors for better ftracing
    PCI/AER: Remove pci_cleanup_aer_uncorrect_error_status() calls
    PCI: pnv_php: Use kmemdup()
    PCI: cpqphp: Remove set but not used variable 'physical_slot'
    PCI/ERR: Remove duplicated include from err.c
    PCI: Equalize hotplug memory and io for occupied and empty slots
    PCI / ACPI: Whitelist D3 for more PCIe hotplug ports
    ACPI / property: Allow multiple property compatible _DSD entries
    PCI/PME: Implement runtime PM callbacks
    PCI: pciehp: Implement runtime PM callbacks
    PCI/portdrv: Add runtime PM hooks for port service drivers
    PCI/portdrv: Resume upon exit from system suspend if left runtime suspended
    PCI: pciehp: Do not handle events if interrupts are masked
    PCI: pciehp: Disable hotplug interrupt during suspend
    PCI / ACPI: Enable wake automatically for power managed bridges
    PCI: Do not skip power-managed bridges in pci_enable_wake()
    PCI: Make link active reporting detection generic
    PCI: Unify device inaccessible
    PCI/ERR: Always report current recovery status for udev
    PCI/ERR: Simplify broadcast callouts
    PCI/ERR: Run error recovery callbacks for all affected devices
    PCI/ERR: Handle fatal error recovery
    PCI/ERR: Use slot reset if available
    PCI/AER: Don't read upstream ports below fatal errors
    PCI/AER: Take reference on error devices
    PCI/DPC: Save and restore config state
    PCI: portdrv: Restore PCI config state on slot reset
    PCI: portdrv: Initialize service drivers directly
    PCI: hotplug: Document TODOs
    PCI: hotplug: Embed hotplug_slot
    PCI: hotplug: Drop hotplug_slot_info
    PCI: hotplug: Constify hotplug_slot_ops
    PCI: pciehp: Reshuffle controller struct for clarity
    PCI: pciehp: Rename controller struct members for clarity
    PCI: pciehp: Unify controller and slot structs
    PCI: pciehp: Tolerate Presence Detect hardwired to zero
    PCI: pciehp: Drop hotplug_slot_ops wrappers
    PCI: pciehp: Drop unnecessary includes
    PCI: pciehp: Differentiate between surprise and safe removal
    PCI: Simplify disconnected marking

    Bjorn Helgaas
     

05 Oct, 2018

1 commit


03 Oct, 2018

2 commits

  • In order to have better power management for Thunderbolt PCIe chains,
    Windows enables power management for native PCIe hotplug ports if there is
    the following ACPI _DSD attached to the root port:

    Name (_DSD, Package () {
    ToUUID ("6211e2c0-58a3-4af3-90e1-927a4e0c55a4"),
    Package () {
    Package () {"HotPlugSupportInD3", 1}
    }
    })

    This is also documented in:

    https://docs.microsoft.com/en-us/windows-hardware/drivers/pci/dsd-for-pcie-root-ports#identifying-pcie-root-ports-supporting-hot-plug-in-d3

    Do the same in Linux by introducing new firmware PM callback
    (->bridge_d3()) and then implement it for ACPI based systems so that the
    above property is checked.

    There is one catch, though. The initial pci_dev->bridge_d3 is set before
    the root port has ACPI companion bound (the device is not added to the PCI
    bus either) so we need to look up the ACPI companion manually in that case
    in acpi_pci_bridge_d3().

    Signed-off-by: Mika Westerberg
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Rafael J. Wysocki

    Mika Westerberg
     
  • We enable power management automatically for bridges where
    pci_bridge_d3_possible() returns true. However, these bridges may have
    ACPI methods such as _DSW that need to be called before D3 entry. For
    example in Lenovo Thinkpad X1 Carbon 6th _DSW method is used to prepare
    D3cold for the PCIe root port hosting Thunderbolt chain. Because wake is
    not enabled _DSW method is never called and the port does not enter
    D3cold properly consuming more power than necessary.

    Users can work this around by writing "enabled" to "wakeup" sysfs file
    under the device in question but that is not something an ordinary user
    is expected to do.

    Since we already automatically enable power management for PCIe ports
    with ->bridge_d3 set extend that to enable wake for them as well,
    assuming the port has any ACPI wakeup related objects implemented in the
    namespace (adev->wakeup.flags.valid is true). This ensures the necessary
    ACPI methods get called at appropriate times and allows the root port in
    Thinkpad X1 Carbon 6th to go into D3cold.

    Signed-off-by: Mika Westerberg
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Rafael J. Wysocki

    Mika Westerberg
     

18 Sep, 2018

1 commit

  • The ACPI specification allows you to provide _PXM entries for devices based
    on their location on a particular bus. Let us use that if it is provided
    rather than just assuming it makes sense to put the device into the
    proximity domain of the root.

    An example DSDT entry that will supply this is:

    Device (PCI2)
    {
    Name (_HID, "PNP0A08") // PCI Express Root Bridge
    Name (_CID, "PNP0A03") // Compatible PCI Root Bridge
    Name(_SEG, 2) // Segment of this Root complex
    Name(_BBN, 0xF8) // Base Bus Number
    Name(_CCA, 1)
    Method (_PXM, 0, NotSerialized) {
    Return(0x00)
    }

    ...
    Device (BRI0) {
    Name (_HID, "19E51610")
    Name (_ADR, 0)
    Name (_BBN, 0xF9)
    Device (CAR0) {
    Name (_HID, "97109912")
    Name (_ADR, 0)
    Method (_PXM, 0, NotSerialized) {
    Return(0x02)
    }
    }
    }
    }

    Signed-off-by: Jonathan Cameron
    Signed-off-by: Bjorn Helgaas

    Jonathan Cameron
     

22 Aug, 2018

1 commit

  • Pull more power management updates from Rafael Wysocki:
    "These fix the main idle loop and the menu cpuidle governor, clean up
    the latter, fix a mistake in the PCI bus type's support for system
    suspend and resume, fix the ondemand and conservative cpufreq
    governors, address a build issue in the system wakeup framework and
    make the ACPI C-states desciptions less confusing.

    Specifics:

    - Make the idle loop handle stopped scheduler tick correctly (Rafael
    Wysocki).

    - Prevent the menu cpuidle governor from letting CPUs spend too much
    time in shallow idle states when it is invoked with scheduler tick
    stopped and clean it up somewhat (Rafael Wysocki).

    - Avoid invoking the platform firmware to make the platform enter the
    ACPI S3 sleep state with suspended PCIe root ports which may
    confuse the firmware and cause it to crash (Rafael Wysocki).

    - Fix sysfs-related race in the ondemand and conservative cpufreq
    governors which may cause the system to crash if the governor
    module is removed during an update of CPU frequency limits (Henry
    Willard).

    - Select SRCU when building the system wakeup framework to avoid a
    build issue in it (zhangyi).

    - Make the descriptions of ACPI C-states vendor-neutral to avoid
    confusion (Prarit Bhargava)"

    * tag 'pm-4.19-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
    cpuidle: menu: Handle stopped tick more aggressively
    sched: idle: Avoid retaining the tick when it has been stopped
    PCI / ACPI / PM: Resume all bridges on suspend-to-RAM
    cpuidle: menu: Update stale polling override comment
    cpufreq: governor: Avoid accessing invalid governor_data
    x86/ACPI/cstate: Make APCI C1 FFH MWAIT C-state description vendor-neutral
    cpuidle: menu: Fix white space
    PM / sleep: wakeup: Fix build error caused by missing SRCU support

    Linus Torvalds
     

17 Aug, 2018

2 commits

  • Commit 26112ddc254c (PCI / ACPI / PM: Resume bridges w/o drivers on
    suspend-to-RAM) attempted to fix a functional regression resulting
    from commit c62ec4610c40 (PM / core: Fix direct_complete handling
    for devices with no callbacks) by resuming PCI bridges without
    drivers (that is, "parallel PCI" ones) during system-wide suspend if
    the target system state is not ACPI S0 (working state).

    That turns out insufficient, however, as it is reported that, at
    least in one case, the platform firmware gets confused if a PCIe
    root port is suspended before entering the ACPI S3 sleep state.
    That issue was exposed by commit 77b3729ca03 (PCI / PM: Use
    SMART_SUSPEND and LEAVE_SUSPENDED flags for PCIe ports) that allowed
    PCIe ports to stay in runtime suspend during system-wide suspend
    (which is OK for suspend-to-idle, but turns out to be problematic
    otherwise).

    For this reason, drop the driver check from acpi_pci_need_resume()
    and resume all bridges (including PCIe ports with drivers) during
    system-wide suspend if the target system state is not ACPI S0.

    [If the target system state is ACPI S0, it means suspend-to-idle
    and the platform firmware is not going to be invoked to actually
    suspend the system, so there is no need to resume the bridges in
    that case.]

    Fixes: 77b3729ca03 (PCI / PM: Use SMART_SUSPEND and LEAVE_SUSPENDED flags for PCIe ports)
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=200675
    Reported-by: teika kazura
    Tested-by: teika kazura
    Reviewed-by: Mika Westerberg
    Acked-by: Bjorn Helgaas
    Cc: 4.16+ # 4.16+: 26112ddc254c (PCI / ACPI / PM: Resume bridges ...)
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     
  • Pull pci updates from Bjorn Helgaas:

    - Decode AER errors with names similar to "lspci" (Tyler Baicar)

    - Expose AER statistics in sysfs (Rajat Jain)

    - Clear AER status bits selectively based on the type of recovery (Oza
    Pawandeep)

    - Honor "pcie_ports=native" even if HEST sets FIRMWARE_FIRST (Alexandru
    Gagniuc)

    - Don't clear AER status bits if we're using the "Firmware-First"
    strategy where firmware owns the registers (Alexandru Gagniuc)

    - Use sysfs_match_string() to simplify ASPM sysfs parsing (Andy
    Shevchenko)

    - Remove unnecessary includes of (Bjorn Helgaas)

    - Defer DPC event handling to work queue (Keith Busch)

    - Use threaded IRQ for DPC bottom half (Keith Busch)

    - Print AER status while handling DPC events (Keith Busch)

    - Work around IDT switch ACS Source Validation erratum (James
    Puthukattukaran)

    - Emit diagnostics for all cases of PCIe Link downtraining (Links
    operating slower than they're capable of) (Alexandru Gagniuc)

    - Skip VFs when configuring Max Payload Size (Myron Stowe)

    - Reduce Root Port Max Payload Size if necessary when hot-adding a
    device below it (Myron Stowe)

    - Simplify SHPC existence/permission checks (Bjorn Helgaas)

    - Remove hotplug sample skeleton driver (Lukas Wunner)

    - Convert pciehp to threaded IRQ handling (Lukas Wunner)

    - Improve pciehp tolerance of missed events and initially unstable
    links (Lukas Wunner)

    - Clear spurious pciehp events on resume (Lukas Wunner)

    - Add pciehp runtime PM support, including for Thunderbolt controllers
    (Lukas Wunner)

    - Support interrupts from pciehp bridges in D3hot (Lukas Wunner)

    - Mark fall-through switch cases before enabling -Wimplicit-fallthrough
    (Gustavo A. R. Silva)

    - Move DMA-debug PCI init from arch code to PCI core (Christoph
    Hellwig)

    - Fix pci_request_irq() usage of IRQF_ONESHOT when no handler is
    supplied (Heiner Kallweit)

    - Unify PCI and DMA direction #defines (Shunyong Yang)

    - Add PCI_DEVICE_DATA() macro (Andy Shevchenko)

    - Check for VPD completion before checking for timeout (Bert Kenward)

    - Limit Netronome NFP5000 config space size to work around erratum
    (Jakub Kicinski)

    - Set IRQCHIP_ONESHOT_SAFE for PCI MSI irqchips (Heiner Kallweit)

    - Document ACPI description of PCI host bridges (Bjorn Helgaas)

    - Add "pci=disable_acs_redir=" parameter to disable ACS redirection for
    peer-to-peer DMA support (we don't have the peer-to-peer support yet;
    this is just one piece) (Logan Gunthorpe)

    - Clean up devm_of_pci_get_host_bridge_resources() resource allocation
    (Jan Kiszka)

    - Fixup resizable BARs after suspend/resume (Christian König)

    - Make "pci=earlydump" generic (Sinan Kaya)

    - Fix ROM BAR access routines to stay in bounds and check for signature
    correctly (Rex Zhu)

    - Add DMA alias quirk for Microsemi Switchtec NTB (Doug Meyer)

    - Expand documentation for pci_add_dma_alias() (Logan Gunthorpe)

    - To avoid bus errors, enable PASID only if entire path supports
    End-End TLP prefixes (Sinan Kaya)

    - Unify slot and bus reset functions and remove hotplug knowledge from
    callers (Sinan Kaya)

    - Add Function-Level Reset quirks for Intel and Samsung NVMe devices to
    fix guest reboot issues (Alex Williamson)

    - Add function 1 DMA alias quirk for Marvell 88SS9183 PCIe SSD
    Controller (Bjorn Helgaas)

    - Remove Xilinx AXI-PCIe host bridge arch dependency (Palmer Dabbelt)

    - Remove Aardvark outbound window configuration (Evan Wang)

    - Fix Aardvark bridge window sizing issue (Zachary Zhang)

    - Convert Aardvark to use pci_host_probe() to reduce code duplication
    (Thomas Petazzoni)

    - Correct the Cadence cdns_pcie_writel() signature (Alan Douglas)

    - Add Cadence support for optional generic PHYs (Alan Douglas)

    - Add Cadence power management ops (Alan Douglas)

    - Remove redundant variable from Cadence driver (Colin Ian King)

    - Add Kirin MSI support (Xiaowei Song)

    - Drop unnecessary root_bus_nr setting from exynos, imx6, keystone,
    armada8k, artpec6, designware-plat, histb, qcom, spear13xx (Shawn
    Guo)

    - Move link notification settings from DesignWare core to individual
    drivers (Gustavo Pimentel)

    - Add endpoint library MSI-X interfaces (Gustavo Pimentel)

    - Correct signature of endpoint library IRQ interfaces (Gustavo
    Pimentel)

    - Add DesignWare endpoint library MSI-X callbacks (Gustavo Pimentel)

    - Add endpoint library MSI-X test support (Gustavo Pimentel)

    - Remove unnecessary GFP_ATOMIC from Hyper-V "new child" allocation
    (Jia-Ju Bai)

    - Add more devices to Broadcom PAXC quirk (Ray Jui)

    - Work around corrupted Broadcom PAXC config space to enable SMMU and
    GICv3 ITS (Ray Jui)

    - Disable MSI parsing to work around broken Broadcom PAXC logic in some
    devices (Ray Jui)

    - Hide unconfigured functions to work around a Broadcom PAXC defect
    (Ray Jui)

    - Lower iproc log level to reduce console output during boot (Ray Jui)

    - Fix mobiveil iomem/phys_addr_t type usage (Lorenzo Pieralisi)

    - Fix mobiveil missing include file (Lorenzo Pieralisi)

    - Add mobiveil Kconfig/Makefile support (Lorenzo Pieralisi)

    - Fix mvebu I/O space remapping issues (Thomas Petazzoni)

    - Use generic pci_host_bridge in mvebu instead of ARM-specific API
    (Thomas Petazzoni)

    - Whitelist VMD devices with fast interrupt handlers to avoid sharing
    vectors with slow handlers (Keith Busch)

    * tag 'pci-v4.19-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (153 commits)
    PCI/AER: Don't clear AER bits if error handling is Firmware-First
    PCI: Limit config space size for Netronome NFP5000
    PCI/MSI: Set IRQCHIP_ONESHOT_SAFE for PCI-MSI irqchips
    PCI/VPD: Check for VPD access completion before checking for timeout
    PCI: Add PCI_DEVICE_DATA() macro to fully describe device ID entry
    PCI: Match Root Port's MPS to endpoint's MPSS as necessary
    PCI: Skip MPS logic for Virtual Functions (VFs)
    PCI: Add function 1 DMA alias quirk for Marvell 88SS9183
    PCI: Check for PCIe Link downtraining
    PCI: Add ACS Redirect disable quirk for Intel Sunrise Point
    PCI: Add device-specific ACS Redirect disable infrastructure
    PCI: Convert device-specific ACS quirks from NULL termination to ARRAY_SIZE
    PCI: Add "pci=disable_acs_redir=" parameter for peer-to-peer support
    PCI: Allow specifying devices using a base bus and path of devfns
    PCI: Make specifying PCI devices in kernel parameters reusable
    PCI: Hide ACS quirk declarations inside PCI core
    PCI: Delay after FLR of Intel DC P3700 NVMe
    PCI: Disable Samsung SM961/PM961 NVMe before FLR
    PCI: Export pcie_has_flr()
    PCI: mvebu: Drop bogus comment above mvebu_pcie_map_registers()
    ...

    Linus Torvalds
     

01 Jul, 2018

1 commit

  • It is reported that commit c62ec4610c40 (PM / core: Fix direct_complete
    handling for devices with no callbacks) introduced a system suspend
    regression on Samsung 305V4A by allowing a PCI bridge (not a PCIe
    port) to stay in D3 over suspend-to-RAM, which is a side effect of
    setting power.direct_complete for the children of that bridge that
    have no PM callbacks.

    On the majority of systems PCI bridges are not allowed to be
    runtime-suspended (the power/control sysfs attribute is set to "on"
    for them by default), but user space can change that setting and if
    it does so and a given bridge has no children with PM callbacks, the
    direct_complete optimization will be applied to it and it will stay
    in suspend over system suspend. Apparently, that confuses the
    platform firmware on the affected machine and that may very well
    happen elsewhere, so avoid the direct_complete optimization for
    PCI bridges with no drivers (if there is a driver, it should take
    care of the PM handling) on suspend-to-RAM altogether (that should
    not matter for suspend-to-idle as platform firmware is not involved
    in it).

    Fixes: c62ec4610c40 (PM / core: Fix direct_complete handling for devices with no callbacks)
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=199941
    Reported-by: n0000b.n000b@gmail.com
    Tested-by: n0000b.n000b@gmail.com
    Reviewed-by: Mika Westerberg
    Acked-by: Bjorn Helgaas
    Cc: 4.15+ # 4.15+
    Signed-off-by: Rafael J. Wysocki

    Rafael J. Wysocki
     

27 Jun, 2018

1 commit

  • The shpchp driver registers for all PCI bridge devices. Its probe method
    should fail if either (1) the bridge doesn't have an SHPC or (2) the OS
    isn't allowed to use it (the platform firmware may be operating the SHPC
    itself).

    Separate these two tests into:

    - A new shpc_capable() that looks for the SHPC hardware and is applicable
    on all systems (ACPI and non-ACPI), and

    - A simplified acpi_get_hp_hw_control_from_firmware() that we call only
    when we already know an SHPC exists and there may be ACPI methods to
    either request permission to use it (_OSC) or transfer control to the
    OS (OSHP).

    acpi_get_hp_hw_control_from_firmware() is implemented when CONFIG_ACPI=y,
    but does nothing if the current platform doesn't support ACPI.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Mika Westerberg

    Bjorn Helgaas
     

05 Jun, 2018

1 commit

  • In the same way we do for pciehp, add shpchp_is_native(), which returns
    true if the bridge should be handled by the native SHPC driver. Then
    convert the driver to use this function.

    Signed-off-by: Mika Westerberg
    Signed-off-by: Bjorn Helgaas

    Mika Westerberg