All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Richard Zhu" <hongxing.zhu@nxp.com>,
	"Lucas Stach" <l.stach@pengutronix.de>,
	"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
	"Krzysztof Wilczyński" <kw@linux.com>,
	"Rob Herring" <robh@kernel.org>,
	"Shawn Guo" <shawnguo@kernel.org>,
	"Sascha Hauer" <s.hauer@pengutronix.de>,
	"Pengutronix Kernel Team" <kernel@pengutronix.de>,
	"Fabio Estevam" <festevam@gmail.com>,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, imx@lists.linux.dev,
	alyssa@rosenzweig.io, bpf@vger.kernel.org, broonie@kernel.org,
	jgg@ziepe.ca, joro@8bytes.org, lgirdwood@gmail.com,
	p.zabel@pengutronix.de, robin.murphy@arm.com, will@kernel.org
Subject: Re: [PATCH v3 2/2] PCI: imx6: Add IOMMU and ITS MSI support for i.MX95
Date: Sat, 02 Nov 2024 22:18:02 +0000	[thread overview]
Message-ID: <87fro9th45.wl-maz@kernel.org> (raw)
In-Reply-To: <ZyZg1nlSPf5rvm8q@lizhi-Precision-Tower-5810>

On Sat, 02 Nov 2024 17:26:46 +0000,
Frank Li <Frank.li@nxp.com> wrote:
> 
> On Sat, Nov 02, 2024 at 05:19:37PM +0530, Manivannan Sadhasivam wrote:
> > On Thu, Oct 24, 2024 at 06:34:45PM -0400, Frank Li wrote:
> > > For the i.MX95, configuration of a LUT is necessary to convert Bus Device
> > > Function (BDF) to stream IDs, which are utilized by both IOMMU and ITS.
> > > This involves examining the msi-map and smmu-map to ensure consistent
> > > mapping of PCI BDF to the same stream IDs. Subsequently, LUT-related
> > > registers are configured. In the absence of an msi-map, the built-in MSI
> > > controller is utilized as a fallback.
> > >
> > > Additionally, register a PCI bus callback function enable_device() and
> > > disable_device() to config LUT when enable a new PCI device.
> > >
> >
> > Callbacks are not *addition*, but it is how you are implementing the LUT
> > configuration. Please reword it so.
> >
> > > Signed-off-by: Frank Li <Frank.Li@nxp.com>
> > > ---
> > > Change from v2 to v3
> > > - Use the "target" argument of of_map_id()
> > > - Check if rid already in lut table when enable device
> > >
> > > change from v1 to v2
> > > - set callback to pci_host_bridge instead pci->ops.
> > > ---
> > >  drivers/pci/controller/dwc/pci-imx6.c | 159 +++++++++++++++++++++++++++++++++-
> > >  1 file changed, 158 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c
> > > index 94f3411352bf0..95f06bfb9fc5e 100644
> > > --- a/drivers/pci/controller/dwc/pci-imx6.c
> > > +++ b/drivers/pci/controller/dwc/pci-imx6.c
> > > @@ -55,6 +55,22 @@
> > >  #define IMX95_PE0_GEN_CTRL_3			0x1058
> > >  #define IMX95_PCIE_LTSSM_EN			BIT(0)
> > >
> > > +#define IMX95_PE0_LUT_ACSCTRL			0x1008
> > > +#define IMX95_PEO_LUT_RWA			BIT(16)
> > > +#define IMX95_PE0_LUT_ENLOC			GENMASK(4, 0)
> > > +
> > > +#define IMX95_PE0_LUT_DATA1			0x100c
> > > +#define IMX95_PE0_LUT_VLD			BIT(31)
> > > +#define IMX95_PE0_LUT_DAC_ID			GENMASK(10, 8)
> > > +#define IMX95_PE0_LUT_STREAM_ID			GENMASK(5, 0)
> > > +
> > > +#define IMX95_PE0_LUT_DATA2			0x1010
> > > +#define IMX95_PE0_LUT_REQID			GENMASK(31, 16)
> > > +#define IMX95_PE0_LUT_MASK			GENMASK(15, 0)
> > > +
> > > +#define IMX95_SID_MASK				GENMASK(5, 0)
> > > +#define IMX95_MAX_LUT				32
> > > +
> > >  #define to_imx_pcie(x)	dev_get_drvdata((x)->dev)
> > >
> > >  enum imx_pcie_variants {
> > > @@ -82,6 +98,7 @@ enum imx_pcie_variants {
> > >  #define IMX_PCIE_FLAG_HAS_PHY_RESET		BIT(5)
> > >  #define IMX_PCIE_FLAG_HAS_SERDES		BIT(6)
> > >  #define IMX_PCIE_FLAG_SUPPORT_64BIT		BIT(7)
> > > +#define IMX_PCIE_FLAG_HAS_LUT			BIT(8)
> > >
> > >  #define imx_check_flag(pci, val)	(pci->drvdata->flags & val)
> > >
> > > @@ -134,6 +151,7 @@ struct imx_pcie {
> > >  	struct device		*pd_pcie_phy;
> > >  	struct phy		*phy;
> > >  	const struct imx_pcie_drvdata *drvdata;
> > > +	struct mutex		lock;
> >
> > Please add a comment on what the lock is guarding.
> >
> > >  };
> > >
> > >  /* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */
> > > @@ -925,6 +943,137 @@ static void imx_pcie_stop_link(struct dw_pcie *pci)
> > >  	imx_pcie_ltssm_disable(dev);
> > >  }
> > >
> > > +static int imx_pcie_add_lut(struct imx_pcie *imx_pcie, u16 reqid, u8 sid)
> >
> > s/reqid/rid
> >
> > > +{
> > > +	struct dw_pcie *pci = imx_pcie->pci;
> > > +	struct device *dev = pci->dev;
> > > +	u32 data1, data2;
> > > +	int i;
> > > +
> > > +	if (sid >= 64) {
> > > +		dev_err(dev, "Invalid SID for index %d\n", sid);
> > > +		return -EINVAL;
> > > +	}
> > > +
> > > +	guard(mutex)(&imx_pcie->lock);
> > > +
> > > +	for (i = 0; i < IMX95_MAX_LUT; i++) {
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, IMX95_PEO_LUT_RWA | i);
> > > +		regmap_read(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, &data1);
> > > +
> > > +		if (!(data1 & IMX95_PE0_LUT_VLD))
> > > +			continue;
> > > +
> > > +		regmap_read(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, &data2);
> > > +
> > > +		/* Needn't add duplicated Request ID */
> > > +		if (reqid == FIELD_GET(IMX95_PE0_LUT_REQID, data2))
> >
> > So this means LUT entry is already present for the given RID (a buggy DT maybe).
> > Don't you need to emit a warning here?
> >
> > > +			return 0;
> > > +	}
> > > +
> >
> > You need to bail out here if no free LUT entry is available. But I'd recommend
> > to combine two loops to avoid having duplicated IMX95_PE0_LUT_VLD checks and
> > program LUT only if there is any free entry available.
> >
> > > +	for (i = 0; i < IMX95_MAX_LUT; i++) {
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, IMX95_PEO_LUT_RWA | i);
> > > +
> > > +		regmap_read(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, &data1);
> > > +		if (data1 & IMX95_PE0_LUT_VLD)
> > > +			continue;
> > > +
> > > +		data1 = FIELD_PREP(IMX95_PE0_LUT_DAC_ID, 0);
> > > +		data1 |= FIELD_PREP(IMX95_PE0_LUT_STREAM_ID, sid);
> > > +		data1 |= IMX95_PE0_LUT_VLD;
> > > +
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, data1);
> > > +
> > > +		data2 = 0xffff;
> >
> > data2 = IMX95_PE0_LUT_MASK;
> >
> > Also add a comment on why the mask is added along with the RID.
> >
> > > +		data2 |= FIELD_PREP(IMX95_PE0_LUT_REQID, reqid);
> > > +
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, data2);
> > > +
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, i);
> > > +
> > > +		return 0;
> > > +	}
> > > +
> > > +	dev_err(dev, "All lut already used\n");
> >
> > "LUT entry is not available"
> >
> > > +	return -EINVAL;
> > > +}
> > > +
> > > +static void imx_pcie_remove_lut(struct imx_pcie *imx_pcie, u16 reqid)
> >
> > s/reqid/rid
> >
> > > +{
> > > +	u32 data2 = 0;
> >
> > No need to initialize.
> >
> > > +	int i;
> > > +
> > > +	guard(mutex)(&imx_pcie->lock);
> > > +
> > > +	for (i = 0; i < IMX95_MAX_LUT; i++) {
> > > +		regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, IMX95_PEO_LUT_RWA | i);
> > > +
> > > +		regmap_read(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, &data2);
> > > +		if (FIELD_GET(IMX95_PE0_LUT_REQID, data2) == reqid) {
> > > +			regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA1, 0);
> > > +			regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_DATA2, 0);
> > > +			regmap_write(imx_pcie->iomuxc_gpr, IMX95_PE0_LUT_ACSCTRL, i);
> > > +
> > > +			break;
> > > +		}
> > > +	}
> > > +}
> > > +
> > > +static int imx_pcie_enable_device(struct pci_host_bridge *bridge, struct pci_dev *pdev)
> > > +{
> > > +	u32 sid_i = 0, sid_m = 0, rid = pci_dev_id(pdev);
> > > +	struct device_node *target;
> > > +	struct imx_pcie *imx_pcie;
> > > +	struct device *dev;
> > > +	int err_i, err_m;
> > > +
> > > +	imx_pcie = to_imx_pcie(to_dw_pcie_from_pp(bridge->sysdata));
> > > +	dev = imx_pcie->pci->dev;
> >
> > You can assign these at initialization time.
> >
> > > +
> > > +	target = NULL;
> > > +	err_i = of_map_id(dev->of_node, rid, "iommu-map", "iommu-map-mask", &target, &sid_i);
> > > +	target = NULL;
> >
> > What is the point in passing 'target' here?
> 
> See https://lore.kernel.org/imx/b479cad6-e0c5-48fb-bb8f-a70f7582cfd5@arm.com/
> Marc Zyngier's comments:

Not quite. That's Robin's email (I never commented on that particular
patch). Nevertheless, "I approve this message".

	M.

-- 
Without deviation from the norm, progress is not possible.

  reply	other threads:[~2024-11-02 22:18 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-24 22:34 [PATCH v3 0/2] PCI: add enabe(disable)_device() hook for bridge Frank Li
2024-10-24 22:34 ` [PATCH v3 1/2] PCI: Add enable_device() and disable_device() callbacks for bridges Frank Li
2024-10-30 21:00   ` Bjorn Helgaas
2024-11-01 16:58     ` Marc Zyngier
2024-11-02 11:10   ` Manivannan Sadhasivam
2024-11-02 11:32     ` Marc Zyngier
2024-11-02 11:54       ` Manivannan Sadhasivam
2024-11-02 12:24         ` Marc Zyngier
2024-11-02 12:48           ` Manivannan Sadhasivam
2024-10-24 22:34 ` [PATCH v3 2/2] PCI: imx6: Add IOMMU and ITS MSI support for i.MX95 Frank Li
2024-11-01 17:23   ` Robin Murphy
2024-11-02 11:49   ` Manivannan Sadhasivam
2024-11-02 17:26     ` Frank Li
2024-11-02 22:18       ` Marc Zyngier [this message]
2024-11-03  6:23       ` Manivannan Sadhasivam

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=87fro9th45.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=Frank.li@nxp.com \
    --cc=alyssa@rosenzweig.io \
    --cc=bhelgaas@google.com \
    --cc=bpf@vger.kernel.org \
    --cc=broonie@kernel.org \
    --cc=festevam@gmail.com \
    --cc=hongxing.zhu@nxp.com \
    --cc=imx@lists.linux.dev \
    --cc=jgg@ziepe.ca \
    --cc=joro@8bytes.org \
    --cc=kernel@pengutronix.de \
    --cc=kw@linux.com \
    --cc=l.stach@pengutronix.de \
    --cc=lgirdwood@gmail.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=manivannan.sadhasivam@linaro.org \
    --cc=p.zabel@pengutronix.de \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=will@kernel.org \
    /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.