qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support
@ 2013-12-05  0:51 liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 1/5] vmstate: add VMSTATE_PTIMER_ARRAY liguang
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang


lay a foundation for allwinner A10 SoC with a cortex-a8
processor, and will add more devices later.

v2: split timer and interrupt controller emulation into
	their corresponding files.
	
v3: 
1. change loader_start address
2. add 64-bit counter
3. fixup fail to clear interrup status issue

v4:
1. add VMSD
2. use defines of magic number for readability
3. code cleanup

v5:
1. add VMSTATE_PTIMER_ARRAY
2. code cleanup

v6:
1. fix a fiq lost issue pointed out by Peter Crosthwaite
2. code cleanup

v7:
model allwinner A10 as a SoC device,
and add cubieboard.

v8:
1. A10 be QOMified as a device
2. add AW as prefix of A10

v9:
code cleanup for PATCH 4/5 A10 SoC support


TODO:
1. add BROM support
2. add more devices

test:
can boot-up officially released linux kernel build with
PLL disabled.
can find test zImage url at:
http://dl.dbank.com/c0jaibr54s

reference:
http://linux-sunxi.org/Main_Page


Li Guang (5)
	 vmstate: add VMSTATE_PTIMER_ARRAY
	 hw/timer: add allwinner a10 timer
	 hw/intc: add allwinner A10 interrupt controller
	 hw/arm: add allwinner a10 SoC support
	 hw/arm: add cubieboard support

default-configs/arm-softmmu.mak      |   2 +
hw/arm/Makefile.objs                 |   4 +-
hw/arm/allwinner-a10.c               |  39 +++++++++++++++++++++++++++++++++++++++
hw/arm/cubieboard.c                  |  33 +++++++++++++++++++++++++++++++++
hw/intc/Makefile.objs                |   1 +
hw/intc/allwinner-a10_pic.c          | 218 +++++++++++++++++++++++++++++++++++
hw/timer/Makefile.objs               |   2 +
hw/timer/allwinner-a10_pit.c         | 253 ++++++++++++++++++++++++++++++++++
include/hw/arm/allwinner-a10.h       |  27 +++++++++++++++++++++++++++
include/hw/intc/allwinner-a10_pic.h  |  40 +++++++
include/hw/timer/allwinner-a10_pit.h |  57 ++++++++
include/migration/vmstate.h          |   4 ++++
savevm.c                             |  31 +++++++++++++++++++++++++++++++
13 files changed, 709 insertions(+), 2 deletions(-)
 create mode 100644 hw/timer/allwinner-a10_pit.c
 create mode 100644 include/hw/timer/allwinner-a10_pit.h
 create mode 100644 hw/intc/allwinner-a10_pic.c
 create mode 100644 include/hw/intc/allwinner-a10_pic.h
 create mode 100644 hw/arm/allwinner-a10.c
 create mode 100644 include/hw/arm/allwinner-a10.h
 create mode 100644 hw/arm/cubieboard.c

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 1/5] vmstate: add VMSTATE_PTIMER_ARRAY
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
@ 2013-12-05  0:51 ` liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 2/5] hw/timer: add allwinner a10 timer liguang
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 include/migration/vmstate.h |    4 ++++
 savevm.c                    |   31 +++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index 9d09e60..977cf52 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -165,6 +165,7 @@ extern const VMStateInfo vmstate_info_timer;
 extern const VMStateInfo vmstate_info_buffer;
 extern const VMStateInfo vmstate_info_unused_buffer;
 extern const VMStateInfo vmstate_info_bitmap;
+extern const VMStateInfo vmstate_info_ptimer;
 
 #define type_check_2darray(t1,t2,n,m) ((t1(*)[n][m])0 - (t2*)0)
 #define type_check_array(t1,t2,n) ((t1(*)[n])0 - (t2*)0)
@@ -613,6 +614,9 @@ extern const VMStateInfo vmstate_info_bitmap;
 #define VMSTATE_TIMER_ARRAY(_f, _s, _n)                              \
     VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_timer, QEMUTimer *)
 
+#define VMSTATE_PTIMER_ARRAY(_f, _s, _n)        \
+    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_ptimer, ptimer_state *)
+
 #define VMSTATE_BOOL_ARRAY_V(_f, _s, _n, _v)                         \
     VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_bool, bool)
 
diff --git a/savevm.c b/savevm.c
index 2f631d4..54dbb33 100644
--- a/savevm.c
+++ b/savevm.c
@@ -30,6 +30,7 @@
 #include "monitor/monitor.h"
 #include "sysemu/sysemu.h"
 #include "qemu/timer.h"
+#include "hw/ptimer.h"
 #include "audio/audio.h"
 #include "migration/migration.h"
 #include "qemu/sockets.h"
@@ -1362,6 +1363,36 @@ const VMStateInfo vmstate_info_timer = {
     .put  = put_timer,
 };
 
+static int get_ptimer(QEMUFile *f, void *pv, size_t size)
+{
+    ptimer_state *v = pv;
+    uint64_t count;
+
+    count = qemu_get_be64(f);
+    if (count != -1) {
+        ptimer_set_count(v, count);
+    } else {
+        ptimer_stop(v);
+    }
+
+    return 0;
+}
+
+static void put_ptimer(QEMUFile *f, void *pv, size_t size)
+{
+    ptimer_state *v = pv;
+    uint64_t count;
+
+    count = ptimer_get_count(v);
+    qemu_put_be64(f, count);
+}
+
+const VMStateInfo vmstate_info_ptimer = {
+    .name = "ptimer",
+    .get  = get_ptimer,
+    .put  = put_ptimer,
+};
+
 /* uint8_t buffers */
 
 static int get_buffer(QEMUFile *f, void *pv, size_t size)
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 2/5] hw/timer: add allwinner a10 timer
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 1/5] vmstate: add VMSTATE_PTIMER_ARRAY liguang
@ 2013-12-05  0:51 ` liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 3/5] hw/intc: add allwinner A10 interrupt controller liguang
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 default-configs/arm-softmmu.mak      |    2 +
 hw/timer/Makefile.objs               |    2 +
 hw/timer/allwinner-a10-pit.c         |  253 ++++++++++++++++++++++++++++++++++
 include/hw/timer/allwinner-a10-pit.h |   57 ++++++++
 4 files changed, 314 insertions(+), 0 deletions(-)
 create mode 100644 hw/timer/allwinner-a10-pit.c
 create mode 100644 include/hw/timer/allwinner-a10-pit.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index a555eef..7858abf 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -81,3 +81,5 @@ CONFIG_VERSATILE_I2C=y
 
 CONFIG_SDHCI=y
 CONFIG_INTEGRATOR_DEBUG=y
+
+CONFIG_ALLWINNER_A10_PIT=y
diff --git a/hw/timer/Makefile.objs b/hw/timer/Makefile.objs
index eca5905..f6ace47 100644
--- a/hw/timer/Makefile.objs
+++ b/hw/timer/Makefile.objs
@@ -27,3 +27,5 @@ obj-$(CONFIG_SH4) += sh_timer.o
 obj-$(CONFIG_TUSB6010) += tusb6010.o
 
 obj-$(CONFIG_MC146818RTC) += mc146818rtc.o
+
+obj-$(CONFIG_ALLWINNER_A10_PIT) += allwinner-a10-pit.o
diff --git a/hw/timer/allwinner-a10-pit.c b/hw/timer/allwinner-a10-pit.c
new file mode 100644
index 0000000..2305813
--- /dev/null
+++ b/hw/timer/allwinner-a10-pit.c
@@ -0,0 +1,253 @@
+/*
+ * Allwinner A10 timer device emulation
+ *
+ * Copyright (C) 2013 Li Guang
+ * Written by Li Guang <lig.fnst@cn.fujitsu.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License
+ * for more details.
+ */
+
+#include "hw/sysbus.h"
+#include "sysemu/sysemu.h"
+#include "hw/timer/allwinner-a10-pit.h"
+
+
+static uint64_t a10_pit_read(void *opaque, hwaddr offset, unsigned size)
+{
+    AwA10PITState *s = AW_A10_PIT(opaque);
+    uint8_t index;
+
+    switch (offset) {
+    case AW_A10_PIT_TIMER_IRQ_EN:
+        return s->irq_enable;
+    case AW_A10_PIT_TIMER_IRQ_ST:
+        return s->irq_status;
+    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 + AW_A10_PIT_TIMER_COUNT:
+        index = offset & 0xf0;
+        index >>= 4;
+        index -= 1;
+        switch (offset & 0x0f) {
+        case AW_A10_PIT_TIMER_CONTROL:
+            return s->control[index];
+        case AW_A10_PIT_TIMER_INTERVAL:
+            return s->interval[index];
+        case AW_A10_PIT_TIMER_COUNT:
+            s->count[index] = ptimer_get_count(s->timer[index]);
+            return s->count[index];
+        default:
+            qemu_log_mask(LOG_GUEST_ERROR,
+                          "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+            break;
+        }
+    case AW_A10_PIT_WDOG_CONTROL:
+        break;
+    case AW_A10_PIT_WDOG_MODE:
+        break;
+    case AW_A10_PIT_COUNT_LO:
+        return s->count_lo;
+    case AW_A10_PIT_COUNT_HI:
+        return s->count_hi;
+    case AW_A10_PIT_COUNT_CTL:
+        return s->count_ctl;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR,
+                      "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+        break;
+    }
+
+    return 0;
+}
+
+static void a10_pit_write(void *opaque, hwaddr offset, uint64_t value,
+                            unsigned size)
+{
+     AwA10PITState *s = AW_A10_PIT(opaque);
+     uint8_t index;
+
+    switch (offset) {
+    case AW_A10_PIT_TIMER_IRQ_EN:
+        s->irq_enable = value;
+        break;
+    case AW_A10_PIT_TIMER_IRQ_ST:
+        s->irq_status &= ~value;
+        break;
+    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 + AW_A10_PIT_TIMER_COUNT:
+        index = offset & 0xf0;
+        index >>= 4;
+        index -= 1;
+        switch (offset & 0x0f) {
+        case AW_A10_PIT_TIMER_CONTROL:
+            s->control[index] = value;
+            if (s->control[index] & AW_A10_PIT_TIMER_RELOAD) {
+                ptimer_set_count(s->timer[index], s->interval[index]);
+            }
+            if (s->control[index] & AW_A10_PIT_TIMER_EN) {
+                int oneshot = 0;
+                if (s->control[index] & AW_A10_PIT_TIMER_MODE) {
+                    oneshot = 1;
+                }
+                ptimer_run(s->timer[index], oneshot);
+            } else {
+                ptimer_stop(s->timer[index]);
+            }
+            break;
+        case AW_A10_PIT_TIMER_INTERVAL:
+            s->interval[index] = value;
+            ptimer_set_limit(s->timer[index], s->interval[index], 1);
+            break;
+        case AW_A10_PIT_TIMER_COUNT:
+            s->count[index] = value;
+            break;
+        default:
+            qemu_log_mask(LOG_GUEST_ERROR,
+                          "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+        }
+        break;
+    case AW_A10_PIT_WDOG_CONTROL:
+        s->watch_dog_control = value;
+        break;
+    case AW_A10_PIT_WDOG_MODE:
+        s->watch_dog_mode = value;
+        break;
+    case AW_A10_PIT_COUNT_LO:
+        s->count_lo = value;
+        break;
+    case AW_A10_PIT_COUNT_HI:
+        s->count_hi = value;
+        break;
+    case AW_A10_PIT_COUNT_CTL:
+        s->count_ctl = value;
+        if (s->count_ctl & AW_A10_PIT_COUNT_RL_EN) {
+            s->count_lo = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+            s->count_hi = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) >> 32;
+            s->count_ctl &= ~AW_A10_PIT_COUNT_RL_EN;
+        }
+        if (s->count_ctl & AW_A10_PIT_COUNT_CLR_EN) {
+            s->count_lo = 0;
+            s->count_hi = 0;
+            s->count_ctl &= ~AW_A10_PIT_COUNT_CLR_EN;
+        }
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR,
+                      "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+        break;
+    }
+}
+
+static const MemoryRegionOps a10_pit_ops = {
+    .read = a10_pit_read,
+    .write = a10_pit_write,
+    .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+static const VMStateDescription vmstate_a10_pit = {
+    .name = "a10.pit",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(irq_enable, AwA10PITState),
+        VMSTATE_UINT32(irq_status, AwA10PITState),
+        VMSTATE_UINT32_ARRAY(control, AwA10PITState, AW_A10_PIT_TIMER_NR),
+        VMSTATE_UINT32_ARRAY(interval, AwA10PITState, AW_A10_PIT_TIMER_NR),
+        VMSTATE_UINT32_ARRAY(count, AwA10PITState, AW_A10_PIT_TIMER_NR),
+        VMSTATE_UINT32(watch_dog_mode, AwA10PITState),
+        VMSTATE_UINT32(watch_dog_control, AwA10PITState),
+        VMSTATE_UINT32(count_lo, AwA10PITState),
+        VMSTATE_UINT32(count_hi, AwA10PITState),
+        VMSTATE_UINT32(count_ctl, AwA10PITState),
+        VMSTATE_PTIMER_ARRAY(timer, AwA10PITState, AW_A10_PIT_TIMER_NR),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void a10_pit_reset(DeviceState *dev)
+{
+    AwA10PITState *s = AW_A10_PIT(dev);
+    uint8_t i;
+
+    s->irq_enable = 0;
+    s->irq_status = 0;
+    for (i = 0; i < 6; i++) {
+        s->control[i] = AW_A10_PIT_DEFAULT_CLOCK;
+        s->interval[i] = 0;
+        s->count[i] = 0;
+        ptimer_stop(s->timer[i]);
+    }
+    s->watch_dog_mode = 0;
+    s->watch_dog_control = 0;
+    s->count_lo = 0;
+    s->count_hi = 0;
+    s->count_ctl = 0;
+}
+
+static void a10_pit_timer_cb(void *opaque)
+{
+    AwA10PITState *s = AW_A10_PIT(opaque);
+    uint8_t i;
+
+    for (i = 0; i < AW_A10_PIT_TIMER_NR; i++) {
+        if (s->control[i] & AW_A10_PIT_TIMER_EN) {
+            s->irq_status |= 1 << i;
+            if (s->control[i] & AW_A10_PIT_TIMER_MODE) {
+                ptimer_stop(s->timer[i]);
+                s->control[i] &= ~AW_A10_PIT_TIMER_EN;
+            }
+            qemu_irq_pulse(s->irq[i]);
+        }
+    }
+}
+
+static void a10_pit_realize(DeviceState *dev, Error **errp)
+{
+    AwA10PITState *s = AW_A10_PIT(dev);
+    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    QEMUBH * bh[AW_A10_PIT_TIMER_NR];
+    uint8_t i;
+
+    for (i = 0; i < AW_A10_PIT_TIMER_NR; i++) {
+        sysbus_init_irq(sbd, &s->irq[i]);
+    }
+    memory_region_init_io(&s->iomem, OBJECT(s), &a10_pit_ops, s,
+                          TYPE_AW_A10_PIT, 0x400);
+    sysbus_init_mmio(sbd, &s->iomem);
+
+    for (i = 0; i < AW_A10_PIT_TIMER_NR; i++) {
+        bh[i] = qemu_bh_new(a10_pit_timer_cb, s);
+        s->timer[i] = ptimer_init(bh[i]);
+        ptimer_set_freq(s->timer[i], 240000);
+    }
+}
+
+static void a10_pit_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc  = DEVICE_CLASS(klass);
+
+    dc->realize = a10_pit_realize;
+    dc->reset = a10_pit_reset;
+    dc->desc = "allwinner a10 timer";
+    dc->vmsd = &vmstate_a10_pit;
+}
+
+static const TypeInfo a10_pit_info = {
+    .name = TYPE_AW_A10_PIT,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(AwA10PITState),
+    .class_init = a10_pit_class_init,
+};
+
+static void a10_register_types(void)
+{
+    type_register_static(&a10_pit_info);
+}
+
+type_init(a10_register_types);
diff --git a/include/hw/timer/allwinner-a10-pit.h b/include/hw/timer/allwinner-a10-pit.h
new file mode 100644
index 0000000..329c05c
--- /dev/null
+++ b/include/hw/timer/allwinner-a10-pit.h
@@ -0,0 +1,57 @@
+#ifndef AW_A10_PIT_H
+#define AW_A10_PIT_H
+
+#include "hw/ptimer.h"
+
+#define TYPE_AW_A10_PIT "Allwinner-A10-timer"
+#define AW_A10_PIT(obj) OBJECT_CHECK(AwA10PITState, (obj), TYPE_AW_A10_PIT)
+
+#define AW_A10_PIT_TIMER_NR    6
+#define AW_A10_PIT_TIMER_IRQ   0x1
+#define AW_A10_PIT_WDOG_IRQ    0x100
+
+#define AW_A10_PIT_TIMER_IRQ_EN    0
+#define AW_A10_PIT_TIMER_IRQ_ST    0x4
+
+#define AW_A10_PIT_TIMER_CONTROL   0x0
+#define AW_A10_PIT_TIMER_EN        0x1
+#define AW_A10_PIT_TIMER_RELOAD    0x2
+#define AW_A10_PIT_TIMER_MODE      0x80
+
+#define AW_A10_PIT_TIMER_INTERVAL  0x4
+#define AW_A10_PIT_TIMER_COUNT     0x8
+#define AW_A10_PIT_WDOG_CONTROL    0x90
+#define AW_A10_PIT_WDOG_MODE       0x94
+
+#define AW_A10_PIT_COUNT_CTL       0xa0
+#define AW_A10_PIT_COUNT_RL_EN     0x2
+#define AW_A10_PIT_COUNT_CLR_EN    0x1
+#define AW_A10_PIT_COUNT_LO        0xa4
+#define AW_A10_PIT_COUNT_HI        0xa8
+
+#define AW_A10_PIT_TIMER_BASE      0x10
+
+#define AW_A10_PIT_DEFAULT_CLOCK   0x4
+
+typedef struct AwA10PITState {
+    /*< private >*/
+    SysBusDevice parent_obj;
+    /*< public >*/
+    qemu_irq irq[AW_A10_PIT_TIMER_NR];
+    ptimer_state *timer[AW_A10_PIT_TIMER_NR];
+    MemoryRegion iomem;
+
+    uint32_t  irq_enable;
+    uint32_t irq_status;
+    uint32_t control[AW_A10_PIT_TIMER_NR];
+    uint32_t interval[AW_A10_PIT_TIMER_NR];
+    uint32_t count[AW_A10_PIT_TIMER_NR];
+    uint32_t watch_dog_mode;
+    uint32_t watch_dog_control;
+    uint32_t count_lo;
+    uint32_t count_hi;
+    uint32_t count_ctl;
+} AwA10PITState;
+
+#endif
+
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 3/5] hw/intc: add allwinner A10 interrupt controller
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 1/5] vmstate: add VMSTATE_PTIMER_ARRAY liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 2/5] hw/timer: add allwinner a10 timer liguang
@ 2013-12-05  0:51 ` liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 4/5] hw/arm: add allwinner a10 SoC support liguang
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 default-configs/arm-softmmu.mak     |    1 +
 hw/intc/Makefile.objs               |    1 +
 hw/intc/allwinner-a10-pic.c         |  218 +++++++++++++++++++++++++++++++++++
 include/hw/intc/allwinner-a10-pic.h |   40 +++++++
 4 files changed, 260 insertions(+), 0 deletions(-)
 create mode 100644 hw/intc/allwinner-a10-pic.c
 create mode 100644 include/hw/intc/allwinner-a10-pic.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index 7858abf..e965068 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -83,3 +83,4 @@ CONFIG_SDHCI=y
 CONFIG_INTEGRATOR_DEBUG=y
 
 CONFIG_ALLWINNER_A10_PIT=y
+CONFIG_ALLWINNER_A10_PIC=y
diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
index 47ac442..60eb936 100644
--- a/hw/intc/Makefile.objs
+++ b/hw/intc/Makefile.objs
@@ -24,3 +24,4 @@ obj-$(CONFIG_OPENPIC_KVM) += openpic_kvm.o
 obj-$(CONFIG_SH4) += sh_intc.o
 obj-$(CONFIG_XICS) += xics.o
 obj-$(CONFIG_XICS_KVM) += xics_kvm.o
+obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
diff --git a/hw/intc/allwinner-a10-pic.c b/hw/intc/allwinner-a10-pic.c
new file mode 100644
index 0000000..fdc9e4e
--- /dev/null
+++ b/hw/intc/allwinner-a10-pic.c
@@ -0,0 +1,218 @@
+/*
+ * Allwinner A10 interrupt controller device emulation
+ *
+ * Copyright (C) 2013 Li Guang
+ * Written by Li Guang <lig.fnst@cn.fujitsu.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License
+ * for more details.
+ */
+
+#include "hw/sysbus.h"
+#include "hw/devices.h"
+#include "sysemu/sysemu.h"
+#include "hw/intc/allwinner-a10-pic.h"
+
+
+static void aw_a10_pic_update(AwA10PICState *s)
+{
+    uint8_t i, j;
+    bool irq = false, fiq = false;
+
+    for (i = 0, j = 0; i < AW_A10_PIC_REG_NUM; i++) {
+        if (s->irq_pending[i] == 0 && s->fiq_pending[i] == 0) {
+            continue;
+        }
+        for (j = 0; j < 32; j++) {
+            if (test_bit(j, (void *)&s->mask[i])) {
+                continue;
+            }
+            if (test_bit(j, (void *)&s->irq_pending[i])) {
+                irq = true;
+            }
+            if (test_bit(j, (void *)&s->fiq_pending[i]) &&
+                test_bit(j, (void *)&s->select[i])) {
+                fiq = true;
+            }
+            if (irq && fiq) {
+                goto out;
+            }
+        }
+    }
+
+out:
+    qemu_set_irq(s->parent_irq, irq);
+    qemu_set_irq(s->parent_fiq, fiq);
+}
+
+static void aw_a10_pic_set_irq(void *opaque, int irq, int level)
+{
+    AwA10PICState *s = opaque;
+
+    if (level) {
+        set_bit(irq%32, (void *)&s->irq_pending[irq/32]);
+    }
+    aw_a10_pic_update(s);
+}
+
+static uint64_t aw_a10_pic_read(void *opaque, hwaddr offset, unsigned size)
+{
+    AwA10PICState *s = opaque;
+    uint8_t index = (offset & 0xc)/4;
+
+    switch (offset) {
+    case AW_A10_PIC_VECTOR:
+        return s->vector;
+    case AW_A10_PIC_BASE_ADDR:
+        return s->base_addr;
+    case AW_A10_PIC_PROTECT:
+        return s->protect;
+    case AW_A10_PIC_NMI:
+        return s->nmi;
+    case AW_A10_PIC_IRQ_PENDING ... AW_A10_PIC_IRQ_PENDING + 8:
+        return s->irq_pending[index];
+    case AW_A10_PIC_FIQ_PENDING ... AW_A10_PIC_FIQ_PENDING + 8:
+        return s->fiq_pending[index];
+    case AW_A10_PIC_SELECT ... AW_A10_PIC_SELECT + 8:
+        return s->select[index];
+    case AW_A10_PIC_ENABLE ... AW_A10_PIC_ENABLE + 8:
+        return s->enable[index];
+    case AW_A10_PIC_MASK ... AW_A10_PIC_MASK + 8:
+        return s->mask[index];
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR,
+                      "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+        break;
+    }
+
+    return 0;
+}
+
+static void aw_a10_pic_write(void *opaque, hwaddr offset, uint64_t value,
+                             unsigned size)
+{
+    AwA10PICState *s = opaque;
+    uint8_t index = (offset & 0xc)/4;
+
+    switch (offset) {
+    case AW_A10_PIC_VECTOR:
+        s->vector = value & ~0x3;
+        break;
+    case AW_A10_PIC_BASE_ADDR:
+        s->base_addr = value & ~0x3;
+    case AW_A10_PIC_PROTECT:
+        s->protect = value;
+        break;
+    case AW_A10_PIC_NMI:
+        s->nmi = value;
+        break;
+    case AW_A10_PIC_IRQ_PENDING ... AW_A10_PIC_IRQ_PENDING + 8:
+        s->irq_pending[index] &= ~value;
+        break;
+    case AW_A10_PIC_FIQ_PENDING ... AW_A10_PIC_FIQ_PENDING + 8:
+        s->fiq_pending[index] &= ~value;
+        break;
+    case AW_A10_PIC_SELECT ... AW_A10_PIC_SELECT + 8:
+        s->select[index] = value;
+        break;
+    case AW_A10_PIC_ENABLE ... AW_A10_PIC_ENABLE + 8:
+        s->enable[index] = value;
+        break;
+    case AW_A10_PIC_MASK ... AW_A10_PIC_MASK + 8:
+        s->mask[index] = value;
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR,
+                      "%s: Bad offset 0x%x\n",  __func__, (int)offset);
+        break;
+    }
+
+    aw_a10_pic_update(s);
+}
+
+static const MemoryRegionOps aw_a10_pic_ops = {
+    .read = aw_a10_pic_read,
+    .write = aw_a10_pic_write,
+    .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+static const VMStateDescription vmstate_aw_a10_pic = {
+    .name = "a10.pic",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(vector, AwA10PICState),
+        VMSTATE_UINT32(base_addr, AwA10PICState),
+        VMSTATE_UINT32(protect, AwA10PICState),
+        VMSTATE_UINT32(nmi, AwA10PICState),
+        VMSTATE_UINT32_ARRAY(irq_pending, AwA10PICState, AW_A10_PIC_REG_NUM),
+        VMSTATE_UINT32_ARRAY(fiq_pending, AwA10PICState, AW_A10_PIC_REG_NUM),
+        VMSTATE_UINT32_ARRAY(enable, AwA10PICState, AW_A10_PIC_REG_NUM),
+        VMSTATE_UINT32_ARRAY(select, AwA10PICState, AW_A10_PIC_REG_NUM),
+        VMSTATE_UINT32_ARRAY(mask, AwA10PICState, AW_A10_PIC_REG_NUM),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void aw_a10_pic_realize(DeviceState *ds, Error **errp)
+{
+    AwA10PICState *s = AW_A10_PIC(ds);
+    SysBusDevice *dev = SYS_BUS_DEVICE(ds);
+
+     qdev_init_gpio_in(DEVICE(dev), aw_a10_pic_set_irq, AW_A10_PIC_INT_NR);
+     sysbus_init_irq(dev, &s->parent_irq);
+     sysbus_init_irq(dev, &s->parent_fiq);
+     memory_region_init_io(&s->iomem, OBJECT(s), &aw_a10_pic_ops, s,
+                           "a10-pic", 0x400);
+     sysbus_init_mmio(dev, &s->iomem);
+}
+
+static void aw_a10_pic_reset(DeviceState *d)
+{
+    AwA10PICState *s = AW_A10_PIC(d);
+    uint8_t i;
+
+    s->base_addr = 0;
+    s->protect = 0;
+    s->nmi = 0;
+    s->vector = 0;
+    for (i = 0; i < AW_A10_PIC_REG_NUM; i++) {
+        s->irq_pending[i] = 0;
+        s->fiq_pending[i] = 0;
+        s->select[i] = 0;
+        s->enable[i] = 0;
+        s->mask[i] = 0;
+    }
+}
+
+static void aw_a10_pic_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = aw_a10_pic_realize;
+    dc->reset = aw_a10_pic_reset;
+    dc->desc = "A10 pic";
+    dc->vmsd = &vmstate_aw_a10_pic;
+ }
+
+static const TypeInfo aw_a10_pic_info = {
+    .name = TYPE_AW_A10_PIC,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(AwA10PICState),
+    .class_init = aw_a10_pic_class_init,
+};
+
+static void aw_a10_register_types(void)
+{
+    type_register_static(&aw_a10_pic_info);
+}
+
+type_init(aw_a10_register_types);
diff --git a/include/hw/intc/allwinner-a10-pic.h b/include/hw/intc/allwinner-a10-pic.h
new file mode 100644
index 0000000..b5d1c05
--- /dev/null
+++ b/include/hw/intc/allwinner-a10-pic.h
@@ -0,0 +1,40 @@
+#ifndef AW_A10_PIC_H
+#define AW_A10_PIC_H
+
+#define TYPE_AW_A10_PIC  "a10-pic"
+#define AW_A10_PIC(obj) OBJECT_CHECK(AwA10PICState, (obj), TYPE_AW_A10_PIC)
+
+#define AW_A10_PIC_VECTOR       0
+#define AW_A10_PIC_BASE_ADDR    4
+#define AW_A10_PIC_PROTECT      8
+#define AW_A10_PIC_NMI          0xc
+#define AW_A10_PIC_IRQ_PENDING  0x10
+#define AW_A10_PIC_FIQ_PENDING  0x20
+#define AW_A10_PIC_SELECT       0x30
+#define AW_A10_PIC_ENABLE       0x40
+#define AW_A10_PIC_MASK         0x50
+
+#define AW_A10_PIC_INT_NR       95
+#define AW_A10_PIC_REG_NUM      DIV_ROUND_UP(AW_A10_PIC_INT_NR, 32)
+
+typedef struct AwA10PICState {
+    /*< private >*/
+    SysBusDevice parent_obj;
+    /*< public >*/
+    MemoryRegion iomem;
+    qemu_irq parent_fiq;
+    qemu_irq parent_irq;
+
+    uint32_t vector;
+    uint32_t base_addr;
+    uint32_t protect;
+    uint32_t nmi;
+    uint32_t irq_pending[AW_A10_PIC_REG_NUM];
+    uint32_t fiq_pending[AW_A10_PIC_REG_NUM];
+    uint32_t select[AW_A10_PIC_REG_NUM];
+    uint32_t enable[AW_A10_PIC_REG_NUM];
+    uint32_t mask[AW_A10_PIC_REG_NUM];
+    /*priority setting here*/
+} AwA10PICState;
+
+#endif
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 4/5] hw/arm: add allwinner a10 SoC support
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
                   ` (2 preceding siblings ...)
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 3/5] hw/intc: add allwinner A10 interrupt controller liguang
@ 2013-12-05  0:51 ` liguang
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 5/5] hw/arm: add cubieboard support liguang
  2013-12-05  1:46 ` [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support Peter Crosthwaite
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 default-configs/arm-softmmu.mak |    1 +
 hw/arm/Makefile.objs            |    1 +
 hw/arm/allwinner-a10.c          |   87 +++++++++++++++++++++++++++++++++++++++
 include/hw/arm/allwinner-a10.h  |   35 ++++++++++++++++
 4 files changed, 124 insertions(+), 0 deletions(-)
 create mode 100644 hw/arm/allwinner-a10.c
 create mode 100644 include/hw/arm/allwinner-a10.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index e965068..a19208f 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -84,3 +84,4 @@ CONFIG_INTEGRATOR_DEBUG=y
 
 CONFIG_ALLWINNER_A10_PIT=y
 CONFIG_ALLWINNER_A10_PIC=y
+CONFIG_ALLWINNER_A10=y
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
index 3671b42..012bd2c 100644
--- a/hw/arm/Makefile.objs
+++ b/hw/arm/Makefile.objs
@@ -5,3 +5,4 @@ obj-y += tosa.o versatilepb.o vexpress.o xilinx_zynq.o z2.o
 
 obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
 obj-y += omap1.o omap2.o strongarm.o
+obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
new file mode 100644
index 0000000..d6a50f5
--- /dev/null
+++ b/hw/arm/allwinner-a10.c
@@ -0,0 +1,87 @@
+#include "hw/sysbus.h"
+#include "hw/devices.h"
+#include "hw/arm/allwinner-a10.h"
+
+
+static void aw_a10_init(Object *obj)
+{
+    AwA10State *s = AW_A10(obj);
+
+    object_initialize(&s->cpu, sizeof(s->cpu), "cortex-a8-" TYPE_ARM_CPU);
+    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+
+    object_initialize(&s->intc, sizeof(s->intc), TYPE_AW_A10_PIC);
+    qdev_set_parent_bus(DEVICE(&s->intc), sysbus_get_default());
+
+    object_initialize(&s->timer, sizeof(s->timer), TYPE_AW_A10_PIT);
+    qdev_set_parent_bus(DEVICE(&s->timer), sysbus_get_default());
+}
+
+static void aw_a10_realize(DeviceState *dev, Error **errp)
+{
+    AwA10State *s = AW_A10(dev);
+    SysBusDevice *sysbusdev;
+    uint8_t i;
+    qemu_irq fiq, irq;
+    Error *err = NULL;
+
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+    irq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ);
+    fiq = qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ);
+
+    object_property_set_bool(OBJECT(&s->intc), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+    sysbusdev = SYS_BUS_DEVICE(&s->intc);
+    sysbus_mmio_map(sysbusdev, 0, AW_A10_PIC_REG_BASE);
+    sysbus_connect_irq(sysbusdev, 0, irq);
+    sysbus_connect_irq(sysbusdev, 1, fiq);
+    for (i = 0; i < AW_A10_PIC_INT_NR; i++) {
+        s->irq[i] = qdev_get_gpio_in(DEVICE(&s->intc), i);
+    }
+
+    object_property_set_bool(OBJECT(&s->timer), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+    sysbusdev = SYS_BUS_DEVICE(&s->timer);
+    sysbus_mmio_map(sysbusdev, 0, AW_A10_PIT_REG_BASE);
+    sysbus_connect_irq(sysbusdev, 0, s->irq[22]);
+    sysbus_connect_irq(sysbusdev, 1, s->irq[23]);
+    sysbus_connect_irq(sysbusdev, 2, s->irq[24]);
+    sysbus_connect_irq(sysbusdev, 3, s->irq[25]);
+    sysbus_connect_irq(sysbusdev, 4, s->irq[67]);
+    sysbus_connect_irq(sysbusdev, 5, s->irq[68]);
+
+    serial_mm_init(get_system_memory(), AW_A10_UART0_REG_BASE, 2, s->irq[1],
+                   115200, serial_hds[0], DEVICE_NATIVE_ENDIAN);
+}
+
+static void aw_a10_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+
+    dc->realize = aw_a10_realize;
+}
+
+static const TypeInfo aw_a10_type_info = {
+    .name = TYPE_AW_A10,
+    .parent = TYPE_DEVICE,
+    .instance_size = sizeof(AwA10State),
+    .instance_init = aw_a10_init,
+    .class_init = aw_a10_class_init,
+};
+
+static void aw_a10_register_types(void)
+{
+    type_register_static(&aw_a10_type_info);
+}
+
+type_init(aw_a10_register_types)
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
new file mode 100644
index 0000000..da36647
--- /dev/null
+++ b/include/hw/arm/allwinner-a10.h
@@ -0,0 +1,35 @@
+#ifndef ALLWINNER_H_
+
+#include "qemu-common.h"
+#include "qemu/error-report.h"
+#include "hw/char/serial.h"
+#include "hw/arm/arm.h"
+#include "hw/timer/allwinner-a10-pit.h"
+#include "hw/intc/allwinner-a10-pic.h"
+
+#include "sysemu/sysemu.h"
+#include "exec/address-spaces.h"
+
+
+#define AW_A10_PIC_REG_BASE     0x01c20400
+#define AW_A10_PIT_REG_BASE     0x01c20c00
+#define AW_A10_UART0_REG_BASE   0x01c28000
+
+#define AW_A10_SDRAM_BASE       0x40000000
+
+#define TYPE_AW_A10 "allwinner-a10"
+#define AW_A10(obj) OBJECT_CHECK(AwA10State, (obj), TYPE_AW_A10)
+
+typedef struct AwA10State {
+    /*< private >*/
+    DeviceState parent_obj;
+    /*< public >*/
+
+    ARMCPU cpu;
+    qemu_irq irq[AW_A10_PIC_INT_NR];
+    AwA10PITState timer;
+    AwA10PICState intc;
+} AwA10State;
+
+#define ALLWINNER_H_
+#endif
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH v9 5/5] hw/arm: add cubieboard support
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
                   ` (3 preceding siblings ...)
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 4/5] hw/arm: add allwinner a10 SoC support liguang
@ 2013-12-05  0:51 ` liguang
  2013-12-05  1:46 ` [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support Peter Crosthwaite
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-12-05  0:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Peter Crosthwaite, Andreas Färber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 hw/arm/Makefile.objs |    2 +-
 hw/arm/cubieboard.c  |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletions(-)
 create mode 100644 hw/arm/cubieboard.c

diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
index 012bd2c..1dd94de 100644
--- a/hw/arm/Makefile.objs
+++ b/hw/arm/Makefile.objs
@@ -5,4 +5,4 @@ obj-y += tosa.o versatilepb.o vexpress.o xilinx_zynq.o z2.o
 
 obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
 obj-y += omap1.o omap2.o strongarm.o
-obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o
+obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o cubieboard.o
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
new file mode 100644
index 0000000..dfccd5d
--- /dev/null
+++ b/hw/arm/cubieboard.c
@@ -0,0 +1,53 @@
+#include "hw/sysbus.h"
+#include "hw/devices.h"
+#include "hw/boards.h"
+#include "hw/arm/allwinner-a10.h"
+
+
+static struct arm_boot_info cubieboard_binfo = {
+    .loader_start = AW_A10_SDRAM_BASE,
+    .board_id = 0x1008,
+};
+
+typedef struct CubieBoardState {
+    AwA10State *a10;
+    MemoryRegion sdram;
+} CubieBoardState;
+
+static void cubieboard_init(QEMUMachineInitArgs *args)
+{
+    CubieBoardState *s = g_new(CubieBoardState, 1);
+    Error *err = NULL;
+
+    s->a10 = AW_A10(object_new(TYPE_AW_A10));
+    object_property_set_bool(OBJECT(s->a10), true, "realized", &err);
+    if (err != NULL) {
+        error_report("Couldn't realize Allwinner A10: %s\n",
+                error_get_pretty(err));
+        exit(1);
+    }
+
+    memory_region_init_ram(&s->sdram, NULL, "cubieboard.ram", args->ram_size);
+    vmstate_register_ram_global(&s->sdram);
+    memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
+                                &s->sdram);
+
+    cubieboard_binfo.ram_size = args->ram_size;
+    cubieboard_binfo.kernel_filename = args->kernel_filename;
+    cubieboard_binfo.kernel_cmdline = args->kernel_cmdline;
+    arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
+}
+
+static QEMUMachine cubieboard_machine = {
+    .name = "cubieboard",
+    .desc = "cubietech cubieboard",
+    .init = cubieboard_init,
+};
+
+
+static void cubieboard_machine_init(void)
+{
+    qemu_register_machine(&cubieboard_machine);
+}
+
+machine_init(cubieboard_machine_init)
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support
  2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
                   ` (4 preceding siblings ...)
  2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 5/5] hw/arm: add cubieboard support liguang
@ 2013-12-05  1:46 ` Peter Crosthwaite
  2013-12-05  1:55   ` Li Guang
  2013-12-05  2:33   ` Li Guang
  5 siblings, 2 replies; 10+ messages in thread
From: Peter Crosthwaite @ 2013-12-05  1:46 UTC (permalink / raw)
  To: liguang
  Cc: Peter Maydell, qemu-devel@nongnu.org Developers,
	Andreas Färber

Hi Liguang,

V9 has some checkpatch errors:

[pcrost@xsjandreislx qemu]$ git format-patch HEAD~5
0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch
0002-hw-timer-add-allwinner-a10-timer.patch
0003-hw-intc-add-allwinner-A10-interrupt-controller.patch
0004-hw-arm-add-allwinner-a10-SoC-support.patch
0005-hw-arm-add-cubieboard-support.patch
[pcrost@xsjandreislx qemu]$ ./scripts/checkpatch.pl 00*
ERROR: need consistent spacing around '*' (ctx:WxB)
#30: FILE: include/migration/vmstate.h:618:
+    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_ptimer,
ptimer_state *)
                                                                               ^

total: 1 errors, 0 warnings, 59 lines checked

0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch has style problems, please
review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
WARNING: line over 80 characters
#75: FILE: hw/timer/allwinner-a10-pit.c:33:
+    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
AW_A10_PIT_TIMER_COUNT:

WARNING: line over 80 characters
#124: FILE: hw/timer/allwinner-a10-pit.c:82:
+    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
AW_A10_PIT_TIMER_COUNT:

total: 0 errors, 2 warnings, 320 lines checked

0002-hw-timer-add-allwinner-a10-timer.patch has style problems, please
review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
total: 0 errors, 0 warnings, 266 lines checked

0003-hw-intc-add-allwinner-A10-interrupt-controller.patch has no
obvious style problems and is ready for submission.
total: 0 errors, 0 warnings, 130 lines checked

0004-hw-arm-add-allwinner-a10-SoC-support.patch has no obvious style
problems and is ready for submission.
total: 0 errors, 0 warnings, 58 lines checked

0005-hw-arm-add-cubieboard-support.patch has no obvious style problems
and is ready for submission.

Please include checkpatch in your pre-send checklist for each version.

I'm still looking trough the series though (now that I have it am'ed
locally), so don't respin on me just yet!

Regards,
Peter

On Thu, Dec 5, 2013 at 10:51 AM, liguang <lig.fnst@cn.fujitsu.com> wrote:
>
> lay a foundation for allwinner A10 SoC with a cortex-a8
> processor, and will add more devices later.
>
> v2: split timer and interrupt controller emulation into
>         their corresponding files.
>
> v3:
> 1. change loader_start address
> 2. add 64-bit counter
> 3. fixup fail to clear interrup status issue
>
> v4:
> 1. add VMSD
> 2. use defines of magic number for readability
> 3. code cleanup
>
> v5:
> 1. add VMSTATE_PTIMER_ARRAY
> 2. code cleanup
>
> v6:
> 1. fix a fiq lost issue pointed out by Peter Crosthwaite
> 2. code cleanup
>
> v7:
> model allwinner A10 as a SoC device,
> and add cubieboard.
>
> v8:
> 1. A10 be QOMified as a device
> 2. add AW as prefix of A10
>
> v9:
> code cleanup for PATCH 4/5 A10 SoC support
>
>
> TODO:
> 1. add BROM support
> 2. add more devices
>
> test:
> can boot-up officially released linux kernel build with
> PLL disabled.
> can find test zImage url at:
> http://dl.dbank.com/c0jaibr54s
>
> reference:
> http://linux-sunxi.org/Main_Page
>
>
> Li Guang (5)
>          vmstate: add VMSTATE_PTIMER_ARRAY
>          hw/timer: add allwinner a10 timer
>          hw/intc: add allwinner A10 interrupt controller
>          hw/arm: add allwinner a10 SoC support
>          hw/arm: add cubieboard support
>
> default-configs/arm-softmmu.mak      |   2 +
> hw/arm/Makefile.objs                 |   4 +-
> hw/arm/allwinner-a10.c               |  39 +++++++++++++++++++++++++++++++++++++++
> hw/arm/cubieboard.c                  |  33 +++++++++++++++++++++++++++++++++
> hw/intc/Makefile.objs                |   1 +
> hw/intc/allwinner-a10_pic.c          | 218 +++++++++++++++++++++++++++++++++++
> hw/timer/Makefile.objs               |   2 +
> hw/timer/allwinner-a10_pit.c         | 253 ++++++++++++++++++++++++++++++++++
> include/hw/arm/allwinner-a10.h       |  27 +++++++++++++++++++++++++++
> include/hw/intc/allwinner-a10_pic.h  |  40 +++++++
> include/hw/timer/allwinner-a10_pit.h |  57 ++++++++
> include/migration/vmstate.h          |   4 ++++
> savevm.c                             |  31 +++++++++++++++++++++++++++++++
> 13 files changed, 709 insertions(+), 2 deletions(-)
>  create mode 100644 hw/timer/allwinner-a10_pit.c
>  create mode 100644 include/hw/timer/allwinner-a10_pit.h
>  create mode 100644 hw/intc/allwinner-a10_pic.c
>  create mode 100644 include/hw/intc/allwinner-a10_pic.h
>  create mode 100644 hw/arm/allwinner-a10.c
>  create mode 100644 include/hw/arm/allwinner-a10.h
>  create mode 100644 hw/arm/cubieboard.c
>
>
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support
  2013-12-05  1:46 ` [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support Peter Crosthwaite
@ 2013-12-05  1:55   ` Li Guang
  2013-12-05  2:33   ` Li Guang
  1 sibling, 0 replies; 10+ messages in thread
From: Li Guang @ 2013-12-05  1:55 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Peter Maydell, qemu-devel@nongnu.org Developers,
	Andreas Färber

I think with your suggestion
of new definition will remove the warnings,
and I will fix the error report.

Thanks!


Peter Crosthwaite wrote:
> Hi Liguang,
>
> V9 has some checkpatch errors:
>
> [pcrost@xsjandreislx qemu]$ git format-patch HEAD~5
> 0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch
> 0002-hw-timer-add-allwinner-a10-timer.patch
> 0003-hw-intc-add-allwinner-A10-interrupt-controller.patch
> 0004-hw-arm-add-allwinner-a10-SoC-support.patch
> 0005-hw-arm-add-cubieboard-support.patch
> [pcrost@xsjandreislx qemu]$ ./scripts/checkpatch.pl 00*
> ERROR: need consistent spacing around '*' (ctx:WxB)
> #30: FILE: include/migration/vmstate.h:618:
> +    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_ptimer,
> ptimer_state *)
>                                                                                 ^
>
> total: 1 errors, 0 warnings, 59 lines checked
>
> 0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch has style problems, please
> review.  If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
> WARNING: line over 80 characters
> #75: FILE: hw/timer/allwinner-a10-pit.c:33:
> +    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
> AW_A10_PIT_TIMER_COUNT:
>
> WARNING: line over 80 characters
> #124: FILE: hw/timer/allwinner-a10-pit.c:82:
> +    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
> AW_A10_PIT_TIMER_COUNT:
>
> total: 0 errors, 2 warnings, 320 lines checked
>
> 0002-hw-timer-add-allwinner-a10-timer.patch has style problems, please
> review.  If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
> total: 0 errors, 0 warnings, 266 lines checked
>
> 0003-hw-intc-add-allwinner-A10-interrupt-controller.patch has no
> obvious style problems and is ready for submission.
> total: 0 errors, 0 warnings, 130 lines checked
>
> 0004-hw-arm-add-allwinner-a10-SoC-support.patch has no obvious style
> problems and is ready for submission.
> total: 0 errors, 0 warnings, 58 lines checked
>
> 0005-hw-arm-add-cubieboard-support.patch has no obvious style problems
> and is ready for submission.
>
> Please include checkpatch in your pre-send checklist for each version.
>
> I'm still looking trough the series though (now that I have it am'ed
> locally), so don't respin on me just yet!
>
> Regards,
> Peter
>
> On Thu, Dec 5, 2013 at 10:51 AM, liguang<lig.fnst@cn.fujitsu.com>  wrote:
>    
>> lay a foundation for allwinner A10 SoC with a cortex-a8
>> processor, and will add more devices later.
>>
>> v2: split timer and interrupt controller emulation into
>>          their corresponding files.
>>
>> v3:
>> 1. change loader_start address
>> 2. add 64-bit counter
>> 3. fixup fail to clear interrup status issue
>>
>> v4:
>> 1. add VMSD
>> 2. use defines of magic number for readability
>> 3. code cleanup
>>
>> v5:
>> 1. add VMSTATE_PTIMER_ARRAY
>> 2. code cleanup
>>
>> v6:
>> 1. fix a fiq lost issue pointed out by Peter Crosthwaite
>> 2. code cleanup
>>
>> v7:
>> model allwinner A10 as a SoC device,
>> and add cubieboard.
>>
>> v8:
>> 1. A10 be QOMified as a device
>> 2. add AW as prefix of A10
>>
>> v9:
>> code cleanup for PATCH 4/5 A10 SoC support
>>
>>
>> TODO:
>> 1. add BROM support
>> 2. add more devices
>>
>> test:
>> can boot-up officially released linux kernel build with
>> PLL disabled.
>> can find test zImage url at:
>> http://dl.dbank.com/c0jaibr54s
>>
>> reference:
>> http://linux-sunxi.org/Main_Page
>>
>>
>> Li Guang (5)
>>           vmstate: add VMSTATE_PTIMER_ARRAY
>>           hw/timer: add allwinner a10 timer
>>           hw/intc: add allwinner A10 interrupt controller
>>           hw/arm: add allwinner a10 SoC support
>>           hw/arm: add cubieboard support
>>
>> default-configs/arm-softmmu.mak      |   2 +
>> hw/arm/Makefile.objs                 |   4 +-
>> hw/arm/allwinner-a10.c               |  39 +++++++++++++++++++++++++++++++++++++++
>> hw/arm/cubieboard.c                  |  33 +++++++++++++++++++++++++++++++++
>> hw/intc/Makefile.objs                |   1 +
>> hw/intc/allwinner-a10_pic.c          | 218 +++++++++++++++++++++++++++++++++++
>> hw/timer/Makefile.objs               |   2 +
>> hw/timer/allwinner-a10_pit.c         | 253 ++++++++++++++++++++++++++++++++++
>> include/hw/arm/allwinner-a10.h       |  27 +++++++++++++++++++++++++++
>> include/hw/intc/allwinner-a10_pic.h  |  40 +++++++
>> include/hw/timer/allwinner-a10_pit.h |  57 ++++++++
>> include/migration/vmstate.h          |   4 ++++
>> savevm.c                             |  31 +++++++++++++++++++++++++++++++
>> 13 files changed, 709 insertions(+), 2 deletions(-)
>>   create mode 100644 hw/timer/allwinner-a10_pit.c
>>   create mode 100644 include/hw/timer/allwinner-a10_pit.h
>>   create mode 100644 hw/intc/allwinner-a10_pic.c
>>   create mode 100644 include/hw/intc/allwinner-a10_pic.h
>>   create mode 100644 hw/arm/allwinner-a10.c
>>   create mode 100644 include/hw/arm/allwinner-a10.h
>>   create mode 100644 hw/arm/cubieboard.c
>>
>>
>>
>>      
>
>    

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support
  2013-12-05  1:46 ` [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support Peter Crosthwaite
  2013-12-05  1:55   ` Li Guang
@ 2013-12-05  2:33   ` Li Guang
  2013-12-05  8:40     ` Peter Maydell
  1 sibling, 1 reply; 10+ messages in thread
From: Li Guang @ 2013-12-05  2:33 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Peter Maydell, qemu-devel@nongnu.org Developers,
	Andreas Färber

Peter Crosthwaite wrote:
> Hi Liguang,
>
> V9 has some checkpatch errors:
>
> [pcrost@xsjandreislx qemu]$ git format-patch HEAD~5
> 0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch
> 0002-hw-timer-add-allwinner-a10-timer.patch
> 0003-hw-intc-add-allwinner-A10-interrupt-controller.patch
> 0004-hw-arm-add-allwinner-a10-SoC-support.patch
> 0005-hw-arm-add-cubieboard-support.patch
> [pcrost@xsjandreislx qemu]$ ./scripts/checkpatch.pl 00*
> ERROR: need consistent spacing around '*' (ctx:WxB)
> #30: FILE: include/migration/vmstate.h:618:
> +    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_ptimer,
> ptimer_state *)
>                                                                                 ^
>
> total: 1 errors, 0 warnings, 59 lines checked
>
> 0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch has style problems, please
> review.  If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
> WARNING: line over 80 characters
> #75: FILE: hw/timer/allwinner-a10-pit.c:33:
> +    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
> AW_A10_PIT_TIMER_COUNT:
>
> WARNING: line over 80 characters
> #124: FILE: hw/timer/allwinner-a10-pit.c:82:
> +    case AW_A10_PIT_TIMER_BASE ... AW_A10_PIT_TIMER_BASE * 6 +
> AW_A10_PIT_TIMER_COUNT:
>
> total: 0 errors, 2 warnings, 320 lines checked
>
> 0002-hw-timer-add-allwinner-a10-timer.patch has style problems, please
> review.  If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
> total: 0 errors, 0 warnings, 266 lines checked
>
> 0003-hw-intc-add-allwinner-A10-interrupt-controller.patch has no
> obvious style problems and is ready for submission.
> total: 0 errors, 0 warnings, 130 lines checked
>
> 0004-hw-arm-add-allwinner-a10-SoC-support.patch has no obvious style
> problems and is ready for submission.
> total: 0 errors, 0 warnings, 58 lines checked
>
> 0005-hw-arm-add-cubieboard-support.patch has no obvious style problems
> and is ready for submission.
>
> Please include checkpatch in your pre-send checklist for each version.
>
>    

I surely will run checkpatch.pl,
but you know, the result is just a reference.

the error here seems subtle,
2 rules used,
1. should a space both before and after '*'
2. shouldn't a space before ')'

so, a dilemma.

> I'm still looking trough the series though (now that I have it am'ed
> locally), so don't respin on me just yet!
>
>
>    
OK.
Thanks!

> On Thu, Dec 5, 2013 at 10:51 AM, liguang<lig.fnst@cn.fujitsu.com>  wrote:
>    
>> lay a foundation for allwinner A10 SoC with a cortex-a8
>> processor, and will add more devices later.
>>
>> v2: split timer and interrupt controller emulation into
>>          their corresponding files.
>>
>> v3:
>> 1. change loader_start address
>> 2. add 64-bit counter
>> 3. fixup fail to clear interrup status issue
>>
>> v4:
>> 1. add VMSD
>> 2. use defines of magic number for readability
>> 3. code cleanup
>>
>> v5:
>> 1. add VMSTATE_PTIMER_ARRAY
>> 2. code cleanup
>>
>> v6:
>> 1. fix a fiq lost issue pointed out by Peter Crosthwaite
>> 2. code cleanup
>>
>> v7:
>> model allwinner A10 as a SoC device,
>> and add cubieboard.
>>
>> v8:
>> 1. A10 be QOMified as a device
>> 2. add AW as prefix of A10
>>
>> v9:
>> code cleanup for PATCH 4/5 A10 SoC support
>>
>>
>> TODO:
>> 1. add BROM support
>> 2. add more devices
>>
>> test:
>> can boot-up officially released linux kernel build with
>> PLL disabled.
>> can find test zImage url at:
>> http://dl.dbank.com/c0jaibr54s
>>
>> reference:
>> http://linux-sunxi.org/Main_Page
>>
>>
>> Li Guang (5)
>>           vmstate: add VMSTATE_PTIMER_ARRAY
>>           hw/timer: add allwinner a10 timer
>>           hw/intc: add allwinner A10 interrupt controller
>>           hw/arm: add allwinner a10 SoC support
>>           hw/arm: add cubieboard support
>>
>> default-configs/arm-softmmu.mak      |   2 +
>> hw/arm/Makefile.objs                 |   4 +-
>> hw/arm/allwinner-a10.c               |  39 +++++++++++++++++++++++++++++++++++++++
>> hw/arm/cubieboard.c                  |  33 +++++++++++++++++++++++++++++++++
>> hw/intc/Makefile.objs                |   1 +
>> hw/intc/allwinner-a10_pic.c          | 218 +++++++++++++++++++++++++++++++++++
>> hw/timer/Makefile.objs               |   2 +
>> hw/timer/allwinner-a10_pit.c         | 253 ++++++++++++++++++++++++++++++++++
>> include/hw/arm/allwinner-a10.h       |  27 +++++++++++++++++++++++++++
>> include/hw/intc/allwinner-a10_pic.h  |  40 +++++++
>> include/hw/timer/allwinner-a10_pit.h |  57 ++++++++
>> include/migration/vmstate.h          |   4 ++++
>> savevm.c                             |  31 +++++++++++++++++++++++++++++++
>> 13 files changed, 709 insertions(+), 2 deletions(-)
>>   create mode 100644 hw/timer/allwinner-a10_pit.c
>>   create mode 100644 include/hw/timer/allwinner-a10_pit.h
>>   create mode 100644 hw/intc/allwinner-a10_pic.c
>>   create mode 100644 include/hw/intc/allwinner-a10_pic.h
>>   create mode 100644 hw/arm/allwinner-a10.c
>>   create mode 100644 include/hw/arm/allwinner-a10.h
>>   create mode 100644 hw/arm/cubieboard.c
>>
>>
>>
>>      
>    

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support
  2013-12-05  2:33   ` Li Guang
@ 2013-12-05  8:40     ` Peter Maydell
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Maydell @ 2013-12-05  8:40 UTC (permalink / raw)
  To: Li Guang
  Cc: Peter Crosthwaite, qemu-devel@nongnu.org Developers,
	Andreas Färber

On 5 December 2013 02:33, Li Guang <lig.fnst@cn.fujitsu.com> wrote:
> Peter Crosthwaite wrote:
>>
>> Hi Liguang,
>>
>> V9 has some checkpatch errors:
>>
>> [pcrost@xsjandreislx qemu]$ git format-patch HEAD~5
>> 0001-vmstate-add-VMSTATE_PTIMER_ARRAY.patch
>> 0002-hw-timer-add-allwinner-a10-timer.patch
>> 0003-hw-intc-add-allwinner-A10-interrupt-controller.patch
>> 0004-hw-arm-add-allwinner-a10-SoC-support.patch
>> 0005-hw-arm-add-cubieboard-support.patch
>> [pcrost@xsjandreislx qemu]$ ./scripts/checkpatch.pl 00*
>> ERROR: need consistent spacing around '*' (ctx:WxB)
>> #30: FILE: include/migration/vmstate.h:618:
>> +    VMSTATE_ARRAY_OF_POINTER(_f, _s, _n, 0, vmstate_info_ptimer,
>> ptimer_state *)

> the error here seems subtle,
> 2 rules used,
> 1. should a space both before and after '*'
> 2. shouldn't a space before ')'

Yes, sometimes checkpatch gets confused by macros, especially
ones like this whose arguments might be types. The correct
spacing here I think would be to have no space before or after
the '*'.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-12-05  8:40 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-05  0:51 [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support liguang
2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 1/5] vmstate: add VMSTATE_PTIMER_ARRAY liguang
2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 2/5] hw/timer: add allwinner a10 timer liguang
2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 3/5] hw/intc: add allwinner A10 interrupt controller liguang
2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 4/5] hw/arm: add allwinner a10 SoC support liguang
2013-12-05  0:51 ` [Qemu-devel] [PATCH v9 5/5] hw/arm: add cubieboard support liguang
2013-12-05  1:46 ` [Qemu-devel] [PATCH v9 0/5] add allwinner A10 SoC support Peter Crosthwaite
2013-12-05  1:55   ` Li Guang
2013-12-05  2:33   ` Li Guang
2013-12-05  8:40     ` Peter Maydell

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).