From: Shannon Zhao <zhaoshenglong@huawei.com>
To: Auger Eric <eric.auger@redhat.com>, <qemu-arm@nongnu.org>
Cc: peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH v2 2/2] arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR
Date: Wed, 21 Mar 2018 16:33:18 +0800 [thread overview]
Message-ID: <5AB218CE.1050000@huawei.com> (raw)
In-Reply-To: <33a7bc59-c457-03d0-90bf-ab5b2d2d46cd@redhat.com>
On 2018/3/20 16:42, Auger Eric wrote:
> Hi Shannon,
> On 20/03/18 08:26, Shannon Zhao wrote:
>> While we skip the GIC_INTERNAL irqs, we don't change the register offset
>> accordingly. This will overlap the GICR registers value and leave the
>> last GIC_INTERNAL irq's registers out of update.
>>
>> Fix this by skipping the registers banked by GICR.
>>
>> Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
>> ---
>> hw/intc/arm_gicv3_kvm.c | 38 ++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 38 insertions(+)
>>
>> diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
>> index 3536795..d423cba 100644
>> --- a/hw/intc/arm_gicv3_kvm.c
>> +++ b/hw/intc/arm_gicv3_kvm.c
>> @@ -136,6 +136,12 @@ static void kvm_dist_get_priority(GICv3State *s, uint32_t offset, uint8_t *bmp)
>> int irq;
>>
>> field = (uint32_t *)bmp;
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 8
>> + * GICD_IPRIORITYR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_IPRIORITYR<n>. So it doesn't need to
>> + * sync them.
>> + */
>> + offset += (8 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 8) {
>> kvm_gicd_access(s, offset, ®, false);
>> *field = reg;
>> @@ -150,6 +156,12 @@ static void kvm_dist_put_priority(GICv3State *s, uint32_t offset, uint8_t *bmp)
>> int irq;
>>
>> field = (uint32_t *)bmp;
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 8
>> + * GICD_IPRIORITYR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_IPRIORITYR<n>. So it doesn't need to
>> + * sync them.
>> + */
>> + offset += (8 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 8) {
>> reg = *field;
>> kvm_gicd_access(s, offset, ®, true);
>> @@ -164,6 +176,12 @@ static void kvm_dist_get_edge_trigger(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 2
>> + * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_ICFGR<n>. So it doesn't need to sync
>> + * them.
>> + */
>> + offset += (2 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 2) {
>> kvm_gicd_access(s, offset, ®, false);
>> reg = half_unshuffle32(reg >> 1);
>> @@ -181,6 +199,12 @@ static void kvm_dist_put_edge_trigger(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 2
>> + * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_ICFGR<n>. So it doesn't need to sync
>> + * them.
>> + */
>> + offset += (2 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 2) {
>> reg = *gic_bmp_ptr32(bmp, irq);
>> if (irq % 32 != 0) {
>> @@ -222,6 +246,12 @@ static void kvm_dist_getbmp(GICv3State *s, uint32_t offset, uint32_t *bmp)
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the
>> + * GICD_IGROUPR0/GICD_ISENABLER0/GICD_ISPENDR0/GICD_ISACTIVER0 registers
>> + * are always RAZ/WI. The corresponding functionality is replaced by the
>> + * GICR registers. So it doesn't need to sync them.
>> + */
>> + offset += (1 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 1) {
>> kvm_gicd_access(s, offset, ®, false);
>> *gic_bmp_ptr32(bmp, irq) = reg;
>> @@ -235,6 +265,14 @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the
>> + * GICD_IGROUPR0/GICD_ISENABLER0/GICD_ISPENDR0/GICD_ISACTIVER0 registers
>> + * are always RAZ/WI. The corresponding functionality is replaced by the
>> + * GICR registers. So it doesn't need to sync them.
>> + */
>> + offset += (1 * sizeof(uint32_t));
> I wonder we couldn't create a new for_each_dist_irq_reg() macro taking
> the offset and clroffset and integrating that shift inside?
>
Peter, what's your opinion?
>> + if (clroffset != 0)
> nit style issue: brace needed here
>
OK
> Besides Reviewed-by: Eric Auger <eric.auger@redhat.com>
>
Thanks!
> Thanks
>
> Eric
>
>> + clroffset += (1 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 1) {
>> /* If this bitmap is a set/clear register pair, first write to the
>> * clear-reg to clear all bits before using the set-reg to write
>>
>
> .
>
--
Shannon
WARNING: multiple messages have this Message-ID (diff)
From: Shannon Zhao <zhaoshenglong@huawei.com>
To: Auger Eric <eric.auger@redhat.com>, qemu-arm@nongnu.org
Cc: peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 2/2] arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR
Date: Wed, 21 Mar 2018 16:33:18 +0800 [thread overview]
Message-ID: <5AB218CE.1050000@huawei.com> (raw)
In-Reply-To: <33a7bc59-c457-03d0-90bf-ab5b2d2d46cd@redhat.com>
On 2018/3/20 16:42, Auger Eric wrote:
> Hi Shannon,
> On 20/03/18 08:26, Shannon Zhao wrote:
>> While we skip the GIC_INTERNAL irqs, we don't change the register offset
>> accordingly. This will overlap the GICR registers value and leave the
>> last GIC_INTERNAL irq's registers out of update.
>>
>> Fix this by skipping the registers banked by GICR.
>>
>> Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
>> ---
>> hw/intc/arm_gicv3_kvm.c | 38 ++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 38 insertions(+)
>>
>> diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
>> index 3536795..d423cba 100644
>> --- a/hw/intc/arm_gicv3_kvm.c
>> +++ b/hw/intc/arm_gicv3_kvm.c
>> @@ -136,6 +136,12 @@ static void kvm_dist_get_priority(GICv3State *s, uint32_t offset, uint8_t *bmp)
>> int irq;
>>
>> field = (uint32_t *)bmp;
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 8
>> + * GICD_IPRIORITYR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_IPRIORITYR<n>. So it doesn't need to
>> + * sync them.
>> + */
>> + offset += (8 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 8) {
>> kvm_gicd_access(s, offset, ®, false);
>> *field = reg;
>> @@ -150,6 +156,12 @@ static void kvm_dist_put_priority(GICv3State *s, uint32_t offset, uint8_t *bmp)
>> int irq;
>>
>> field = (uint32_t *)bmp;
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 8
>> + * GICD_IPRIORITYR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_IPRIORITYR<n>. So it doesn't need to
>> + * sync them.
>> + */
>> + offset += (8 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 8) {
>> reg = *field;
>> kvm_gicd_access(s, offset, ®, true);
>> @@ -164,6 +176,12 @@ static void kvm_dist_get_edge_trigger(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 2
>> + * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_ICFGR<n>. So it doesn't need to sync
>> + * them.
>> + */
>> + offset += (2 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 2) {
>> kvm_gicd_access(s, offset, ®, false);
>> reg = half_unshuffle32(reg >> 1);
>> @@ -181,6 +199,12 @@ static void kvm_dist_put_edge_trigger(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the first 2
>> + * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
>> + * functionality is replaced by GICR_ICFGR<n>. So it doesn't need to sync
>> + * them.
>> + */
>> + offset += (2 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 2) {
>> reg = *gic_bmp_ptr32(bmp, irq);
>> if (irq % 32 != 0) {
>> @@ -222,6 +246,12 @@ static void kvm_dist_getbmp(GICv3State *s, uint32_t offset, uint32_t *bmp)
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the
>> + * GICD_IGROUPR0/GICD_ISENABLER0/GICD_ISPENDR0/GICD_ISACTIVER0 registers
>> + * are always RAZ/WI. The corresponding functionality is replaced by the
>> + * GICR registers. So it doesn't need to sync them.
>> + */
>> + offset += (1 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 1) {
>> kvm_gicd_access(s, offset, ®, false);
>> *gic_bmp_ptr32(bmp, irq) = reg;
>> @@ -235,6 +265,14 @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
>> uint32_t reg;
>> int irq;
>>
>> + /* For the KVM GICv3, affinity routing is always enabled, and the
>> + * GICD_IGROUPR0/GICD_ISENABLER0/GICD_ISPENDR0/GICD_ISACTIVER0 registers
>> + * are always RAZ/WI. The corresponding functionality is replaced by the
>> + * GICR registers. So it doesn't need to sync them.
>> + */
>> + offset += (1 * sizeof(uint32_t));
> I wonder we couldn't create a new for_each_dist_irq_reg() macro taking
> the offset and clroffset and integrating that shift inside?
>
Peter, what's your opinion?
>> + if (clroffset != 0)
> nit style issue: brace needed here
>
OK
> Besides Reviewed-by: Eric Auger <eric.auger@redhat.com>
>
Thanks!
> Thanks
>
> Eric
>
>> + clroffset += (1 * sizeof(uint32_t));
>> for_each_dist_irq_reg(irq, s->num_irq, 1) {
>> /* If this bitmap is a set/clear register pair, first write to the
>> * clear-reg to clear all bits before using the set-reg to write
>>
>
> .
>
--
Shannon
next prev parent reply other threads:[~2018-03-21 8:34 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-20 7:26 [Qemu-arm] [PATCH v2 0/2] two fixes for KVM GICv3 dist get/put functions Shannon Zhao
2018-03-20 7:26 ` [Qemu-devel] " Shannon Zhao
2018-03-20 7:26 ` [Qemu-arm] [PATCH v2 1/2] arm_gicv3_kvm: increase clroffset accordingly Shannon Zhao
2018-03-20 7:26 ` [Qemu-devel] " Shannon Zhao
2018-03-20 8:07 ` [Qemu-arm] " Auger Eric
2018-03-20 8:07 ` Auger Eric
2018-03-20 7:26 ` [Qemu-arm] [PATCH v2 2/2] arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR Shannon Zhao
2018-03-20 7:26 ` [Qemu-devel] " Shannon Zhao
2018-03-20 8:42 ` [Qemu-arm] " Auger Eric
2018-03-20 8:42 ` Auger Eric
2018-03-21 8:33 ` Shannon Zhao [this message]
2018-03-21 8:33 ` Shannon Zhao
2018-03-20 11:22 ` [Qemu-arm] " Peter Maydell
2018-03-20 11:22 ` [Qemu-devel] " Peter Maydell
2018-03-20 11:36 ` Shannon Zhao
2018-03-20 11:36 ` [Qemu-devel] " Shannon Zhao
2018-03-20 11:54 ` Peter Maydell
2018-03-20 11:54 ` [Qemu-devel] " Peter Maydell
2018-03-21 8:00 ` Shannon Zhao
2018-03-21 8:00 ` [Qemu-devel] " Shannon Zhao
2018-03-23 12:08 ` Peter Maydell
2018-03-23 12:08 ` [Qemu-devel] " Peter Maydell
2018-03-29 10:54 ` Peter Maydell
2018-03-29 10:54 ` [Qemu-devel] " Peter Maydell
2018-03-29 11:11 ` Dr. David Alan Gilbert
2018-03-29 11:11 ` [Qemu-devel] " Dr. David Alan Gilbert
2018-04-05 14:22 ` Peter Maydell
2018-04-05 14:22 ` [Qemu-devel] " Peter Maydell
2018-04-06 9:36 ` Peter Maydell
2018-04-06 9:36 ` [Qemu-devel] " Peter Maydell
2018-04-08 1:50 ` Shannon Zhao
2018-04-08 1:50 ` [Qemu-devel] " Shannon Zhao
2018-05-22 9:13 ` Peter Maydell
2018-05-22 9:13 ` [Qemu-devel] " Peter Maydell
2018-05-24 6:29 ` Shannon Zhao
2018-05-24 6:29 ` [Qemu-devel] " Shannon Zhao
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=5AB218CE.1050000@huawei.com \
--to=zhaoshenglong@huawei.com \
--cc=eric.auger@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.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.