diff mbox series

[PATCH/RFC] iommu/ipmmu-vmsa: R-Car M3-N/V3H/E3 AVB whitelist prototype

Message ID 154014429795.2869.7870954544925695802.sendpatchset@octo (mailing list archive)
State RFC
Delegated to: Geert Uytterhoeven
Headers show
Series [PATCH/RFC] iommu/ipmmu-vmsa: R-Car M3-N/V3H/E3 AVB whitelist prototype | expand

Commit Message

Magnus Damm Oct. 21, 2018, 5:51 p.m. UTC
From: Magnus Damm <damm@opensource.se>

For testing purpose enable IPMMU for Ethernet-AVB on R-Car M3-N/V3H/E3.

Not for upstream merge.

Not-Yet-Signed-off-by: Magnus Damm <damm@opensource.se>
---

 Applies on top of renesas-devel-20181019-v4.19-rc8

 drivers/iommu/ipmmu-vmsa.c |    4 ++++
 1 file changed, 4 insertions(+)

Comments

Geert Uytterhoeven Oct. 28, 2018, 1:32 p.m. UTC | #1
Hi Magnus,

Thanks for your patch!

On Sun, Oct 21, 2018 at 7:56 PM Magnus Damm <magnus.damm@gmail.com> wrote:
> From: Magnus Damm <damm@opensource.se>
>
> For testing purpose enable IPMMU for Ethernet-AVB on R-Car M3-N/V3H/E3.
>
> Not for upstream merge.
>
> Not-Yet-Signed-off-by: Magnus Damm <damm@opensource.se>
> ---
>
>  Applies on top of renesas-devel-20181019-v4.19-rc8
>
>  drivers/iommu/ipmmu-vmsa.c |    4 ++++
>  1 file changed, 4 insertions(+)
>
> --- 0001/drivers/iommu/ipmmu-vmsa.c
> +++ work/drivers/iommu/ipmmu-vmsa.c     2018-10-22 02:46:30.139880557 +0900
> @@ -756,6 +756,10 @@ static int ipmmu_init_platform_device(st
>
>  static bool ipmmu_slave_whitelist(struct device *dev)
>  {
> +       /* R-Car M3-N/V3H/E3 Ethernet-AVB */
> +       if (!strcmp(dev_name(dev), "e6800000.ethernet"))
> +               return true;

I'm afraid the whitelisting doesn't work that way: with the above check, it will
be enabled on all R-Car Gen3 SoCs.

> +
>         /* By default, do not allow use of IPMMU */
>         return false;
>  }

Gr{oetje,eeting}s,

                        Geert
Yoshihiro Shimoda Nov. 12, 2018, 7:23 a.m. UTC | #2
Hi Magnus-san, Geert-san,

> From: Geert Uytterhoeven, Sent: Sunday, October 28, 2018 10:33 PM
> 
> Hi Magnus,
> 
> Thanks for your patch!
> 
> On Sun, Oct 21, 2018 at 7:56 PM Magnus Damm <magnus.damm@gmail.com> wrote:
> > From: Magnus Damm <damm@opensource.se>
> >
> > For testing purpose enable IPMMU for Ethernet-AVB on R-Car M3-N/V3H/E3.
> >
> > Not for upstream merge.
> >
> > Not-Yet-Signed-off-by: Magnus Damm <damm@opensource.se>
> > ---
> >
> >  Applies on top of renesas-devel-20181019-v4.19-rc8
> >
> >  drivers/iommu/ipmmu-vmsa.c |    4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > --- 0001/drivers/iommu/ipmmu-vmsa.c
> > +++ work/drivers/iommu/ipmmu-vmsa.c     2018-10-22 02:46:30.139880557 +0900
> > @@ -756,6 +756,10 @@ static int ipmmu_init_platform_device(st
> >
> >  static bool ipmmu_slave_whitelist(struct device *dev)
> >  {
> > +       /* R-Car M3-N/V3H/E3 Ethernet-AVB */
> > +       if (!strcmp(dev_name(dev), "e6800000.ethernet"))
> > +               return true;
> 
> I'm afraid the whitelisting doesn't work that way: with the above check, it will
> be enabled on all R-Car Gen3 SoCs.

I agree with Geert-san.
So, how about adding .revision into the soc_rcar_gen3 like a whitelist of SoCs first as following?
I believe almost all R-Car Gen3 SoCs can use IPMMU safety, except H3 ES2.0 or older and M3-W ES1.*.

---
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index b98a031..7a528b8 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -758,10 +758,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
 }
 
 static const struct soc_device_attribute soc_rcar_gen3[] = {
-	{ .soc_id = "r8a7795", },
-	{ .soc_id = "r8a7796", },
+	{ .soc_id = "r8a7795", .revision = "ES3.*" },
 	{ .soc_id = "r8a77965", },
 	{ .soc_id = "r8a77970", },
+	{ .soc_id = "r8a77990", },
 	{ .soc_id = "r8a77995", },
 	{ /* sentinel */ }
 };

Best regards,
Yoshihiro Shimoda


> > +
> >         /* By default, do not allow use of IPMMU */
> >         return false;
> >  }
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
Geert Uytterhoeven Nov. 12, 2018, 8:18 a.m. UTC | #3
Hi Shimoda-san,

On Mon, Nov 12, 2018 at 8:24 AM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> > From: Geert Uytterhoeven, Sent: Sunday, October 28, 2018 10:33 PM
> > On Sun, Oct 21, 2018 at 7:56 PM Magnus Damm <magnus.damm@gmail.com> wrote:
> > > From: Magnus Damm <damm@opensource.se>
> > >
> > > For testing purpose enable IPMMU for Ethernet-AVB on R-Car M3-N/V3H/E3.
> > >
> > > Not for upstream merge.
> > >
> > > Not-Yet-Signed-off-by: Magnus Damm <damm@opensource.se>
> > > ---
> > >
> > >  Applies on top of renesas-devel-20181019-v4.19-rc8
> > >
> > >  drivers/iommu/ipmmu-vmsa.c |    4 ++++
> > >  1 file changed, 4 insertions(+)
> > >
> > > --- 0001/drivers/iommu/ipmmu-vmsa.c
> > > +++ work/drivers/iommu/ipmmu-vmsa.c     2018-10-22 02:46:30.139880557 +0900
> > > @@ -756,6 +756,10 @@ static int ipmmu_init_platform_device(st
> > >
> > >  static bool ipmmu_slave_whitelist(struct device *dev)
> > >  {
> > > +       /* R-Car M3-N/V3H/E3 Ethernet-AVB */
> > > +       if (!strcmp(dev_name(dev), "e6800000.ethernet"))
> > > +               return true;
> >
> > I'm afraid the whitelisting doesn't work that way: with the above check, it will
> > be enabled on all R-Car Gen3 SoCs.
>
> I agree with Geert-san.
> So, how about adding .revision into the soc_rcar_gen3 like a whitelist of SoCs first as following?
> I believe almost all R-Car Gen3 SoCs can use IPMMU safety, except H3 ES2.0 or older and M3-W ES1.*.

Thanks for the information!

> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -758,10 +758,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
>  }
>
>  static const struct soc_device_attribute soc_rcar_gen3[] = {
> -       { .soc_id = "r8a7795", },
> -       { .soc_id = "r8a7796", },
> +       { .soc_id = "r8a7795", .revision = "ES3.*" },
>         { .soc_id = "r8a77965", },
>         { .soc_id = "r8a77970", },
> +       { .soc_id = "r8a77990", },
>         { .soc_id = "r8a77995", },
>         { /* sentinel */ }
>  };

Given the above, I think the time is ripe to convert this from a whitelist to a
blacklist?

Gr{oetje,eeting}s,

                        Geert
Yoshihiro Shimoda Nov. 12, 2018, 8:53 a.m. UTC | #4
Hi Geert-san,

Thank you for the comment!

> From: Geert Uytterhoeven, Sent: Monday, November 12, 2018 5:19 PM
> 
> Hi Shimoda-san,
> 
> On Mon, Nov 12, 2018 at 8:24 AM Yoshihiro Shimoda
> <yoshihiro.shimoda.uh@renesas.com> wrote:
<snip>
> > --- a/drivers/iommu/ipmmu-vmsa.c
> > +++ b/drivers/iommu/ipmmu-vmsa.c
> > @@ -758,10 +758,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
> >  }
> >
> >  static const struct soc_device_attribute soc_rcar_gen3[] = {
> > -       { .soc_id = "r8a7795", },
> > -       { .soc_id = "r8a7796", },
> > +       { .soc_id = "r8a7795", .revision = "ES3.*" },
> >         { .soc_id = "r8a77965", },
> >         { .soc_id = "r8a77970", },
> > +       { .soc_id = "r8a77990", },
> >         { .soc_id = "r8a77995", },
> >         { /* sentinel */ }
> >  };
> 
> Given the above, I think the time is ripe to convert this from a whitelist to a
> blacklist?

About the SoCs, I think so. (I updated example patch below and it seems better :) )
However, I would like to keep ipmmu_slave_whitelist to avoid any trouble for now...

---
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index b98a031..ab24128 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -757,12 +757,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
 	return false;
 }
 
-static const struct soc_device_attribute soc_rcar_gen3[] = {
-	{ .soc_id = "r8a7795", },
-	{ .soc_id = "r8a7796", },
-	{ .soc_id = "r8a77965", },
-	{ .soc_id = "r8a77970", },
-	{ .soc_id = "r8a77995", },
+static const struct soc_device_attribute soc_rcar_gen3_blacklist[] = {
+	{ .soc_id = "r8a7795", .revision = "ES1.*" },
+	{ .soc_id = "r8a7795", .revision = "ES2.*" },
+	{ .soc_id = "r8a7796", .revision = "ES1.*" },
 	{ /* sentinel */ }
 };
 
@@ -770,7 +768,8 @@ static int ipmmu_of_xlate(struct device *dev,
 			  struct of_phandle_args *spec)
 {
 	/* For R-Car Gen3 use a white list to opt-in slave devices */
-	if (soc_device_match(soc_rcar_gen3) && !ipmmu_slave_whitelist(dev))
+	if (!soc_device_match(soc_rcar_gen3_blacklist) &&
+	    !ipmmu_slave_whitelist(dev))
 		return -ENODEV;
 
 	iommu_fwspec_add_ids(dev, spec->args, 1);
---
Best regards,
Yoshihiro Shimoda

> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
Simon Horman Nov. 12, 2018, 9:06 a.m. UTC | #5
On Mon, Nov 12, 2018 at 09:18:41AM +0100, Geert Uytterhoeven wrote:
> Hi Shimoda-san,
> 
> On Mon, Nov 12, 2018 at 8:24 AM Yoshihiro Shimoda
> <yoshihiro.shimoda.uh@renesas.com> wrote:
> > > From: Geert Uytterhoeven, Sent: Sunday, October 28, 2018 10:33 PM
> > > On Sun, Oct 21, 2018 at 7:56 PM Magnus Damm <magnus.damm@gmail.com> wrote:
> > > > From: Magnus Damm <damm@opensource.se>
> > > >
> > > > For testing purpose enable IPMMU for Ethernet-AVB on R-Car M3-N/V3H/E3.
> > > >
> > > > Not for upstream merge.
> > > >
> > > > Not-Yet-Signed-off-by: Magnus Damm <damm@opensource.se>
> > > > ---
> > > >
> > > >  Applies on top of renesas-devel-20181019-v4.19-rc8
> > > >
> > > >  drivers/iommu/ipmmu-vmsa.c |    4 ++++
> > > >  1 file changed, 4 insertions(+)
> > > >
> > > > --- 0001/drivers/iommu/ipmmu-vmsa.c
> > > > +++ work/drivers/iommu/ipmmu-vmsa.c     2018-10-22 02:46:30.139880557 +0900
> > > > @@ -756,6 +756,10 @@ static int ipmmu_init_platform_device(st
> > > >
> > > >  static bool ipmmu_slave_whitelist(struct device *dev)
> > > >  {
> > > > +       /* R-Car M3-N/V3H/E3 Ethernet-AVB */
> > > > +       if (!strcmp(dev_name(dev), "e6800000.ethernet"))
> > > > +               return true;
> > >
> > > I'm afraid the whitelisting doesn't work that way: with the above check, it will
> > > be enabled on all R-Car Gen3 SoCs.
> >
> > I agree with Geert-san.
> > So, how about adding .revision into the soc_rcar_gen3 like a whitelist of SoCs first as following?
> > I believe almost all R-Car Gen3 SoCs can use IPMMU safety, except H3 ES2.0 or older and M3-W ES1.*.
> 
> Thanks for the information!
> 
> > --- a/drivers/iommu/ipmmu-vmsa.c
> > +++ b/drivers/iommu/ipmmu-vmsa.c
> > @@ -758,10 +758,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
> >  }
> >
> >  static const struct soc_device_attribute soc_rcar_gen3[] = {
> > -       { .soc_id = "r8a7795", },
> > -       { .soc_id = "r8a7796", },
> > +       { .soc_id = "r8a7795", .revision = "ES3.*" },
> >         { .soc_id = "r8a77965", },
> >         { .soc_id = "r8a77970", },
> > +       { .soc_id = "r8a77990", },
> >         { .soc_id = "r8a77995", },
> >         { /* sentinel */ }
> >  };
> 
> Given the above, I think the time is ripe to convert this from a whitelist to a
> blacklist?

My understanding is that the motivation for the whitelist was to allow us
to control enabling this device on a per-SOC basis in a very deliberate
maner to avoid enabling non-working hardware/firmware/driver combinations.

In moving to a whitelist I believe we would be saying that the risk of
such non-working combinations has subsided and can satisfactorily be
managed by a whitelist.

Are we comfortable in saying that?
Geert Uytterhoeven Nov. 12, 2018, 9:07 a.m. UTC | #6
Hi Shimoda-san,

On Mon, Nov 12, 2018 at 9:53 AM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> > From: Geert Uytterhoeven, Sent: Monday, November 12, 2018 5:19 PM
> > On Mon, Nov 12, 2018 at 8:24 AM Yoshihiro Shimoda
> > <yoshihiro.shimoda.uh@renesas.com> wrote:
> <snip>
> > > --- a/drivers/iommu/ipmmu-vmsa.c
> > > +++ b/drivers/iommu/ipmmu-vmsa.c
> > > @@ -758,10 +758,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
> > >  }
> > >
> > >  static const struct soc_device_attribute soc_rcar_gen3[] = {
> > > -       { .soc_id = "r8a7795", },
> > > -       { .soc_id = "r8a7796", },
> > > +       { .soc_id = "r8a7795", .revision = "ES3.*" },
> > >         { .soc_id = "r8a77965", },
> > >         { .soc_id = "r8a77970", },
> > > +       { .soc_id = "r8a77990", },
> > >         { .soc_id = "r8a77995", },
> > >         { /* sentinel */ }
> > >  };
> >
> > Given the above, I think the time is ripe to convert this from a whitelist to a
> > blacklist?
>
> About the SoCs, I think so. (I updated example patch below and it seems better :) )
> However, I would like to keep ipmmu_slave_whitelist to avoid any trouble for now...

OK, IC.

> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -757,12 +757,10 @@ static bool ipmmu_slave_whitelist(struct device *dev)
>         return false;
>  }
>
> -static const struct soc_device_attribute soc_rcar_gen3[] = {
> -       { .soc_id = "r8a7795", },
> -       { .soc_id = "r8a7796", },
> -       { .soc_id = "r8a77965", },
> -       { .soc_id = "r8a77970", },
> -       { .soc_id = "r8a77995", },
> +static const struct soc_device_attribute soc_rcar_gen3_blacklist[] = {
> +       { .soc_id = "r8a7795", .revision = "ES1.*" },
> +       { .soc_id = "r8a7795", .revision = "ES2.*" },

I think you can combine both lines using "ES[12].*", too.
But it may be considered less readable, and not greppable for e.g. "ES1".

> +       { .soc_id = "r8a7796", .revision = "ES1.*" },
>         { /* sentinel */ }
>  };
>
> @@ -770,7 +768,8 @@ static int ipmmu_of_xlate(struct device *dev,
>                           struct of_phandle_args *spec)
>  {
>         /* For R-Car Gen3 use a white list to opt-in slave devices */
> -       if (soc_device_match(soc_rcar_gen3) && !ipmmu_slave_whitelist(dev))
> +       if (!soc_device_match(soc_rcar_gen3_blacklist) &&
> +           !ipmmu_slave_whitelist(dev))
>                 return -ENODEV;

Ah, this has the side effect of applying ipmmu_slave_whitelist() on R-Car
Gen2, too, which is probably not what we want?

Gr{oetje,eeting}s,

                        Geert
Yoshihiro Shimoda Nov. 14, 2018, 11:20 a.m. UTC | #7
Hi Geert-san,

> From: Geert Uytterhoeven, Sent: Monday, November 12, 2018 6:08 PM
> 
> Hi Shimoda-san,
> 
> On Mon, Nov 12, 2018 at 9:53 AM Yoshihiro Shimoda
> <yoshihiro.shimoda.uh@renesas.com> wrote:
> > > From: Geert Uytterhoeven, Sent: Monday, November 12, 2018 5:19 PM
> > > On Mon, Nov 12, 2018 at 8:24 AM Yoshihiro Shimoda
> > > <yoshihiro.shimoda.uh@renesas.com> wrote:
<snip>
> > @@ -770,7 +768,8 @@ static int ipmmu_of_xlate(struct device *dev,
> >                           struct of_phandle_args *spec)
> >  {
> >         /* For R-Car Gen3 use a white list to opt-in slave devices */
> > -       if (soc_device_match(soc_rcar_gen3) && !ipmmu_slave_whitelist(dev))
> > +       if (!soc_device_match(soc_rcar_gen3_blacklist) &&
> > +           !ipmmu_slave_whitelist(dev))
> >                 return -ENODEV;
> 
> Ah, this has the side effect of applying ipmmu_slave_whitelist() on R-Car
> Gen2, too, which is probably not what we want?

Oops! You're correct. The current code behavior is:
 - Gen2 doesn't use any whitelist.
 - Gen3 uses the whitelist.

If we apply this my patch above:
 - Gen2 and Gen3 use the whitelist anyway.

This is not our expected, so I think we keep to use the current style.
# Note that my first suggestion [1] also broke the code because
# r8a7795 ES2.0 or older and r8a7796 don't use the whitelist...
# 
# [1] https://www.spinics.net/lists/linux-renesas-soc/msg35048.html

Best regards,
Yoshihiro Shimoda

> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
diff mbox series

Patch

--- 0001/drivers/iommu/ipmmu-vmsa.c
+++ work/drivers/iommu/ipmmu-vmsa.c	2018-10-22 02:46:30.139880557 +0900
@@ -756,6 +756,10 @@  static int ipmmu_init_platform_device(st
 
 static bool ipmmu_slave_whitelist(struct device *dev)
 {
+	/* R-Car M3-N/V3H/E3 Ethernet-AVB */
+	if (!strcmp(dev_name(dev), "e6800000.ethernet"))
+		return true;
+
 	/* By default, do not allow use of IPMMU */
 	return false;
 }