Re: [Qemu-devel] [RFT][PATCH 05/15] hpet: Convert to qdev

2010-05-25 Thread Paul Brook
 +static SysBusDeviceInfo hpet_device_info = {
 +.qdev.name= hpet,
 +.qdev.size= sizeof(HPETState),
 +.qdev.no_user = 1,

Why shouldn't the user create HPET devices? I thought you'd removed all the 
global state.

Paul



Re: [Qemu-devel] [RFT][PATCH 05/15] hpet: Convert to qdev

2010-05-25 Thread Jan Kiszka
Paul Brook wrote:
 +static SysBusDeviceInfo hpet_device_info = {
 +.qdev.name= hpet,
 +.qdev.size= sizeof(HPETState),
 +.qdev.no_user = 1,
 
 Why shouldn't the user create HPET devices? I thought you'd removed all the 
 global state.

Long-term, there is no reason to deny this.

But the code is not yet ready for this: we statically instantiate it
during PC setup to establish the routings and respect -no-hpat. Also,
the BIOS isn't prepared for  1 HPET.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux



[Qemu-devel] [RFT][PATCH 05/15] hpet: Convert to qdev

2010-05-24 Thread Jan Kiszka
From: Jan Kiszka jan.kis...@siemens.com

Register the HPET as a sysbus device and create it that way. As it can
route its IRQs to any ISA IRQ, we need to connect it to all 24 of them.
Once converted to qdev, we can move reset handler and vmstate
registration into its hands as well.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com
---
 hw/hpet.c  |   43 ++-
 hw/hpet_emul.h |3 ++-
 hw/pc.c|7 ++-
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/hw/hpet.c b/hw/hpet.c
index fd7a1fd..6974935 100644
--- a/hw/hpet.c
+++ b/hw/hpet.c
@@ -29,6 +29,7 @@
 #include console.h
 #include qemu-timer.h
 #include hpet_emul.h
+#include sysbus.h
 
 //#define HPET_DEBUG
 #ifdef HPET_DEBUG
@@ -54,8 +55,9 @@ typedef struct HPETTimer {  /* timers */
 } HPETTimer;
 
 typedef struct HPETState {
+SysBusDevice busdev;
 uint64_t hpet_offset;
-qemu_irq *irqs;
+qemu_irq irqs[HPET_NUM_IRQ_ROUTES];
 HPETTimer timer[HPET_NUM_TIMERS];
 
 /* Memory-mapped, software visible registers */
@@ -565,9 +567,9 @@ static CPUWriteMemoryFunc * const hpet_ram_write[] = {
 hpet_ram_writel,
 };
 
-static void hpet_reset(void *opaque)
+static void hpet_reset(DeviceState *d)
 {
-HPETState *s = opaque;
+HPETState *s = FROM_SYSBUS(HPETState, sysbus_from_qdev(d));
 int i;
 static int count = 0;
 
@@ -600,28 +602,43 @@ static void hpet_reset(void *opaque)
 count = 1;
 }
 
-
-void hpet_init(qemu_irq *irq)
+static int hpet_init(SysBusDevice *dev)
 {
+HPETState *s = FROM_SYSBUS(HPETState, dev);
 int i, iomemtype;
 HPETTimer *timer;
-HPETState *s;
-
-DPRINTF (hpet_init\n);
 
-s = qemu_mallocz(sizeof(HPETState));
+assert(!hpet_statep);
 hpet_statep = s;
-s-irqs = irq;
+for (i = 0; i  HPET_NUM_IRQ_ROUTES; i++) {
+sysbus_init_irq(dev, s-irqs[i]);
+}
 for (i = 0; i  HPET_NUM_TIMERS; i++) {
 timer = s-timer[i];
 timer-qemu_timer = qemu_new_timer(vm_clock, hpet_timer, timer);
 timer-tn = i;
 timer-state = s;
 }
-vmstate_register(-1, vmstate_hpet, s);
-qemu_register_reset(hpet_reset, s);
+
 /* HPET Area */
 iomemtype = cpu_register_io_memory(hpet_ram_read,
hpet_ram_write, s);
-cpu_register_physical_memory(HPET_BASE, 0x400, iomemtype);
+sysbus_init_mmio(dev, 0x400, iomemtype);
+return 0;
 }
+
+static SysBusDeviceInfo hpet_device_info = {
+.qdev.name= hpet,
+.qdev.size= sizeof(HPETState),
+.qdev.no_user = 1,
+.qdev.vmsd= vmstate_hpet,
+.qdev.reset   = hpet_reset,
+.init = hpet_init,
+};
+
+static void hpet_register_device(void)
+{
+sysbus_register_withprop(hpet_device_info);
+}
+
+device_init(hpet_register_device)
diff --git a/hw/hpet_emul.h b/hw/hpet_emul.h
index 2f5f8ba..785f850 100644
--- a/hw/hpet_emul.h
+++ b/hw/hpet_emul.h
@@ -19,6 +19,8 @@
 #define FS_PER_NS 100
 #define HPET_NUM_TIMERS 3
 
+#define HPET_NUM_IRQ_ROUTES 32
+
 #define HPET_CFG_ENABLE 0x001
 #define HPET_CFG_LEGACY 0x002
 
@@ -47,7 +49,6 @@
 
 #if defined TARGET_I386
 extern uint32_t hpet_in_legacy_mode(void);
-extern void hpet_init(qemu_irq *irq);
 #endif
 
 #endif
diff --git a/hw/pc.c b/hw/pc.c
index e7f31d3..631b0ae 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -35,6 +35,7 @@
 #include elf.h
 #include multiboot.h
 #include mc146818rtc.h
+#include sysbus.h
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -945,7 +946,11 @@ void pc_basic_device_init(qemu_irq *isa_irq,
 pit = pit_init(0x40, isa_reserve_irq(0));
 pcspk_init(pit);
 if (!no_hpet) {
-hpet_init(isa_irq);
+DeviceState *hpet = sysbus_create_simple(hpet, HPET_BASE, NULL);
+
+for (i = 0; i  24; i++) {
+sysbus_connect_irq(sysbus_from_qdev(hpet), i, isa_irq[i]);
+}
 }
 
 for(i = 0; i  MAX_SERIAL_PORTS; i++) {
-- 
1.6.0.2