[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m
From: |
Peter Crosthwaite |
Subject: |
Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init() |
Date: |
Fri, 30 Oct 2015 14:15:25 -0700 |
Missing CC of Alistair for STM32F205.
On Sun, Oct 11, 2015 at 8:36 PM, Michael Davidsaver
<address@hidden> 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 <address@hidden>
This is a good step towards QOMification, and I like it in its own right.
Reviewed-by: Peter Crosthwaite <address@hidden>
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
>
- Re: [Qemu-devel] [PATCH] armv7-m: exit on external reset request, (continued)
- Re: [Qemu-devel] [PATCH] armv7-m: exit on external reset request, Peter Crosthwaite, 2015/10/09
- Re: [Qemu-devel] [PATCH] armv7-m: exit on external reset request, Michael Davidsaver, 2015/10/09
- Re: [Qemu-devel] [PATCH] armv7-m: exit on external reset request, Michael Davidsaver, 2015/10/10
- [Qemu-devel] [PATCH v2] armv7-m: exit on external reset request, Michael Davidsaver, 2015/10/10
- Re: [Qemu-devel] [PATCH v2] armv7-m: exit on external reset request, Peter Crosthwaite, 2015/10/15
- [Qemu-devel] [PATCH v3 3/3] stellaris: exit on external reset request, Michael Davidsaver, 2015/10/11
- Re: [Qemu-devel] [PATCH v3 3/3] stellaris: exit on external reset request, Peter Crosthwaite, 2015/10/30
- [Qemu-devel] [PATCH v3 2/3] armv7-m: Implement SYSRESETREQ, Michael Davidsaver, 2015/10/11
- Re: [Qemu-devel] [PATCH v3 2/3] armv7-m: Implement SYSRESETREQ, Peter Crosthwaite, 2015/10/30
- [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init(), Michael Davidsaver, 2015/10/11
- Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init(),
Peter Crosthwaite <=
- Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init(), Peter Crosthwaite, 2015/10/30
- Re: [Qemu-devel] [PATCH v3 1/3] armv7-m: Return DeviceState* from armv7m_init(), Peter Maydell, 2015/10/30
Re: [Qemu-devel] [PATCH] Exit on reset for armv7-m, Peter Crosthwaite, 2015/10/08