lkml.org 
[lkml]   [2019]   [Apr]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 1/4] PCI: hotplug: Add support for disabling in-band presence
    Date
    The presence detect state (PDS) is normally a logical or of in-band
    and out-of-band presence. In PCIe 4.0, there is the option to disable
    in-band presence so that the PDS bit always reflects the state of the
    out-of-band presence.

    The recommendation of the PCIe spec is to disable in-band presence
    whenever supported.

    Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
    ---
    drivers/pci/hotplug/pciehp.h | 1 +
    drivers/pci/hotplug/pciehp_hpc.c | 9 ++++++++-
    include/uapi/linux/pci_regs.h | 2 ++
    3 files changed, 11 insertions(+), 1 deletion(-)

    diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
    index 506e1d923a1f..6f729ce4a7b9 100644
    --- a/drivers/pci/hotplug/pciehp.h
    +++ b/drivers/pci/hotplug/pciehp.h
    @@ -98,6 +98,7 @@ struct controller {
    struct pcie_device *pcie;

    u32 slot_cap; /* capabilities and quirks */
    + unsigned int inband_presence_disabled:1;

    u16 slot_ctrl; /* control register access */
    struct mutex ctrl_lock;
    diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
    index 6a2365cd794e..078d78a7437d 100644
    --- a/drivers/pci/hotplug/pciehp_hpc.c
    +++ b/drivers/pci/hotplug/pciehp_hpc.c
    @@ -837,7 +837,7 @@ static inline void dbg_ctrl(struct controller *ctrl)
    struct controller *pcie_init(struct pcie_device *dev)
    {
    struct controller *ctrl;
    - u32 slot_cap, link_cap;
    + u32 slot_cap, slot_cap2, link_cap;
    u8 poweron;
    struct pci_dev *pdev = dev->port;
    struct pci_bus *subordinate = pdev->subordinate;
    @@ -895,6 +895,13 @@ struct controller *pcie_init(struct pcie_device *dev)
    FLAG(link_cap, PCI_EXP_LNKCAP_DLLLARC),
    pdev->broken_cmd_compl ? " (with Cmd Compl erratum)" : "");

    + pcie_capability_read_dword(pdev, PCI_EXP_SLTCAP2, &slot_cap2);
    + if (slot_cap2 & PCI_EXP_SLTCAP2_IBPD) {
    + pcie_write_cmd_nowait(ctrl, PCI_EXP_SLTCTL_IBPD_DISABLE,
    + PCI_EXP_SLTCTL_IBPD_DISABLE);
    + ctrl->inband_presence_disabled = 1;
    + }
    +
    /*
    * If empty slot's power status is on, turn power off. The IRQ isn't
    * requested yet, so avoid triggering a notification with this command.
    diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
    index 5c98133f2c94..c7afdc4c098c 100644
    --- a/include/uapi/linux/pci_regs.h
    +++ b/include/uapi/linux/pci_regs.h
    @@ -597,6 +597,7 @@
    #define PCI_EXP_SLTCTL_PWR_OFF 0x0400 /* Power Off */
    #define PCI_EXP_SLTCTL_EIC 0x0800 /* Electromechanical Interlock Control */
    #define PCI_EXP_SLTCTL_DLLSCE 0x1000 /* Data Link Layer State Changed Enable */
    +#define PCI_EXP_SLTCTL_IBPD_DISABLE 0x4000 /* In-band PD disable */
    #define PCI_EXP_SLTSTA 26 /* Slot Status */
    #define PCI_EXP_SLTSTA_ABP 0x0001 /* Attention Button Pressed */
    #define PCI_EXP_SLTSTA_PFD 0x0002 /* Power Fault Detected */
    @@ -667,6 +668,7 @@
    #define PCI_EXP_LNKSTA2 50 /* Link Status 2 */
    #define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 52 /* v2 endpoints with link end here */
    #define PCI_EXP_SLTCAP2 52 /* Slot Capabilities 2 */
    +#define PCI_EXP_SLTCAP2_IBPD 0x0001 /* In-band PD Disable Supported */
    #define PCI_EXP_SLTCTL2 56 /* Slot Control 2 */
    #define PCI_EXP_SLTSTA2 58 /* Slot Status 2 */

    --
    2.20.1
    \
     
     \ /
      Last update: 2019-04-19 20:20    [W:5.838 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site