From: Jan Kiszka <jan.kiszka@siemens.com>
To: Siddharth Vadapalli <s-vadapalli@ti.com>, huaqian.li@siemens.com
Cc: helgaas@kernel.org, baocheng.su@siemens.com, bhelgaas@google.com,
conor+dt@kernel.org, devicetree@vger.kernel.org,
diogo.ivo@siemens.com, kristo@kernel.org, krzk+dt@kernel.org,
kw@linux.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
lpieralisi@kernel.org, nm@ti.com, robh@kernel.org,
ssantosh@kernel.org, vigneshr@ti.com
Subject: Re: [PATCH v8 4/7] PCI: keystone: Add support for PVU-based DMA isolation on AM654
Date: Tue, 15 Jul 2025 10:55:19 +0200 [thread overview]
Message-ID: <e9716614-1849-4524-af4d-20587df365cf@siemens.com> (raw)
In-Reply-To: <7c8c29ee-2600-4eea-866f-8fe2d533418e@ti.com>
On 25.04.25 18:48, Siddharth Vadapalli wrote:
> On Tue, Apr 22, 2025 at 02:14:03PM +0800, huaqian.li@siemens.com wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> The AM654 lacks an IOMMU, thus does not support isolating DMA requests
>> from untrusted PCI devices to selected memory regions this way. Use
>> static PVU-based protection instead. The PVU, when enabled, will only
>> accept DMA requests that address previously configured regions.
>>
>> Use the availability of a restricted-dma-pool memory region as trigger
>> and register it as valid DMA target with the PVU. In addition, enable
>> the mapping of requester IDs to VirtIDs in the PCI RC. Use only a single
>> VirtID so far, catching all devices. This may be extended later on.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
>> Signed-off-by: Li Hua Qian <huaqian.li@siemens.com>
>> ---
>> drivers/pci/controller/dwc/pci-keystone.c | 106 ++++++++++++++++++++++
>> 1 file changed, 106 insertions(+)
>>
>> diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
>> index 76a37368ae4f..ea2d8768e333 100644
>> --- a/drivers/pci/controller/dwc/pci-keystone.c
>> +++ b/drivers/pci/controller/dwc/pci-keystone.c
>> @@ -19,6 +19,7 @@
>> #include <linux/mfd/syscon.h>
>> #include <linux/msi.h>
>> #include <linux/of.h>
>> +#include <linux/of_address.h>
>> #include <linux/of_irq.h>
>> #include <linux/of_pci.h>
>> #include <linux/phy/phy.h>
>> @@ -26,6 +27,7 @@
>> #include <linux/regmap.h>
>> #include <linux/resource.h>
>> #include <linux/signal.h>
>> +#include <linux/ti-pvu.h>
>>
>> #include "../../pci.h"
>> #include "pcie-designware.h"
>> @@ -111,6 +113,16 @@
>>
>> #define PCI_DEVICE_ID_TI_AM654X 0xb00c
>>
>> +#define KS_PCI_VIRTID 0
>> +
>> +#define PCIE_VMAP_xP_CTRL 0x0
>> +#define PCIE_VMAP_xP_REQID 0x4
>> +#define PCIE_VMAP_xP_VIRTID 0x8
>> +
>> +#define PCIE_VMAP_xP_CTRL_EN BIT(0)
>> +
>> +#define PCIE_VMAP_xP_VIRTID_VID_MASK 0xfff
>> +
>> struct ks_pcie_of_data {
>> enum dw_pcie_device_mode mode;
>> const struct dw_pcie_host_ops *host_ops;
>> @@ -1137,6 +1149,94 @@ static const struct of_device_id ks_pcie_of_match[] = {
>> { },
>> };
>>
>> +static int ks_init_vmap(struct platform_device *pdev, const char *vmap_name)
>> +{
>> + struct resource *res;
>> + void __iomem *base;
>> + u32 val;
>> +
>> + if (!IS_ENABLED(CONFIG_TI_PVU))
>> + return 0;
>> +
>> + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, vmap_name);
>> + base = devm_pci_remap_cfg_resource(&pdev->dev, res);
>> + if (IS_ERR(base))
>> + return PTR_ERR(base);
>> +
>> + writel(0, base + PCIE_VMAP_xP_REQID);
>> +
>> + val = readl(base + PCIE_VMAP_xP_VIRTID);
>> + val &= ~PCIE_VMAP_xP_VIRTID_VID_MASK;
>> + val |= KS_PCI_VIRTID;
>
> While it has been stated that we are going to start off with a single
> VirtID for now and extend it later on, is there an example for how it may
> be extended? The only option I see is that of associating one VirtID for
> Low-Priority (LP) traffic and another for High-Priority (HP) traffic, in
> which case, it might be better to define them upfront and use them like:
> #define KS_PCI_LP_VIRTID 0
> #define KS_PCI_HP_VIRTID 1
Sorry for the late reply, was just reminded of this question:
When trying to design anything beyond the current use case, I would be
struggling right now with the how, simply because we would have no user
of extended APIs around to make sure that the result would be useful.
Can you envision such use cases? If not, I would rather suggest to
postpone any attempts to broaden the API until we have such users.
>
>> + writel(val, base + PCIE_VMAP_xP_VIRTID);
>> +
>> + val = readl(base + PCIE_VMAP_xP_CTRL);
>> + val |= PCIE_VMAP_xP_CTRL_EN;
>> + writel(val, base + PCIE_VMAP_xP_CTRL);
>> +
>> + return 0;
>> +}
>> +
>> +static int ks_init_restricted_dma(struct platform_device *pdev)
>> +{
>> + struct device *dev = &pdev->dev;
>> + struct of_phandle_iterator it;
>> + struct resource phys;
>> + int err;
>> +
>> + if (!IS_ENABLED(CONFIG_TI_PVU))
>> + return 0;
>> +
>> + /* Only process the first restricted DMA pool, more are not allowed */
>> + of_for_each_phandle(&it, err, dev->of_node, "memory-region",
>> + NULL, 0) {
>> + if (of_device_is_compatible(it.node, "restricted-dma-pool"))
>> + break;
>> + }
>> + if (err)
>> + return err == -ENOENT ? 0 : err;
>> +
>> + err = of_address_to_resource(it.node, 0, &phys);
>> + if (err < 0) {
>> + dev_err(dev, "failed to parse memory region %pOF: %d\n",
>> + it.node, err);
>> + return 0;
>> + }
>> +
>> + /* Map all incoming requests on low and high prio port to virtID 0 */
>
> The question I asked above applies here too. How is it planned to extend
> support for multiple VirtIDs, if not on the basis of assigining one
> VirtID to LP traffic and another to HP traffic? Since we have an option
> of using different VirtIDs for LP and HP traffic, why not use it? Is
> there going to be an issue with using VirtID 0 for LP traffic and VirtID 1
> for HP traffic?
>
>> + err = ks_init_vmap(pdev, "vmap_lp");
>> + if (err)
>> + return err;
>> + err = ks_init_vmap(pdev, "vmap_hp");
>> + if (err)
>> + return err;
>> +
>> + /*
>> + * Enforce DMA pool usage with the help of the PVU.
>> + * Any request outside will be dropped and raise an error at the PVU.
>> + */
>> + return ti_pvu_create_region(KS_PCI_VIRTID, &phys);
>
> Same as above, we are passing a single VIRTID and not an array, so it
> isn't clear to me as to how it will be extended in the future.
>
>> +}
>> +
>> +static void ks_release_restricted_dma(struct platform_device *pdev)
>> +{
>> + struct of_phandle_iterator it;
>> + struct resource phys;
>> + int err;
>> +
>> + if (!IS_ENABLED(CONFIG_TI_PVU))
>> + return;
>> +
>> + of_for_each_phandle(&it, err, pdev->dev.of_node, "memory-region",
>> + NULL, 0) {
>> + if (of_device_is_compatible(it.node, "restricted-dma-pool") &&
>> + of_address_to_resource(it.node, 0, &phys) == 0) {
>> + ti_pvu_remove_region(KS_PCI_VIRTID, &phys);
>> + break;
>> + }
>> + }
>> +}
>> +
>> static int ks_pcie_probe(struct platform_device *pdev)
>> {
>> const struct dw_pcie_host_ops *host_ops;
>> @@ -1285,6 +1385,10 @@ static int ks_pcie_probe(struct platform_device *pdev)
>> if (ret < 0)
>> goto err_get_sync;
>>
>> + ret = ks_init_restricted_dma(pdev);
>> + if (ret < 0)
>> + goto err_get_sync;
>> +
>
> Shouldn't the above be moved into the case for "DW_PCIE_RC_TYPE" below? Or
> is this valid even when the SoC is configured to act as an Endpoint?
Fair remark. We currently have no setup for EP usage thus cannot even
say if it would make sense / would work as intended in that case as
well. Probably better to move then.
Jan
>
>> switch (mode) {
>> case DW_PCIE_RC_TYPE:
>> if (!IS_ENABLED(CONFIG_PCI_KEYSTONE_HOST)) {
>> @@ -1366,6 +1470,8 @@ static void ks_pcie_remove(struct platform_device *pdev)
>> int num_lanes = ks_pcie->num_lanes;
>> struct device *dev = &pdev->dev;
>>
>> + ks_release_restricted_dma(pdev);
>> +
>> pm_runtime_put(dev);
>> pm_runtime_disable(dev);
>> ks_pcie_disable_phy(ks_pcie);
>
> Regards,
> Siddharth.
--
Siemens AG, Foundational Technologies
Linux Expert Center
next prev parent reply other threads:[~2025-07-15 8:55 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-09 17:03 [PATCH v6 0/7] soc: ti: Add and use PVU on K3-AM65 for DMA isolation Jan Kiszka
2024-09-09 17:03 ` [PATCH v6 1/7] dt-bindings: soc: ti: Add AM65 peripheral virtualization unit Jan Kiszka
2024-09-09 17:03 ` [PATCH v6 2/7] dt-bindings: PCI: ti,am65: Extend for use with PVU Jan Kiszka
2024-09-18 9:11 ` Krzysztof Kozlowski
2024-09-09 17:03 ` [PATCH v6 3/7] soc: ti: Add IOMMU-like PVU driver Jan Kiszka
2024-09-09 17:03 ` [PATCH v6 4/7] PCI: keystone: Add support for PVU-based DMA isolation on AM654 Jan Kiszka
2024-10-30 20:57 ` Bjorn Helgaas
2024-11-03 6:15 ` Vignesh Raghavendra
2024-11-03 9:50 ` Jan Kiszka
2024-09-09 17:03 ` [PATCH v6 5/7] arm64: dts: ti: k3-am65-main: Add PVU nodes Jan Kiszka
2024-09-09 17:03 ` [PATCH v6 6/7] arm64: dts: ti: k3-am65-main: Add VMAP registers to PCI root complexes Jan Kiszka
2024-09-09 17:04 ` [PATCH v6 7/7] arm64: dts: ti: iot2050: Add overlay for DMA isolation for devices behind PCI RC Jan Kiszka
2024-10-30 20:57 ` [PATCH v6 0/7] soc: ti: Add and use PVU on K3-AM65 for DMA isolation Bjorn Helgaas
2025-04-18 7:30 ` [PATCH v7 0/8] " huaqian.li
2025-04-18 7:30 ` [PATCH v7 1/8] dt-bindings: soc: ti: Add AM65 peripheral virtualization unit huaqian.li
2025-04-18 7:30 ` [PATCH v7 2/8] dt-bindings: PCI: ti,am65: Extend for use with PVU huaqian.li
2025-04-18 8:24 ` Rob Herring (Arm)
2025-04-18 7:30 ` [PATCH v7 3/8] soc: ti: Add IOMMU-like PVU driver huaqian.li
2025-04-18 7:30 ` [PATCH v7 4/8] PCI: keystone: Add support for PVU-based DMA isolation on AM654 huaqian.li
2025-04-18 7:30 ` [PATCH v7 5/8] arm64: dts: ti: k3-am65-main: Add PVU nodes huaqian.li
2025-04-18 7:30 ` [PATCH v7 6/8] arm64: dts: ti: k3-am65-main: Add VMAP registers to PCI root complexes huaqian.li
2025-04-18 7:30 ` [PATCH v7 7/8] arm64: dts: ti: iot2050: Add overlay for DMA isolation for devices behind PCI RC huaqian.li
2025-04-18 7:30 ` [PATCH v7 8/8] swiotlb: Make IO_TLB_SEGSIZE configurable huaqian.li
2025-04-18 13:43 ` [PATCH v7 0/8] soc: ti: Add and use PVU on K3-AM65 for DMA isolation Nishanth Menon
2025-04-18 16:34 ` Bjorn Helgaas
2025-04-18 19:04 ` Nishanth Menon
2025-04-22 5:16 ` Li, Hua Qian
2025-04-22 6:13 ` [PATCH v8 " huaqian.li
2025-04-22 6:14 ` [PATCH v8 1/7] dt-bindings: soc: ti: Add AM65 peripheral virtualization unit huaqian.li
2025-04-22 6:14 ` [PATCH v8 2/7] dt-bindings: PCI: ti,am65: Extend for use with PVU huaqian.li
2025-04-22 6:14 ` [PATCH v8 3/7] soc: ti: Add IOMMU-like PVU driver huaqian.li
2025-04-22 6:14 ` [PATCH v8 4/7] PCI: keystone: Add support for PVU-based DMA isolation on AM654 huaqian.li
2025-04-25 16:48 ` Siddharth Vadapalli
2025-07-15 8:55 ` Jan Kiszka [this message]
2025-07-15 9:15 ` Siddharth Vadapalli
2025-07-16 5:10 ` [PATCH v9 0/8] soc: ti: Add and use PVU on K3-AM65 for DMA isolation huaqian.li
2025-07-16 5:10 ` [PATCH v9 1/7] dt-bindings: soc: ti: Add AM65 peripheral virtualization unit huaqian.li
2025-07-16 5:10 ` [PATCH v9 2/7] dt-bindings: PCI: ti,am65: Extend for use with PVU huaqian.li
2025-07-16 5:10 ` [PATCH v9 3/7] soc: ti: Add IOMMU-like PVU driver huaqian.li
2025-07-16 5:10 ` [PATCH v9 4/7] PCI: keystone: Add support for PVU-based DMA isolation on AM654 huaqian.li
2025-07-16 5:10 ` [PATCH v9 5/7] arm64: dts: ti: k3-am65-main: Add PVU nodes huaqian.li
2025-07-16 5:10 ` [PATCH v9 6/7] arm64: dts: ti: k3-am65-main: Add VMAP registers to PCI root complexes huaqian.li
2025-07-16 5:10 ` [PATCH v9 7/7] arm64: dts: ti: iot2050: Add overlay for DMA isolation for devices behind PCI RC huaqian.li
2025-07-16 6:02 ` [PATCH v9 0/8] soc: ti: Add and use PVU on K3-AM65 for DMA isolation Krzysztof Kozlowski
2025-07-16 6:37 ` Li, Hua Qian
2025-07-16 5:39 ` [PATCH v9 (RESEND) 0/7] " huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 1/7] dt-bindings: soc: ti: Add AM65 peripheral virtualization unit huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 2/7] dt-bindings: PCI: ti,am65: Extend for use with PVU huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 3/7] soc: ti: Add IOMMU-like PVU driver huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 4/7] PCI: keystone: Add support for PVU-based DMA isolation on AM654 huaqian.li
2025-07-16 7:16 ` Siddharth Vadapalli
2025-07-16 5:39 ` [PATCH v9 (RESEND) 5/7] arm64: dts: ti: k3-am65-main: Add PVU nodes huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 6/7] arm64: dts: ti: k3-am65-main: Add VMAP registers to PCI root complexes huaqian.li
2025-07-16 5:39 ` [PATCH v9 (RESEND) 7/7] arm64: dts: ti: iot2050: Add overlay for DMA isolation for devices behind PCI RC huaqian.li
2025-04-22 6:14 ` [PATCH v8 5/7] arm64: dts: ti: k3-am65-main: Add PVU nodes huaqian.li
2025-04-22 6:14 ` [PATCH v8 6/7] arm64: dts: ti: k3-am65-main: Add VMAP registers to PCI root complexes huaqian.li
2025-04-22 6:14 ` [PATCH v8 7/7] arm64: dts: ti: iot2050: Add overlay for DMA isolation for devices behind PCI RC huaqian.li
2025-04-21 15:07 ` [PATCH v7 0/8] soc: ti: Add and use PVU on K3-AM65 for DMA isolation Rob Herring (Arm)
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=e9716614-1849-4524-af4d-20587df365cf@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=baocheng.su@siemens.com \
--cc=bhelgaas@google.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=diogo.ivo@siemens.com \
--cc=helgaas@kernel.org \
--cc=huaqian.li@siemens.com \
--cc=kristo@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=kw@linux.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=nm@ti.com \
--cc=robh@kernel.org \
--cc=s-vadapalli@ti.com \
--cc=ssantosh@kernel.org \
--cc=vigneshr@ti.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).