From: Marc Zyngier <maz@kernel.org>
To: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Cc: "Vijayanand Jitta" <vijayanand.jitta@oss.qualcomm.com>,
"Nipun Gupta" <nipun.gupta@amd.com>,
"Nikhil Agarwal" <nikhil.agarwal@amd.com>,
"Joerg Roedel" <joro@8bytes.org>, "Will Deacon" <will@kernel.org>,
"Robin Murphy" <robin.murphy@arm.com>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Thomas Gleixner" <tglx@kernel.org>,
"Rob Herring" <robh@kernel.org>,
"Saravana Kannan" <saravanak@kernel.org>,
"Richard Zhu" <hongxing.zhu@nxp.com>,
"Lucas Stach" <l.stach@pengutronix.de>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Frank Li" <Frank.Li@nxp.com>,
"Sascha Hauer" <s.hauer@pengutronix.de>,
"Pengutronix Kernel Team" <kernel@pengutronix.de>,
"Fabio Estevam" <festevam@gmail.com>,
"Juergen Gross" <jgross@suse.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Oleksandr Tyshchenko" <oleksandr_tyshchenko@epam.com>,
"Konrad Dybcio" <konrad.dybcio@oss.qualcomm.com>,
"Bjorn Andersson" <bjorn.andersson@oss.qualcomm.com>,
"Conor Dooley" <conor+dt@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Prakash Gupta" <prakash.gupta@oss.qualcomm.com>,
"Vikash Garodia" <vikash.garodia@oss.qualcomm.com>,
linux-kernel@vger.kernel.org, iommu@lists.linux.dev,
linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org,
linux-pci@vger.kernel.org, imx@lists.linux.dev,
xen-devel@lists.xenproject.org, linux-arm-msm@vger.kernel.org,
"Charan Teja Kalla" <charan.kalla@oss.qualcomm.com>
Subject: Re: [PATCH v9 2/3] of: factor arguments passed to of_map_id() into a struct
Date: Sun, 01 Mar 2026 11:42:47 +0000 [thread overview]
Message-ID: <86zf4r93ns.wl-maz@kernel.org> (raw)
In-Reply-To: <ehhnta6zvfua723llpb52hh3lwqdh4ttomzt7xqrmcjnsslbop@p4w3gjzxp4rn>
On Sun, 01 Mar 2026 10:46:57 +0000,
Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> wrote:
>
> On Sun, Mar 01, 2026 at 10:02:49AM +0000, Marc Zyngier wrote:
> > On Sun, 01 Mar 2026 08:34:20 +0000,
> > Vijayanand Jitta <vijayanand.jitta@oss.qualcomm.com> wrote:
> > >
> > > From: Charan Teja Kalla <charan.kalla@oss.qualcomm.com>
> > >
> > > Change of_map_id() to take a pointer to struct of_phandle_args
> > > instead of passing target device node and translated IDs separately.
> > > Update all callers accordingly.
> > >
> > > Subsequent patch will make use of the args_count field in
> > > struct of_phandle_args.
> > >
> > > Suggested-by: Rob Herring (Arm) <robh@kernel.org>
> > > Signed-off-by: Charan Teja Kalla <charan.kalla@oss.qualcomm.com>
> > > Signed-off-by: Vijayanand Jitta <vijayanand.jitta@oss.qualcomm.com>
> > > ---
> > > drivers/iommu/of_iommu.c | 2 +-
> > > drivers/of/base.c | 37 +++++++++++++++++------------------
> > > drivers/pci/controller/dwc/pci-imx6.c | 8 +++++++-
> > > drivers/pci/controller/pcie-apple.c | 4 +++-
> > > drivers/xen/grant-dma-ops.c | 2 +-
> > > include/linux/of.h | 21 +++++++++++++-------
> > > 6 files changed, 44 insertions(+), 30 deletions(-)
> > >
> > > diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
> > > index a511ecf21fcd..d255d0f58e8c 100644
> > > --- a/drivers/iommu/of_iommu.c
> > > +++ b/drivers/iommu/of_iommu.c
> > > @@ -48,7 +48,7 @@ static int of_iommu_configure_dev_id(struct device_node *master_np,
> > > struct of_phandle_args iommu_spec = { .args_count = 1 };
> > > int err;
> > >
> > > - err = of_map_iommu_id(master_np, *id, &iommu_spec.np, iommu_spec.args);
> > > + err = of_map_iommu_id(master_np, *id, &iommu_spec);
> > > if (err)
> > > return err;
> > >
> > > diff --git a/drivers/of/base.c b/drivers/of/base.c
> > > index 57420806c1a2..6c3628255908 100644
> > > --- a/drivers/of/base.c
> > > +++ b/drivers/of/base.c
> > > @@ -2102,8 +2102,11 @@ int of_find_last_cache_level(unsigned int cpu)
> > > * @id: device ID to map.
> > > * @map_name: property name of the map to use.
> > > * @map_mask_name: optional property name of the mask to use.
> > > - * @target: optional pointer to a target device node.
> > > - * @id_out: optional pointer to receive the translated ID.
> > > + * @arg: of_phandle_args structure,
> > > + * which includes:
> > > + * np: pointer to the target device node
> > > + * args_count: number of arguments
> >
> > Number of arguments *to what*? Isn't that the size of args[] instead?
>
> It is a number of values corresponding to the phandle in the DT
> property.
No. It is what the *caller* expects. Not what is is in the DT, which
could be (and generally is) a pile of random crap. If the two don't
match, return an error. But don't randomly overwrite data that is not
yours.
[...]
> It might be not obvious here for iommu-maps, but the struct is
> idiomatic in OF world. Let me quote a (trimmed) example from
> qcom/sm8650.dtsi (for a different property, but it explains the meaning
> of the values here):
>
> gem_noc: interconnect@24100000 {
> #interconnect-cells = <2>;
> };
>
> epss_l3: interconnect@17d90000 {
> #interconnect-cells = <1>;
> };
>
> interconnects = <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY
> &gem_noc SLAVE_LLCC QCOM_ICC_TAG_ACTIVE_ONLY>,
> <&epss_l3 MASTER_EPSS_L3_APPS
> &epss_l3 SLAVE_EPSS_L3_SHARED>;
> /* I skipped the second pair, it adds nothing here */
>
> Here the parsing function for this property (of_icc_get_by_index()) will
> call of_parse_phandle_with_args() 4 times and it expects to return the
> following values in the of_phandle_args:
>
> 1. { .np = gem_noc, .args_count = 2, .args = [MASTER_APPSS_PROC,
> QCOM_ICC_TAG_ACTIVE_ONLY] }
> 2. { .np = gem_noc, .args_count = 2, .args = [SLAVE_LLCC,
> QCOM_ICC_TAG_ACTIVE_ONLY] }
> 3. { .np = epss_l3, .args_count = 1, .args = [MASTER_EPSS_L3_APPS] }
> 4. { .np = epss_l3, .args_count = 1, .args = [SLAVE_EPSS_L3_SHARED] }
>
> The whole of_phandle_args is then typically passed to the corresponding
> xlate function, specific to the paricular .np ('provider'), which will
> use #args_count values from the #args array to return the object from
> the provider.
>
> Now let's see iommu-maps (again, qcom/sm8650.dtsi):
>
> apps_smmu: iommu@15000000 {
> #iommu-cells = <2>;
> };
>
> iommu-map = <0 &apps_smmu 0x1400 0x1>,
> <0x100 &apps_smmu 0x1401 0x1>;
>
> The property matches current definition at [1], however this spec
> doesn't match the DT practice. It forces that the property should use 1
> cell for identifying the "object" in the IOMMU provider, even if the
> provider expects to use 2 cells (two args).
>
> The correct property should look like:
>
> iommu-map = <0 &apps_smmu 0x1400 0x0 0x1>,
> <0x100 &apps_smmu 0x1401 0x0 0x1>;
>
> [1] https://github.com/devicetree-org/dt-schema/blob/main/dtschema/schemas/pci/pci-iommu.yaml
>
> >
> > > + * args[]: array to receive the translated ID(s).
> > > *
> > > * Given a device ID, look up the appropriate implementation-defined
> > > * platform ID and/or the target device which receives transactions on that
> > > @@ -2117,21 +2120,21 @@ int of_find_last_cache_level(unsigned int cpu)
> > > */
> > > int of_map_id(const struct device_node *np, u32 id,
> > > const char *map_name, const char *map_mask_name,
> > > - struct device_node **target, u32 *id_out)
> > > + struct of_phandle_args *arg)
> > > {
> > > u32 map_mask, masked_id;
> > > int map_len;
> > > const __be32 *map = NULL;
> > >
> > > - if (!np || !map_name || (!target && !id_out))
> > > + if (!np || !map_name || !arg)
> > > return -EINVAL;
> > >
> > > map = of_get_property(np, map_name, &map_len);
> > > if (!map) {
> > > - if (target)
> > > + if (arg->np)
> > > return -ENODEV;
> > > /* Otherwise, no map implies no translation */
> > > - *id_out = id;
> > > + arg->args[0] = id;
> >
> > What if args_count is 0? Given that you place no restriction on the
> > way this can be called, that'd be entirely legitimate, and you'd
> > corrupt something you're not supposed to touch.
>
> args is an array (not a pointer) in of_phandle_args. As such we know
> that args[0] is legit.
Again, no. The caller is telling you what it expects. This is strictly
equivalent to:
void func(void *blah[], int sz);
func() is not supposed to look beyond sz. As it stands, this change in
not acceptable.
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2026-03-01 11:42 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-01 8:34 [PATCH v9 0/3] of: parsing of multi #{iommu,msi}-cells in maps Vijayanand Jitta
2026-03-01 8:34 ` [PATCH v9 1/3] of: Add convenience wrappers for of_map_id() Vijayanand Jitta
2026-03-01 9:46 ` Marc Zyngier
2026-03-04 9:32 ` Vijayanand Jitta
2026-03-04 23:48 ` Dmitry Baryshkov
2026-03-05 21:47 ` Rob Herring
2026-03-04 22:34 ` Bjorn Helgaas
2026-03-01 8:34 ` [PATCH v9 2/3] of: factor arguments passed to of_map_id() into a struct Vijayanand Jitta
2026-03-01 10:02 ` Dmitry Baryshkov
2026-03-04 9:34 ` Vijayanand Jitta
2026-03-01 10:02 ` Marc Zyngier
2026-03-01 10:46 ` Dmitry Baryshkov
2026-03-01 11:42 ` Marc Zyngier [this message]
2026-03-01 12:00 ` Dmitry Baryshkov
2026-03-01 10:59 ` Dmitry Baryshkov
2026-03-01 11:45 ` Marc Zyngier
2026-03-04 9:34 ` Vijayanand Jitta
2026-03-01 8:34 ` [PATCH v9 3/3] of: Respect #{iommu,msi}-cells in maps Vijayanand Jitta
2026-03-01 10:14 ` Dmitry Baryshkov
2026-03-04 9:34 ` Vijayanand Jitta
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=86zf4r93ns.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=Frank.Li@nxp.com \
--cc=bhelgaas@google.com \
--cc=bjorn.andersson@oss.qualcomm.com \
--cc=charan.kalla@oss.qualcomm.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=festevam@gmail.com \
--cc=hongxing.zhu@nxp.com \
--cc=imx@lists.linux.dev \
--cc=iommu@lists.linux.dev \
--cc=jgross@suse.com \
--cc=joro@8bytes.org \
--cc=kernel@pengutronix.de \
--cc=konrad.dybcio@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=kwilczynski@kernel.org \
--cc=l.stach@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=mani@kernel.org \
--cc=nikhil.agarwal@amd.com \
--cc=nipun.gupta@amd.com \
--cc=oleksandr_tyshchenko@epam.com \
--cc=prakash.gupta@oss.qualcomm.com \
--cc=robh@kernel.org \
--cc=robin.murphy@arm.com \
--cc=s.hauer@pengutronix.de \
--cc=saravanak@kernel.org \
--cc=sstabellini@kernel.org \
--cc=tglx@kernel.org \
--cc=vijayanand.jitta@oss.qualcomm.com \
--cc=vikash.garodia@oss.qualcomm.com \
--cc=will@kernel.org \
--cc=xen-devel@lists.xenproject.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.