[PATCH] PCI: rockchip: Mark SLC bit as well as CCC bit for RC

Bjorn Helgaas helgaas at kernel.org
Sat Apr 1 08:14:25 PDT 2017


On Fri, Mar 17, 2017 at 03:24:53PM +0800, Shawn Lin wrote:
> lspci traces CCC to see if the end-2-end supports common
> clock, so the current code should work as we mark the CCC bit
> of RC. 

I assume you're talking about lspci code here, where the bit is called
PCI_EXP_LNKCTL_CLOCK.  The only use of PCI_EXP_LNKCTL_CLOCK in lspci
is to decode it in cap_express_link().  I don't know what you mean by
"tracing CCC", since lspci only decodes registers of one device at a
time; it never follows the hierarchy from an endpoint up to a root
port.

I'm not sure how this lspci information is relevant to this patch.

> However, ASPM code actually check SLC bit of RC and try to
> compare it with the downstream components' SLC instead. 

Here I think you're talking about pcie_aspm_configure_common_clock()
in Linux.  That looks at PCI_EXP_LNKSTA_SLC on both ends of a link.
If PCI_EXP_LNKSTA_SLC is set at both ends, we set PCI_EXP_LNKCTL_CCC
on both ends; otherwise we clear PCI_EXP_LNKCTL_CCC on both ends.
This follows the Implementation Note in PCIe r3.1, sec 7.8.7.

Per that note, PCI_EXP_LNKSTA_SLC in the root port tells us whether
the port "uses a clock that has a common source ... to the clock
signal provided on the slot" below the port.

This patch sets PCI_EXP_LNKSTA_SLC based on your knowledge of the
platform topology, i.e., that the root port clock and the slot clock
have the same source.  I assume this is *always* the case for every
possible platform using Rockchip?

If so, just say that, and you can go on to say that this enables the
ASPM code to set PCI_EXP_LNKCTL_CCC if the downstream end also sets
PCI_EXP_LNKSTA_SLC to indicate that it uses the clock provided on the
slot, e.g., something like this:

  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().

> So when
> enabling ASPM, CCC will be cleared after failing to match SLC with
> the corresponding bit of downstream components. On one hand, from the
> code of pcie_aspm_configure_common_clock, we could find that what we
> actually need to set is SLC. 

> On the other hand, we should also guarantee
> that CCC should be marked w/o supporting ASPM. 

This patch doesn't change anything with PCI_EXP_LNKCTL_CCC.  I'd
suggest that we should *not* set it here because we have no idea what
(if anything) is at the other end of the link.  Per the implementation
note, I think we should only set PCI_EXP_LNKCTL_CCC if both ends of
the link have PCI_EXP_LNKSTA_SLC set.

Are you suggesting that we should set PCI_EXP_LNKCTL_CCC on both ends
of the link whenever possible, and that today we don't do that unless
ASPM is enabled?  That sounds plausible to me, but that would be a
generic PCIe enhancement, not anything Rockchip-specific, and of
course, this patch doesn't make that happen.

> This patch fixes this
> issue.
> 
> Cc: Brian Norris <briannorris at chromium.org>
> Cc: jeffy.chen <jeffy.chen at rock-chips.com>
> Signed-off-by: Shawn Lin <shawn.lin at rock-chips.com>
> ---
> 
>  drivers/pci/host/pcie-rockchip.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/host/pcie-rockchip.c b/drivers/pci/host/pcie-rockchip.c
> index 26ddd35..7cd4d5c 100644
> --- a/drivers/pci/host/pcie-rockchip.c
> +++ b/drivers/pci/host/pcie-rockchip.c
> @@ -596,7 +596,7 @@ static int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
>  
>  	/* Set RC's clock architecture as common clock */
>  	status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_LCS);
> -	status |= PCI_EXP_LNKCTL_CCC;
> +	status |= (PCI_EXP_LNKCTL_CCC | PCI_EXP_LNKSTA_SLC << 16);
>  	rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_LCS);
>  
>  	/* Enable Gen1 training */
> -- 
> 1.9.1
> 
> 



More information about the Linux-rockchip mailing list