qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 03/11] heathrow: QOMify heathrow PIC


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH 03/11] heathrow: QOMify heathrow PIC
Date: Tue, 20 Feb 2018 14:28:19 +1100
User-agent: Mutt/1.9.2 (2017-12-15)

On Mon, Feb 19, 2018 at 06:19:14PM +0000, Mark Cave-Ayland wrote:
> Signed-off-by: Mark Cave-Ayland <address@hidden>
> ---
>  hw/intc/heathrow_pic.c         | 126 
> +++++++++++++++++++++++------------------
>  include/hw/intc/heathrow_pic.h |  49 ++++++++++++++++
>  2 files changed, 119 insertions(+), 56 deletions(-)
>  create mode 100644 include/hw/intc/heathrow_pic.h
> 
> diff --git a/hw/intc/heathrow_pic.c b/hw/intc/heathrow_pic.c
> index 171f5ed814..7bf44e0d86 100644
> --- a/hw/intc/heathrow_pic.c
> +++ b/hw/intc/heathrow_pic.c
> @@ -25,6 +25,7 @@
>  #include "qemu/osdep.h"
>  #include "hw/hw.h"
>  #include "hw/ppc/mac.h"
> +#include "hw/intc/heathrow_pic.h"
>  
>  /* debug PIC */
>  //#define DEBUG_PIC
> @@ -36,39 +37,27 @@
>  #define PIC_DPRINTF(fmt, ...)
>  #endif
>  
> -typedef struct HeathrowPIC {
> -    uint32_t events;
> -    uint32_t mask;
> -    uint32_t levels;
> -    uint32_t level_triggered;
> -} HeathrowPIC;
> -
> -typedef struct HeathrowPICS {
> -    MemoryRegion mem;
> -    HeathrowPIC pics[2];
> -    qemu_irq *irqs;
> -} HeathrowPICS;
> -
> -static inline int check_irq(HeathrowPIC *pic)
> +static inline int heathrow_check_irq(HeathrowPICState *pic)
>  {
>      return (pic->events | (pic->levels & pic->level_triggered)) & pic->mask;
>  }
>  
>  /* update the CPU irq state */
> -static void heathrow_pic_update(HeathrowPICS *s)
> +static void heathrow_update_irq(HeathrowState *s)
>  {
> -    if (check_irq(&s->pics[0]) || check_irq(&s->pics[1])) {
> +    if (heathrow_check_irq(&s->pics[0]) ||
> +            heathrow_check_irq(&s->pics[1])) {
>          qemu_irq_raise(s->irqs[0]);
>      } else {
>          qemu_irq_lower(s->irqs[0]);
>      }
>  }
>  
> -static void pic_write(void *opaque, hwaddr addr,
> -                      uint64_t value, unsigned size)
> +static void heathrow_write(void *opaque, hwaddr addr,
> +                           uint64_t value, unsigned size)
>  {
> -    HeathrowPICS *s = opaque;
> -    HeathrowPIC *pic;
> +    HeathrowState *s = opaque;
> +    HeathrowPICState *pic;
>      unsigned int n;
>  
>      n = ((addr & 0xfff) - 0x10) >> 4;
> @@ -79,24 +68,24 @@ static void pic_write(void *opaque, hwaddr addr,
>      switch(addr & 0xf) {
>      case 0x04:
>          pic->mask = value;
> -        heathrow_pic_update(s);
> +        heathrow_update_irq(s);
>          break;
>      case 0x08:
>          /* do not reset level triggered IRQs */
>          value &= ~pic->level_triggered;
>          pic->events &= ~value;
> -        heathrow_pic_update(s);
> +        heathrow_update_irq(s);
>          break;
>      default:
>          break;
>      }
>  }
>  
> -static uint64_t pic_read(void *opaque, hwaddr addr,
> -                         unsigned size)
> +static uint64_t heathrow_read(void *opaque, hwaddr addr,
> +                              unsigned size)
>  {
> -    HeathrowPICS *s = opaque;
> -    HeathrowPIC *pic;
> +    HeathrowState *s = opaque;
> +    HeathrowPICState *pic;
>      unsigned int n;
>      uint32_t value;
>  
> @@ -124,16 +113,16 @@ static uint64_t pic_read(void *opaque, hwaddr addr,
>      return value;
>  }
>  
> -static const MemoryRegionOps heathrow_pic_ops = {
> -    .read = pic_read,
> -    .write = pic_write,
> +static const MemoryRegionOps heathrow_ops = {
> +    .read = heathrow_read,
> +    .write = heathrow_write,
>      .endianness = DEVICE_LITTLE_ENDIAN,
>  };
>  
> -static void heathrow_pic_set_irq(void *opaque, int num, int level)
> +static void heathrow_set_irq(void *opaque, int num, int level)
>  {
> -    HeathrowPICS *s = opaque;
> -    HeathrowPIC *pic;
> +    HeathrowState *s = opaque;
> +    HeathrowPICState *pic;
>      unsigned int irq_bit;
>  
>  #if defined(DEBUG)
> @@ -153,7 +142,7 @@ static void heathrow_pic_set_irq(void *opaque, int num, 
> int level)
>      } else {
>          pic->levels &= ~irq_bit;
>      }
> -    heathrow_pic_update(s);
> +    heathrow_update_irq(s);
>  }
>  
>  static const VMStateDescription vmstate_heathrow_pic_one = {
> @@ -161,54 +150,79 @@ static const VMStateDescription 
> vmstate_heathrow_pic_one = {
>      .version_id = 0,
>      .minimum_version_id = 0,
>      .fields = (VMStateField[]) {
> -        VMSTATE_UINT32(events, HeathrowPIC),
> -        VMSTATE_UINT32(mask, HeathrowPIC),
> -        VMSTATE_UINT32(levels, HeathrowPIC),
> -        VMSTATE_UINT32(level_triggered, HeathrowPIC),
> +        VMSTATE_UINT32(events, HeathrowPICState),
> +        VMSTATE_UINT32(mask, HeathrowPICState),
> +        VMSTATE_UINT32(levels, HeathrowPICState),
> +        VMSTATE_UINT32(level_triggered, HeathrowPICState),
>          VMSTATE_END_OF_LIST()
>      }
>  };
>  
> -static const VMStateDescription vmstate_heathrow_pic = {
> +static const VMStateDescription vmstate_heathrow = {
>      .name = "heathrow_pic",
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (VMStateField[]) {
> -        VMSTATE_STRUCT_ARRAY(pics, HeathrowPICS, 2, 1,
> -                             vmstate_heathrow_pic_one, HeathrowPIC),
> +        VMSTATE_STRUCT_ARRAY(pics, HeathrowState, 2, 1,
> +                             vmstate_heathrow_pic_one, HeathrowPICState),
>          VMSTATE_END_OF_LIST()
>      }
>  };
>  
> -static void heathrow_pic_reset_one(HeathrowPIC *s)
> +static void heathrow_reset(DeviceState *d)
>  {
> -    memset(s, '\0', sizeof(HeathrowPIC));
> +    HeathrowState *s = HEATHROW(d);
> +
> +    s->pics[0].level_triggered = 0;
> +    s->pics[1].level_triggered = 0x1ff00000;
>  }
>  
> -static void heathrow_pic_reset(void *opaque)
> +static void heathrow_init(Object *obj)
>  {
> -    HeathrowPICS *s = opaque;
> -
> -    heathrow_pic_reset_one(&s->pics[0]);
> -    heathrow_pic_reset_one(&s->pics[1]);
> +    HeathrowState *s = HEATHROW(obj);
>  
> -    s->pics[0].level_triggered = 0;
> -    s->pics[1].level_triggered = 0x1ff00000;
> +    memory_region_init_io(&s->mem, OBJECT(s), &heathrow_ops, s,
> +                          "heathrow-pic", 0x1000);

IIRC, you generally don't want to create memory regions at instance
init time, but only at realize time.


>  }
>  
>  qemu_irq *heathrow_pic_init(MemoryRegion **pmem,
>                              int nb_cpus, qemu_irq **irqs)
>  {
> -    HeathrowPICS *s;
> +    DeviceState *d;
> +    HeathrowState *s;
>  
> -    s = g_malloc0(sizeof(HeathrowPICS));
> +    d = qdev_create(NULL, TYPE_HEATHROW);
> +    qdev_init_nofail(d);
> +
> +    s = HEATHROW(d);
>      /* only 1 CPU */
>      s->irqs = irqs[0];
> -    memory_region_init_io(&s->mem, NULL, &heathrow_pic_ops, s,
> -                          "heathrow-pic", 0x1000);
> +
>      *pmem = &s->mem;
>  
> -    vmstate_register(NULL, -1, &vmstate_heathrow_pic, s);
> -    qemu_register_reset(heathrow_pic_reset, s);
> -    return qemu_allocate_irqs(heathrow_pic_set_irq, s, 64);
> +    return qemu_allocate_irqs(heathrow_set_irq, s, HEATHROW_NUM_IRQS);
> +}
> +
> +static void heathrow_class_init(ObjectClass *oc, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(oc);
> +
> +    dc->reset = heathrow_reset;
> +    dc->vmsd = &vmstate_heathrow;
> +    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
>  }
> +
> +static const TypeInfo heathrow_type_info = {
> +    .name = TYPE_HEATHROW,
> +    .parent = TYPE_SYS_BUS_DEVICE,
> +    .instance_size = sizeof(HeathrowState),
> +    .instance_init = heathrow_init,
> +    .class_init = heathrow_class_init,
> +};
> +
> +static void heathrow_register_types(void)
> +{
> +    type_register_static(&heathrow_type_info);
> +}
> +
> +type_init(heathrow_register_types)
> diff --git a/include/hw/intc/heathrow_pic.h b/include/hw/intc/heathrow_pic.h
> new file mode 100644
> index 0000000000..bc3ffaab87
> --- /dev/null
> +++ b/include/hw/intc/heathrow_pic.h
> @@ -0,0 +1,49 @@
> +/*
> + * Heathrow PIC support (OldWorld PowerMac)
> + *
> + * Copyright (c) 2005-2007 Fabrice Bellard
> + * Copyright (c) 2007 Jocelyn Mayer
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> + * of this software and associated documentation files (the "Software"), to 
> deal
> + * in the Software without restriction, including without limitation the 
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#ifndef HEATHROW_H
> +#define HEATHROW_H
> +
> +#define TYPE_HEATHROW "heathrow"
> +#define HEATHROW(obj) OBJECT_CHECK(HeathrowState, (obj), TYPE_HEATHROW)
> +
> +typedef struct HeathrowPICState {
> +    uint32_t events;
> +    uint32_t mask;
> +    uint32_t levels;
> +    uint32_t level_triggered;
> +} HeathrowPICState;
> +
> +typedef struct HeathrowState {
> +    SysBusDevice parent_obj;
> +
> +    MemoryRegion mem;
> +    HeathrowPICState pics[2];
> +    qemu_irq *irqs;
> +} HeathrowState;
> +
> +#define HEATHROW_NUM_IRQS 64
> +
> +#endif /* HEATHROW_H */

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

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