All of lore.kernel.org
 help / color / mirror / Atom feed
From: shashi.mallela@linaro.org
To: Eric Auger <eauger@redhat.com>,
	peter.maydell@linaro.org, leif@nuviainc.com,  rad@semihalf.com
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [PATCH v4 1/8] hw/intc: GICv3 ITS initial framework
Date: Tue, 06 Jul 2021 10:18:28 -0400	[thread overview]
Message-ID: <7c660ca8e5e1ccecb72a98d67063156d3419759b.camel@linaro.org> (raw)
In-Reply-To: <7fbf59d6-1b29-0e7a-0af3-6c4b3cc59970@redhat.com>

On Tue, 2021-07-06 at 16:04 +0200, Eric Auger wrote:
> Hi Shashi,
> 
> On 7/6/21 3:24 PM, shashi.mallela@linaro.org wrote:
> > Hi Eric,
> > 
> > Please find my response inline(below):-
> > 
> > On Tue, 2021-07-06 at 09:38 +0200, Eric Auger wrote:
> > > Hi,
> > > 
> > > On 6/11/21 6:21 PM, Eric Auger wrote:
> > > > Hi,
> > > > 
> > > > On 6/2/21 8:00 PM, Shashi Mallela wrote:
> > > > > Added register definitions relevant to ITS,implemented
> > > > > overall
> > > > > ITS device framework with stubs for ITS control and
> > > > > translater
> > > > > regions read/write,extended ITS common to handle mmio init
> > > > > between
> > > > > existing kvm device and newer qemu device.
> > > > > 
> > > > > Signed-off-by: Shashi Mallela <shashi.mallela@linaro.org>
> > > > > ---
> > > > >  hw/intc/arm_gicv3_its.c                | 240
> > > > > +++++++++++++++++++++++++
> > > > >  hw/intc/arm_gicv3_its_common.c         |   8 +-
> > > > >  hw/intc/arm_gicv3_its_kvm.c            |   2 +-
> > > > >  hw/intc/gicv3_internal.h               |  88 +++++++--
> > > > >  hw/intc/meson.build                    |   1 +
> > > > >  include/hw/intc/arm_gicv3_its_common.h |   9 +-
> > > > >  6 files changed, 331 insertions(+), 17 deletions(-)
> > > > >  create mode 100644 hw/intc/arm_gicv3_its.c
> > > > > 
> > > > > diff --git a/hw/intc/arm_gicv3_its.c
> > > > > b/hw/intc/arm_gicv3_its.c
> > > > > new file mode 100644
> > > > > index 0000000000..545cda3665
> > > > > --- /dev/null
> > > > > +++ b/hw/intc/arm_gicv3_its.c
> > > > > @@ -0,0 +1,240 @@
> > > > > +/*
> > > > > + * ITS emulation for a GICv3-based system
> > > > > + *
> > > > > + * Copyright Linaro.org 2021
> > > > > + *
> > > > > + * Authors:
> > > > > + *  Shashi Mallela <shashi.mallela@linaro.org>
> > > > > + *
> > > > > + * This work is licensed under the terms of the GNU GPL,
> > > > > version
> > > > > 2 or (at your
> > > > > + * option) any later version.  See the COPYING file in the
> > > > > top-
> > > > > level directory.
> > > > > + *
> > > > > + */
> > > > > +
> > > > > +#include "qemu/osdep.h"
> > > > > +#include "qemu/log.h"
> > > > > +#include "hw/qdev-properties.h"
> > > > > +#include "hw/intc/arm_gicv3_its_common.h"
> > > > > +#include "gicv3_internal.h"
> > > > > +#include "qom/object.h"
> > > > > +
> > > > > +typedef struct GICv3ITSClass GICv3ITSClass;
> > > > > +/* This is reusing the GICv3ITSState typedef from
> > > > > ARM_GICV3_ITS_COMMON */
> > > > > +DECLARE_OBJ_CHECKERS(GICv3ITSState, GICv3ITSClass,
> > > > > +                     ARM_GICV3_ITS, TYPE_ARM_GICV3_ITS)
> > > > > +
> > > > > +struct GICv3ITSClass {
> > > > > +    GICv3ITSCommonClass parent_class;
> > > > > +    void (*parent_reset)(DeviceState *dev);
> > > > > +};
> > > > > +
> > > > > +static MemTxResult gicv3_its_translation_write(void *opaque,
> > > > > hwaddr offset,
> > > > > +                                               uint64_t
> > > > > data,
> > > > > unsigned size,
> > > > > +                                               MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    MemTxResult result = MEMTX_OK;
> > > > > +
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult its_writel(GICv3ITSState *s, hwaddr
> > > > > offset,
> > > > > +                              uint64_t value, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    MemTxResult result = MEMTX_OK;
> > > > > +
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult its_readl(GICv3ITSState *s, hwaddr
> > > > > offset,
> > > > > +                             uint64_t *data, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    MemTxResult result = MEMTX_OK;
> > > > > +
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult its_writell(GICv3ITSState *s, hwaddr
> > > > > offset,
> > > > > +                               uint64_t value, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    MemTxResult result = MEMTX_OK;
> > > > > +
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult its_readll(GICv3ITSState *s, hwaddr
> > > > > offset,
> > > > > +                              uint64_t *data, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    MemTxResult result = MEMTX_OK;
> > > > > +
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult gicv3_its_read(void *opaque, hwaddr
> > > > > offset,
> > > > > uint64_t *data,
> > > > > +                                  unsigned size, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    GICv3ITSState *s = (GICv3ITSState *)opaque;
> > > > > +    MemTxResult result;
> > > > > +
> > > > > +    switch (size) {
> > > > > +    case 4:
> > > > > +        result = its_readl(s, offset, data, attrs);
> > > > > +        break;
> > > > > +    case 8:
> > > > > +        result = its_readll(s, offset, data, attrs);
> > > > > +        break;
> > > > > +    default:
> > > > > +        result = MEMTX_ERROR;
> > > > > +        break;
> > > > > +    }
> > > > > +
> > > > > +    if (result == MEMTX_ERROR) {
> > > > > +        qemu_log_mask(LOG_GUEST_ERROR,
> > > > > +                      "%s: invalid guest read at offset "
> > > > > TARGET_FMT_plx
> > > > > +                      "size %u\n", __func__, offset, size);
> > > > > +        /*
> > > > > +         * The spec requires that reserved registers are
> > > > > RAZ/WI;
> > > > > +         * so use MEMTX_ERROR returns from leaf functions as
> > > > > a
> > > > > way to
> > > > > +         * trigger the guest-error logging but don't return
> > > > > it
> > > > > to
> > > > > +         * the caller, or we'll cause a spurious guest data
> > > > > abort.
> > > > > +         */
> > > > > +        result = MEMTX_OK;
> > > > > +        *data = 0;
> > > > > +    }
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static MemTxResult gicv3_its_write(void *opaque, hwaddr
> > > > > offset,
> > > > > uint64_t data,
> > > > > +                                   unsigned size, MemTxAttrs
> > > > > attrs)
> > > > > +{
> > > > > +    GICv3ITSState *s = (GICv3ITSState *)opaque;
> > > > > +    MemTxResult result;
> > > > > +
> > > > > +    switch (size) {
> > > > > +    case 4:
> > > > > +        result = its_writel(s, offset, data, attrs);
> > > > > +        break;
> > > > > +    case 8:
> > > > > +        result = its_writell(s, offset, data, attrs);
> > > > > +        break;
> > > > > +    default:
> > > > > +        result = MEMTX_ERROR;
> > > > > +        break;
> > > > > +    }
> > > > > +
> > > > > +    if (result == MEMTX_ERROR) {
> > > > > +        qemu_log_mask(LOG_GUEST_ERROR,
> > > > > +                      "%s: invalid guest write at offset "
> > > > > TARGET_FMT_plx
> > > > > +                      "size %u\n", __func__, offset, size);
> > > > > +        /*
> > > > > +         * The spec requires that reserved registers are
> > > > > RAZ/WI;
> > > > > +         * so use MEMTX_ERROR returns from leaf functions as
> > > > > a
> > > > > way to
> > > > > +         * trigger the guest-error logging but don't return
> > > > > it
> > > > > to
> > > > > +         * the caller, or we'll cause a spurious guest data
> > > > > abort.
> > > > > +         */
> > > > > +        result = MEMTX_OK;
> > > > > +    }
> > > > > +    return result;
> > > > > +}
> > > > > +
> > > > > +static const MemoryRegionOps gicv3_its_control_ops = {
> > > > > +    .read_with_attrs = gicv3_its_read,
> > > > > +    .write_with_attrs = gicv3_its_write,
> > > > > +    .valid.min_access_size = 4,
> > > > > +    .valid.max_access_size = 8,
> > > > > +    .impl.min_access_size = 4,
> > > > > +    .impl.max_access_size = 8,
> > > > > +    .endianness = DEVICE_NATIVE_ENDIAN,
> > > > > +};
> > > > > +
> > > > > +static const MemoryRegionOps gicv3_its_translation_ops = {
> > > > > +    .write_with_attrs = gicv3_its_translation_write,
> > > > > +    .valid.min_access_size = 2,
> > > > > +    .valid.max_access_size = 4,
> > > > > +    .impl.min_access_size = 2,
> > > > > +    .impl.max_access_size = 4,
> > > > > +    .endianness = DEVICE_NATIVE_ENDIAN,
> > > > > +};
> > > > > +
> > > > > +static void gicv3_arm_its_realize(DeviceState *dev, Error
> > > > > **errp)
> > > > > +{
> > > > > +    GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
> > > > > +
> > > > > +    gicv3_its_init_mmio(s, &gicv3_its_control_ops,
> > > > > &gicv3_its_translation_ops);
> > > > > +
> > > > > +    if (s->gicv3->cpu->gicr_typer & GICR_TYPER_PLPIS) {
> > > > > +        /* set the ITS default features supported */
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER,
> > > > > PHYSICAL,
> > > > > +                              GITS_TYPE_PHYSICAL);
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER,
> > > > > ITT_ENTRY_SIZE,
> > > > > +                              ITS_ITT_ENTRY_SIZE - 1);
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER, IDBITS,
> > > > > ITS_IDBITS);
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER, DEVBITS,
> > > > > ITS_DEVBITS);
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER, CIL, 1);
> > > > > +        s->typer = FIELD_DP64(s->typer, GITS_TYPER, CIDBITS,
> > > > > ITS_CIDBITS);
> > > > > +    }
> > > > > +}
> > > > > +
> > > > > +static void gicv3_its_reset(DeviceState *dev)
> > > > > +{
> > > > > +    GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
> > > > > +    GICv3ITSClass *c = ARM_GICV3_ITS_GET_CLASS(s);
> > > > > +
> > > > > +    if (s->gicv3->cpu->gicr_typer & GICR_TYPER_PLPIS) {
> > > > > +        c->parent_reset(dev);
> > > > > +
> > > > > +        /* Quiescent bit reset to 1 */
> > > > > +        s->ctlr = FIELD_DP32(s->ctlr, GITS_CTLR, QUIESCENT,
> > > > > 1);
> > > > > +
> > > > > +        /*
> > > > > +         * setting GITS_BASER0.Type = 0b001 (Device)
> > > > > +         *         GITS_BASER1.Type = 0b100 (Collection
> > > > > Table)
> > > > > +         *         GITS_BASER<n>.Type,where n = 3 to 7 are
> > > > > 0b00
> > > > > (Unimplemented)
> > > > > +         *         GITS_BASER<0,1>.Page_Size = 64KB
> > > > > +         * and default translation table entry size to 16
> > > > > bytes
> > > > > +         */
> > > > > +        s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER,
> > > > > TYPE,
> > > > > +                                 GITS_ITT_TYPE_DEVICE);
> > > > > +        s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER,
> > > > > PAGESIZE,
> > > > > +                                 GITS_BASER_PAGESIZE_64K);
> > > > > +        s->baser[0] = FIELD_DP64(s->baser[0], GITS_BASER,
> > > > > ENTRYSIZE,
> > > > > +                                 GITS_DTE_SIZE - 1);
> > > > > +
> > > > > +        s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER,
> > > > > TYPE,
> > > > > +                                 GITS_ITT_TYPE_COLLECTION);
> > > > > +        s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER,
> > > > > PAGESIZE,
> > > > > +                                 GITS_BASER_PAGESIZE_64K);
> > > > > +        s->baser[1] = FIELD_DP64(s->baser[1], GITS_BASER,
> > > > > ENTRYSIZE,
> > > > > +                                 GITS_CTE_SIZE - 1);
> > > > > +    }
> > > > > +}
> > > > > +
> > > > > +static Property gicv3_its_props[] = {
> > > > > +    DEFINE_PROP_LINK("parent-gicv3", GICv3ITSState, gicv3,
> > > > > "arm-
> > > > > gicv3",
> > > > > +                     GICv3State *),
> > > > > +    DEFINE_PROP_END_OF_LIST(),
> > > > > +};
> > > > > +
> > > > > +static void gicv3_its_class_init(ObjectClass *klass, void
> > > > > *data)
> > > > > +{
> > > > > +    DeviceClass *dc = DEVICE_CLASS(klass);
> > > > > +    GICv3ITSClass *ic = ARM_GICV3_ITS_CLASS(klass);
> > > > > +
> > > > > +    dc->realize = gicv3_arm_its_realize;
> > > > > +    device_class_set_props(dc, gicv3_its_props);
> > > > > +    device_class_set_parent_reset(dc, gicv3_its_reset, &ic-
> > > > > > parent_reset);
> > > > > +}
> > > > > +
> > > > > +static const TypeInfo gicv3_its_info = {
> > > > > +    .name = TYPE_ARM_GICV3_ITS,
> > > > > +    .parent = TYPE_ARM_GICV3_ITS_COMMON,
> > > > > +    .instance_size = sizeof(GICv3ITSState),
> > > > > +    .class_init = gicv3_its_class_init,
> > > > > +    .class_size = sizeof(GICv3ITSClass),
> > > > > +};
> > > > > +
> > > > > +static void gicv3_its_register_types(void)
> > > > > +{
> > > > > +    type_register_static(&gicv3_its_info);
> > > > > +}
> > > > > +
> > > > > +type_init(gicv3_its_register_types)
> > > > > diff --git a/hw/intc/arm_gicv3_its_common.c
> > > > > b/hw/intc/arm_gicv3_its_common.c
> > > > > index 66c4c6a188..f1657c84e0 100644
> > > > > --- a/hw/intc/arm_gicv3_its_common.c
> > > > > +++ b/hw/intc/arm_gicv3_its_common.c
> > > > > @@ -50,6 +50,8 @@ static int gicv3_its_post_load(void
> > > > > *opaque,
> > > > > int version_id)
> > > > >  
> > > > >  static const VMStateDescription vmstate_its = {
> > > > >      .name = "arm_gicv3_its",
> > > > > +    .version_id = 1,
> > > > > +    .minimum_version_id = 1,
> > > > >      .pre_save = gicv3_its_pre_save,
> > > > >      .post_load = gicv3_its_post_load,
> > > > >      .priority = MIG_PRI_GICV3_ITS,
> > > > > @@ -99,14 +101,15 @@ static const MemoryRegionOps
> > > > > gicv3_its_trans_ops = {
> > > > >      .endianness = DEVICE_NATIVE_ENDIAN,
> > > > >  };
> > > > >  
> > > > > -void gicv3_its_init_mmio(GICv3ITSState *s, const
> > > > > MemoryRegionOps
> > > > > *ops)
> > > > > +void gicv3_its_init_mmio(GICv3ITSState *s, const
> > > > > MemoryRegionOps
> > > > > *ops,
> > > > > +                         const MemoryRegionOps *tops)
> > > > >  {
> > > > >      SysBusDevice *sbd = SYS_BUS_DEVICE(s);
> > > > >  
> > > > >      memory_region_init_io(&s->iomem_its_cntrl, OBJECT(s),
> > > > > ops,
> > > > > s,
> > > > >                            "control", ITS_CONTROL_SIZE);
> > > > >      memory_region_init_io(&s->iomem_its_translation,
> > > > > OBJECT(s),
> > > > > -                          &gicv3_its_trans_ops, s,
> > > > > +                          tops ? tops :
> > > > > &gicv3_its_trans_ops, s,
> > > > >                            "translation", ITS_TRANS_SIZE);
> > > > >  
> > > > >      /* Our two regions are always adjacent, therefore we now
> > > > > combine them
> > > > > @@ -129,7 +132,6 @@ static void
> > > > > gicv3_its_common_reset(DeviceState *dev)
> > > > >      s->cbaser = 0;
> > > > >      s->cwriter = 0;
> > > > >      s->creadr = 0;
> > > > > -    s->iidr = 0;
> > > > >      memset(&s->baser, 0, sizeof(s->baser));
> > > > >  }
> > > > >  
> > > > > diff --git a/hw/intc/arm_gicv3_its_kvm.c
> > > > > b/hw/intc/arm_gicv3_its_kvm.c
> > > > > index b554d2ede0..0b4cbed28b 100644
> > > > > --- a/hw/intc/arm_gicv3_its_kvm.c
> > > > > +++ b/hw/intc/arm_gicv3_its_kvm.c
> > > > > @@ -106,7 +106,7 @@ static void
> > > > > kvm_arm_its_realize(DeviceState
> > > > > *dev, Error **errp)
> > > > >      kvm_arm_register_device(&s->iomem_its_cntrl, -1,
> > > > > KVM_DEV_ARM_VGIC_GRP_ADDR,
> > > > >                              KVM_VGIC_ITS_ADDR_TYPE, s-
> > > > > >dev_fd,
> > > > > 0);
> > > > >  
> > > > > -    gicv3_its_init_mmio(s, NULL);
> > > > > +    gicv3_its_init_mmio(s, NULL, NULL);
> > > > >  
> > > > >      if (!kvm_device_check_attr(s->dev_fd,
> > > > > KVM_DEV_ARM_VGIC_GRP_ITS_REGS,
> > > > >          GITS_CTLR)) {
> > > > > diff --git a/hw/intc/gicv3_internal.h
> > > > > b/hw/intc/gicv3_internal.h
> > > > > index 05303a55c8..e0b06930a7 100644
> > > > > --- a/hw/intc/gicv3_internal.h
> > > > > +++ b/hw/intc/gicv3_internal.h
> > > > > @@ -24,6 +24,7 @@
> > > > >  #ifndef QEMU_ARM_GICV3_INTERNAL_H
> > > > >  #define QEMU_ARM_GICV3_INTERNAL_H
> > > > >  
> > > > > +#include "hw/registerfields.h"
> > > > >  #include "hw/intc/arm_gicv3_common.h"
> > > > >  
> > > > >  /* Distributor registers, as offsets from the distributor
> > > > > base
> > > > > address */
> > > > > @@ -67,6 +68,9 @@
> > > > >  #define GICD_CTLR_E1NWF             (1U << 7)
> > > > >  #define GICD_CTLR_RWP               (1U << 31)
> > > > >  
> > > > > +/* 16 bits EventId */
> > > > > +#define GICD_TYPER_IDBITS            0xf
> > > > > +
> > > > >  /*
> > > > >   * Redistributor frame offsets from RD_base
> > > > >   */
> > > > > @@ -122,18 +126,6 @@
> > > > >  #define GICR_WAKER_ProcessorSleep    (1U << 1)
> > > > >  #define GICR_WAKER_ChildrenAsleep    (1U << 2)
> > > > >  
> > > > > -#define GICR_PROPBASER_OUTER_CACHEABILITY_MASK (7ULL << 56)
> > > > > -#define
> > > > > GICR_PROPBASER_ADDR_MASK               (0xfffffffffULL
> > > > > << 12)
> > > > > -#define GICR_PROPBASER_SHAREABILITY_MASK       (3U << 10)
> > > > > -#define GICR_PROPBASER_CACHEABILITY_MASK       (7U << 7)
> > > > > -#define GICR_PROPBASER_IDBITS_MASK             (0x1f)
> > > > > -
> > > > > -#define GICR_PENDBASER_PTZ                     (1ULL << 62)
> > > > > -#define GICR_PENDBASER_OUTER_CACHEABILITY_MASK (7ULL << 56)
> > > > > -#define
> > > > > GICR_PENDBASER_ADDR_MASK               (0xffffffffULL <<
> > > > > 16)
> > > > > -#define GICR_PENDBASER_SHAREABILITY_MASK       (3U << 10)
> > > > > -#define GICR_PENDBASER_CACHEABILITY_MASK       (7U << 7)
> > > > > -
> > > > >  #define ICC_CTLR_EL1_CBPR           (1U << 0)
> > > > >  #define ICC_CTLR_EL1_EOIMODE        (1U << 1)
> > > > >  #define ICC_CTLR_EL1_PMHE            (1U << 6)
> > > > > @@ -239,6 +231,78 @@
> > > > >  #define ICH_VTR_EL2_PREBITS_SHIFT 26
> > > > >  #define ICH_VTR_EL2_PRIBITS_SHIFT 29
> > > > >  
> > > > > +/* ITS Registers */
> > > > > +
> > > > > +FIELD(GITS_BASER, SIZE, 0, 8)
> > > > > +FIELD(GITS_BASER, PAGESIZE, 8, 2)
> > > > > +FIELD(GITS_BASER, SHAREABILITY, 10, 2)
> > > > > +FIELD(GITS_BASER, PHYADDR, 12, 36)
> > > > > +FIELD(GITS_BASER, PHYADDRL_64K, 16, 32)
> > > > > +FIELD(GITS_BASER, PHYADDRH_64K, 48, 4)
> > > > Isn't it FIELD(GITS_BASER, PHYADDRH_64K, 12, 4)
> > > > hum actually it is fixed in next patch ;-) The right value can
> > > > be
> > > > put
> > > > here directly
> > > not addressed in v5
> > will do
> > > > > +FIELD(GITS_BASER, ENTRYSIZE, 48, 5)
> > > > > +FIELD(GITS_BASER, OUTERCACHE, 53, 3)
> > > > > +FIELD(GITS_BASER, TYPE, 56, 3)
> > > > > +FIELD(GITS_BASER, INNERCACHE, 59, 3)
> > > > > +FIELD(GITS_BASER, INDIRECT, 62, 1)
> > > > > +FIELD(GITS_BASER, VALID, 63, 1)
> > > > > +
> > > > > +FIELD(GITS_CTLR, QUIESCENT, 31, 1)
> > > > > +
> > > > > +FIELD(GITS_TYPER, PHYSICAL, 0, 1)
> > > > > +FIELD(GITS_TYPER, ITT_ENTRY_SIZE, 4, 4)
> > > > > +FIELD(GITS_TYPER, IDBITS, 8, 5)
> > > > > +FIELD(GITS_TYPER, DEVBITS, 13, 5)
> > > > > +FIELD(GITS_TYPER, SEIS, 18, 1)
> > > > > +FIELD(GITS_TYPER, PTA, 19, 1)
> > > > > +FIELD(GITS_TYPER, CIDBITS, 32, 4)
> > > > > +FIELD(GITS_TYPER, CIL, 36, 1)
> > > > > +
> > > > > +#define GITS_BASER_PAGESIZE_4K                0
> > > > > +#define GITS_BASER_PAGESIZE_16K               1
> > > > > +#define GITS_BASER_PAGESIZE_64K               2
> > > > > +
> > > > > +#define GITS_ITT_TYPE_DEVICE                  1ULL
> > > > > +#define GITS_ITT_TYPE_COLLECTION              4ULL
> > > > you may rename into GITS_BASER_TYPE_DEVICE and COLLECTION?
> > > not addressed in v5
> > will do
> > > > > +
> > > > > +/**
> > > > > + * Default features advertised by this version of ITS
> > > > > + */
> > > > > +/* Physical LPIs supported */
> > > > > +#define GITS_TYPE_PHYSICAL           (1U << 0)
> > > > > +
> > > > > +/*
> > > > > + * 12 bytes Interrupt translation Table Entry size
> > > > > + * ITE Lower 8 Bytes
> > > > > + * Valid = 1 bit,InterruptType = 1 bit,
> > > > > + * Size of LPI number space[considering max 24 bits],
> > > > > + * Size of LPI number space[considering max 24 bits],
> I just meant the above sentence is repeated twice ;-)
This is not repeated twice,but it is as defined in the GIC spec(Table
5-3),both of them refer to the interrupt number,but the 2nd one differs
in value between GICv3(programmed value of 1023) & GICv4(pIntid
doorbell value).I can add further comment to 2nd sentence to clarify.  
> 
> > > > repeated
> > > not adressed in v5
> > I had replied to this comment earlier,
> > The ITE size of 12 bytes format defined here is based on "Table 5-3 
> > ITE
> > entries" in GIC specification and is generic between both GICv3 &
> > GICv4
> > versions for both physical and virtual LPIs,unlike the linux kernel
> > ABI
> > which has current definition only for GICv3 physical LPIs.The idea
> > here
> > was to define the format once(considering future virtual LPIs too).
> > Do you still want me to reduce the ITE size to 8 bytes as in linux
> > kernel ABI (thereby leave the GICV4 fields out)? 
> no, see above
> 
> Thanks
> 
> Eric
> > > > > + * ITE Higher 4 Bytes
> > > > > + * ICID = 16 bits,
> > > > > + * vPEID = 16 bits
> > > > 
> > > > for info the ABI used by the kernel can be found in linux
> > > > Documentation/virt/kvm/devices/arm-vgic-its.rst
> > > > 
> > > > The ITE there is 8 bytes.
> > > > 
> > > > Have you considered the same?
> > > > 
> > > > > + */
> > > > > +#define ITS_ITT_ENTRY_SIZE            0xC
> > > > > +
> > > > > +/* 16 bits EventId */
> > > > > +#define ITS_IDBITS                   GICD_TYPER_IDBITS
> > > > > +
> > > > > +/* 16 bits DeviceId */
> > > > > +#define ITS_DEVBITS                   0xF
> > > > > +
> > > > > +/* 16 bits CollectionId */
> > > > > +#define ITS_CIDBITS                  0xF
> > > > > +
> > > > > +/*
> > > > > + * 8 bytes Device Table Entry size
> > > > > + * Valid = 1 bit,ITTAddr = 44 bits,Size = 5 bits
> > > > > + */
> > > > > +#define GITS_DTE_SIZE                 (0x8ULL)
> > > > > +
> > > > > +/*
> > > > > + * 8 bytes Collection Table Entry size
> > > > > + * Valid = 1 bit,RDBase = 36 bits(considering max RDBASE)
> > > > > + */
> > > > > +#define GITS_CTE_SIZE                 (0x8ULL)
> > > > > +
> > > > >  /* Special interrupt IDs */
> > > > >  #define INTID_SECURE 1020
> > > > >  #define INTID_NONSECURE 1021
> > > > > diff --git a/hw/intc/meson.build b/hw/intc/meson.build
> > > > > index 6e52a166e3..4dcfea6aa8 100644
> > > > > --- a/hw/intc/meson.build
> > > > > +++ b/hw/intc/meson.build
> > > > > @@ -8,6 +8,7 @@ softmmu_ss.add(when: 'CONFIG_ARM_GIC',
> > > > > if_true:
> > > > > files(
> > > > >    'arm_gicv3_dist.c',
> > > > >    'arm_gicv3_its_common.c',
> > > > >    'arm_gicv3_redist.c',
> > > > > +  'arm_gicv3_its.c',
> > > > >  ))
> > > > >  softmmu_ss.add(when: 'CONFIG_ETRAXFS', if_true:
> > > > > files('etraxfs_pic.c'))
> > > > >  softmmu_ss.add(when: 'CONFIG_HEATHROW_PIC', if_true:
> > > > > files('heathrow_pic.c'))
> > > > > diff --git a/include/hw/intc/arm_gicv3_its_common.h
> > > > > b/include/hw/intc/arm_gicv3_its_common.h
> > > > > index 5a0952b404..65d1191db1 100644
> > > > > --- a/include/hw/intc/arm_gicv3_its_common.h
> > > > > +++ b/include/hw/intc/arm_gicv3_its_common.h
> > > > > @@ -25,17 +25,22 @@
> > > > >  #include "hw/intc/arm_gicv3_common.h"
> > > > >  #include "qom/object.h"
> > > > >  
> > > > > +#define TYPE_ARM_GICV3_ITS "arm-gicv3-its"
> > > > > +
> > > > >  #define ITS_CONTROL_SIZE 0x10000
> > > > >  #define ITS_TRANS_SIZE   0x10000
> > > > >  #define ITS_SIZE         (ITS_CONTROL_SIZE + ITS_TRANS_SIZE)
> > > > >  
> > > > >  #define GITS_CTLR        0x0
> > > > >  #define GITS_IIDR        0x4
> > > > > +#define GITS_TYPER       0x8
> > > > >  #define GITS_CBASER      0x80
> > > > >  #define GITS_CWRITER     0x88
> > > > >  #define GITS_CREADR      0x90
> > > > >  #define GITS_BASER       0x100
> > > > >  
> > > > > +#define GITS_TRANSLATER  0x0040
> > > > > +
> > > > >  struct GICv3ITSState {
> > > > >      SysBusDevice parent_obj;
> > > > >  
> > > > > @@ -52,6 +57,7 @@ struct GICv3ITSState {
> > > > >      /* Registers */
> > > > >      uint32_t ctlr;
> > > > >      uint32_t iidr;
> > > > > +    uint64_t typer;
> > > > >      uint64_t cbaser;
> > > > >      uint64_t cwriter;
> > > > >      uint64_t creadr;
> > > > > @@ -62,7 +68,8 @@ struct GICv3ITSState {
> > > > >  
> > > > >  typedef struct GICv3ITSState GICv3ITSState;
> > > > >  
> > > > > -void gicv3_its_init_mmio(GICv3ITSState *s, const
> > > > > MemoryRegionOps
> > > > > *ops);
> > > > > +void gicv3_its_init_mmio(GICv3ITSState *s, const
> > > > > MemoryRegionOps
> > > > > *ops,
> > > > > +                   const MemoryRegionOps *tops);
> > > > >  
> > > > >  #define TYPE_ARM_GICV3_ITS_COMMON "arm-gicv3-its-common"
> > > > >  typedef struct GICv3ITSCommonClass GICv3ITSCommonClass;
> > > > > 
> > > > Thanks
> > > > 
> > > > Eric
> > > > 
> > > 
> > > Thanks
> > > 
> > > Eric
> > > 



  reply	other threads:[~2021-07-06 14:19 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-02 18:00 [PATCH v4 0/8] GICv3 LPI and ITS feature implementation Shashi Mallela
2021-06-02 18:00 ` [PATCH v4 1/8] hw/intc: GICv3 ITS initial framework Shashi Mallela
2021-06-08 10:02   ` Peter Maydell
2021-06-11 16:21   ` Eric Auger
2021-06-11 17:23     ` Shashi Mallela
2021-07-06  7:38     ` Eric Auger
2021-07-06 13:24       ` shashi.mallela
2021-07-06 14:04         ` Eric Auger
2021-07-06 14:18           ` shashi.mallela [this message]
2021-06-12  6:52   ` Eric Auger
2021-07-06  7:29     ` Eric Auger
2021-06-02 18:00 ` [PATCH v4 2/8] hw/intc: GICv3 ITS register definitions added Shashi Mallela
2021-06-08 10:31   ` Peter Maydell
2021-06-12  6:08   ` Eric Auger
2021-06-16 21:02     ` shashi.mallela
2021-06-21  9:51       ` Eric Auger
2021-06-28 21:51         ` shashi.mallela
2021-06-02 18:00 ` [PATCH v4 3/8] hw/intc: GICv3 ITS command queue framework Shashi Mallela
2021-06-08 10:38   ` Peter Maydell
2021-06-13 14:13   ` Eric Auger
2021-06-16 21:02     ` shashi.mallela
2021-06-21 10:03       ` Eric Auger
2021-06-28 21:58         ` shashi.mallela
2021-06-13 14:39   ` Eric Auger
2021-06-28 15:55     ` shashi.mallela
2021-06-02 18:00 ` [PATCH v4 4/8] hw/intc: GICv3 ITS Command processing Shashi Mallela
2021-06-08 10:45   ` Peter Maydell
2021-06-13 15:55   ` Eric Auger
2021-06-16 21:02     ` shashi.mallela
2021-06-21 10:13       ` Eric Auger
2021-06-28 22:04         ` shashi.mallela
2021-06-02 18:00 ` [PATCH v4 5/8] hw/intc: GICv3 ITS Feature enablement Shashi Mallela
2021-06-08 10:57   ` Peter Maydell
2021-06-02 18:00 ` [PATCH v4 6/8] hw/intc: GICv3 redistributor ITS processing Shashi Mallela
2021-06-08 13:57   ` Peter Maydell
2021-06-10 23:39     ` Shashi Mallela
2021-06-11  8:30       ` Peter Maydell
2021-06-15  2:23         ` Shashi Mallela
2021-06-13 16:26   ` Eric Auger
2021-06-16 21:02     ` shashi.mallela
2021-06-02 18:00 ` [PATCH v4 7/8] hw/arm/sbsa-ref: add ITS support in SBSA GIC Shashi Mallela
2021-06-03 11:42   ` Leif Lindholm
2021-06-03 15:31     ` shashi.mallela
2021-06-04 10:42       ` Leif Lindholm
2021-06-04 15:36         ` shashi.mallela
2021-07-08 19:40           ` Leif Lindholm
2021-07-08 20:05             ` Peter Maydell
2021-07-08 22:05               ` Leif Lindholm
2021-08-05 20:10                 ` shashi.mallela
2021-06-02 18:00 ` [PATCH v4 8/8] hw/arm/virt: add ITS support in virt GIC Shashi Mallela
2021-06-08 11:00   ` Peter Maydell
2021-06-08 10:00 ` [PATCH v4 0/8] GICv3 LPI and ITS feature implementation Peter Maydell

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=7c660ca8e5e1ccecb72a98d67063156d3419759b.camel@linaro.org \
    --to=shashi.mallela@linaro.org \
    --cc=eauger@redhat.com \
    --cc=leif@nuviainc.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rad@semihalf.com \
    /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.