qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] e500: ppce500_init_mpic() return device instead


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH] e500: ppce500_init_mpic() return device instead of IRQ array
Date: Fri, 27 Oct 2017 16:42:58 +0200
User-agent: Mutt/1.9.1 (2017-09-22)

On Fri, Oct 20, 2017 at 09:38:52AM -0500, Michael Davidsaver wrote:
> Actual number of interrupt pins isn't known
> in ppce500_init_mpic() so a hardcoded number
> was used, which causes a crash with older openpic.
> 
> Instead, return the DeviceState* and change ppce500_init()
> to call qdev_get_gpio_in() to get only the irq pins
> which are needed.
> 
> Signed-off-by: Michael Davidsaver <address@hidden>

Applied to ppc-for-2.11.

> ---
>  hw/ppc/e500.c | 32 +++++++++++++-------------------
>  1 file changed, 13 insertions(+), 19 deletions(-)
> 
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index b8d786c479..33adc809ba 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -729,15 +729,13 @@ static DeviceState *ppce500_init_mpic_kvm(PPCE500Params 
> *params,
>      return dev;
>  }
>  
> -static qemu_irq *ppce500_init_mpic(MachineState *machine, PPCE500Params 
> *params,
> -                                   MemoryRegion *ccsr, qemu_irq **irqs)
> +static DeviceState *ppce500_init_mpic(MachineState *machine,
> +                                      PPCE500Params *params,
> +                                      MemoryRegion *ccsr,
> +                                      qemu_irq **irqs)
>  {
> -    qemu_irq *mpic;
>      DeviceState *dev = NULL;
>      SysBusDevice *s;
> -    int i;
> -
> -    mpic = g_new0(qemu_irq, 256);
>  
>      if (kvm_enabled()) {
>          Error *err = NULL;
> @@ -756,15 +754,11 @@ static qemu_irq *ppce500_init_mpic(MachineState 
> *machine, PPCE500Params *params,
>          dev = ppce500_init_mpic_qemu(params, irqs);
>      }
>  
> -    for (i = 0; i < 256; i++) {
> -        mpic[i] = qdev_get_gpio_in(dev, i);
> -    }
> -
>      s = SYS_BUS_DEVICE(dev);
>      memory_region_add_subregion(ccsr, MPC8544_MPIC_REGS_OFFSET,
>                                  s->mmio[0].memory);
>  
> -    return mpic;
> +    return dev;
>  }
>  
>  static void ppce500_power_off(void *opaque, int line, int on)
> @@ -796,8 +790,8 @@ void ppce500_init(MachineState *machine, PPCE500Params 
> *params)
>      /* irq num for pin INTA, INTB, INTC and INTD is 1, 2, 3 and
>       * 4 respectively */
>      unsigned int pci_irq_nrs[PCI_NUM_PINS] = {1, 2, 3, 4};
> -    qemu_irq **irqs, *mpic;
> -    DeviceState *dev;
> +    qemu_irq **irqs;
> +    DeviceState *dev, *mpicdev;
>      CPUPPCState *firstenv = NULL;
>      MemoryRegion *ccsr_addr_space;
>      SysBusDevice *s;
> @@ -866,18 +860,18 @@ void ppce500_init(MachineState *machine, PPCE500Params 
> *params)
>      memory_region_add_subregion(address_space_mem, params->ccsrbar_base,
>                                  ccsr_addr_space);
>  
> -    mpic = ppce500_init_mpic(machine, params, ccsr_addr_space, irqs);
> +    mpicdev = ppce500_init_mpic(machine, params, ccsr_addr_space, irqs);
>  
>      /* Serial */
>      if (serial_hds[0]) {
>          serial_mm_init(ccsr_addr_space, MPC8544_SERIAL0_REGS_OFFSET,
> -                       0, mpic[42], 399193,
> +                       0, qdev_get_gpio_in(mpicdev, 42), 399193,
>                         serial_hds[0], DEVICE_BIG_ENDIAN);
>      }
>  
>      if (serial_hds[1]) {
>          serial_mm_init(ccsr_addr_space, MPC8544_SERIAL1_REGS_OFFSET,
> -                       0, mpic[42], 399193,
> +                       0, qdev_get_gpio_in(mpicdev, 42), 399193,
>                         serial_hds[1], DEVICE_BIG_ENDIAN);
>      }
>  
> @@ -896,7 +890,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
> *params)
>      qdev_init_nofail(dev);
>      s = SYS_BUS_DEVICE(dev);
>      for (i = 0; i < PCI_NUM_PINS; i++) {
> -        sysbus_connect_irq(s, i, mpic[pci_irq_nrs[i]]);
> +        sysbus_connect_irq(s, i, qdev_get_gpio_in(mpicdev, pci_irq_nrs[i]));
>      }
>  
>      memory_region_add_subregion(ccsr_addr_space, MPC8544_PCI_REGS_OFFSET,
> @@ -927,7 +921,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
> *params)
>          dev = qdev_create(NULL, "mpc8xxx_gpio");
>          s = SYS_BUS_DEVICE(dev);
>          qdev_init_nofail(dev);
> -        sysbus_connect_irq(s, 0, mpic[MPC8XXX_GPIO_IRQ]);
> +        sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, 
> MPC8XXX_GPIO_IRQ));
>          memory_region_add_subregion(ccsr_addr_space, MPC8XXX_GPIO_OFFSET,
>                                      sysbus_mmio_get_region(s, 0));
>  
> @@ -947,7 +941,7 @@ void ppce500_init(MachineState *machine, PPCE500Params 
> *params)
>  
>          for (i = 0; i < params->platform_bus_num_irqs; i++) {
>              int irqn = params->platform_bus_first_irq + i;
> -            sysbus_connect_irq(s, i, mpic[irqn]);
> +            sysbus_connect_irq(s, i, qdev_get_gpio_in(mpicdev, irqn));
>          }
>  
>          memory_region_add_subregion(address_space_mem,

-- 
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]