28 Apr, 2017

1 commit

  • * pci/ioremap:
    PCI: versatile: Update PCI config space remap function
    PCI: keystone-dw: Update PCI config space remap function
    PCI: layerscape: Update PCI config space remap function
    PCI: hisi: Update PCI config space remap function
    PCI: tegra: Update PCI config space remap function
    PCI: xgene: Update PCI config space remap function
    PCI: armada8k: Update PCI config space remap function
    PCI: designware: Update PCI config space remap function
    PCI: iproc-platform: Update PCI config space remap function
    PCI: qcom: Update PCI config space remap function
    PCI: rockchip: Update PCI config space remap function
    PCI: spear13xx: Update PCI config space remap function
    PCI: xilinx-nwl: Update PCI config space remap function
    PCI: xilinx: Update PCI config space remap function
    PCI: ECAM: Map config region with pci_remap_cfgspace()
    PCI: Implement devm_pci_remap_cfgspace()
    devres: fix devm_ioremap_*() offset parameter kerneldoc description
    ARM: Implement pci_remap_cfgspace() interface
    ARM64: Implement pci_remap_cfgspace() interface
    linux/io.h: Add pci_remap_cfgspace() interface
    PCI: Remove __weak tag from pci_remap_iospace()

    Bjorn Helgaas
     

25 Apr, 2017

1 commit

  • PCI configuration space should be mapped with a memory region type that
    generates on the CPU host bus non-posted write transations. Update the
    driver to use the devm_pci_remap_cfg* interface to make sure the correct
    memory mappings for PCI configuration space are used.

    Signed-off-by: Lorenzo Pieralisi
    Signed-off-by: Bjorn Helgaas
    Cc: Wenrui Li
    Cc: Shawn Lin

    Lorenzo Pieralisi
     

22 Apr, 2017

1 commit

  • Now that we've exported pci_remap_iospace() and added proper remove()
    support, there's no reason this can't be a loadable module.

    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Brian Norris
     

21 Apr, 2017

1 commit

  • Currently, if we try to unbind the platform device, the remove will
    succeed, but the removal won't undo most of the registration, leaving
    partially-configured PCI devices in the system.

    This allows, for example, a simple 'lspci' to crash the system, as it will
    try to touch the freed (via devm_*) driver structures, e.g., on RK3399:

    # echo f8000000.pcie > /sys/bus/platform/drivers/rockchip-pcie/unbind
    # lspci

    So let's implement device remove().

    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Brian Norris
     

12 Apr, 2017

1 commit

  • All platforms using Rockchip use a common clock for the Root Port and the
    slot connected to it. Indicate this by setting the Slot Clock Configuration
    (PCI_EXP_LNKSTA_SLC) bit in the Root Port's Link Status.

    Per the Implementation Note in the spec (PCIe r3.1, sec 7.8.7), if the
    downstream component also sets PCI_EXP_LNKSTA_SLC, software may set the
    Common Clock Configuration (PCI_EXP_LNKCTL_CCC) bits on both ends of the
    Link. This is done by pcie_aspm_configure_common_clock().

    Signed-off-by: Shawn Lin
    Cc: Brian Norris
    Cc: jeffy.chen

    Shawn Lin
     

04 Apr, 2017

1 commit


24 Mar, 2017

3 commits

  • There's no way to get here with 'err != 0'. Just return 0 to be more
    obvious and prevent future changes from accidentally erroring out here
    without going through the right error paths.

    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas

    Brian Norris
     
  • If regulator_get_current_limit() returns 0 or error, return early so the
    body of the function doesn't have to be indented as the body of an "if"
    statement. No functional change intended.

    Signed-off-by: Bjorn Helgaas

    Bjorn Helgaas
     
  • regulator_get_current_limit() can return negative error codes. We saved
    the return value in an unsigned "curr", and a subsequent check interpreted
    a negative error code as a positive (invalid) current limit.

    Save the return code as a signed value, which avoids messages like this,
    seen on Samsung Chromebook Plus:

    rockchip-pcie f8000000.pcie: invalid power supply

    [bhelgaas: changelog]
    Fixes: 4816c4c7b82b ("PCI: rockchip: Provide captured slot power limit and scale")
    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Brian Norris
     

18 Feb, 2017

1 commit

  • The TRM says the vendor ID in the RC's configure space can be rewritten
    and the value must be the same as the value read from the local core
    configure space. But we misread that and didn't notice it before. Actually
    we should only able to rewrite it from the local core configure space.

    Fix that issue to make lspci show the correct IP vendor infomation.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     

11 Feb, 2017

1 commit

  • rockchip_pcie_probe() calls of_pci_get_host_bridge_resources() to parse
    resources from DT and build a resource list. The caller is responsible for
    disposing of the resource list. This is normally done by
    pci_release_host_bridge_dev() when the host bridge is removed.

    If the host bridge probe fails, dispose of the resource list in the probe
    error path.

    [bhelgaas: changelog]
    Suggested-by: Bjorn Helgaas
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     

31 Jan, 2017

2 commits

  • When CONFIG_PM_SLEEP is disabled, we get harmless build warnings:

    host/pcie-rockchip.c:1267:12: error: 'rockchip_pcie_resume_noirq' defined but not used [-Werror=unused-function]
    host/pcie-rockchip.c:1240:12: error: 'rockchip_pcie_suspend_noirq' defined but not used [-Werror=unused-function]

    Marking both functions as __maybe_unused avoids the warning without the
    need for #ifdef around them.

    Fixes: 013dd3d5e183 ("PCI: rockchip: Add system PM support")
    Signed-off-by: Arnd Bergmann
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Arnd Bergmann
     
  • Use readl_poll_timeout() instead of open-coding it.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     

13 Jan, 2017

1 commit

  • Rockchip's RC produces a 100MHz reference clock but there are two methods
    for the PHY to generate it:

    (1) Use the system PLL to generate a 100MHz clock. The PHY will relock
    it, filter signal noise, and output the reference clock. ASPM L0s
    works correctly, but circuit noise issues make it difficult to pass
    the TX compatibility test.

    (2) Share the SoC's 24MHZ crystal oscillator with the PHY and force the
    PHY's PLL to generate 100MHz internally. In this case, exit from
    ASPM L0s sometimes fails due to a design error in the RC receiver
    circuit. Even if we use extended-synch, the PHY sometimes fails to
    relock the bits from FTS, which will hang the system.

    We want the flexibility to use both clocking methods, so add a DT property,
    "aspm-no-l0s". If that's present, disable L0s to avoid the issues with
    case (2).

    [bhelgaas: changelog]
    Reported-by: Jeffy Chen
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Brian Norris
    Acked-by: Rob Herring

    Shawn Lin
     

12 Jan, 2017

1 commit

  • Add system PM support for Rockchip's RC. For pre S3, the EP is configured
    into D3 state which guarantees the link state should be in L1. So we could
    send PME_Turn_Off message to the EP and wait for its ACK to make the link
    state into L2 or L3 without the aux-supply. This could help save more
    power which I think should be very important for mobile devices.

    As note that there is a 5s timeout for RC to wait for the PMA_ACK after
    sending PME_Turn_Off. Technically it should depend on the hierarchy of
    devices but seems PCIe core framework doesn't handle the L2/3 for S3 at
    all. So that means we should presume to set a default value for PME_ACK.
    From the bug report[1], we could find a statement that Microsoft Windows
    versions typically wait for 5 seconds. So we are prone to take 5s for this
    timeout here.

    [1] https://lists.launchpad.net/kernel-packages/msg123315.html
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Brian Norris

    Shawn Lin
     

13 Dec, 2016

1 commit

  • * pci/host-rockchip:
    PCI: rockchip: Move the deassert of pm/aclk/pclk after phy_init()
    PCI: rockchip: Split out rockchip_cfg_atu()
    PCI: rockchip: Clean up bit definitions for PCIE_RC_CONFIG_LCS
    PCI: rockchip: Correct the use of FTS mask
    PCI: rockchip: Remove the pointer to L1 substate cap
    PCI: rockchip: Specify the link capability
    PCI: rockchip: Fix negotiated lanes calculation
    PCI: rockchip: Add Kconfig COMPILE_TEST
    PCI: rockchip: Mark RC as common clock architecture
    PCI: rockchip: Provide captured slot power limit and scale
    PCI: rockchip: Add three new resets as required properties
    PCI: Don't attempt to claim shadow copies of ROM
    PCI: designware: Check for iATU unroll support after initializing host
    PCI: qcom: Fix pp->dev usage before assignment
    PCI: designware-plat: Update author email address
    PCI: layerscape: Fix drvdata usage before assignment
    PCI: designware-plat: Change maintainer to Jose Abreu

    Bjorn Helgaas
     

08 Dec, 2016

9 commits

  • Move deassert of pm/aclk/pclk after phy_init() as we want to optimize the
    logic of reset control and reuse rockchip_pcie_init_port() later which
    should fully follow the cold boot procedure of ROM code.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Brian Norris

    Shawn Lin
     
  • Split out a new function, rockchip_cfg_atu(), in order to re-configure the
    ATU when missing these information after wakeup from S3.

    [bhelgaas: add "dev" temporary, return 0 when known]
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Brian Norris

    Shawn Lin
     
  • PCIE_RC_CONFIG_LCS contains control and status bits specific to the PCIe
    link. The layout for this register looks the same as the existing
    PCI_EXP_LNKCTL and PCI_EXP_LNKSTA. So let's reuse them.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • We're trying to mask out bits[23:8] while retaining [32:24, 7:0], but we're
    doing the inverse. That doesn't have too much effect, since we're setting
    all the [23:8] bits to 1, and the other bits are only relevant for modes
    we're currently not using. But we should get this right.

    Fixes: ca1989084054 ("PCI: rockchip: Fix wrong transmitted FTS count")
    Signed-off-by: Brian Norris
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Brian Norris
     
  • Per the errata of TRM, the RC can't support L1 substate, so remove the L1
    substate cap as well as operation for PCIE_RC_CONFIG_L1_SUBSTATE_CTRL2.

    Tested-by: Brian Norris
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • rk3399 supports PCIe 2.x link speeds marginally at best, and on some
    boards, the link won't train at 5 GT/s at all. Rather than sacrifice 500ms
    waiting for training that will never happen, let's use the helper function,
    of_pci_get_max_link_speed(), to get the max link speed from DT and specify
    link capability.

    Signed-off-by: Brian Norris
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • The calculation of negotiated lanes is wrong: it should be shifted by
    PCIE_CORE_PL_CONF_LANE_SHIFT, but it is shifted by
    PCIE_CORE_PL_CONF_LANE_MASK instead. Let's fix it.

    Fixes: e77f847df54c ("PCI: rockchip: Add Rockchip PCIe controller support")
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • The default value of common clock configuration is zero indicating
    Rockchip's RC is using asynchronous clock architecture but actually we are
    using common clock. This will confuse some EP drivers if they need some
    different settings referring to this value.

    Set the Common Clock Configuration bit in the Link Control Register.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • If vpcie3v3 is available, we could provide these information via RC's
    configure register to make EP able to know the power limit.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     

22 Nov, 2016

1 commit

  • Hardware that supports only 32-bit config writes is not spec-compliant.
    For example, if software performs a 16-bit write, we must do a 32-bit read,
    merge in the 16 bits we intend to write, followed by a 32-bit write. If
    the 16 bits we *don't* intend to write happen to have any RW1C (write-one-
    to-clear) bits set, we just inadvertently cleared something we shouldn't
    have.

    Add a rate-limited warning when we do sub-32 bit config writes. Remove
    similar probe-time warnings from some of the affected host bridge drivers.

    Signed-off-by: Bjorn Helgaas
    Enthusiastically-Acked-by: Russell King
    Acked-by: Shawn Lin # rockchip
    Acked-by: Thierry Reding

    Bjorn Helgaas
     

11 Nov, 2016

1 commit

  • pm_rst, aclk_rst, pclk_rst was controlled by ROM code so the software
    wasn't needed to control it again in theory. But it didn't work properly,
    so we do need to do it again and add enough delay between the assert of
    pm_rst and the deassert of pm_rst. The Soc intergrated with this
    controller, rk3399, is still under MP test internally, so the backward
    compatibility won't be a big deal.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Heiko Stuebner
    Acked-by: Rob Herring

    Shawn Lin
     

12 Oct, 2016

2 commits


05 Oct, 2016

3 commits

  • If the expected number of FTS aren't received by RC when exiting from L0s,
    the LTSSM will fall into recover state, which means it will need to send TS
    for retraining which makes the latency of exiting from L0s a little longer
    than expected. This issue is caused by an incorrect reset value of FTS
    count on PLC1 register (offset 0x4). The expected value for Gen1/2 should
    be more than 240 and we may leave a little margin here. Fix this before
    starting Gen1 training which will make TS1 contain the correct FTS count.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • Per TRM, we need to deassert the four reset pins simultaneously. Currently
    the reset framework doesn't support that so we did it one by one. It seems
    no side effect found but it does impact the state machine of controller, so
    sometimes the change speed bit is not set when sending training sequence
    from recover state. After the silicon RTL review from SoC guys, we don't
    need to do the sequence recommended by TRM, and could just move the
    deassert of mgmt_sticky_rst to the first place.

    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas

    Shawn Lin
     
  • Increase the likelihood of link state to automatically go to L1 and save
    some power.

    The default credit update interval of 7.5 us results in the rootport
    sending UpdateFC-P and UpdateFC-NP packets too often, thus resulting in the
    link never going to L1, and always staying in L0/L0s. The value 24 us was
    chosen after some experiments and peeking over the PCIe bus to see that we
    do enter L1 substate when there is not enough traffic on the PCIe bus.

    Signed-off-by: Rajat Jain
    Signed-off-by: Bjorn Helgaas
    Acked-by: Shawn Lin

    Rajat Jain
     

04 Sep, 2016

1 commit

  • Add support for the Rockchip PCIe controller found on RK3399 SoC platform.

    [bhelgaas: fold in Brian's rockchip_pcie_client_irq_handler() OR fix, other
    fixes and cleanups from Guenter Roeck and me,
    uninitialized variable fix from Arnd Bergmann ]
    Signed-off-by: Shawn Lin
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Brian Norris

    Shawn Lin