diff mbox series

[2/2] iommu/ipmmu-vmsa: Add support for r8a779a0

Message ID 20210901102705.556093-3-yoshihiro.shimoda.uh@renesas.com
State New
Headers show
Series [1/2] dt-bindings: iommu: renesas,ipmmu-vmsa: add r8a779a0 support | expand

Commit Message

Yoshihiro Shimoda Sept. 1, 2021, 10:27 a.m. UTC
Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design
of this SoC differs than others. So, add a new ipmmu_features for it.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
 drivers/iommu/ipmmu-vmsa.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

Comments

Geert Uytterhoeven Sept. 6, 2021, 3:33 p.m. UTC | #1
Hi Shimoda-san,

On Wed, Sep 1, 2021 at 12:27 PM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design

> of this SoC differs than others. So, add a new ipmmu_features for it.

>

> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>


> --- a/drivers/iommu/ipmmu-vmsa.c

> +++ b/drivers/iommu/ipmmu-vmsa.c


> @@ -922,6 +922,20 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {

>         .utlb_offset_base = 0,

>  };

>

> +static const struct ipmmu_features ipmmu_features_r8a779a0 = {

> +       .use_ns_alias_offset = false,

> +       .has_cache_leaf_nodes = true,

> +       .number_of_contexts = 8,


Shouldn't this be 16?
Or do you plan to add support for more than 8 contexts later, as that
would require increasing IPMMU_CTX_MAX, and updating ipmmu_ctx_reg()
to handle the second bank of 8 contexts?

Regardless, I assume this will still work when when limiting to 8
contexts, so
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>


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
Yoshihiro Shimoda Sept. 7, 2021, 12:02 a.m. UTC | #2
Hi Geert-san,

> From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 12:34 AM

> 

> Hi Shimoda-san,

> 

> On Wed, Sep 1, 2021 at 12:27 PM Yoshihiro Shimoda

> <yoshihiro.shimoda.uh@renesas.com> wrote:

> > Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design

> > of this SoC differs than others. So, add a new ipmmu_features for it.

> >

> > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

> 

> > --- a/drivers/iommu/ipmmu-vmsa.c

> > +++ b/drivers/iommu/ipmmu-vmsa.c

> 

> > @@ -922,6 +922,20 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {

> >         .utlb_offset_base = 0,

> >  };

> >

> > +static const struct ipmmu_features ipmmu_features_r8a779a0 = {

> > +       .use_ns_alias_offset = false,

> > +       .has_cache_leaf_nodes = true,

> > +       .number_of_contexts = 8,

> 

> Shouldn't this be 16?

> Or do you plan to add support for more than 8 contexts later, as that

> would require increasing IPMMU_CTX_MAX, and updating ipmmu_ctx_reg()

> to handle the second bank of 8 contexts?


I would like to add support for more than 8 contexts later because
I realized that ctx_offset_{base,stride} are not suitable for the second bank
of 8 contexts...

> Regardless, I assume this will still work when when limiting to 8

> contexts, so

> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>


Thank you for your review!

Best regards,
Yoshihiro Shimoda
Geert Uytterhoeven Sept. 7, 2021, 6:33 a.m. UTC | #3
Hi Shimoda-san,

On Tue, Sep 7, 2021 at 2:02 AM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> > From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 12:34 AM

> > On Wed, Sep 1, 2021 at 12:27 PM Yoshihiro Shimoda

> > <yoshihiro.shimoda.uh@renesas.com> wrote:

> > > Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design

> > > of this SoC differs than others. So, add a new ipmmu_features for it.

> > >

> > > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

> >

> > > --- a/drivers/iommu/ipmmu-vmsa.c

> > > +++ b/drivers/iommu/ipmmu-vmsa.c

> >

> > > @@ -922,6 +922,20 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {

> > >         .utlb_offset_base = 0,

> > >  };

> > >

> > > +static const struct ipmmu_features ipmmu_features_r8a779a0 = {

> > > +       .use_ns_alias_offset = false,

> > > +       .has_cache_leaf_nodes = true,

> > > +       .number_of_contexts = 8,

> >

> > Shouldn't this be 16?

> > Or do you plan to add support for more than 8 contexts later, as that

> > would require increasing IPMMU_CTX_MAX, and updating ipmmu_ctx_reg()

> > to handle the second bank of 8 contexts?

>

> I would like to add support for more than 8 contexts later because

> I realized that ctx_offset_{base,stride} are not suitable for the second bank

> of 8 contexts...


Wouldn't something like below be sufficient?

 static unsigned int ipmmu_ctx_reg(struct ipmmu_vmsa_device *mmu,
                                  unsigned int context_id, unsigned int reg)
 {
-       return mmu->features->ctx_offset_base +
-              context_id * mmu->features->ctx_offset_stride + reg;
+       unsigned int base = mmu->features->ctx_offset_base;
+
+       if (context_id > 7)
+               base += 0x800 - 8 * 0x1040;
+
+       return base + context_id * mmu->features->ctx_offset_stride + reg;
 }

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
Yoshihiro Shimoda Sept. 7, 2021, 7:28 a.m. UTC | #4
Hi Geert-san,

> From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 3:34 PM

> 

> Hi Shimoda-san,

> 

> On Tue, Sep 7, 2021 at 2:02 AM Yoshihiro Shimoda

> <yoshihiro.shimoda.uh@renesas.com> wrote:

> > > From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 12:34 AM

> > > On Wed, Sep 1, 2021 at 12:27 PM Yoshihiro Shimoda

> > > <yoshihiro.shimoda.uh@renesas.com> wrote:

> > > > Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design

> > > > of this SoC differs than others. So, add a new ipmmu_features for it.

> > > >

> > > > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

> > >

> > > > --- a/drivers/iommu/ipmmu-vmsa.c

> > > > +++ b/drivers/iommu/ipmmu-vmsa.c

> > >

> > > > @@ -922,6 +922,20 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {

> > > >         .utlb_offset_base = 0,

> > > >  };

> > > >

> > > > +static const struct ipmmu_features ipmmu_features_r8a779a0 = {

> > > > +       .use_ns_alias_offset = false,

> > > > +       .has_cache_leaf_nodes = true,

> > > > +       .number_of_contexts = 8,

> > >

> > > Shouldn't this be 16?

> > > Or do you plan to add support for more than 8 contexts later, as that

> > > would require increasing IPMMU_CTX_MAX, and updating ipmmu_ctx_reg()

> > > to handle the second bank of 8 contexts?

> >

> > I would like to add support for more than 8 contexts later because

> > I realized that ctx_offset_{base,stride} are not suitable for the second bank

> > of 8 contexts...

> 

> Wouldn't something like below be sufficient?


Thank you for your suggestion!

>  static unsigned int ipmmu_ctx_reg(struct ipmmu_vmsa_device *mmu,

>                                   unsigned int context_id, unsigned int reg)

>  {

> -       return mmu->features->ctx_offset_base +

> -              context_id * mmu->features->ctx_offset_stride + reg;

> +       unsigned int base = mmu->features->ctx_offset_base;

> +

> +       if (context_id > 7)

> +               base += 0x800 - 8 * 0x1040;


This should be "base += 0x800 - 8 * 0x40;" because the 8th context address is
0x18800, not 0x10800.

I'll send v2 patch to support 16 contexts.
(I'll change IPMMU_CTX_MAX to 16 too.)

Best regards,
Yoshihiro Shimoda

> +

> +       return base + context_id * mmu->features->ctx_offset_stride + reg;

>  }

> 

> 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 Sept. 7, 2021, 7:36 a.m. UTC | #5
Hi Shimoda-san,

On Tue, Sep 7, 2021 at 9:29 AM Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com> wrote:
> > From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 3:34 PM

> > On Tue, Sep 7, 2021 at 2:02 AM Yoshihiro Shimoda

> > <yoshihiro.shimoda.uh@renesas.com> wrote:

> > > > From: Geert Uytterhoeven, Sent: Tuesday, September 7, 2021 12:34 AM

> > > > On Wed, Sep 1, 2021 at 12:27 PM Yoshihiro Shimoda

> > > > <yoshihiro.shimoda.uh@renesas.com> wrote:

> > > > > Add support for r8a779a0 (R-Car V3U). The IPMMU hardware design

> > > > > of this SoC differs than others. So, add a new ipmmu_features for it.

> > > > >

> > > > > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

> > > >

> > > > > --- a/drivers/iommu/ipmmu-vmsa.c

> > > > > +++ b/drivers/iommu/ipmmu-vmsa.c

> > > >

> > > > > @@ -922,6 +922,20 @@ static const struct ipmmu_features ipmmu_features_rcar_gen3 = {

> > > > >         .utlb_offset_base = 0,

> > > > >  };

> > > > >

> > > > > +static const struct ipmmu_features ipmmu_features_r8a779a0 = {

> > > > > +       .use_ns_alias_offset = false,

> > > > > +       .has_cache_leaf_nodes = true,

> > > > > +       .number_of_contexts = 8,

> > > >

> > > > Shouldn't this be 16?

> > > > Or do you plan to add support for more than 8 contexts later, as that

> > > > would require increasing IPMMU_CTX_MAX, and updating ipmmu_ctx_reg()

> > > > to handle the second bank of 8 contexts?

> > >

> > > I would like to add support for more than 8 contexts later because

> > > I realized that ctx_offset_{base,stride} are not suitable for the second bank

> > > of 8 contexts...

> >

> > Wouldn't something like below be sufficient?

>

> Thank you for your suggestion!

>

> >  static unsigned int ipmmu_ctx_reg(struct ipmmu_vmsa_device *mmu,

> >                                   unsigned int context_id, unsigned int reg)

> >  {

> > -       return mmu->features->ctx_offset_base +

> > -              context_id * mmu->features->ctx_offset_stride + reg;

> > +       unsigned int base = mmu->features->ctx_offset_base;

> > +

> > +       if (context_id > 7)

> > +               base += 0x800 - 8 * 0x1040;

>

> This should be "base += 0x800 - 8 * 0x40;" because the 8th context address is

> 0x18800, not 0x10800.


Doh, I should have written my first thought ("base += FIXME" ;-)

> I'll send v2 patch to support 16 contexts.

> (I'll change IPMMU_CTX_MAX to 16 too.)


Thanks!

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

diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index d38ff29a76e8..c46951367f93 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -36,7 +36,7 @@ 
 #define IPMMU_CTX_MAX		8U
 #define IPMMU_CTX_INVALID	-1
 
-#define IPMMU_UTLB_MAX		48U
+#define IPMMU_UTLB_MAX		64U
 
 struct ipmmu_features {
 	bool use_ns_alias_offset;
@@ -922,6 +922,20 @@  static const struct ipmmu_features ipmmu_features_rcar_gen3 = {
 	.utlb_offset_base = 0,
 };
 
+static const struct ipmmu_features ipmmu_features_r8a779a0 = {
+	.use_ns_alias_offset = false,
+	.has_cache_leaf_nodes = true,
+	.number_of_contexts = 8,
+	.num_utlbs = 64,
+	.setup_imbuscr = false,
+	.twobit_imttbcr_sl0 = true,
+	.reserved_context = true,
+	.cache_snoop = false,
+	.ctx_offset_base = 0x10000,
+	.ctx_offset_stride = 0x1040,
+	.utlb_offset_base = 0x3000,
+};
+
 static const struct of_device_id ipmmu_of_ids[] = {
 	{
 		.compatible = "renesas,ipmmu-vmsa",
@@ -959,6 +973,9 @@  static const struct of_device_id ipmmu_of_ids[] = {
 	}, {
 		.compatible = "renesas,ipmmu-r8a77995",
 		.data = &ipmmu_features_rcar_gen3,
+	}, {
+		.compatible = "renesas,ipmmu-r8a779a0",
+		.data = &ipmmu_features_r8a779a0,
 	}, {
 		/* Terminator */
 	},