qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH V5 4/7] nios2: Add IIC interrupt controller emul


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH V5 4/7] nios2: Add IIC interrupt controller emulation
Date: Wed, 22 Feb 2017 07:31:05 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)

I know this has been committed already, but here goes anyway:

Marek Vasut <address@hidden> writes:

> From: Chris Wulff <address@hidden>
>
> Add the Altera Nios2 internal interrupt controller model.
>
> Signed-off-by: Marek Vasut <address@hidden>
> Cc: Chris Wulff <address@hidden>
> Cc: Jeff Da Silva <address@hidden>
> Cc: Ley Foon Tan <address@hidden>
> Cc: Sandra Loosemore <address@hidden>
> Cc: Yves Vandervennet <address@hidden>
> Cc: Alexander Graf <address@hidden>
> Cc: Richard Henderson <address@hidden>
> Reviewed-by: Alexander Graf <address@hidden>
> ---
> V3: Checkpatch cleanup
> V4: Rebase on top of qemu/master
> V5: Rebase on top of qemu/master
> ---
>  hw/intc/Makefile.objs |   1 +
>  hw/intc/nios2_iic.c   | 103 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 104 insertions(+)
>  create mode 100644 hw/intc/nios2_iic.c
>
> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
> index 2f44a2da26..8948106ac4 100644
> --- a/hw/intc/Makefile.objs
> +++ b/hw/intc/Makefile.objs
> @@ -41,3 +41,4 @@ obj-$(CONFIG_S390_FLIC_KVM) += s390_flic_kvm.o
>  obj-$(CONFIG_ASPEED_SOC) += aspeed_vic.o
>  obj-$(CONFIG_ARM_GIC) += arm_gicv3_cpuif.o
>  obj-$(CONFIG_MIPS_CPS) += mips_gic.o
> +obj-$(CONFIG_NIOS2) += nios2_iic.o
> diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
> new file mode 100644
> index 0000000000..818ab1b315
> --- /dev/null
> +++ b/hw/intc/nios2_iic.c
> @@ -0,0 +1,103 @@
> +/*
> + * QEMU Altera Internal Interrupt Controller.
> + *
> + * Copyright (c) 2012 Chris Wulff <address@hidden>
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see
> + * <http://www.gnu.org/licenses/lgpl-2.1.html>
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu-common.h"
> +#include "qapi/error.h"
> +
> +#include "hw/sysbus.h"
> +#include "cpu.h"
> +
> +#define TYPE_ALTERA_IIC "altera,iic"
> +#define ALTERA_IIC(obj) \
> +    OBJECT_CHECK(AlteraIIC, (obj), TYPE_ALTERA_IIC)
> +
> +typedef struct AlteraIIC {
> +    SysBusDevice  parent_obj;
> +    void         *cpu;
> +    qemu_irq      parent_irq;
> +} AlteraIIC;
> +
> +static void update_irq(AlteraIIC *pv)
> +{
> +    CPUNios2State *env = &((Nios2CPU *)(pv->cpu))->env;
> +
> +    qemu_set_irq(pv->parent_irq,
> +                 env->regs[CR_IPENDING] & env->regs[CR_IENABLE]);
> +}
> +
> +static void irq_handler(void *opaque, int irq, int level)
> +{
> +    AlteraIIC *pv = opaque;
> +    CPUNios2State *env = &((Nios2CPU *)(pv->cpu))->env;
> +
> +    env->regs[CR_IPENDING] &= ~(1 << irq);
> +    env->regs[CR_IPENDING] |= !!level << irq;
> +
> +    update_irq(pv);
> +}
> +
> +static void altera_iic_init(Object *obj)
> +{
> +    AlteraIIC *pv = ALTERA_IIC(obj);
> +
> +    qdev_init_gpio_in(DEVICE(pv), irq_handler, 32);
> +    sysbus_init_irq(SYS_BUS_DEVICE(obj), &pv->parent_irq);
> +}
> +
> +static Property altera_iic_properties[] = {
> +    DEFINE_PROP_PTR("cpu", AlteraIIC, cpu),

Could this be a QOM link instead?

We want to get rid of pointer properties.  Commit d2fe4ec converts one
to a link.

> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void altera_iic_realize(DeviceState *dev, Error **errp)
> +{
> +    struct AlteraIIC *pv = ALTERA_IIC(dev);
> +
> +    if (!pv->cpu) {
> +        error_setg(errp, "altera,iic: CPU not connected");
> +        return;
> +    }
> +}
> +
> +static void altera_iic_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +
> +    dc->props = altera_iic_properties;
> +    /* Reason: pointer property "cpu" */
> +    dc->cannot_instantiate_with_device_add_yet = true;
> +    dc->realize = altera_iic_realize;
> +}
> +
> +static TypeInfo altera_iic_info = {
> +    .name          = "altera,iic",
> +    .parent        = TYPE_SYS_BUS_DEVICE,
> +    .instance_size = sizeof(AlteraIIC),
> +    .instance_init = altera_iic_init,
> +    .class_init    = altera_iic_class_init,
> +};
> +
> +static void altera_iic_register(void)
> +{
> +    type_register_static(&altera_iic_info);
> +}
> +
> +type_init(altera_iic_register)



reply via email to

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