Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Jingyi Wang



On 7/2/2020 9:42 PM, Auger Eric wrote:

Hi Marc,

On 7/2/20 3:08 PM, Marc Zyngier wrote:

Hi Eric,

On 2020-07-02 13:57, Auger Eric wrote:

Hi Jingyi,

On 7/2/20 5:01 AM, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.

Signed-off-by: Jingyi Wang 
---
  arm/micro-bench.c    | 45 +++-
  lib/arm/asm/gic-v3.h |  3 +++
  lib/arm/asm/gic.h    |  1 +
  3 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/arm/micro-bench.c b/arm/micro-bench.c
index fc4d356..80d8db3 100644
--- a/arm/micro-bench.c
+++ b/arm/micro-bench.c
@@ -91,9 +91,40 @@ static void gic_prep_common(void)
  assert(irq_ready);
  }

-static void ipi_prep(void)
+static bool ipi_prep(void)

Any reason why the bool returned value is preferred over the standard
int?

  {
+    u32 val;
+
+    val = readl(vgic_dist_base + GICD_CTLR);
+    if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
+    val &= ~GICD_CTLR_ENABLE_G1A;
+    val &= ~GICD_CTLR_nASSGIreq;
+    writel(val, vgic_dist_base + GICD_CTLR);
+    val |= GICD_CTLR_ENABLE_G1A;
+    writel(val, vgic_dist_base + GICD_CTLR);

Why do we need this G1A dance?


Because it isn't legal to change the SGI behaviour when groups are enabled.
Yes, it is described in this bit of documentation nobody has access to.


OK thank you for the explanation. Jingyi, maybe add a comment to avoid
the question again ;-)

Thanks

Eric


Okay, I will add a comment here in the next version.

Thanks,
Jingyi



And this code needs to track RWP on disabling Group-1.

     M.



.



___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Andrew Jones
On Thu, Jul 02, 2020 at 02:57:56PM +0200, Auger Eric wrote:
> Hi Jingyi,
> 
> On 7/2/20 5:01 AM, Jingyi Wang wrote:
> > If gicv4.1(sgi hardware injection) supported, we test ipi injection
> > via hw/sw way separately.
> > 
> > Signed-off-by: Jingyi Wang 
> > ---
> >  arm/micro-bench.c| 45 +++-
> >  lib/arm/asm/gic-v3.h |  3 +++
> >  lib/arm/asm/gic.h|  1 +
> >  3 files changed, 44 insertions(+), 5 deletions(-)
> > 
> > diff --git a/arm/micro-bench.c b/arm/micro-bench.c
> > index fc4d356..80d8db3 100644
> > --- a/arm/micro-bench.c
> > +++ b/arm/micro-bench.c
> > @@ -91,9 +91,40 @@ static void gic_prep_common(void)
> > assert(irq_ready);
> >  }
> >  
> > -static void ipi_prep(void)
> > +static bool ipi_prep(void)
> Any reason why the bool returned value is preferred over the standard int?

Why would an int be preferred over bool if the return is boolean?

Thanks,
drew

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Auger Eric
Hi Marc,

On 7/2/20 3:08 PM, Marc Zyngier wrote:
> Hi Eric,
> 
> On 2020-07-02 13:57, Auger Eric wrote:
>> Hi Jingyi,
>>
>> On 7/2/20 5:01 AM, Jingyi Wang wrote:
>>> If gicv4.1(sgi hardware injection) supported, we test ipi injection
>>> via hw/sw way separately.
>>>
>>> Signed-off-by: Jingyi Wang 
>>> ---
>>>  arm/micro-bench.c    | 45 +++-
>>>  lib/arm/asm/gic-v3.h |  3 +++
>>>  lib/arm/asm/gic.h    |  1 +
>>>  3 files changed, 44 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/arm/micro-bench.c b/arm/micro-bench.c
>>> index fc4d356..80d8db3 100644
>>> --- a/arm/micro-bench.c
>>> +++ b/arm/micro-bench.c
>>> @@ -91,9 +91,40 @@ static void gic_prep_common(void)
>>>  assert(irq_ready);
>>>  }
>>>
>>> -static void ipi_prep(void)
>>> +static bool ipi_prep(void)
>> Any reason why the bool returned value is preferred over the standard
>> int?
>>>  {
>>> +    u32 val;
>>> +
>>> +    val = readl(vgic_dist_base + GICD_CTLR);
>>> +    if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
>>> +    val &= ~GICD_CTLR_ENABLE_G1A;
>>> +    val &= ~GICD_CTLR_nASSGIreq;
>>> +    writel(val, vgic_dist_base + GICD_CTLR);
>>> +    val |= GICD_CTLR_ENABLE_G1A;
>>> +    writel(val, vgic_dist_base + GICD_CTLR);
>> Why do we need this G1A dance?
> 
> Because it isn't legal to change the SGI behaviour when groups are enabled.
> Yes, it is described in this bit of documentation nobody has access to.

OK thank you for the explanation. Jingyi, maybe add a comment to avoid
the question again ;-)

Thanks

Eric
> 
> And this code needs to track RWP on disabling Group-1.
> 
>     M.

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Marc Zyngier

Hi Eric,

On 2020-07-02 13:57, Auger Eric wrote:

Hi Jingyi,

On 7/2/20 5:01 AM, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.

Signed-off-by: Jingyi Wang 
---
 arm/micro-bench.c| 45 
+++-

 lib/arm/asm/gic-v3.h |  3 +++
 lib/arm/asm/gic.h|  1 +
 3 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/arm/micro-bench.c b/arm/micro-bench.c
index fc4d356..80d8db3 100644
--- a/arm/micro-bench.c
+++ b/arm/micro-bench.c
@@ -91,9 +91,40 @@ static void gic_prep_common(void)
assert(irq_ready);
 }

-static void ipi_prep(void)
+static bool ipi_prep(void)
Any reason why the bool returned value is preferred over the standard 
int?

 {
+   u32 val;
+
+   val = readl(vgic_dist_base + GICD_CTLR);
+   if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
+   val &= ~GICD_CTLR_ENABLE_G1A;
+   val &= ~GICD_CTLR_nASSGIreq;
+   writel(val, vgic_dist_base + GICD_CTLR);
+   val |= GICD_CTLR_ENABLE_G1A;
+   writel(val, vgic_dist_base + GICD_CTLR);

Why do we need this G1A dance?


Because it isn't legal to change the SGI behaviour when groups are 
enabled.

Yes, it is described in this bit of documentation nobody has access to.

And this code needs to track RWP on disabling Group-1.

M.
--
Jazz is not dead. It just smells funny...
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Marc Zyngier

Hi Eric,

On 2020-07-02 13:36, Auger Eric wrote:

Hi Marc,

On 7/2/20 10:22 AM, Marc Zyngier wrote:

On 2020-07-02 04:01, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.


nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
isn't as such visible to the guest itself (it only sees a GICv3).


By the way, I have just downloaded the latest GIC spec from the ARM
portal and I still do not find the GICD_CTLR_ENABLE_G1A,
GICD_CTLR_nASSGIreq and GICD_TYPER2_nASSGIcap. Do I miss something?


The latest spec still is the old one. There is a *confidential* erratum
to the spec that adds the missing bits, but nothing public.

You unfortunately will have to take my word for it.

M.
--
Jazz is not dead. It just smells funny...
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Auger Eric
Hi Jingyi,

On 7/2/20 5:01 AM, Jingyi Wang wrote:
> If gicv4.1(sgi hardware injection) supported, we test ipi injection
> via hw/sw way separately.
> 
> Signed-off-by: Jingyi Wang 
> ---
>  arm/micro-bench.c| 45 +++-
>  lib/arm/asm/gic-v3.h |  3 +++
>  lib/arm/asm/gic.h|  1 +
>  3 files changed, 44 insertions(+), 5 deletions(-)
> 
> diff --git a/arm/micro-bench.c b/arm/micro-bench.c
> index fc4d356..80d8db3 100644
> --- a/arm/micro-bench.c
> +++ b/arm/micro-bench.c
> @@ -91,9 +91,40 @@ static void gic_prep_common(void)
>   assert(irq_ready);
>  }
>  
> -static void ipi_prep(void)
> +static bool ipi_prep(void)
Any reason why the bool returned value is preferred over the standard int?
>  {
> + u32 val;
> +
> + val = readl(vgic_dist_base + GICD_CTLR);
> + if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
> + val &= ~GICD_CTLR_ENABLE_G1A;
> + val &= ~GICD_CTLR_nASSGIreq;
> + writel(val, vgic_dist_base + GICD_CTLR);
> + val |= GICD_CTLR_ENABLE_G1A;
> + writel(val, vgic_dist_base + GICD_CTLR);
Why do we need this G1A dance?
> + }
> +
>   gic_prep_common();
> + return true;
> +}
> +
> +static bool ipi_hw_prep(void)
> +{
> + u32 val;
> +
> + val = readl(vgic_dist_base + GICD_CTLR);
> + if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
> + val &= ~GICD_CTLR_ENABLE_G1A;
> + val |= GICD_CTLR_nASSGIreq;
> + writel(val, vgic_dist_base + GICD_CTLR);
> + val |= GICD_CTLR_ENABLE_G1A;
> + writel(val, vgic_dist_base + GICD_CTLR);
> + } else {
> + return false;
> + }
> +
> + gic_prep_common();
> + return true;
>  }
>  
>  static void ipi_exec(void)
> @@ -147,7 +178,7 @@ static void eoi_exec(void)
>  
>  struct exit_test {
>   const char *name;
> - void (*prep)(void);
> + bool (*prep)(void);
>   void (*exec)(void);
>   bool run;
>  };
> @@ -158,6 +189,7 @@ static struct exit_test tests[] = {
>   {"mmio_read_vgic",  NULL,   mmio_read_vgic_exec,true},
>   {"eoi", NULL,   eoi_exec,   true},
>   {"ipi", ipi_prep,   ipi_exec,   true},
> + {"ipi_hw",  ipi_hw_prep,ipi_exec,   true},
>  };
>  
>  struct ns_time {
> @@ -181,9 +213,12 @@ static void loop_test(struct exit_test *test)
>   uint64_t start, end, total_ticks, ntimes = NTIMES;
>   struct ns_time total_ns, avg_ns;
>  
> - if (test->prep)
> - test->prep();
> -
> + if (test->prep) {
> + if(!test->prep()) {
> + printf("%s test skipped\n", test->name);
> + return;
> + }
> + }
>   isb();
>   start = read_sysreg(cntpct_el0);
>   while (ntimes--)
> diff --git a/lib/arm/asm/gic-v3.h b/lib/arm/asm/gic-v3.h
> index cb72922..b4ce130 100644
> --- a/lib/arm/asm/gic-v3.h
> +++ b/lib/arm/asm/gic-v3.h
> @@ -20,10 +20,13 @@
>   */
>  #define GICD_CTLR0x
>  #define GICD_CTLR_RWP(1U << 31)
> +#define GICD_CTLR_nASSGIreq  (1U << 8)
>  #define GICD_CTLR_ARE_NS (1U << 4)
>  #define GICD_CTLR_ENABLE_G1A (1U << 1)
>  #define GICD_CTLR_ENABLE_G1  (1U << 0)
>  
> +#define GICD_TYPER2_nASSGIcap(1U << 8)
> +
>  /* Re-Distributor registers, offsets from RD_base */
>  #define GICR_TYPER   0x0008
>  
> diff --git a/lib/arm/asm/gic.h b/lib/arm/asm/gic.h
> index 38e79b2..1898400 100644
> --- a/lib/arm/asm/gic.h
> +++ b/lib/arm/asm/gic.h
> @@ -13,6 +13,7 @@
>  #define GICD_CTLR0x
>  #define GICD_TYPER   0x0004
>  #define GICD_IIDR0x0008
> +#define GICD_TYPER2  0x000C
>  #define GICD_IGROUPR 0x0080
>  #define GICD_ISENABLER   0x0100
>  #define GICD_ICENABLER   0x0180
> 

Thanks

Eric

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Auger Eric
Hi Marc,

On 7/2/20 10:22 AM, Marc Zyngier wrote:
> On 2020-07-02 04:01, Jingyi Wang wrote:
>> If gicv4.1(sgi hardware injection) supported, we test ipi injection
>> via hw/sw way separately.
> 
> nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
> imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
> isn't as such visible to the guest itself (it only sees a GICv3).

By the way, I have just downloaded the latest GIC spec from the ARM
portal and I still do not find the GICD_CTLR_ENABLE_G1A,
GICD_CTLR_nASSGIreq and GICD_TYPER2_nASSGIcap. Do I miss something?

Thanks

Eric


> 
> Thanks,
> 
>     M.

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Jingyi Wang

On 7/2/2020 5:17 PM, Marc Zyngier wrote:

On 2020-07-02 10:02, Jingyi Wang wrote:

Hi Marc,

On 7/2/2020 4:22 PM, Marc Zyngier wrote:

On 2020-07-02 04:01, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.


nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
isn't as such visible to the guest itself (it only sees a GICv3).

Thanks,

 M.


Yes, but to measure the performance difference of hw/sw SGI injection,
do you think it is acceptable to make it visible to guest and let it
switch SGI injection mode?


It is of course acceptable. I simply object to the "GICv4.1" description.

     M.


Okay, maybe description like "GICv4.1 supported kvm" is better.

Thanks,
Jingyi

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Marc Zyngier

On 2020-07-02 10:02, Jingyi Wang wrote:

Hi Marc,

On 7/2/2020 4:22 PM, Marc Zyngier wrote:

On 2020-07-02 04:01, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.


nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
isn't as such visible to the guest itself (it only sees a GICv3).

Thanks,

     M.


Yes, but to measure the performance difference of hw/sw SGI injection,
do you think it is acceptable to make it visible to guest and let it
switch SGI injection mode?


It is of course acceptable. I simply object to the "GICv4.1" 
description.


M.
--
Jazz is not dead. It just smells funny...
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Jingyi Wang

Hi Marc,

On 7/2/2020 4:22 PM, Marc Zyngier wrote:

On 2020-07-02 04:01, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.


nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
isn't as such visible to the guest itself (it only sees a GICv3).

Thanks,

     M.


Yes, but to measure the performance difference of hw/sw SGI injection,
do you think it is acceptable to make it visible to guest and let it
switch SGI injection mode?

Thanks,
Jingyi

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-02 Thread Marc Zyngier

On 2020-07-02 04:01, Jingyi Wang wrote:

If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.


nit: active-less SGIs are not strictly a feature of GICv4.1 (you could
imagine a GIC emulation offering the same thing). Furthermore, GICv4.1
isn't as such visible to the guest itself (it only sees a GICv3).

Thanks,

M.
--
Jazz is not dead. It just smells funny...
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


[kvm-unit-tests PATCH v2 3/8] arm64: microbench: gic: Add gicv4.1 support for ipi latency test.

2020-07-01 Thread Jingyi Wang
If gicv4.1(sgi hardware injection) supported, we test ipi injection
via hw/sw way separately.

Signed-off-by: Jingyi Wang 
---
 arm/micro-bench.c| 45 +++-
 lib/arm/asm/gic-v3.h |  3 +++
 lib/arm/asm/gic.h|  1 +
 3 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/arm/micro-bench.c b/arm/micro-bench.c
index fc4d356..80d8db3 100644
--- a/arm/micro-bench.c
+++ b/arm/micro-bench.c
@@ -91,9 +91,40 @@ static void gic_prep_common(void)
assert(irq_ready);
 }
 
-static void ipi_prep(void)
+static bool ipi_prep(void)
 {
+   u32 val;
+
+   val = readl(vgic_dist_base + GICD_CTLR);
+   if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
+   val &= ~GICD_CTLR_ENABLE_G1A;
+   val &= ~GICD_CTLR_nASSGIreq;
+   writel(val, vgic_dist_base + GICD_CTLR);
+   val |= GICD_CTLR_ENABLE_G1A;
+   writel(val, vgic_dist_base + GICD_CTLR);
+   }
+
gic_prep_common();
+   return true;
+}
+
+static bool ipi_hw_prep(void)
+{
+   u32 val;
+
+   val = readl(vgic_dist_base + GICD_CTLR);
+   if (readl(vgic_dist_base + GICD_TYPER2) & GICD_TYPER2_nASSGIcap) {
+   val &= ~GICD_CTLR_ENABLE_G1A;
+   val |= GICD_CTLR_nASSGIreq;
+   writel(val, vgic_dist_base + GICD_CTLR);
+   val |= GICD_CTLR_ENABLE_G1A;
+   writel(val, vgic_dist_base + GICD_CTLR);
+   } else {
+   return false;
+   }
+
+   gic_prep_common();
+   return true;
 }
 
 static void ipi_exec(void)
@@ -147,7 +178,7 @@ static void eoi_exec(void)
 
 struct exit_test {
const char *name;
-   void (*prep)(void);
+   bool (*prep)(void);
void (*exec)(void);
bool run;
 };
@@ -158,6 +189,7 @@ static struct exit_test tests[] = {
{"mmio_read_vgic",  NULL,   mmio_read_vgic_exec,true},
{"eoi", NULL,   eoi_exec,   true},
{"ipi", ipi_prep,   ipi_exec,   true},
+   {"ipi_hw",  ipi_hw_prep,ipi_exec,   true},
 };
 
 struct ns_time {
@@ -181,9 +213,12 @@ static void loop_test(struct exit_test *test)
uint64_t start, end, total_ticks, ntimes = NTIMES;
struct ns_time total_ns, avg_ns;
 
-   if (test->prep)
-   test->prep();
-
+   if (test->prep) {
+   if(!test->prep()) {
+   printf("%s test skipped\n", test->name);
+   return;
+   }
+   }
isb();
start = read_sysreg(cntpct_el0);
while (ntimes--)
diff --git a/lib/arm/asm/gic-v3.h b/lib/arm/asm/gic-v3.h
index cb72922..b4ce130 100644
--- a/lib/arm/asm/gic-v3.h
+++ b/lib/arm/asm/gic-v3.h
@@ -20,10 +20,13 @@
  */
 #define GICD_CTLR  0x
 #define GICD_CTLR_RWP  (1U << 31)
+#define GICD_CTLR_nASSGIreq(1U << 8)
 #define GICD_CTLR_ARE_NS   (1U << 4)
 #define GICD_CTLR_ENABLE_G1A   (1U << 1)
 #define GICD_CTLR_ENABLE_G1(1U << 0)
 
+#define GICD_TYPER2_nASSGIcap  (1U << 8)
+
 /* Re-Distributor registers, offsets from RD_base */
 #define GICR_TYPER 0x0008
 
diff --git a/lib/arm/asm/gic.h b/lib/arm/asm/gic.h
index 38e79b2..1898400 100644
--- a/lib/arm/asm/gic.h
+++ b/lib/arm/asm/gic.h
@@ -13,6 +13,7 @@
 #define GICD_CTLR  0x
 #define GICD_TYPER 0x0004
 #define GICD_IIDR  0x0008
+#define GICD_TYPER20x000C
 #define GICD_IGROUPR   0x0080
 #define GICD_ISENABLER 0x0100
 #define GICD_ICENABLER 0x0180
-- 
2.19.1


___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm