From: "Troy Mitchell" <troy.mitchell@linux.spacemit.com>
To: "Inochi Amaoto" <inochiama@gmail.com>,
"Troy Mitchell" <troy.mitchell@linux.spacemit.com>,
"Jingoo Han" <jingoohan1@gmail.com>,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Frank Li" <Frank.Li@nxp.com>,
"Niklas Cassel" <cassel@kernel.org>,
"Sherry Sun" <sherry.sun@nxp.com>,
"Arnd Bergmann" <arnd@arndb.de>,
"Christian Bruel" <christian.bruel@foss.st.com>,
"Krishna Chaitanya Chundru" <krishna.chundru@oss.qualcomm.com>,
"Senchuan Zhang" <zhangsenchuan@eswincomputing.com>,
"Alex Elder" <elder@riscstar.com>,
"Xincheng Zhang" <zhangxincheng@ultrarisc.com>,
"Randolph Lin" <randolph@andestech.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>,
"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
"Vidya Sagar" <vidyas@nvidia.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Danilo Krummrich" <dakr@kernel.org>,
"Uwe Kleine-König (The Capable Hub)"
<u.kleine-koenig@baylibre.com>,
"Pengpeng Hou" <pengpeng@iscas.ac.cn>,
"Anirudh Srinivasan" <asrinivasan@oss.tenstorrent.com>,
"Gustavo Pimentel" <gustavo.pimentel@synopsys.com>
Cc: <linux-pci@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<spacemit@lists.linux.dev>, "Yixun Lan" <dlan@gentoo.org>,
"Longbin Li" <looong.bin@gmail.com>
Subject: Re: [PATCH v5 6/6] PCI: spacemit-k1: Add Spacemit K3 PCIe host controller support
Date: Thu, 10 Sep 2026 17:51:04 +0800 [thread overview]
Message-ID: <DLBJKRFHSLZ7.3OKDAR8I7V7JE@linux.spacemit.com> (raw)
In-Reply-To: <aqEOHmlKdKqQWYE8@inochi.infowork>
[-- Attachment #1: Type: text/plain, Size: 4985 bytes --]
On Wed Sep 9, 2026 at 3:51 PM +08, Inochi Amaoto wrote:
> On Mon, Sep 07, 2026 at 09:14:23PM +0800, Troy Mitchell wrote:
>> On Mon, Sep 7, 2026 at 07:26:05PM +0800, Inochi Amaoto wrote:
>> > [...]
>> >
>> > @@ -303,6 +316,116 @@ static int k1_pcie_parse_port(struct k1_pcie *k1)
>> > [...]
>> >
>> > +static int k3_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 = k1->pmu_off + PCIE_CLK_RESET_CONTROL;
>> > + u32 val;
>> > + int ret;
>> > +
>> > + regmap_clear_bits(k1->pmu, reset_ctrl, LTSSM_EN);
>> > +
>> > + k1_pcie_toggle_soft_reset(k1);
>> > +
>> > + /* K3: Set IGNORE_PERSTN and drive PERSTN_OE high (assert reset) */
>> > + regmap_update_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC,
>> > + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE | PCIE_PERSTN_OUT,
>> > + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE);
>> > +
>> > + ret = k1_pcie_enable_resources(k1);
>> > + if (ret)
>> > + goto failed_resources;
>> > +
>> > + regmap_set_bits(k1->pmu, reset_ctrl, PCIE_AUX_PWR_DET);
>> > + regmap_clear_bits(k1->pmu, reset_ctrl, APP_HOLD_PHY_RST);
>> > +
>> > + ret = phy_bulk_init(k1->phy_count, k1->phys);
>> > + if (ret)
>> > + goto failed_phy;
>> > +
>> > + msleep(PCIE_T_PVPERL_MS);
>> > +
>> > + regmap_set_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC,
>> > + PCIE_PERSTN_OUT | PCIE_PERSTN_OE);
>> > +
>>
>> Should we use pci->pe_rst when reset-gpios is provided, and keep the PMU path as
>> a fallback? The SDK handles both cases. The DWC core requests that GPIO with
>> GPIOD_OUT_HIGH, but this path only releases PERST# through the PMU, so an
>> endpoint using the GPIO would remain in reset.
>>
>
> I do not think this should be included in this version. I found PICO-ITX
> has no reset gpio support. This means I can not test this feature.
>
> I suggest adding this function when there is a board using this function.
Agreed, we can defer GPIO reset support until a board needs it and
we can test it. I checked again, and the SDK only added this support
recently. It provides GPIO-controlled PERST# as an alternative to
the native PERST# control through the PMU.
>
>> > [...]
>> >
>> > + /* Finally, as a workaround, disable ASPM L1 */
>> > + k1_pcie_disable_aspm_l1(k1);
>> > +
>> > + return 0;
>> > +
>>
>> Would we also need to configure IOMMU bypass during initialization? The SDK sets
>> the PCIe A/B/C bypass bits in PMUA_PCIE_SUBSYS_MGMT when there is no usable
>> iommu-map. The proposed K3 PCIe DTS has no iommu-map, and I could not find the
>> corresponding bypass setup in this series.
>>
>> Is bypass already guaranteed by firmware or the reset state, or should the
>> driver set it here? My concern is that enumeration could succeed while endpoint
>> DMA still goes through an unconfigured IOMMU.
>>
>
> I think the firmware should mark it bypassed as the default, at least
> I have notice this behavior, but I am not sure whether it is the builtin
> firmware or the uboot do this trick.
I checked the register specification. The PCIe A/B/C IOMMU bypass
bits reset to 1, so bypass is the hardware reset default and does
not require firmware to enable it. That resolves my concern.
>
>> > [...]
>> >
>> > +static int k3_pcie_parse_port(struct k1_pcie *k1)
>> > +{
>> > + u32 status0, status1, status2;
>> > +
>> > + /* This register require a RAW for cleanup */
>> > + status0 = readl_relaxed(k1->link + K3_PHY_AHB_IRQSTATUS_INTX);
>> > + status1 = readl_relaxed(k1->link + INTR_STATUS);
>> > + status2 = readl_relaxed(k1->link + K3_ADDR_INTR_STATUS1);
>> > +
>> > + writel_relaxed(status0, k1->link + K3_PHY_AHB_IRQSTATUS_INTX);
>> > + writel_relaxed(status1, k1->link + INTR_STATUS);
>> > + writel_relaxed(status2, k1->link + K3_ADDR_INTR_STATUS1);
>> > +
>> > + return k1_pcie_parse_port(k1);
>> > +}
>> > +
>>
>> Are these status registers accessible before the controller clocks are enabled
>> and resets released? k3_pcie_parse_port() runs before dw_pcie_host_init(), which
>> calls k3_pcie_init() to enable those resources.
>>
>
> Yes they can. It is something interesting.
>
>> The SDK uses the same ordering, but I am not sure whether it relies on firmware
>> leaving the registers accessible. If so, would it be safer to move this clearing
>> into k3_pcie_init(), after enabling the resources?
>>
>
> In fact, I have no idea about which clock control this MMIO area, if it is dbi
> clock (but I guest it is not), it is kind of weird for this clear and should
> move to the init. Do you have some knowledge on this?
I have not confirmed which clock controls this MMIO region yet.
I have asked our clock team about its clock and reset dependencies
and whether access before resource initialization is guaranteed.
I will follow up once I have clarification.
>
> Regards,
> Inochi
--
Troy Mitchell
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 248 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: "Troy Mitchell" <troy.mitchell@linux.spacemit.com>
To: "Inochi Amaoto" <inochiama@gmail.com>,
"Troy Mitchell" <troy.mitchell@linux.spacemit.com>,
"Jingoo Han" <jingoohan1@gmail.com>,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Frank Li" <Frank.Li@nxp.com>,
"Niklas Cassel" <cassel@kernel.org>,
"Sherry Sun" <sherry.sun@nxp.com>,
"Arnd Bergmann" <arnd@arndb.de>,
"Christian Bruel" <christian.bruel@foss.st.com>,
"Krishna Chaitanya Chundru" <krishna.chundru@oss.qualcomm.com>,
"Senchuan Zhang" <zhangsenchuan@eswincomputing.com>,
"Alex Elder" <elder@riscstar.com>,
"Xincheng Zhang" <zhangxincheng@ultrarisc.com>,
"Randolph Lin" <randolph@andestech.com>,
"Siddharth Vadapalli" <s-vadapalli@ti.com>,
"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
"Vidya Sagar" <vidyas@nvidia.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Danilo Krummrich" <dakr@kernel.org>,
"Uwe Kleine-König (The Capable Hub)"
<u.kleine-koenig@baylibre.com>,
"Pengpeng Hou" <pengpeng@iscas.ac.cn>,
"Anirudh Srinivasan" <asrinivasan@oss.tenstorrent.com>,
"Gustavo Pimentel" <gustavo.pimentel@synopsys.com>
Cc: <linux-pci@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<spacemit@lists.linux.dev>, "Yixun Lan" <dlan@gentoo.org>,
"Longbin Li" <looong.bin@gmail.com>
Subject: Re: [PATCH v5 6/6] PCI: spacemit-k1: Add Spacemit K3 PCIe host controller support
Date: Thu, 10 Sep 2026 17:51:04 +0800 [thread overview]
Message-ID: <DLBJKRFHSLZ7.3OKDAR8I7V7JE@linux.spacemit.com> (raw)
In-Reply-To: <aqEOHmlKdKqQWYE8@inochi.infowork>
[-- Attachment #1.1: Type: text/plain, Size: 4985 bytes --]
On Wed Sep 9, 2026 at 3:51 PM +08, Inochi Amaoto wrote:
> On Mon, Sep 07, 2026 at 09:14:23PM +0800, Troy Mitchell wrote:
>> On Mon, Sep 7, 2026 at 07:26:05PM +0800, Inochi Amaoto wrote:
>> > [...]
>> >
>> > @@ -303,6 +316,116 @@ static int k1_pcie_parse_port(struct k1_pcie *k1)
>> > [...]
>> >
>> > +static int k3_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 = k1->pmu_off + PCIE_CLK_RESET_CONTROL;
>> > + u32 val;
>> > + int ret;
>> > +
>> > + regmap_clear_bits(k1->pmu, reset_ctrl, LTSSM_EN);
>> > +
>> > + k1_pcie_toggle_soft_reset(k1);
>> > +
>> > + /* K3: Set IGNORE_PERSTN and drive PERSTN_OE high (assert reset) */
>> > + regmap_update_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC,
>> > + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE | PCIE_PERSTN_OUT,
>> > + PCIE_IGNORE_PERSTN | PCIE_PERSTN_OE);
>> > +
>> > + ret = k1_pcie_enable_resources(k1);
>> > + if (ret)
>> > + goto failed_resources;
>> > +
>> > + regmap_set_bits(k1->pmu, reset_ctrl, PCIE_AUX_PWR_DET);
>> > + regmap_clear_bits(k1->pmu, reset_ctrl, APP_HOLD_PHY_RST);
>> > +
>> > + ret = phy_bulk_init(k1->phy_count, k1->phys);
>> > + if (ret)
>> > + goto failed_phy;
>> > +
>> > + msleep(PCIE_T_PVPERL_MS);
>> > +
>> > + regmap_set_bits(k1->pmu, k1->pmu_off + PCIE_CONTROL_LOGIC,
>> > + PCIE_PERSTN_OUT | PCIE_PERSTN_OE);
>> > +
>>
>> Should we use pci->pe_rst when reset-gpios is provided, and keep the PMU path as
>> a fallback? The SDK handles both cases. The DWC core requests that GPIO with
>> GPIOD_OUT_HIGH, but this path only releases PERST# through the PMU, so an
>> endpoint using the GPIO would remain in reset.
>>
>
> I do not think this should be included in this version. I found PICO-ITX
> has no reset gpio support. This means I can not test this feature.
>
> I suggest adding this function when there is a board using this function.
Agreed, we can defer GPIO reset support until a board needs it and
we can test it. I checked again, and the SDK only added this support
recently. It provides GPIO-controlled PERST# as an alternative to
the native PERST# control through the PMU.
>
>> > [...]
>> >
>> > + /* Finally, as a workaround, disable ASPM L1 */
>> > + k1_pcie_disable_aspm_l1(k1);
>> > +
>> > + return 0;
>> > +
>>
>> Would we also need to configure IOMMU bypass during initialization? The SDK sets
>> the PCIe A/B/C bypass bits in PMUA_PCIE_SUBSYS_MGMT when there is no usable
>> iommu-map. The proposed K3 PCIe DTS has no iommu-map, and I could not find the
>> corresponding bypass setup in this series.
>>
>> Is bypass already guaranteed by firmware or the reset state, or should the
>> driver set it here? My concern is that enumeration could succeed while endpoint
>> DMA still goes through an unconfigured IOMMU.
>>
>
> I think the firmware should mark it bypassed as the default, at least
> I have notice this behavior, but I am not sure whether it is the builtin
> firmware or the uboot do this trick.
I checked the register specification. The PCIe A/B/C IOMMU bypass
bits reset to 1, so bypass is the hardware reset default and does
not require firmware to enable it. That resolves my concern.
>
>> > [...]
>> >
>> > +static int k3_pcie_parse_port(struct k1_pcie *k1)
>> > +{
>> > + u32 status0, status1, status2;
>> > +
>> > + /* This register require a RAW for cleanup */
>> > + status0 = readl_relaxed(k1->link + K3_PHY_AHB_IRQSTATUS_INTX);
>> > + status1 = readl_relaxed(k1->link + INTR_STATUS);
>> > + status2 = readl_relaxed(k1->link + K3_ADDR_INTR_STATUS1);
>> > +
>> > + writel_relaxed(status0, k1->link + K3_PHY_AHB_IRQSTATUS_INTX);
>> > + writel_relaxed(status1, k1->link + INTR_STATUS);
>> > + writel_relaxed(status2, k1->link + K3_ADDR_INTR_STATUS1);
>> > +
>> > + return k1_pcie_parse_port(k1);
>> > +}
>> > +
>>
>> Are these status registers accessible before the controller clocks are enabled
>> and resets released? k3_pcie_parse_port() runs before dw_pcie_host_init(), which
>> calls k3_pcie_init() to enable those resources.
>>
>
> Yes they can. It is something interesting.
>
>> The SDK uses the same ordering, but I am not sure whether it relies on firmware
>> leaving the registers accessible. If so, would it be safer to move this clearing
>> into k3_pcie_init(), after enabling the resources?
>>
>
> In fact, I have no idea about which clock control this MMIO area, if it is dbi
> clock (but I guest it is not), it is kind of weird for this clear and should
> move to the init. Do you have some knowledge on this?
I have not confirmed which clock controls this MMIO region yet.
I have asked our clock team about its clock and reset dependencies
and whether access before resource initialization is guaranteed.
I will follow up once I have clarification.
>
> Regards,
> Inochi
--
Troy Mitchell
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 248 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2026-09-10 9:51 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 11:25 [PATCH v5 0/6] riscv: spacemit: Add PCIe RC controller support for K3 Inochi Amaoto
2026-09-07 11:25 ` Inochi Amaoto
2026-09-07 11:26 ` [PATCH v5 1/6] PCI: spacemit-k1: Add device data support Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:31 ` sashiko-bot
2026-09-08 10:26 ` Andy Shevchenko
2026-09-08 10:26 ` Andy Shevchenko
2026-09-09 8:00 ` Inochi Amaoto
2026-09-09 8:00 ` Inochi Amaoto
2026-09-10 5:44 ` Yao Zi
2026-09-10 5:44 ` Yao Zi
2026-09-10 6:42 ` Andy Shevchenko
2026-09-10 6:42 ` Andy Shevchenko
2026-09-10 12:15 ` Yao Zi
2026-09-10 12:15 ` Yao Zi
2026-09-07 11:26 ` [PATCH v5 2/6] PCI: spacemit-k1: Add multiple PHY handles support Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:37 ` sashiko-bot
2026-09-08 10:29 ` Andy Shevchenko
2026-09-08 10:29 ` Andy Shevchenko
2026-09-09 8:00 ` Inochi Amaoto
2026-09-09 8:00 ` Inochi Amaoto
2026-09-09 14:27 ` Andy Shevchenko
2026-09-09 14:27 ` Andy Shevchenko
2026-09-07 11:26 ` [PATCH v5 3/6] PCI: spacemit-k1: Add device id update helper Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:31 ` sashiko-bot
2026-09-07 11:26 ` [PATCH v5 4/6] dt-bindings: PCI: snps,dw-pcie: Add msi-parent for MSI handle check Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:35 ` sashiko-bot
2026-09-07 11:26 ` [PATCH v5 5/6] dt-bindings: PCI: spacemit: Introduce Spacemit K3 PCIe host controller Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:38 ` sashiko-bot
2026-09-07 13:08 ` Troy Mitchell
2026-09-07 13:08 ` Troy Mitchell
2026-09-09 8:01 ` Inochi Amaoto
2026-09-09 8:01 ` Inochi Amaoto
2026-09-07 11:26 ` [PATCH v5 6/6] PCI: spacemit-k1: Add Spacemit K3 PCIe host controller support Inochi Amaoto
2026-09-07 11:26 ` Inochi Amaoto
2026-09-07 11:42 ` sashiko-bot
2026-09-07 13:14 ` Troy Mitchell
2026-09-07 13:14 ` Troy Mitchell
2026-09-09 7:51 ` Inochi Amaoto
2026-09-09 7:51 ` Inochi Amaoto
2026-09-10 9:51 ` Troy Mitchell [this message]
2026-09-10 9:51 ` Troy Mitchell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DLBJKRFHSLZ7.3OKDAR8I7V7JE@linux.spacemit.com \
--to=troy.mitchell@linux.spacemit.com \
--cc=Frank.Li@nxp.com \
--cc=alex@ghiti.fr \
--cc=andriy.shevchenko@linux.intel.com \
--cc=aou@eecs.berkeley.edu \
--cc=arnd@arndb.de \
--cc=asrinivasan@oss.tenstorrent.com \
--cc=bhelgaas@google.com \
--cc=cassel@kernel.org \
--cc=christian.bruel@foss.st.com \
--cc=conor+dt@kernel.org \
--cc=dakr@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlan@gentoo.org \
--cc=dlan@kernel.org \
--cc=elder@riscstar.com \
--cc=gustavo.pimentel@synopsys.com \
--cc=inochiama@gmail.com \
--cc=jingoohan1@gmail.com \
--cc=krishna.chundru@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=kwilczynski@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=looong.bin@gmail.com \
--cc=lpieralisi@kernel.org \
--cc=mani@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=palmer@dabbelt.com \
--cc=pengpeng@iscas.ac.cn \
--cc=pjw@kernel.org \
--cc=randolph@andestech.com \
--cc=robh@kernel.org \
--cc=s-vadapalli@ti.com \
--cc=sherry.sun@nxp.com \
--cc=spacemit@lists.linux.dev \
--cc=u.kleine-koenig@baylibre.com \
--cc=vidyas@nvidia.com \
--cc=zhangsenchuan@eswincomputing.com \
--cc=zhangxincheng@ultrarisc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.