Re: [PATCH] PCI: spacemit: Ignore PERST# bit for controllers

From: Encrow Thorne

Date: Wed Nov 04 2026 - 23:23:02 EST


On Wed Nov 4, 2026 at 10:07 PM CST, Ali Tariq wrote:

Hi Ali,
> The k1_pcie_init() does not set PCIE_IGNORE_PERSTN bit of the
> control logic register, which causes controller to reset itself once
> PERST# signal is asserted even when acting as host.
> On Orange Pi RV2 (SpacemiT K1), this resets the controller and wipes
> the IDs. k1_pcie_deinit() leaves PERST# asserted, so when k1_pcie_init()
> runs again, its first DBI access hangs the CPU.
>
> Set PCIE_IGNORE_PERSTN bit of the control logic register of APMU
> in k1_pcie_init() before enabling resources so controllers
> dont end up resetting themselves when PERST# signal is asserted.
>
> Fixes: ff64e078e45f ("PCI: spacemit: Add SpacemiT PCIe host driver")
> Signed-off-by: Ali Tariq <alitariq45892@xxxxxxxxx>
> ---
> Hang log: https://kernelci.cloud-v.co/scheduler/job/420
> Fixed Log: https://kernelci.cloud-v.co/scheduler/job/430
> ---
> drivers/pci/controller/dwc/pcie-spacemit-k1.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/drivers/pci/controller/dwc/pcie-spacemit-k1.c b/drivers/pci/controller/dwc/pcie-spacemit-k1.c
> index 92a71ea90ac3..af6028e8825a 100644
> --- a/drivers/pci/controller/dwc/pcie-spacemit-k1.c
> +++ b/drivers/pci/controller/dwc/pcie-spacemit-k1.c
> @@ -47,6 +47,7 @@
>
> #define PCIE_CONTROL_LOGIC 0x0004
> #define PCIE_SOFT_RESET BIT(0)
> +#define PCIE_IGNORE_PERSTN BIT(2) /* 1: ignore PERST# */
>
> struct k1_pcie {
> struct dw_pcie pci;
> @@ -131,11 +132,19 @@ static int k1_pcie_init(struct dw_pcie_rp *pp)
> struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
> struct k1_pcie *k1 = to_k1_pcie(pci);
> u32 reset_ctrl;
> + u32 ctrl_logic;
> u32 val;
> int ret;
>
> k1_pcie_toggle_soft_reset(k1);
>
> + /*
> + * Ignore the PERST# signal so the controller does not reset
> + * itself when it pulls PERST# low.
> + */
> + ctrl_logic = k1->pmu_off + PCIE_CONTROL_LOGIC;
> + regmap_set_bits(k1->pmu, ctrl_logic, PCIE_IGNORE_PERSTN);
> +
> ret = k1_pcie_enable_resources(k1);
> if (ret)
> return ret;

Thanks for investigating this and submitting a fix.

Our testing also confirms that setting PCIE_IGNORE_PERSTN prevents
PERST# from resetting the local RC and resolves the DBI hang.

I will send a v2 of my earlier patch with an updated explanation
and the test results.

Regards,
Encrow Thorne