提交 6889939b 编写于 作者: P Phil Elwell 提交者: Zheng Zengkai

PCI: brcmstb: Add DT property to control L1SS

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

The BRCM PCIe block has controls to enable control of the CLKREQ#
signal by the L1SS, and to gate the refclk with the CLKREQ# input.
These controls are mutually exclusive - the upstream code sets the
latter, but some use cases require the former.

Add a Device Tree property - brcm,enable-l1ss - to switch to the
L1SS configuration.
Signed-off-by: NPhil Elwell <phil@raspberrypi.com>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 1088c5d4
...@@ -114,8 +114,9 @@ ...@@ -114,8 +114,9 @@
PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI + ((win) * 8) PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI + ((win) * 8)
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG 0x4204 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG 0x4204
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK 0x2 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK BIT(1)
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK 0x08000000 #define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK BIT(21)
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK BIT(27)
#define PCIE_INTR2_CPU_BASE 0x4300 #define PCIE_INTR2_CPU_BASE 0x4300
...@@ -276,6 +277,7 @@ struct brcm_pcie { ...@@ -276,6 +277,7 @@ struct brcm_pcie {
struct clk *clk; struct clk *clk;
struct device_node *np; struct device_node *np;
bool ssc; bool ssc;
bool l1ss;
int gen; int gen;
u64 msi_target_addr; u64 msi_target_addr;
struct brcm_msi *msi; struct brcm_msi *msi;
...@@ -1025,12 +1027,25 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie) ...@@ -1025,12 +1027,25 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie)
PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK); PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK);
writel(tmp, base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1); writel(tmp, base + PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1);
/*
* Refclk from RC should be gated with CLKREQ# input when ASPM L0s,L1
* is enabled => setting the CLKREQ_DEBUG_ENABLE field to 1.
*/
tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG); tmp = readl(base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK; if (pcie->l1ss) {
/*
* Enable CLKREQ# signalling include L1 Substate control of
* the CLKREQ# signal and the external reference clock buffer.
* meet requirement for Endpoints that require CLKREQ#
* assertion to clock active within 400ns.
*/
tmp &= ~PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK;
} else {
/*
* Refclk from RC should be gated with CLKREQ# input when
* ASPM L0s,L1 is enabled => setting the CLKREQ_DEBUG_ENABLE
* field to 1.
*/
tmp &= ~PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_L1SS_ENABLE_MASK;
tmp |= PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK;
}
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG); writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
return 0; return 0;
...@@ -1251,6 +1266,7 @@ static int brcm_pcie_probe(struct platform_device *pdev) ...@@ -1251,6 +1266,7 @@ static int brcm_pcie_probe(struct platform_device *pdev)
pcie->gen = (ret < 0) ? 0 : ret; pcie->gen = (ret < 0) ? 0 : ret;
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc"); pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
ret = clk_prepare_enable(pcie->clk); ret = clk_prepare_enable(pcie->clk);
if (ret) { if (ret) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册