qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-2.5 v2 2/4] mips: add Global Config Register


From: James Hogan
Subject: Re: [Qemu-devel] [PATCH for-2.5 v2 2/4] mips: add Global Config Register block (part)
Date: Fri, 30 Oct 2015 11:40:56 +0000
User-agent: Mutt/1.5.23 (2014-03-12)

On Fri, Oct 30, 2015 at 12:36:07AM +0000, James Hogan wrote:
> Hi Yongbok,
> 
> On Tue, Oct 27, 2015 at 05:12:35PM +0000, Yongbok Kim wrote:
> > Add part of GCR Block which Linux Kernel utilises and it is enough
> > to bring the GIC up.
> > It defines full 32 Kbytes address space allocated for GCR but only few
> > registers are implemented such as config, revision, status, L2 config and
> > local config registers.
> > To support MIPS Coherent Manager, this module would be necessary to be 
> > extended
> 
> s/Coherent/Coherence/
> 
> > further.
> > 
> > Signed-off-by: Yongbok Kim <address@hidden>
> > ---
> >  default-configs/mips-softmmu.mak     |    1 +
> >  default-configs/mips64-softmmu.mak   |    1 +
> >  default-configs/mips64el-softmmu.mak |    1 +
> >  default-configs/mipsel-softmmu.mak   |    1 +
> >  hw/misc/Makefile.objs                |    1 +
> >  hw/misc/mips_gcr.c                   |  113 
> > ++++++++++++++++++++++++++++++++++
> >  include/hw/misc/mips_gcr.h           |   58 +++++++++++++++++
> 
> would these be better named mips_cmgcr.{h,c}?
> 
> >  7 files changed, 176 insertions(+), 0 deletions(-)
> >  create mode 100644 hw/misc/mips_gcr.c
> >  create mode 100644 include/hw/misc/mips_gcr.h
> > 
> > diff --git a/default-configs/mips-softmmu.mak 
> > b/default-configs/mips-softmmu.mak
> > index 44467c3..a784644 100644
> > --- a/default-configs/mips-softmmu.mak
> > +++ b/default-configs/mips-softmmu.mak
> > @@ -30,3 +30,4 @@ CONFIG_I8259=y
> >  CONFIG_MC146818RTC=y
> >  CONFIG_ISA_TESTDEV=y
> >  CONFIG_EMPTY_SLOT=y
> > +CONFIG_MIPS_GIC=y
> > diff --git a/default-configs/mips64-softmmu.mak 
> > b/default-configs/mips64-softmmu.mak
> > index 66ed5f9..957508d 100644
> > --- a/default-configs/mips64-softmmu.mak
> > +++ b/default-configs/mips64-softmmu.mak
> > @@ -36,3 +36,4 @@ CONFIG_JAZZ_LED=y
> >  CONFIG_MC146818RTC=y
> >  CONFIG_ISA_TESTDEV=y
> >  CONFIG_EMPTY_SLOT=y
> > +CONFIG_MIPS_GIC=y
> > diff --git a/default-configs/mips64el-softmmu.mak 
> > b/default-configs/mips64el-softmmu.mak
> > index bfca2b2..6c1065f 100644
> > --- a/default-configs/mips64el-softmmu.mak
> > +++ b/default-configs/mips64el-softmmu.mak
> > @@ -39,3 +39,4 @@ CONFIG_MC146818RTC=y
> >  CONFIG_VT82C686=y
> >  CONFIG_ISA_TESTDEV=y
> >  CONFIG_EMPTY_SLOT=y
> > +CONFIG_MIPS_GIC=y
> > diff --git a/default-configs/mipsel-softmmu.mak 
> > b/default-configs/mipsel-softmmu.mak
> > index 0162ef0..4633b0b 100644
> > --- a/default-configs/mipsel-softmmu.mak
> > +++ b/default-configs/mipsel-softmmu.mak
> > @@ -30,3 +30,4 @@ CONFIG_I8259=y
> >  CONFIG_MC146818RTC=y
> >  CONFIG_ISA_TESTDEV=y
> >  CONFIG_EMPTY_SLOT=y
> > +CONFIG_MIPS_GIC=y
> > diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
> > index 4aa76ff..02ac5bb 100644
> > --- a/hw/misc/Makefile.objs
> > +++ b/hw/misc/Makefile.objs
> > @@ -37,6 +37,7 @@ obj-$(CONFIG_OMAP) += omap_tap.o
> >  obj-$(CONFIG_SLAVIO) += slavio_misc.o
> >  obj-$(CONFIG_ZYNQ) += zynq_slcr.o
> >  obj-$(CONFIG_STM32F2XX_SYSCFG) += stm32f2xx_syscfg.o
> > +obj-$(CONFIG_MIPS_GIC) += mips_gcr.o
> 
> would CONFIG_MIPS_CMGCR be a better name?
> 
> >  
> >  obj-$(CONFIG_PVPANIC) += pvpanic.o
> >  obj-$(CONFIG_EDU) += edu.o
> > diff --git a/hw/misc/mips_gcr.c b/hw/misc/mips_gcr.c
> > new file mode 100644
> > index 0000000..6db4a9d
> > --- /dev/null
> > +++ b/hw/misc/mips_gcr.c
> > @@ -0,0 +1,113 @@
> > +/*
> > + * This file is subject to the terms and conditions of the GNU General 
> > Public
> > + * License.  See the file "COPYING" in the main directory of this archive
> > + * for more details.
> > + *
> > + * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
> > + * Authors: Sanjay Lal <address@hidden>
> > + *
> > + * Copyright (C) 2015 Imagination Technologies
> > + */
> > +
> > +#include "hw/hw.h"
> > +#include "hw/sysbus.h"
> > +#include "sysemu/sysemu.h"
> > +#include "hw/misc/mips_gcr.h"
> > +#include "hw/intc/mips_gic.h"
> 
> I don't think this header exists yet at this point in the patchset.
> 
> > +
> > +/* Read GCR registers */
> > +static uint64_t gcr_read(void *opaque, hwaddr addr, unsigned size)
> > +{
> > +    MIPSGCRState *gcr = (MIPSGCRState *) opaque;
> > +
> > +    switch (addr) {
> > +    /* Global Control Block Register */
> > +    case GCR_CONFIG_OFS:
> > +        /* Set PCORES to 0 */
> > +        return 0;
> > +    case GCR_BASE_OFS:
> > +        return gcr->gcr_base;
> > +    case GCR_REV_OFS:
> > +        return gcr->gcr_rev;
> > +    case GCR_GIC_BASE_OFS:
> > +        return gcr->gic_base;

Note also, that this is a read-write register. It starts undefined and
the kernel will write the address it wants it to appear at. The GIC_EN
also resets to 0, and needs setting to 1 by software to enable the GIC
region.

Cheers
James

> > +    case GCR_GIC_STATUS_OFS:
> > +        return GCR_GIC_STATUS_GICEX_MSK;
> 
> well, it doesn't exist yet, does it?
> 
> > +    case GCR_CPC_STATUS_OFS:
> > +        return 0;
> > +    case GCR_L2_CONFIG_OFS:
> > +        /* L2 BYPASS */
> > +        return GCR_L2_CONFIG_BYPASS_MSK;
> > +        /* Core-Local and Core-Other Control Blocks */
> > +    case MIPS_CLCB_OFS + GCR_CL_CONFIG_OFS:
> > +    case MIPS_COCB_OFS + GCR_CL_CONFIG_OFS:
> > +        /* Set PVP to # cores - 1 */
> > +        return gcr->num_vps - 1;
> > +    case MIPS_CLCB_OFS + GCR_CL_OTHER_OFS:
> > +        return 0;
> > +    default:
> > +        qemu_log_mask(LOG_UNIMP, "Read %d bytes at GCR offset 0x%" PRIx64 
> > "\n",
> > +                      size, addr);
> > +        return 0;
> > +    }
> > +    return 0;
> > +}
> > +
> > +/* Write GCR registers */
> > +static void gcr_write(void *opaque, hwaddr addr, uint64_t data, unsigned 
> > size)
> > +{
> > +    switch (addr) {
> > +    default:
> > +        qemu_log_mask(LOG_UNIMP, "Write %d bytes at GCR offset 0x%" PRIx64
> > +                      " 0x%08lx\n", size, addr, data);
> > +        break;
> > +    }
> > +}
> > +
> > +static const MemoryRegionOps gcr_ops = {
> > +    .read = gcr_read,
> > +    .write = gcr_write,
> > +    .endianness = DEVICE_NATIVE_ENDIAN,
> > +    .impl = {
> > +        .max_access_size = 8,
> > +    },
> > +};
> > +
> > +static void mips_gcr_init(Object *obj)
> > +{
> > +    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> > +    MIPSGCRState *s = MIPS_GCR(obj);
> > +
> > +    memory_region_init_io(&s->iomem, OBJECT(s), &gcr_ops, s,
> > +                          "mips-gcr", GCR_ADDRSPACE_SZ);
> > +    sysbus_init_mmio(sbd, &s->iomem);
> > +}
> > +
> > +static Property mips_gcr_properties[] = {
> > +    DEFINE_PROP_INT32("num-vp", MIPSGCRState, num_vps, 1),
> > +    DEFINE_PROP_INT32("gcr-rev", MIPSGCRState, gcr_rev, 0x800),
> 
> Is this configurable per core?
> 
> > +    DEFINE_PROP_UINT64("gcr-base", MIPSGCRState, gcr_base, GCR_BASE_ADDR),
> > +    DEFINE_PROP_UINT64("gic-base", MIPSGCRState, gic_base, GIC_BASE_ADDR),
> 
> GIC_BASE_ADDR is not defined yet. Maybe this should be added in a later
> patch.
> 
> > +    DEFINE_PROP_END_OF_LIST(),
> > +};
> > +
> > +static void mips_gcr_class_init(ObjectClass *klass, void *data)
> > +{
> > +    DeviceClass *dc = DEVICE_CLASS(klass);
> > +    dc->props = mips_gcr_properties;
> > +}
> > +
> > +static const TypeInfo mips_gcr_info = {
> > +    .name          = TYPE_MIPS_GCR,
> > +    .parent        = TYPE_SYS_BUS_DEVICE,
> > +    .instance_size = sizeof(MIPSGCRState),
> > +    .instance_init = mips_gcr_init,
> > +    .class_init    = mips_gcr_class_init,
> > +};
> > +
> > +static void mips_gcr_register_types(void)
> > +{
> > +    type_register_static(&mips_gcr_info);
> > +}
> > +
> > +type_init(mips_gcr_register_types)
> > diff --git a/include/hw/misc/mips_gcr.h b/include/hw/misc/mips_gcr.h
> > new file mode 100644
> > index 0000000..28f3ca7
> > --- /dev/null
> > +++ b/include/hw/misc/mips_gcr.h
> > @@ -0,0 +1,58 @@
> > +/*
> > + * This file is subject to the terms and conditions of the GNU General 
> > Public
> > + * License.  See the file "COPYING" in the main directory of this archive
> > + * for more details.
> > + *
> > + * Copyright (C) 2015 Imagination Technologies
> > + *
> > + */
> > +
> > +#ifndef _MIPS_GCR_H
> > +#define _MIPS_GCR_H
> > +
> > +#define TYPE_MIPS_GCR "mips-gcr"
> > +#define MIPS_GCR(obj) OBJECT_CHECK(MIPSGCRState, (obj), TYPE_MIPS_GCR)
> > +
> > +#define GCR_BASE_ADDR           0x1fbf8000ULL
> > +#define GCR_ADDRSPACE_SZ        0x8000
> > +
> > +/* Offsets to register blocks */
> > +#define MIPS_GCB_OFS        0x0000 /* Global Control Block */
> > +#define MIPS_CLCB_OFS       0x2000 /* Core Local Control Block */
> > +#define MIPS_COCB_OFS       0x4000 /* Core Other Control Block */
> > +#define MIPS_GDB_OFS        0x6000 /* Global Debug Block */
> > +
> > +/* Global Control Block Register Map */
> > +#define GCR_CONFIG_OFS      0x0000
> > +#define GCR_BASE_OFS        0x0008
> 
> Since QEMU supports XPA, perhaps we should have GCR_BASE_UPPER
> implemented too (like P5600).
> 
> > +#define GCR_REV_OFS         0x0030
> > +#define GCR_GIC_BASE_OFS    0x0080
> 
> Same, GIC_BASE_UPPER?
> 
> > +#define GCR_GIC_STATUS_OFS  0x00D0
> > +#define GCR_CPC_STATUS_OFS  0x00F0
> > +#define GCR_L2_CONFIG_OFS   0x0130
> > +
> > +/* Core Local and Core Other Block Register Map */
> > +#define GCR_CL_CONFIG_OFS   0x0010
> > +#define GCR_CL_OTHER_OFS    0x0018
> > +
> > +/* GCR_GIC_STATUS register fields */
> > +#define GCR_GIC_STATUS_GICEX_SHF    0
> > +#define GCR_GIC_STATUS_GICEX_MSK    ((0x1ULL) << GCR_GIC_STATUS_GICEX_SHF)
> > +
> > +/* GCR_L2_CONFIG register fields */
> > +#define GCR_L2_CONFIG_BYPASS_SHF    20
> > +#define GCR_L2_CONFIG_BYPASS_MSK    ((0x1ULL) << GCR_L2_CONFIG_BYPASS_SHF)
> > +
> > +
> > +typedef struct MIPSGCRState MIPSGCRState;
> > +struct MIPSGCRState {
> > +    SysBusDevice parent_obj;
> > +
> > +    int32_t gcr_rev;
> > +    int32_t num_vps;
> > +    hwaddr gcr_base;
> > +    hwaddr gic_base;
> > +    MemoryRegion iomem;
> > +} ;
> 
> unneeded whitespace before ";"
> 
> Cheers
> James
> 
> > +
> > +#endif /* _MIPS_GCR_H */
> > -- 
> > 1.7.1
> > 


Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]