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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox