qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Crosthwaite <crosthwaitepeter@gmail.com>
To: Michael Davidsaver <mdavidsaver@gmail.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>,
	Alistair Francis <alistair23@gmail.com>
Subject: Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init()
Date: Fri, 30 Oct 2015 14:15:25 -0700	[thread overview]
Message-ID: <CAPokK=p78PZARrHFXcc0a3sqmJVs5SLPwQVn3acc4GfohT663A@mail.gmail.com> (raw)
In-Reply-To: <1444620986-20262-1-git-send-email-mdavidsaver@gmail.com>

Missing CC of Alistair for STM32F205.

On Sun, Oct 11, 2015 at 8:36 PM, Michael Davidsaver
<mdavidsaver@gmail.com> wrote:
> Change armv7m_init to return the DeviceState* for the NVIC.
> This allows access to all GPIO blocks, not just the IRQ inputs.
> Move qdev_get_gpio_in() calls out of armv7m_init() into
> board code for stellaris and stm32f205 boards.
>
> Signed-off-by: Michael Davidsaver <mdavidsaver@gmail.com>

This is a good step towards QOMification, and I like it in its own right.

Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>

Regards,
Peter

> ---
>  hw/arm/armv7m.c        |  9 ++-------
>  hw/arm/stellaris.c     | 29 ++++++++++++++++++-----------
>  hw/arm/stm32f205_soc.c | 15 ++++++++-------
>  include/hw/arm/arm.h   |  2 +-
>  4 files changed, 29 insertions(+), 26 deletions(-)
>
> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
> index eb214db..a80d2ad 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -166,17 +166,15 @@ static void armv7m_reset(void *opaque)
>     mem_size is in bytes.
>     Returns the NVIC array.  */
>
> -qemu_irq *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
> +DeviceState *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
>                        const char *kernel_filename, const char *cpu_model)
>  {
>      ARMCPU *cpu;
>      CPUARMState *env;
>      DeviceState *nvic;
> -    qemu_irq *pic = g_new(qemu_irq, num_irq);
>      int image_size;
>      uint64_t entry;
>      uint64_t lowaddr;
> -    int i;
>      int big_endian;
>      MemoryRegion *hack = g_new(MemoryRegion, 1);
>
> @@ -198,9 +196,6 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
>      qdev_init_nofail(nvic);
>      sysbus_connect_irq(SYS_BUS_DEVICE(nvic), 0,
>                         qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
> -    for (i = 0; i < num_irq; i++) {
> -        pic[i] = qdev_get_gpio_in(nvic, i);
> -    }
>
>  #ifdef TARGET_WORDS_BIGENDIAN
>      big_endian = 1;
> @@ -234,7 +229,7 @@ qemu_irq *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
>      memory_region_add_subregion(system_memory, 0xfffff000, hack);
>
>      qemu_register_reset(armv7m_reset, cpu);
> -    return pic;
> +    return nvic;
>  }
>
>  static Property bitband_properties[] = {
> diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
> index 3d6486f..82a4ad5 100644
> --- a/hw/arm/stellaris.c
> +++ b/hw/arm/stellaris.c
> @@ -1210,8 +1210,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>          0x40024000, 0x40025000, 0x40026000};
>      static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
>
> -    qemu_irq *pic;
> -    DeviceState *gpio_dev[7];
> +    DeviceState *gpio_dev[7], *nvic;
>      qemu_irq gpio_in[7][8];
>      qemu_irq gpio_out[7][8];
>      qemu_irq adc;
> @@ -1241,12 +1240,16 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>      vmstate_register_ram_global(sram);
>      memory_region_add_subregion(system_memory, 0x20000000, sram);
>
> -    pic = armv7m_init(system_memory, flash_size, NUM_IRQ_LINES,
> +    nvic = armv7m_init(system_memory, flash_size, NUM_IRQ_LINES,
>                        kernel_filename, cpu_model);
>
>      if (board->dc1 & (1 << 16)) {
>          dev = sysbus_create_varargs(TYPE_STELLARIS_ADC, 0x40038000,
> -                                    pic[14], pic[15], pic[16], pic[17], NULL);
> +                                    qdev_get_gpio_in(nvic, 14),
> +                                    qdev_get_gpio_in(nvic, 15),
> +                                    qdev_get_gpio_in(nvic, 16),
> +                                    qdev_get_gpio_in(nvic, 17),
> +                                    NULL);
>          adc = qdev_get_gpio_in(dev, 0);
>      } else {
>          adc = NULL;
> @@ -1255,19 +1258,21 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>          if (board->dc2 & (0x10000 << i)) {
>              dev = sysbus_create_simple(TYPE_STELLARIS_GPTM,
>                                         0x40030000 + i * 0x1000,
> -                                       pic[timer_irq[i]]);
> +                                       qdev_get_gpio_in(nvic, timer_irq[i]));
>              /* TODO: This is incorrect, but we get away with it because
>                 the ADC output is only ever pulsed.  */
>              qdev_connect_gpio_out(dev, 0, adc);
>          }
>      }
>
> -    stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr.a);
> +    stellaris_sys_init(0x400fe000, qdev_get_gpio_in(nvic, 28),
> +                       board, nd_table[0].macaddr.a);
>
>      for (i = 0; i < 7; i++) {
>          if (board->dc4 & (1 << i)) {
>              gpio_dev[i] = sysbus_create_simple("pl061_luminary", gpio_addr[i],
> -                                               pic[gpio_irq[i]]);
> +                                               qdev_get_gpio_in(nvic,
> +                                                                gpio_irq[i]));
>              for (j = 0; j < 8; j++) {
>                  gpio_in[i][j] = qdev_get_gpio_in(gpio_dev[i], j);
>                  gpio_out[i][j] = NULL;
> @@ -1276,7 +1281,8 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>      }
>
>      if (board->dc2 & (1 << 12)) {
> -        dev = sysbus_create_simple(TYPE_STELLARIS_I2C, 0x40020000, pic[8]);
> +        dev = sysbus_create_simple(TYPE_STELLARIS_I2C, 0x40020000,
> +                                   qdev_get_gpio_in(nvic, 8));
>          i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
>          if (board->peripherals & BP_OLED_I2C) {
>              i2c_create_slave(i2c, "ssd0303", 0x3d);
> @@ -1286,11 +1292,12 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>      for (i = 0; i < 4; i++) {
>          if (board->dc2 & (1 << i)) {
>              sysbus_create_simple("pl011_luminary", 0x4000c000 + i * 0x1000,
> -                                 pic[uart_irq[i]]);
> +                                 qdev_get_gpio_in(nvic, uart_irq[i]));
>          }
>      }
>      if (board->dc2 & (1 << 4)) {
> -        dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
> +        dev = sysbus_create_simple("pl022", 0x40008000,
> +                                   qdev_get_gpio_in(nvic, 7));
>          if (board->peripherals & BP_OLED_SSI) {
>              void *bus;
>              DeviceState *sddev;
> @@ -1326,7 +1333,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
>          qdev_set_nic_properties(enet, &nd_table[0]);
>          qdev_init_nofail(enet);
>          sysbus_mmio_map(SYS_BUS_DEVICE(enet), 0, 0x40048000);
> -        sysbus_connect_irq(SYS_BUS_DEVICE(enet), 0, pic[42]);
> +        sysbus_connect_irq(SYS_BUS_DEVICE(enet), 0, qdev_get_gpio_in(nvic, 42));
>      }
>      if (board->peripherals & BP_GAMEPAD) {
>          qemu_irq gpad_irq[5];
> diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
> index 4d26a7e..3f99340 100644
> --- a/hw/arm/stm32f205_soc.c
> +++ b/hw/arm/stm32f205_soc.c
> @@ -59,9 +59,8 @@ static void stm32f205_soc_initfn(Object *obj)
>  static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>  {
>      STM32F205State *s = STM32F205_SOC(dev_soc);
> -    DeviceState *syscfgdev, *usartdev, *timerdev;
> +    DeviceState *syscfgdev, *usartdev, *timerdev, *nvic;
>      SysBusDevice *syscfgbusdev, *usartbusdev, *timerbusdev;
> -    qemu_irq *pic;
>      Error *err = NULL;
>      int i;
>
> @@ -88,8 +87,8 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      vmstate_register_ram_global(sram);
>      memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, sram);
>
> -    pic = armv7m_init(get_system_memory(), FLASH_SIZE, 96,
> -                      s->kernel_filename, s->cpu_model);
> +    nvic = armv7m_init(get_system_memory(), FLASH_SIZE, 96,
> +                       s->kernel_filename, s->cpu_model);
>
>      /* System configuration controller */
>      syscfgdev = DEVICE(&s->syscfg);
> @@ -100,7 +99,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      }
>      syscfgbusdev = SYS_BUS_DEVICE(syscfgdev);
>      sysbus_mmio_map(syscfgbusdev, 0, 0x40013800);
> -    sysbus_connect_irq(syscfgbusdev, 0, pic[71]);
> +    sysbus_connect_irq(syscfgbusdev, 0, qdev_get_gpio_in(nvic, 71));
>
>      /* Attach UART (uses USART registers) and USART controllers */
>      for (i = 0; i < STM_NUM_USARTS; i++) {
> @@ -112,7 +111,8 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>          }
>          usartbusdev = SYS_BUS_DEVICE(usartdev);
>          sysbus_mmio_map(usartbusdev, 0, usart_addr[i]);
> -        sysbus_connect_irq(usartbusdev, 0, pic[usart_irq[i]]);
> +        sysbus_connect_irq(usartbusdev, 0,
> +                           qdev_get_gpio_in(nvic, usart_irq[i]));
>      }
>
>      /* Timer 2 to 5 */
> @@ -126,7 +126,8 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>          }
>          timerbusdev = SYS_BUS_DEVICE(timerdev);
>          sysbus_mmio_map(timerbusdev, 0, timer_addr[i]);
> -        sysbus_connect_irq(timerbusdev, 0, pic[timer_irq[i]]);
> +        sysbus_connect_irq(timerbusdev, 0,
> +                           qdev_get_gpio_in(nvic, timer_irq[i]));
>      }
>  }
>
> diff --git a/include/hw/arm/arm.h b/include/hw/arm/arm.h
> index 4dcd4f9..7916b6b 100644
> --- a/include/hw/arm/arm.h
> +++ b/include/hw/arm/arm.h
> @@ -17,7 +17,7 @@
>  #include "cpu.h"
>
>  /* armv7m.c */
> -qemu_irq *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
> +DeviceState *armv7m_init(MemoryRegion *system_memory, int mem_size, int num_irq,
>                        const char *kernel_filename, const char *cpu_model);
>
>  /*
> --
> 2.1.4
>

  reply	other threads:[~2015-10-30 21:15 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-08 15:40 [Qemu-devel] [PATCH] Exit on reset for armv7-m Michael Davidsaver
2015-10-08 15:40 ` [Qemu-devel] [PATCH] armv7-m: exit on external reset request Michael Davidsaver
2015-10-09 16:59   ` Peter Maydell
2015-10-09 17:25     ` Michael Davidsaver
2015-10-09 18:18       ` Peter Crosthwaite
2015-10-09 18:51         ` Michael Davidsaver
2015-10-10 14:35           ` Michael Davidsaver
2015-10-10 18:54             ` [Qemu-devel] [PATCH v2] " Michael Davidsaver
2015-10-11 15:06               ` Peter Crosthwaite
2015-10-12  3:36                 ` [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init() Michael Davidsaver
2015-10-30 21:15                   ` Peter Crosthwaite [this message]
2015-10-30 21:20                     ` Peter Crosthwaite
2015-10-30 21:35                       ` Peter Maydell
2015-10-12  3:36                 ` [Qemu-devel] [PATCH v3 2/3] armv7-m: Implement SYSRESETREQ Michael Davidsaver
2015-10-30 21:16                   ` Peter Crosthwaite
2015-10-12  3:36                 ` [Qemu-devel] [PATCH v3 3/3] stellaris: exit on external reset request Michael Davidsaver
2015-10-30 21:13                   ` Peter Crosthwaite
2015-10-08 20:09 ` [Qemu-devel] [PATCH] Exit on reset for armv7-m Peter Crosthwaite
2015-10-09  1:24   ` Michael Davidsaver
2015-10-09  4:21     ` Peter Crosthwaite

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='CAPokK=p78PZARrHFXcc0a3sqmJVs5SLPwQVn3acc4GfohT663A@mail.gmail.com' \
    --to=crosthwaitepeter@gmail.com \
    --cc=alistair23@gmail.com \
    --cc=mdavidsaver@gmail.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).