[PATCH v2] PCI: dw-rockchip: Enable L0S capability

Shawn Lin shawn.lin at rock-chips.com
Fri Apr 11 02:02:58 PDT 2025


在 2025/04/11 星期五 16:51, Niklas Cassel 写道:
> Hello Shawn,
> 
> On Fri, Apr 11, 2025 at 08:48:01AM +0800, Shawn Lin wrote:
>> L0S capability isn't enabled on all SoCs by default, so enabling it
>> in order to make ASPM L0S work on Rockchip platforms. We have been
>> testing it for quite a long time and found the default FTS number
>> provided by DWC core doesn't work stable and make LTSSM switch between
>> L0S and Recovery, leading to long exit latency, even fail to link sometimes.
>> So override it to the max 255 which seems work fine under test for both PHYs
>> used by Rockchip platforms.
>>
>> Signed-off-by: Shawn Lin <shawn.lin at rock-chips.com>
>> ---
>>
>> Changes in v2:
>> - Move n_fts to probe function
>> - rewrite the commit message
>>
>>   drivers/pci/controller/dwc/pcie-dw-rockchip.c | 14 ++++++++++++++
>>   1 file changed, 14 insertions(+)
>>
>> diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> index 21dc99c..c397f3a 100644
>> --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
>> @@ -185,6 +185,17 @@ static int rockchip_pcie_link_up(struct dw_pcie *pci)
>>   static int rockchip_pcie_start_link(struct dw_pcie *pci)
>>   {
>>   	struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
>> +	u32 cap, lnkcap;
>> +
>> +	/* Enable L0S capability for all SoCs */
>> +	cap = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
>> +	if (cap) {
>> +		lnkcap = dw_pcie_readl_dbi(pci, cap + PCI_EXP_LNKCAP);
>> +		lnkcap |= PCI_EXP_LNKCAP_ASPM_L0S;
>> +		dw_pcie_dbi_ro_wr_en(pci);
>> +		dw_pcie_writel_dbi(pci, cap + PCI_EXP_LNKCAP, lnkcap);
>> +		dw_pcie_dbi_ro_wr_dis(pci);
>> +	}
> 
> I think it looks wrong to have this in _start_link().
> Why not put this code in a new "_enable_l0s() function, and call it from:
> rockchip_pcie_ep_init() and rockchip_pcie_host_init().
> 

Will do.

> When looking at this, we probably should also move the
> rockchip_pcie_ep_hide_broken_ats_cap_rk3588() call from _pre_init() to _init(),
> because if there is a core reset, _init() is called again, but _pre_init() is
> not.

That's a good point.

> 
> 
>>   
>>   	/* Reset device */
>>   	gpiod_set_value_cansleep(rockchip->rst_gpio, 0);
>> @@ -598,6 +609,9 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
>>   	rockchip->pci.dev = dev;
>>   	rockchip->pci.ops = &dw_pcie_ops;
>>   	rockchip->data = data;
> 
> Perhaps add a newline here.
> 
>> +	/* Default fts number(210) is broken, override it to 255 */
> 
> Perhaps add a space between "number" and "(".
> Perhaps write it as N_FTS instead of fts.
> Perhaps use "value" instead of "number".
> 
> ie.
> 
> /* Default N_FTS value (210) is broken, ... */
> 

Sure.

> 
> 
> Kind regards,
> Niklas
> 
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
> 



More information about the Linux-rockchip mailing list