* [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children
@ 2012-11-08 5:36 Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 01/10] convert RTC as piix3 proper QOM child Wanpeng Li
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
All of the devices described in the PIIX3 as being implemented within the
PIIX3 are created as child devices of the PIIX3 object in QEMU.
PIIX3 has-a RTC, has-a I8042, has-a PCSPK, etc.
All child device creation for the PIIX3 is done by calling object_init()
with qdev_init() being called for each child device in the PIIX3 ::init
function.
Anthony Liguori (3):
convert RTC as piix3 proper QOM child
convert HPET as piix3 proper QOM child
convert PIT as piix3 proper QOM child
Wanpeng Li (7):
convert PCSPK as piix3 proper QOM child
convert PORT92 as piix3 proper QOM child
convert I8042 as piixe proper QOM child
convert VMPORT piix3 proper QOM child
convert VMMOUSE as piix3 proper QOM child
convert IDE as piix3 proper QOM child
convert IOAPIC as piix3 proper QOM child
hw/hpet.c | 35 ---------
hw/hpet_emul.h | 40 ++++++++++
hw/i440fx.c | 6 ++
hw/i8254.c | 2 +-
hw/i8254_internal.h | 3 +-
hw/ide.h | 6 +-
hw/ide/internal.h | 9 ++
hw/ide/isa.c | 14 +---
hw/ide/piix.c | 24 +------
hw/ioapic.c | 2 +-
hw/ioapic.h | 2 -
hw/ioapic_internal.h | 2 +
hw/kvm/i8254.c | 8 +--
hw/kvm/ioapic.c | 9 +--
hw/mc146818rtc.c | 29 +-------
hw/mc146818rtc.h | 30 +++++++
hw/pc.c | 144 ++++-------------------------------
hw/pc.h | 14 ++-
hw/pckbd.c | 24 +------
hw/pcspk.c | 19 +-----
hw/pcspk.h | 19 +++++
hw/piix3.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++
hw/piix3.h | 104 +++++++++++++++++++++++++
hw/ps2.h | 3 +
hw/vmmouse.c | 14 ----
hw/vmport.c | 10 +--
sysemu.h | 2 -
27 files changed, 459 insertions(+), 320 deletions(-)
--
1.7.7.6
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 01/10] convert RTC as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 02/10] convert HPET " Wanpeng Li
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert RTC as piix3 proper QOM child.
RTC creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/mc146818rtc.c | 29 +----------------------------
hw/mc146818rtc.h | 30 ++++++++++++++++++++++++++++++
hw/pc.c | 13 +++++++------
hw/piix3.c | 14 ++++++++++++++
hw/piix3.h | 5 +++++
5 files changed, 57 insertions(+), 34 deletions(-)
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 98839f2..f385f4c 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -56,33 +56,6 @@
#define RTC_CLOCK_RATE 32768
#define UIP_HOLD_LENGTH (8 * NSEC_PER_SEC / 32768)
-typedef struct RTCState {
- ISADevice dev;
- MemoryRegion io;
- uint8_t cmos_data[128];
- uint8_t cmos_index;
- int32_t base_year;
- uint64_t base_rtc;
- uint64_t last_update;
- int64_t offset;
- qemu_irq irq;
- qemu_irq sqw_irq;
- int it_shift;
- /* periodic timer */
- QEMUTimer *periodic_timer;
- int64_t next_periodic_time;
- /* update-ended timer */
- QEMUTimer *update_timer;
- uint64_t next_alarm_time;
- uint16_t irq_reinject_on_ack_count;
- uint32_t irq_coalesced;
- uint32_t period;
- QEMUTimer *coalesced_timer;
- Notifier clock_reset_notifier;
- LostTickPolicy lost_tick_policy;
- Notifier suspend_notifier;
-} RTCState;
-
static void rtc_set_time(RTCState *s);
static void rtc_update_time(RTCState *s);
static void rtc_set_cmos(RTCState *s, const struct tm *tm);
@@ -894,7 +867,7 @@ static void rtc_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo mc146818rtc_info = {
- .name = "mc146818rtc",
+ .name = TYPE_RTC,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(RTCState),
.class_init = rtc_class_initfn,
diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
index f286b6a..a8f1428 100644
--- a/hw/mc146818rtc.h
+++ b/hw/mc146818rtc.h
@@ -3,6 +3,36 @@
#include "isa.h"
#include "mc146818rtc_regs.h"
+#include "notify.h"
+
+#define TYPE_RTC "mc146818rtc"
+
+typedef struct RTCState {
+ ISADevice dev;
+ MemoryRegion io;
+ uint8_t cmos_data[128];
+ uint8_t cmos_index;
+ int32_t base_year;
+ uint64_t base_rtc;
+ uint64_t last_update;
+ int64_t offset;
+ qemu_irq irq;
+ qemu_irq sqw_irq;
+ int it_shift;
+ /* periodic timer */
+ QEMUTimer *periodic_timer;
+ int64_t next_periodic_time;
+ /* update-ended timer */
+ QEMUTimer *update_timer;
+ uint64_t next_alarm_time;
+ uint16_t irq_reinject_on_ack_count;
+ uint32_t irq_coalesced;
+ uint32_t period;
+ QEMUTimer *coalesced_timer;
+ Notifier clock_reset_notifier;
+ LostTickPolicy lost_tick_policy;
+ Notifier suspend_notifier;
+} RTCState;
ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq);
void rtc_set_memory(ISADevice *dev, int addr, int val);
diff --git a/hw/pc.c b/hw/pc.c
index c40e112..7fed363 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -90,6 +90,8 @@ struct e820_table {
struct e820_entry entry[E820_NR_ENTRIES];
} QEMU_PACKED __attribute((__aligned__(4)));
+qemu_irq rtc_irq;
+
static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
@@ -941,7 +943,6 @@ static void cpu_request_exit(void *opaque, int irq, int level)
}
static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
- ISADevice **rtc_state,
ISADevice **floppy,
bool no_vmport)
{
@@ -950,7 +951,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
DeviceState *hpet = NULL;
int pit_isa_irq = 0;
qemu_irq pit_alt_irq = NULL;
- qemu_irq rtc_irq = NULL;
qemu_irq *a20_line;
ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
qemu_irq *cpu_exit_irq;
@@ -977,9 +977,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
rtc_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_RTC_INT);
}
}
- *rtc_state = rtc_init(isa_bus, 2000, rtc_irq);
-
- qemu_register_boot_set(pc_boot_set, *rtc_state);
if (!xen_enabled()) {
if (kvm_irqchip_in_kernel()) {
@@ -1237,7 +1234,7 @@ static void pc_init1(MemoryRegion *system_memory,
}
/* init basic PC hardware */
- pc_basic_device_init(isa_bus, gsi, &rtc_state, &floppy, xen_enabled());
+ pc_basic_device_init(isa_bus, gsi, &floppy, xen_enabled());
for (i = 0; i < nb_nics; i++) {
NICInfo *nd = &nd_table[i];
@@ -1269,6 +1266,10 @@ static void pc_init1(MemoryRegion *system_memory,
}
}
+ /* FIXME */
+ rtc_state = ISA_DEVICE(object_resolve_path("rtc", NULL));
+ qemu_register_boot_set(pc_boot_set, rtc_state);
+
audio_init(isa_bus, pci_enabled ? pci_bus : NULL);
pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
diff --git a/hw/piix3.c b/hw/piix3.c
index 7d4145f..a40c8cd 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -198,6 +198,17 @@ static int piix3_realize(PCIDevice *dev)
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
isa_bus_irqs(s->bus, s->pic);
+ /* Realize the RTC */
+ qdev_set_parent_bus(DEVICE(&s->rtc), BUS(s->bus));
+ qdev_init_nofail(DEVICE(&s->rtc));
+
+ /* Setup the RTC IRQ */
+ if (!no_hpet && (!kvm_irqchip_in_kernel() || kvm_has_pit_state2())) {
+ s->rtc.irq = rtc_irq;
+ } else {
+ isa_init_irq(ISA_DEVICE(&s->rtc), &rtc_irq, RTC_ISA_IRQ);
+ }
+
return 0;
}
@@ -208,6 +219,9 @@ static void piix3_initfn(Object *obj)
qdev_prop_set_int32(DEVICE(s), "addr", PCI_DEVFN(1, 0));
qdev_prop_set_bit(DEVICE(s), "multifunction", true);
+ object_initialize(&s->rtc, TYPE_RTC);
+ object_property_add_child(obj, "rtc", OBJECT(&s->rtc), NULL);
+ qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 0fb04f2..23ee74a 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -30,6 +30,7 @@
#define QEMU_PIIX3_H
#include "pci.h"
+#include "mc146818rtc.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -58,6 +59,8 @@ typedef struct PIIX3State {
ISABus *bus;
+ RTCState rtc;
+
qemu_irq *pic;
/* This member isn't used. Just for save/load compatibility */
@@ -70,4 +73,6 @@ void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level);
void piix3_set_irq(void *opaque, int pirq, int level);
+extern qemu_irq rtc_irq;
+
#endif
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 02/10] convert HPET as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 01/10] convert RTC as piix3 proper QOM child Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 03/10] convert PIT " Wanpeng Li
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert HPET as piix3 proper QOM child.
HPET creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/hpet.c | 35 -----------------------------------
hw/hpet_emul.h | 40 ++++++++++++++++++++++++++++++++++++++++
hw/pc.c | 21 ---------------------
hw/piix3.c | 28 ++++++++++++++++++++++++++--
hw/piix3.h | 4 ++--
5 files changed, 68 insertions(+), 60 deletions(-)
diff --git a/hw/hpet.c b/hw/hpet.c
index 50ac067..b128505 100644
--- a/hw/hpet.c
+++ b/hw/hpet.c
@@ -42,41 +42,6 @@
#define HPET_MSI_SUPPORT 0
-struct HPETState;
-typedef struct HPETTimer { /* timers */
- uint8_t tn; /*timer number*/
- QEMUTimer *qemu_timer;
- struct HPETState *state;
- /* Memory-mapped, software visible timer registers */
- uint64_t config; /* configuration/cap */
- uint64_t cmp; /* comparator */
- uint64_t fsb; /* FSB route */
- /* Hidden register state */
- uint64_t period; /* Last value written to comparator */
- uint8_t wrap_flag; /* timer pop will indicate wrap for one-shot 32-bit
- * mode. Next pop will be actual timer expiration.
- */
-} HPETTimer;
-
-typedef struct HPETState {
- SysBusDevice busdev;
- MemoryRegion iomem;
- uint64_t hpet_offset;
- qemu_irq irqs[HPET_NUM_IRQ_ROUTES];
- uint32_t flags;
- uint8_t rtc_irq_level;
- qemu_irq pit_enabled;
- uint8_t num_timers;
- HPETTimer timer[HPET_MAX_TIMERS];
-
- /* Memory-mapped, software visible registers */
- uint64_t capability; /* capabilities */
- uint64_t config; /* configuration */
- uint64_t isr; /* interrupt status reg */
- uint64_t hpet_counter; /* main counter */
- uint8_t hpet_id; /* instance id */
-} HPETState;
-
static uint32_t hpet_in_legacy_mode(HPETState *s)
{
return s->config & HPET_CFG_LEGACY;
diff --git a/hw/hpet_emul.h b/hw/hpet_emul.h
index 757f79f..46dee92 100644
--- a/hw/hpet_emul.h
+++ b/hw/hpet_emul.h
@@ -13,6 +13,8 @@
#ifndef QEMU_HPET_EMUL_H
#define QEMU_HPET_EMUL_H
+#include "sysbus.h"
+
#define HPET_BASE 0xfed00000
#define HPET_CLK_PERIOD 10000000ULL /* 10000000 femtoseconds == 10ns*/
@@ -71,4 +73,42 @@ struct hpet_fw_config
} QEMU_PACKED;
extern struct hpet_fw_config hpet_cfg;
+
+#define TYPE_HPET "hpet"
+
+struct HPETState;
+typedef struct HPETTimer { /* timers */
+ uint8_t tn; /*timer number*/
+ QEMUTimer *qemu_timer;
+ struct HPETState *state;
+ /* Memory-mapped, software visible timer registers */
+ uint64_t config; /* configuration/cap */
+ uint64_t cmp; /* comparator */
+ uint64_t fsb; /* FSB route */
+ /* Hidden register state */
+ uint64_t period; /* Last value written to comparator */
+ uint8_t wrap_flag; /* timer pop will indicate wrap for one-shot 32-bit
+ * mode. Next pop will be actual timer expiration.
+ */
+} HPETTimer;
+
+typedef struct HPETState {
+ SysBusDevice busdev;
+ MemoryRegion iomem;
+ uint64_t hpet_offset;
+ qemu_irq irqs[HPET_NUM_IRQ_ROUTES];
+ uint32_t flags;
+ uint8_t rtc_irq_level;
+ qemu_irq pit_enabled;
+ uint8_t num_timers;
+ HPETTimer timer[HPET_MAX_TIMERS];
+
+ /* Memory-mapped, software visible registers */
+ uint64_t capability; /* capabilities */
+ uint64_t config; /* configuration */
+ uint64_t isr; /* interrupt status reg */
+ uint64_t hpet_counter; /* main counter */
+ uint8_t hpet_id; /* instance id */
+} HPETState;
+
#endif
diff --git a/hw/pc.c b/hw/pc.c
index 7fed363..7105f4e 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -90,8 +90,6 @@ struct e820_table {
struct e820_entry entry[E820_NR_ENTRIES];
} QEMU_PACKED __attribute((__aligned__(4)));
-qemu_irq rtc_irq;
-
static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
@@ -959,25 +957,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
- /*
- * Check if an HPET shall be created.
- *
- * Without KVM_CAP_PIT_STATE2, we cannot switch off the in-kernel PIT
- * when the HPET wants to take over. Thus we have to disable the latter.
- */
- if (!no_hpet && (!kvm_irqchip_in_kernel() || kvm_has_pit_state2())) {
- hpet = sysbus_try_create_simple("hpet", HPET_BASE, NULL);
-
- if (hpet) {
- for (i = 0; i < GSI_NUM_PINS; i++) {
- sysbus_connect_irq(sysbus_from_qdev(hpet), i, gsi[i]);
- }
- pit_isa_irq = -1;
- pit_alt_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_PIT_INT);
- rtc_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_RTC_INT);
- }
- }
-
if (!xen_enabled()) {
if (kvm_irqchip_in_kernel()) {
pit = kvm_pit_init(isa_bus, 0x40);
diff --git a/hw/piix3.c b/hw/piix3.c
index a40c8cd..5fe41cd 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -193,6 +193,7 @@ static const VMStateDescription vmstate_piix3 = {
static int piix3_realize(PCIDevice *dev)
{
PIIX3State *s = PIIX3(dev);
+ qemu_irq rtc_irq;
/* Initialize ISA Bus */
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
@@ -202,13 +203,33 @@ static int piix3_realize(PCIDevice *dev)
qdev_set_parent_bus(DEVICE(&s->rtc), BUS(s->bus));
qdev_init_nofail(DEVICE(&s->rtc));
- /* Setup the RTC IRQ */
+ /*
+ *Check if an HPET shall be created
+ *
+ * Without KVM_CAP_PIT_STATE2, we cannot switch off the in-kernel PIT
+ * when the HPET wants to take over, Thus we have to disable the latter.
+ */
if (!no_hpet && (!kvm_irqchip_in_kernel() || kvm_has_pit_state2())) {
- s->rtc.irq = rtc_irq;
+ int i;
+
+ /* We need to introduce a proper IRQ and Memory QOM infrastructure
+ * so that the HPET isn't a sysbus device */
+ qdev_set_parent_bus(DEVICE(&s->hpet), sysbus_get_default());
+ qdev_init_nofail(DEVICE(&s->hpet));
+
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->hpet), 0, HPET_BASE);
+ for (i = 0; i < GSI_NUM_PINS; i++) {
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->hpet), i, s->pic[i]);
+ }
+
+ rtc_irq = qdev_get_gpio_in(DEVICE(&s->hpet), HPET_LEGACY_RTC_INT);
} else {
isa_init_irq(ISA_DEVICE(&s->rtc), &rtc_irq, RTC_ISA_IRQ);
}
+ /* Setup the RTC IRQ */
+ s->rtc.irq = rtc_irq;
+
return 0;
}
@@ -222,6 +243,9 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->rtc, TYPE_RTC);
object_property_add_child(obj, "rtc", OBJECT(&s->rtc), NULL);
qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
+
+ object_initialize(&s->hpet, TYPE_HPET);
+ object_property_add_child(obj, "hpet", OBJECT(&s->hpet), NULL);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 23ee74a..ef22c03 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -31,6 +31,7 @@
#include "pci.h"
#include "mc146818rtc.h"
+#include "hpet_emul.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -60,6 +61,7 @@ typedef struct PIIX3State {
ISABus *bus;
RTCState rtc;
+ HPETState hpet;
qemu_irq *pic;
@@ -73,6 +75,4 @@ void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level);
void piix3_set_irq(void *opaque, int pirq, int level);
-extern qemu_irq rtc_irq;
-
#endif
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 03/10] convert PIT as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 01/10] convert RTC as piix3 proper QOM child Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 02/10] convert HPET " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 04/10] convert PCSPK " Wanpeng Li
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert PIT as piix3 proper QOM child.
PIT creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/i8254.c | 2 +-
hw/i8254_internal.h | 3 ++-
hw/kvm/i8254.c | 8 +-------
hw/pc.c | 18 +-----------------
hw/piix3.c | 34 ++++++++++++++++++++++++++++++++++
hw/piix3.h | 15 +++++++++++++++
6 files changed, 54 insertions(+), 26 deletions(-)
diff --git a/hw/i8254.c b/hw/i8254.c
index bea5f92..8d3616d 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -348,7 +348,7 @@ static void pit_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo pit_info = {
- .name = "isa-pit",
+ .name = TYPE_PIT,
.parent = TYPE_PIT_COMMON,
.instance_size = sizeof(PITCommonState),
.class_init = pit_class_initfn,
diff --git a/hw/i8254_internal.h b/hw/i8254_internal.h
index 686f0c2..1aecad3 100644
--- a/hw/i8254_internal.h
+++ b/hw/i8254_internal.h
@@ -26,7 +26,6 @@
#define QEMU_I8254_INTERNAL_H
#include "hw.h"
-#include "pc.h"
#include "isa.h"
typedef struct PITChannelState {
@@ -57,6 +56,8 @@ typedef struct PITCommonState {
PITChannelState channels[3];
} PITCommonState;
+#define TYPE_KVM_PIT "kvm-pit"
+#define TYPE_PIT "isa-pit"
#define TYPE_PIT_COMMON "pit-common"
#define PIT_COMMON(obj) \
OBJECT_CHECK(PITCommonState, (obj), TYPE_PIT_COMMON)
diff --git a/hw/kvm/i8254.c b/hw/kvm/i8254.c
index 53d13e3..9f8fb7c 100644
--- a/hw/kvm/i8254.c
+++ b/hw/kvm/i8254.c
@@ -27,18 +27,12 @@
#include "hw/i8254.h"
#include "hw/i8254_internal.h"
#include "kvm.h"
+#include "hw/piix3.h"
#define KVM_PIT_REINJECT_BIT 0
#define CALIBRATION_ROUNDS 3
-typedef struct KVMPITState {
- PITCommonState pit;
- LostTickPolicy lost_tick_policy;
- bool vm_stopped;
- int64_t kernel_clock_offset;
-} KVMPITState;
-
static int64_t abs64(int64_t v)
{
return v < 0 ? -v : v;
diff --git a/hw/pc.c b/hw/pc.c
index 7105f4e..80b437f 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -946,30 +946,14 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
{
int i;
DriveInfo *fd[MAX_FD];
- DeviceState *hpet = NULL;
- int pit_isa_irq = 0;
- qemu_irq pit_alt_irq = NULL;
qemu_irq *a20_line;
- ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
+ ISADevice *i8042, *port92, *vmmouse;
qemu_irq *cpu_exit_irq;
register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
- if (!xen_enabled()) {
- if (kvm_irqchip_in_kernel()) {
- pit = kvm_pit_init(isa_bus, 0x40);
- } else {
- pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
- }
- if (hpet) {
- /* connect PIT to output control line of the HPET */
- qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
- }
- pcspk_init(isa_bus, pit);
- }
-
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
diff --git a/hw/piix3.c b/hw/piix3.c
index 5fe41cd..41739bd 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -194,6 +194,8 @@ static int piix3_realize(PCIDevice *dev)
{
PIIX3State *s = PIIX3(dev);
qemu_irq rtc_irq;
+ int pit_isa_irq = 0;
+ qemu_irq pit_alt_irq = NULL;
/* Initialize ISA Bus */
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
@@ -222,6 +224,8 @@ static int piix3_realize(PCIDevice *dev)
sysbus_connect_irq(SYS_BUS_DEVICE(&s->hpet), i, s->pic[i]);
}
+ pit_isa_irq = -1;
+ pit_alt_irq = qdev_get_gpio_in(DEVICE(&s->hpet), HPET_LEGACY_PIT_INT);
rtc_irq = qdev_get_gpio_in(DEVICE(&s->hpet), HPET_LEGACY_RTC_INT);
} else {
isa_init_irq(ISA_DEVICE(&s->rtc), &rtc_irq, RTC_ISA_IRQ);
@@ -230,6 +234,23 @@ static int piix3_realize(PCIDevice *dev)
/* Setup the RTC IRQ */
s->rtc.irq = rtc_irq;
+ /* Realize the PIT */
+ if (!xen_enabled()) {
+ if (kvm_irqchip_in_kernel()) {
+ qdev_set_parent_bus(DEVICE(&s->pit.kvm_pit), BUS(s->bus));
+ qdev_init_nofail(DEVICE(&s->pit.kvm_pit));
+ qdev_connect_gpio_out(DEVICE(&s->hpet), 0,
+ qdev_get_gpio_in(DEVICE(&s->pit.kvm_pit), 0));
+ } else {
+ qdev_set_parent_bus(DEVICE(&s->pit), BUS(s->bus));
+ qdev_init_nofail(DEVICE(&s->pit));
+ qdev_connect_gpio_out(DEVICE(&s->pit), 0, pit_isa_irq >= 0 ?
+ isa_get_irq(ISA_DEVICE(&s->pit), pit_isa_irq) : pit_alt_irq);
+ qdev_connect_gpio_out(DEVICE(&s->hpet), 0,
+ qdev_get_gpio_in(DEVICE(&s->pit), 0));
+ }
+ }
+
return 0;
}
@@ -246,6 +267,19 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->hpet, TYPE_HPET);
object_property_add_child(obj, "hpet", OBJECT(&s->hpet), NULL);
+
+ if (!xen_enabled()) {
+ if (kvm_irqchip_in_kernel()) {
+ object_initialize(&s->pit.kvm_pit, TYPE_KVM_PIT);
+ object_property_add_child(obj, "kvm-pit",
+ OBJECT(&s->pit.kvm_pit), NULL);
+ qdev_prop_set_int32(DEVICE(&s->pit.kvm_pit), "iobase", 0x40);
+ } else {
+ object_initialize(&s->pit, TYPE_PIT);
+ object_property_add_child(obj, "pit", OBJECT(&s->pit), NULL);
+ qdev_prop_set_int32(DEVICE(&s->pit), "iobase", 0x40);
+ }
+ }
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index ef22c03..58486b9 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -32,6 +32,8 @@
#include "pci.h"
#include "mc146818rtc.h"
#include "hpet_emul.h"
+#include "i8254.h"
+#include "i8254_internal.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -41,6 +43,13 @@
#define TYPE_PIIX3 "PIIX3"
#define PIIX3(obj) OBJECT_CHECK(PIIX3State, (obj), TYPE_PIIX3)
+typedef struct KVMPITState {
+ PITCommonState pit;
+ LostTickPolicy lost_tick_policy;
+ bool vm_stopped;
+ int64_t kernel_clock_offset;
+} KVMPITState;
+
typedef struct PIIX3State {
PCIDevice dev;
@@ -62,6 +71,12 @@ typedef struct PIIX3State {
RTCState rtc;
HPETState hpet;
+#if !defined(CONFIG_XEN_BACKEND) && defined(CONFIG_NO_XEN)
+ union {
+ PITCommonState pit;
+ KVMPITState kvm_pit;
+ } pit;
+#endif
qemu_irq *pic;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 04/10] convert PCSPK as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (2 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 03/10] convert PIT " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 05/10] convert PORT92 " Wanpeng Li
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert PCSPK as piix3 proper QOM child.
PCSPK creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/pcspk.c | 19 +------------------
hw/pcspk.h | 19 +++++++++++++++++++
hw/piix3.c | 8 ++++++++
hw/piix3.h | 2 ++
4 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/hw/pcspk.c b/hw/pcspk.c
index ad6491b..fc8bc99 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -25,31 +25,14 @@
#include "hw.h"
#include "pc.h"
#include "isa.h"
-#include "audio/audio.h"
#include "qemu-timer.h"
#include "i8254.h"
#include "pcspk.h"
-#define PCSPK_BUF_LEN 1792
#define PCSPK_SAMPLE_RATE 32000
#define PCSPK_MAX_FREQ (PCSPK_SAMPLE_RATE >> 1)
#define PCSPK_MIN_COUNT ((PIT_FREQ + PCSPK_MAX_FREQ - 1) / PCSPK_MAX_FREQ)
-typedef struct {
- ISADevice dev;
- MemoryRegion ioport;
- uint32_t iobase;
- uint8_t sample_buf[PCSPK_BUF_LEN];
- QEMUSoundCard card;
- SWVoiceOut *voice;
- void *pit;
- unsigned int pit_count;
- unsigned int samples;
- unsigned int play_pos;
- int data_on;
- int dummy_refresh_clock;
-} PCSpkState;
-
static const char *s_spk = "pcspk";
static PCSpkState *pcspk_state;
@@ -188,7 +171,7 @@ static void pcspk_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo pcspk_info = {
- .name = "isa-pcspk",
+ .name = TYPE_PCSPK,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(PCSpkState),
.class_init = pcspk_class_initfn,
diff --git a/hw/pcspk.h b/hw/pcspk.h
index 7f42bac..07b3a8f 100644
--- a/hw/pcspk.h
+++ b/hw/pcspk.h
@@ -27,6 +27,25 @@
#include "hw.h"
#include "isa.h"
+#include "audio/audio.h"
+
+#define PCSPK_BUF_LEN 1792
+#define TYPE_PCSPK "isa-pcspk"
+
+typedef struct {
+ ISADevice dev;
+ MemoryRegion ioport;
+ uint32_t iobase;
+ uint8_t sample_buf[PCSPK_BUF_LEN];
+ QEMUSoundCard card;
+ SWVoiceOut *voice;
+ void *pit;
+ unsigned int pit_count;
+ unsigned int samples;
+ unsigned int play_pos;
+ int data_on;
+ int dummy_refresh_clock;
+} PCSpkState;
static inline ISADevice *pcspk_init(ISABus *bus, ISADevice *pit)
{
diff --git a/hw/piix3.c b/hw/piix3.c
index 41739bd..35a0de9 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -250,6 +250,11 @@ static int piix3_realize(PCIDevice *dev)
qdev_get_gpio_in(DEVICE(&s->pit), 0));
}
}
+ /* Realize the PCSPK */
+ qdev_set_parent_bus(DEVICE(&s->pcspk), BUS(s->bus));
+ qdev_prop_set_uint32(DEVICE(&s->pcspk), "iobase", 0x61);
+ qdev_prop_set_ptr(DEVICE(&s->pcspk), "pit", ISA_DEVICE(&s->pit));
+ qdev_init_nofail(DEVICE(&s->pcspk));
return 0;
}
@@ -280,6 +285,9 @@ static void piix3_initfn(Object *obj)
qdev_prop_set_int32(DEVICE(&s->pit), "iobase", 0x40);
}
}
+
+ object_initialize(&s->pcspk, TYPE_PCSPK);
+ object_property_add_child(obj, "pcspk", OBJECT(&s->pcspk), NULL);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 58486b9..32f7a95 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -34,6 +34,7 @@
#include "hpet_emul.h"
#include "i8254.h"
#include "i8254_internal.h"
+#include "pcspk.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -77,6 +78,7 @@ typedef struct PIIX3State {
KVMPITState kvm_pit;
} pit;
#endif
+ PCSpkState pcspk;
qemu_irq *pic;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 05/10] convert PORT92 as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (3 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 04/10] convert PCSPK " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 06/10] convert i8042 " Wanpeng Li
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert PORT92 as piix3 proper QOM child.
PORT92 creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/pc.c | 25 ++++---------------------
hw/pc.h | 3 +++
hw/piix3.c | 10 ++++++++++
hw/piix3.h | 11 +++++++++++
4 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 80b437f..94fdea9 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -421,14 +421,6 @@ static void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
qemu_register_reset(pc_cmos_init_late, &arg);
}
-/* port 92 stuff: could be split off */
-typedef struct Port92State {
- ISADevice dev;
- MemoryRegion io;
- uint8_t outport;
- qemu_irq *a20_out;
-} Port92State;
-
static void port92_write(void *opaque, hwaddr addr, uint64_t val,
unsigned size)
{
@@ -453,13 +445,6 @@ static uint64_t port92_read(void *opaque, hwaddr addr,
return ret;
}
-static void port92_init(ISADevice *dev, qemu_irq *a20_out)
-{
- Port92State *s = DO_UPCAST(Port92State, dev, dev);
-
- s->a20_out = a20_out;
-}
-
static const VMStateDescription vmstate_port92_isa = {
.name = "port92",
.version_id = 1,
@@ -510,7 +495,7 @@ static void port92_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo port92_info = {
- .name = "port92",
+ .name = TYPE_PORT92,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(Port92State),
.class_init = port92_class_initfn,
@@ -523,7 +508,7 @@ static void port92_register_types(void)
type_init(port92_register_types)
-static void handle_a20_line_change(void *opaque, int irq, int level)
+void handle_a20_line_change(void *opaque, int irq, int level)
{
CPUX86State *cpu = opaque;
@@ -947,7 +932,7 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
int i;
DriveInfo *fd[MAX_FD];
qemu_irq *a20_line;
- ISADevice *i8042, *port92, *vmmouse;
+ ISADevice *i8042, *vmmouse;
qemu_irq *cpu_exit_irq;
register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -966,7 +951,7 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
}
}
- a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
+ a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 1);
i8042 = isa_create_simple(isa_bus, "i8042");
i8042_setup_a20_line(i8042, &a20_line[0]);
if (!no_vmport) {
@@ -979,8 +964,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
qdev_prop_set_ptr(&vmmouse->qdev, "ps2_mouse", i8042);
qdev_init_nofail(&vmmouse->qdev);
}
- port92 = isa_create_simple(isa_bus, "port92");
- port92_init(port92, &a20_line[1]);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
diff --git a/hw/pc.h b/hw/pc.h
index d4b149e..17d48a0 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -9,6 +9,7 @@
#include "net.h"
#include "memory.h"
#include "ioapic.h"
+#include "piix3.h"
#include "i440fx.h"
/* PC-style peripherals (also used by other machines). */
@@ -144,4 +145,6 @@ void pc_system_firmware_init(MemoryRegion *rom_memory);
int e820_add_entry(uint64_t, uint64_t, uint32_t);
+void handle_a20_line_change(void *opaque, int irq, int level);
+
#endif
diff --git a/hw/piix3.c b/hw/piix3.c
index 35a0de9..675212e 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -196,6 +196,7 @@ static int piix3_realize(PCIDevice *dev)
qemu_irq rtc_irq;
int pit_isa_irq = 0;
qemu_irq pit_alt_irq = NULL;
+ qemu_irq *a20_line;
/* Initialize ISA Bus */
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
@@ -256,6 +257,12 @@ static int piix3_realize(PCIDevice *dev)
qdev_prop_set_ptr(DEVICE(&s->pcspk), "pit", ISA_DEVICE(&s->pit));
qdev_init_nofail(DEVICE(&s->pcspk));
+ /* Realize the PORT92 */
+ qdev_set_parent_bus(DEVICE(&s->port92), BUS(s->bus));
+ qdev_init_nofail(DEVICE(&s->port92));
+ a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 1);
+ s->port92.a20_out = &a20_line[0];
+
return 0;
}
@@ -288,6 +295,9 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->pcspk, TYPE_PCSPK);
object_property_add_child(obj, "pcspk", OBJECT(&s->pcspk), NULL);
+
+ object_initialize(&s->port92, TYPE_PORT92);
+ object_property_add_child(obj, "port92", OBJECT(&s->port92), NULL);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 32f7a95..4e5ee20 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -51,6 +51,16 @@ typedef struct KVMPITState {
int64_t kernel_clock_offset;
} KVMPITState;
+#define TYPE_PORT92 "port92"
+
+/* port 92 stuff: could be split off */
+typedef struct Port92State {
+ ISADevice dev;
+ MemoryRegion io;
+ uint8_t outport;
+ qemu_irq *a20_out;
+} Port92State;
+
typedef struct PIIX3State {
PCIDevice dev;
@@ -79,6 +89,7 @@ typedef struct PIIX3State {
} pit;
#endif
PCSpkState pcspk;
+ Port92State port92;
qemu_irq *pic;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 06/10] convert i8042 as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (4 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 05/10] convert PORT92 " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 07/10] convert VMPORT " Wanpeng Li
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert i8042 as piix3 proper QOM child.
I8042 creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/pc.c | 9 ++-------
hw/pckbd.c | 24 +-----------------------
hw/piix3.c | 13 +++++++++++--
hw/piix3.h | 24 ++++++++++++++++++++++++
hw/ps2.h | 3 +++
5 files changed, 41 insertions(+), 32 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 94fdea9..a14bf5a 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -931,8 +931,7 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
{
int i;
DriveInfo *fd[MAX_FD];
- qemu_irq *a20_line;
- ISADevice *i8042, *vmmouse;
+ ISADevice *vmmouse;
qemu_irq *cpu_exit_irq;
register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -951,9 +950,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
}
}
- a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 1);
- i8042 = isa_create_simple(isa_bus, "i8042");
- i8042_setup_a20_line(i8042, &a20_line[0]);
if (!no_vmport) {
vmport_init(isa_bus);
vmmouse = isa_try_create(isa_bus, "vmmouse");
@@ -961,7 +957,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
vmmouse = NULL;
}
if (vmmouse) {
- qdev_prop_set_ptr(&vmmouse->qdev, "ps2_mouse", i8042);
qdev_init_nofail(&vmmouse->qdev);
}
@@ -1153,8 +1148,8 @@ static void pc_init1(MemoryRegion *system_memory,
i440fx_state = NULL;
isa_bus = isa_bus_new(NULL, system_io);
no_hpet = 1;
+ isa_bus_irqs(isa_bus, gsi);
}
- isa_bus_irqs(isa_bus, gsi);
if (kvm_irqchip_in_kernel()) {
i8259 = kvm_i8259_init(isa_bus);
diff --git a/hw/pckbd.c b/hw/pckbd.c
index 5bb3e0a..d76bcbb 100644
--- a/hw/pckbd.c
+++ b/hw/pckbd.c
@@ -126,22 +126,6 @@
#define KBD_PENDING_KBD 1
#define KBD_PENDING_AUX 2
-typedef struct KBDState {
- uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
- uint8_t status;
- uint8_t mode;
- uint8_t outport;
- /* Bitmask of devices with data available. */
- uint8_t pending;
- void *kbd;
- void *mouse;
-
- qemu_irq irq_kbd;
- qemu_irq irq_mouse;
- qemu_irq *a20_out;
- hwaddr mask;
-} KBDState;
-
/* update irq and KBD_STAT_[MOUSE_]OBF */
/* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be
incorrect, but it avoids having to simulate exact delays */
@@ -431,12 +415,6 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
qemu_register_reset(kbd_reset, s);
}
-typedef struct ISAKBDState {
- ISADevice dev;
- KBDState kbd;
- MemoryRegion io[2];
-} ISAKBDState;
-
void i8042_isa_mouse_fake_event(void *opaque)
{
ISADevice *dev = opaque;
@@ -513,7 +491,7 @@ static void i8042_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo i8042_info = {
- .name = "i8042",
+ .name = TYPE_I8042,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(ISAKBDState),
.class_init = i8042_class_initfn,
diff --git a/hw/piix3.c b/hw/piix3.c
index 675212e..c6bf3cb 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -202,6 +202,8 @@ static int piix3_realize(PCIDevice *dev)
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
isa_bus_irqs(s->bus, s->pic);
+ a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
+
/* Realize the RTC */
qdev_set_parent_bus(DEVICE(&s->rtc), BUS(s->bus));
qdev_init_nofail(DEVICE(&s->rtc));
@@ -260,8 +262,12 @@ static int piix3_realize(PCIDevice *dev)
/* Realize the PORT92 */
qdev_set_parent_bus(DEVICE(&s->port92), BUS(s->bus));
qdev_init_nofail(DEVICE(&s->port92));
- a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 1);
- s->port92.a20_out = &a20_line[0];
+ s->port92.a20_out = &a20_line[1];
+
+ /* Realize the I8042 */
+ qdev_set_parent_bus(DEVICE(&s->i8042), BUS(s->bus));
+ i8042_setup_a20_line(ISA_DEVICE(&s->i8042), &a20_line[0]);
+ qdev_init_nofail(DEVICE(&s->i8042));
return 0;
}
@@ -298,6 +304,9 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->port92, TYPE_PORT92);
object_property_add_child(obj, "port92", OBJECT(&s->port92), NULL);
+
+ object_initialize(&s->i8042, TYPE_I8042);
+ object_property_add_child(obj, "i8042", OBJECT(&s->i8042), NULL);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 4e5ee20..94a0daf 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -35,6 +35,7 @@
#include "i8254.h"
#include "i8254_internal.h"
#include "pcspk.h"
+#include "ps2.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -61,6 +62,28 @@ typedef struct Port92State {
qemu_irq *a20_out;
} Port92State;
+typedef struct KBDState {
+ uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
+ uint8_t status;
+ uint8_t mode;
+ uint8_t outport;
+ /* Bitmask of devices with data available. */
+ uint8_t pending;
+ void *kbd;
+ void *mouse;
+
+ qemu_irq irq_kbd;
+ qemu_irq irq_mouse;
+ qemu_irq *a20_out;
+ hwaddr mask;
+} KBDState;
+
+typedef struct ISAKBDState {
+ ISADevice dev;
+ KBDState kbd;
+ MemoryRegion io[2];
+} ISAKBDState;
+
typedef struct PIIX3State {
PCIDevice dev;
@@ -90,6 +113,7 @@ typedef struct PIIX3State {
#endif
PCSpkState pcspk;
Port92State port92;
+ ISAKBDState i8042;
qemu_irq *pic;
diff --git a/hw/ps2.h b/hw/ps2.h
index 7c45ce7..1cd7c07 100644
--- a/hw/ps2.h
+++ b/hw/ps2.h
@@ -25,6 +25,9 @@
#ifndef HW_PS2_H
#define HW_PS2_H
+
+#define TYPE_I8042 "i8042"
+
/* ps2.c */
void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg);
void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg);
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 07/10] convert VMPORT as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (5 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 06/10] convert i8042 " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 08/10] convert VMMOUSE " Wanpeng Li
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert VMPORT as piix3 proper QOM child.
VMPORT creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/pc.c | 1 -
hw/pc.h | 5 -----
hw/piix3.c | 11 +++++++++++
hw/piix3.h | 11 +++++++++++
hw/vmport.c | 10 +---------
5 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index a14bf5a..99cd314 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -951,7 +951,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
}
if (!no_vmport) {
- vmport_init(isa_bus);
vmmouse = isa_try_create(isa_bus, "vmmouse");
} else {
vmmouse = NULL;
diff --git a/hw/pc.h b/hw/pc.h
index 17d48a0..5b7bc26 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -54,11 +54,6 @@ typedef struct GSIState {
qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
} GSIState;
-/* vmport.c */
-static inline void vmport_init(ISABus *bus)
-{
- isa_create_simple(bus, "vmport");
-}
void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque);
void vmmouse_get_data(uint32_t *data);
void vmmouse_set_data(const uint32_t *data);
diff --git a/hw/piix3.c b/hw/piix3.c
index c6bf3cb..27c8f50 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -269,6 +269,12 @@ static int piix3_realize(PCIDevice *dev)
i8042_setup_a20_line(ISA_DEVICE(&s->i8042), &a20_line[0]);
qdev_init_nofail(DEVICE(&s->i8042));
+ /* Realize the VMPORT */
+ if (!xen_enabled()) {
+ qdev_set_parent_bus(DEVICE(&s->vmport), BUS(s->bus));
+ qdev_init_nofail(DEVICE(&s->vmport));
+ }
+
return 0;
}
@@ -307,6 +313,11 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->i8042, TYPE_I8042);
object_property_add_child(obj, "i8042", OBJECT(&s->i8042), NULL);
+
+ if (!xen_enabled()) {
+ object_initialize(&s->vmport, TYPE_VMPORT);
+ object_property_add_child(obj, "vmport", OBJECT(&s->vmport), NULL);
+ }
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 94a0daf..477e39e 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -54,6 +54,16 @@ typedef struct KVMPITState {
#define TYPE_PORT92 "port92"
+#define TYPE_VMPORT "vmport"
+#define VMPORT_ENTRIES 0x2c
+
+typedef struct _VMPortState {
+ ISADevice dev;
+ MemoryRegion io;
+ IOPortReadFunc *func[VMPORT_ENTRIES];
+ void *opaque[VMPORT_ENTRIES];
+} VMPortState;
+
/* port 92 stuff: could be split off */
typedef struct Port92State {
ISADevice dev;
@@ -110,6 +120,7 @@ typedef struct PIIX3State {
PITCommonState pit;
KVMPITState kvm_pit;
} pit;
+ VMPortState vmport;
#endif
PCSpkState pcspk;
Port92State port92;
diff --git a/hw/vmport.c b/hw/vmport.c
index 3ab3a14..45daef6 100644
--- a/hw/vmport.c
+++ b/hw/vmport.c
@@ -35,14 +35,6 @@
#define VMPORT_ENTRIES 0x2c
#define VMPORT_MAGIC 0x564D5868
-typedef struct _VMPortState
-{
- ISADevice dev;
- MemoryRegion io;
- IOPortReadFunc *func[VMPORT_ENTRIES];
- void *opaque[VMPORT_ENTRIES];
-} VMPortState;
-
static VMPortState *port_state;
void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque)
@@ -156,7 +148,7 @@ static void vmport_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo vmport_info = {
- .name = "vmport",
+ .name = TYPE_VMPORT,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(VMPortState),
.class_init = vmport_class_initfn,
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 08/10] convert VMMOUSE as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (6 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 07/10] convert VMPORT " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 09/10] convert IDE " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 10/10] convert IOAPIC " Wanpeng Li
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert VMMOUSE as piix3 proper QOM child.
VMMOUSE creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/pc.c | 15 ++-------------
hw/piix3.c | 10 ++++++++++
hw/piix3.h | 16 ++++++++++++++++
hw/vmmouse.c | 14 --------------
4 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index 99cd314..9798c24 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -926,12 +926,10 @@ static void cpu_request_exit(void *opaque, int irq, int level)
}
static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
- ISADevice **floppy,
- bool no_vmport)
+ ISADevice **floppy)
{
int i;
DriveInfo *fd[MAX_FD];
- ISADevice *vmmouse;
qemu_irq *cpu_exit_irq;
register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -950,15 +948,6 @@ static void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
}
}
- if (!no_vmport) {
- vmmouse = isa_try_create(isa_bus, "vmmouse");
- } else {
- vmmouse = NULL;
- }
- if (vmmouse) {
- qdev_init_nofail(&vmmouse->qdev);
- }
-
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
@@ -1174,7 +1163,7 @@ static void pc_init1(MemoryRegion *system_memory,
}
/* init basic PC hardware */
- pc_basic_device_init(isa_bus, gsi, &floppy, xen_enabled());
+ pc_basic_device_init(isa_bus, gsi, &floppy);
for (i = 0; i < nb_nics; i++) {
NICInfo *nd = &nd_table[i];
diff --git a/hw/piix3.c b/hw/piix3.c
index 27c8f50..2922fd4 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -271,8 +271,15 @@ static int piix3_realize(PCIDevice *dev)
/* Realize the VMPORT */
if (!xen_enabled()) {
+ /* Realize the VMPORT */
qdev_set_parent_bus(DEVICE(&s->vmport), BUS(s->bus));
qdev_init_nofail(DEVICE(&s->vmport));
+
+ /* Realize the VMMOUSE */
+ qdev_set_parent_bus(DEVICE(&s->vmmouse), BUS(s->bus));
+ qdev_prop_set_ptr(DEVICE(&s->vmmouse),
+ "ps2_mouse", ISA_DEVICE(&s->i8042));
+ qdev_init_nofail(DEVICE(&s->vmmouse));
}
return 0;
@@ -318,6 +325,9 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->vmport, TYPE_VMPORT);
object_property_add_child(obj, "vmport", OBJECT(&s->vmport), NULL);
}
+
+ object_initialize(&s->vmmouse, TYPE_VMMOUSE);
+ object_property_add_child(obj, "vmmouse", OBJECT(&s->vmmouse), NULL);
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 477e39e..29ae820 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -36,6 +36,7 @@
#include "i8254_internal.h"
#include "pcspk.h"
#include "ps2.h"
+#include "console.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -57,6 +58,20 @@ typedef struct KVMPITState {
#define TYPE_VMPORT "vmport"
#define VMPORT_ENTRIES 0x2c
+#define TYPE_VMMOUSE "vmmouse"
+#define VMMOUSE_QUEUE_SIZE 1024
+
+typedef struct _VMMouseState {
+ ISADevice dev;
+ uint32_t queue[VMMOUSE_QUEUE_SIZE];
+ int32_t queue_size;
+ uint16_t nb_queue;
+ uint16_t status;
+ uint8_t absolute;
+ QEMUPutMouseEntry *entry;
+ void *ps2_mouse;
+} VMMouseState;
+
typedef struct _VMPortState {
ISADevice dev;
MemoryRegion io;
@@ -121,6 +136,7 @@ typedef struct PIIX3State {
KVMPITState kvm_pit;
} pit;
VMPortState vmport;
+ VMMouseState vmmouse;
#endif
PCSpkState pcspk;
Port92State port92;
diff --git a/hw/vmmouse.c b/hw/vmmouse.c
index 6338efa..022e493 100644
--- a/hw/vmmouse.c
+++ b/hw/vmmouse.c
@@ -41,8 +41,6 @@
#define VMMOUSE_REQUEST_RELATIVE 0x4c455252
#define VMMOUSE_REQUEST_ABSOLUTE 0x53424152
-#define VMMOUSE_QUEUE_SIZE 1024
-
#define VMMOUSE_VERSION 0x3442554a
#ifdef DEBUG_VMMOUSE
@@ -51,18 +49,6 @@
#define DPRINTF(fmt, ...) do { } while (0)
#endif
-typedef struct _VMMouseState
-{
- ISADevice dev;
- uint32_t queue[VMMOUSE_QUEUE_SIZE];
- int32_t queue_size;
- uint16_t nb_queue;
- uint16_t status;
- uint8_t absolute;
- QEMUPutMouseEntry *entry;
- void *ps2_mouse;
-} VMMouseState;
-
static uint32_t vmmouse_get_status(VMMouseState *s)
{
DPRINTF("vmmouse_get_status()\n");
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 09/10] convert IDE as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (7 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 08/10] convert VMMOUSE " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 10/10] convert IOAPIC " Wanpeng Li
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert IDE as piix3 proper QOM child.
IDE creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/i440fx.c | 6 ++++++
hw/ide.h | 6 ++++--
hw/ide/internal.h | 9 +++++++++
hw/ide/isa.c | 14 +-------------
hw/ide/piix.c | 24 ++----------------------
hw/pc.c | 28 +++++-----------------------
hw/pc.h | 4 ++++
hw/piix3.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
hw/piix3.h | 7 +++++++
sysemu.h | 2 --
10 files changed, 85 insertions(+), 62 deletions(-)
diff --git a/hw/i440fx.c b/hw/i440fx.c
index 5196201..e994722 100644
--- a/hw/i440fx.c
+++ b/hw/i440fx.c
@@ -193,6 +193,12 @@ static int i440fx_realize(SysBusDevice *dev)
h->bus = pci_bus_new(DEVICE(s), NULL, &s->pci_address_space,
s->address_space_io, 0);
+ if (pci_is_enabled) {
+ qdev_set_parent_bus(DEVICE(&s->piix3.ide.pci), BUS(h->bus));
+ } else {
+ qdev_set_parent_bus(DEVICE(&s->piix3.ide.isa), BUS(h->bus));
+ }
+
memory_region_init_io(&h->conf_mem, &pci_host_conf_le_ops, s,
"pci-conf-idx", 4);
sysbus_add_io(dev, 0xcf8, &h->conf_mem);
diff --git a/hw/ide.h b/hw/ide.h
index add742c..7060124 100644
--- a/hw/ide.h
+++ b/hw/ide.h
@@ -7,6 +7,10 @@
#define MAX_IDE_DEVS 2
+#define TYPE_PIIX3_IDE_XEN "piix3-ide-xen"
+#define TYPE_PIIX3_IDE "piix3-ide"
+#define TYPE_ISA_IDE "isa-ide"
+
/* ide-isa.c */
ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
DriveInfo *hd0, DriveInfo *hd1);
@@ -14,8 +18,6 @@ ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
/* ide-pci.c */
void pci_cmd646_ide_init(PCIBus *bus, DriveInfo **hd_table,
int secondary_ide_enabled);
-PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
-PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
index bf7d313..3114f8c 100644
--- a/hw/ide/internal.h
+++ b/hw/ide/internal.h
@@ -483,6 +483,15 @@ struct IDEDevice {
uint64_t wwn;
};
+typedef struct ISAIDEState {
+ ISADevice dev;
+ IDEBus bus;
+ uint32_t iobase;
+ uint32_t iobase2;
+ uint32_t isairq;
+ qemu_irq irq;
+} ISAIDEState;
+
#define BM_STATUS_DMAING 0x01
#define BM_STATUS_ERROR 0x02
#define BM_STATUS_INT 0x04
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 8ab2718..ca206ca 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -30,18 +30,6 @@
#include <hw/ide/internal.h>
-/***********************************************************/
-/* ISA IDE definitions */
-
-typedef struct ISAIDEState {
- ISADevice dev;
- IDEBus bus;
- uint32_t iobase;
- uint32_t iobase2;
- uint32_t isairq;
- qemu_irq irq;
-} ISAIDEState;
-
static void isa_ide_reset(DeviceState *d)
{
ISAIDEState *s = container_of(d, ISAIDEState, dev.qdev);
@@ -112,7 +100,7 @@ static void isa_ide_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo isa_ide_info = {
- .name = "isa-ide",
+ .name = TYPE_ISA_IDE,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(ISAIDEState),
.class_init = isa_ide_class_initfn,
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index 9431bad..3e53302 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -192,15 +192,6 @@ static int pci_piix3_xen_ide_unplug(DeviceState *dev)
return 0;
}
-PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
-{
- PCIDevice *dev;
-
- dev = pci_create_simple(bus, devfn, "piix3-ide-xen");
- pci_ide_create_devs(dev, hd_table);
- return dev;
-}
-
static void pci_piix_ide_exitfn(PCIDevice *dev)
{
PCIIDEState *d = DO_UPCAST(PCIIDEState, dev, dev);
@@ -216,17 +207,6 @@ static void pci_piix_ide_exitfn(PCIDevice *dev)
}
/* hd_table must contain 4 block drivers */
-/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
-PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
-{
- PCIDevice *dev;
-
- dev = pci_create_simple(bus, devfn, "piix3-ide");
- pci_ide_create_devs(dev, hd_table);
- return dev;
-}
-
-/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX4, the IRQs and IOports are hardcoded */
PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
{
@@ -252,7 +232,7 @@ static void piix3_ide_class_init(ObjectClass *klass, void *data)
}
static TypeInfo piix3_ide_info = {
- .name = "piix3-ide",
+ .name = TYPE_PIIX3_IDE,
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCIIDEState),
.class_init = piix3_ide_class_init,
@@ -272,7 +252,7 @@ static void piix3_ide_xen_class_init(ObjectClass *klass, void *data)
}
static TypeInfo piix3_ide_xen_info = {
- .name = "piix3-ide-xen",
+ .name = TYPE_PIIX3_IDE_XEN,
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(PCIIDEState),
.class_init = piix3_ide_xen_class_init,
diff --git a/hw/pc.c b/hw/pc.c
index 9798c24..74cec55 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -77,7 +77,7 @@
#define E820_NR_ENTRIES 16
-#define MAX_IDE_BUS 2
+BusState *idebus[MAX_IDE_BUS];
struct e820_entry {
uint64_t address;
@@ -97,6 +97,8 @@ static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
static struct e820_table e820_table;
struct hpet_fw_config hpet_cfg = {.count = UINT8_MAX};
+int pci_is_enabled;
+
static void gsi_handler(void *opaque, int n, int level)
{
GSIState *s = opaque;
@@ -1090,13 +1092,13 @@ static void pc_init1(MemoryRegion *system_memory,
qemu_irq *i8259;
qemu_irq *smi_irq;
GSIState *gsi_state;
- DriveInfo * hd[MAX_IDE_BUS * MAX_IDE_DEVS];
- BusState *idebus[MAX_IDE_BUS];
ISADevice *rtc_state;
ISADevice *floppy;
void *fw_cfg = NULL;
+ pci_is_enabled = pci_enabled;
+
pc_cpus_init(cpu_model);
if (kvmclock_enabled) {
@@ -1175,26 +1177,6 @@ static void pc_init1(MemoryRegion *system_memory,
}
}
- ide_drive_get(hd, MAX_IDE_BUS);
- if (pci_enabled) {
- PCIDevice *dev;
- if (xen_enabled()) {
- dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
- } else {
- dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
- }
- idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
- idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
- } else {
- for (i = 0; i < MAX_IDE_BUS; i++) {
- ISADevice *dev;
- dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
- ide_irq[i],
- hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
- idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
- }
- }
-
/* FIXME */
rtc_state = ISA_DEVICE(object_resolve_path("rtc", NULL));
qemu_register_boot_set(pc_boot_set, rtc_state);
diff --git a/hw/pc.h b/hw/pc.h
index 5b7bc26..620349f 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -138,6 +138,10 @@ void pc_system_firmware_init(MemoryRegion *rom_memory);
#define E820_NVS 4
#define E820_UNUSABLE 5
+extern BusState *idebus[MAX_IDE_BUS];
+
+extern int pci_is_enabled;
+
int e820_add_entry(uint64_t, uint64_t, uint32_t);
void handle_a20_line_change(void *opaque, int irq, int level);
diff --git a/hw/piix3.c b/hw/piix3.c
index 2922fd4..7ca0f83 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -33,6 +33,10 @@
#include "pc.h"
#include "pcspk.h"
+static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
+static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
+static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
+
void piix3_set_irq(void *opaque, int pirq, int level)
{
PIIX3State *piix3 = opaque;
@@ -197,6 +201,8 @@ static int piix3_realize(PCIDevice *dev)
int pit_isa_irq = 0;
qemu_irq pit_alt_irq = NULL;
qemu_irq *a20_line;
+ DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+ int i;
/* Initialize ISA Bus */
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
@@ -282,6 +288,31 @@ static int piix3_realize(PCIDevice *dev)
qdev_init_nofail(DEVICE(&s->vmmouse));
}
+ /* Realize the IDE */
+ ide_drive_get(hd, MAX_IDE_BUS);
+ if (pci_is_enabled) {
+ s->ide.pci.dev.devfn = s->dev.devfn + 1;
+ qdev_init_nofail(DEVICE(&s->ide.pci));
+ pci_ide_create_devs(&s->ide.pci.dev, hd);
+ idebus[0] = qdev_get_child_bus(DEVICE(&s->ide.pci), "ide.0");
+ idebus[1] = qdev_get_child_bus(DEVICE(&s->ide.pci), "ide.1");
+ } else {
+ for (i = 0; i < MAX_IDE_BUS; i++) {
+ qdev_prop_set_uint32(DEVICE(&s->ide.isa), "iobase", ide_iobase[i]);
+ qdev_prop_set_uint32(DEVICE(&s->ide.isa), "iobase2",
+ ide_iobase2[i]);
+ qdev_prop_set_uint32(DEVICE(&s->ide.isa), "irq", ide_irq[i]);
+ qdev_init_nofail(DEVICE(&s->ide.isa));
+ if (hd[MAX_IDE_DEVS * i]) {
+ ide_create_drive(&s->ide.isa.bus, 0, hd[MAX_IDE_DEVS * i]);
+ }
+ if (hd[MAX_IDE_DEVS * i + 1]) {
+ ide_create_drive(&s->ide.isa.bus, 1, hd[MAX_IDE_DEVS * i + 1]);
+ }
+ idebus[i] = qdev_get_child_bus(DEVICE(&s->ide.isa), "ide.0");
+ }
+ }
+
return 0;
}
@@ -328,6 +359,22 @@ static void piix3_initfn(Object *obj)
object_initialize(&s->vmmouse, TYPE_VMMOUSE);
object_property_add_child(obj, "vmmouse", OBJECT(&s->vmmouse), NULL);
+
+ if (pci_is_enabled) {
+ if (xen_enabled()) {
+ object_initialize(&s->ide.pci, TYPE_PIIX3_IDE_XEN);
+ object_property_add_child(obj, "piix3-ide-xen",
+ OBJECT(&s->ide.pci), NULL);
+ } else {
+ object_initialize(&s->ide.pci, TYPE_PIIX3_IDE);
+ object_property_add_child(obj, "piix3-ide",
+ OBJECT(&s->ide.pci), NULL);
+ }
+ } else {
+ object_initialize(&s->ide.isa, TYPE_ISA_IDE);
+ object_property_add_child(obj, "isa-ide",
+ OBJECT(&s->ide.isa), NULL);
+ }
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 29ae820..8916e4a 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -37,6 +37,7 @@
#include "pcspk.h"
#include "ps2.h"
#include "console.h"
+#include "ide/pci.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -61,6 +62,8 @@ typedef struct KVMPITState {
#define TYPE_VMMOUSE "vmmouse"
#define VMMOUSE_QUEUE_SIZE 1024
+#define MAX_IDE_BUS 2
+
typedef struct _VMMouseState {
ISADevice dev;
uint32_t queue[VMMOUSE_QUEUE_SIZE];
@@ -141,6 +144,10 @@ typedef struct PIIX3State {
PCSpkState pcspk;
Port92State port92;
ISAKBDState i8042;
+ union {
+ ISAIDEState isa;
+ PCIIDEState pci;
+ } ide;
qemu_irq *pic;
diff --git a/sysemu.h b/sysemu.h
index f5ac664..9bcb04b 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -175,8 +175,6 @@ void usb_info(Monitor *mon);
void rtc_change_mon_event(struct tm *tm);
-void register_devices(void);
-
void add_boot_device_path(int32_t bootindex, DeviceState *dev,
const char *suffix);
char *get_boot_devices_list(uint32_t *size);
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH 10/10] convert IOAPIC as piix3 proper QOM child
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
` (8 preceding siblings ...)
2012-11-08 5:36 ` [Qemu-devel] [PATCH 09/10] convert IDE " Wanpeng Li
@ 2012-11-08 5:36 ` Wanpeng Li
9 siblings, 0 replies; 11+ messages in thread
From: Wanpeng Li @ 2012-11-08 5:36 UTC (permalink / raw)
To: Anthony Liguori
Cc: Ram Pai, Michael S. Tsirkin, Jan Kiszka, qemu-devel, Liu Ping Fan,
Blue Swirl, Stefan Weil, Avi Kivity, Paolo Bonzini, Wanpeng Li
convert IOAPIC as piix3 proper QOM child.
IOAPIC creation for the PIIX3 is done by calling object_init() with
qdev_init() being called for each child device in the PIIX3 ::init
function.
Signed-off-by: Wanpeng Li <liwanp@linux.vnet.ibm.com>
---
hw/ioapic.c | 2 +-
hw/ioapic.h | 2 --
hw/ioapic_internal.h | 2 ++
hw/kvm/ioapic.c | 9 +--------
hw/pc.c | 30 ++----------------------------
hw/pc.h | 2 ++
hw/piix3.c | 38 ++++++++++++++++++++++++++++++++++++++
hw/piix3.h | 13 +++++++++++++
8 files changed, 59 insertions(+), 39 deletions(-)
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 7273095..927a099 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -245,7 +245,7 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
}
static TypeInfo ioapic_info = {
- .name = "ioapic",
+ .name = TYPE_IOAPIC,
.parent = TYPE_IOAPIC_COMMON,
.instance_size = sizeof(IOAPICCommonState),
.class_init = ioapic_class_init,
diff --git a/hw/ioapic.h b/hw/ioapic.h
index 86e63da..649dd0c 100644
--- a/hw/ioapic.h
+++ b/hw/ioapic.h
@@ -20,8 +20,6 @@
#ifndef HW_IOAPIC_H
#define HW_IOAPIC_H
-#define IOAPIC_NUM_PINS 24
-
void ioapic_eoi_broadcast(int vector);
#endif /* !HW_IOAPIC_H */
diff --git a/hw/ioapic_internal.h b/hw/ioapic_internal.h
index e04c9f3..d3cb4c9 100644
--- a/hw/ioapic_internal.h
+++ b/hw/ioapic_internal.h
@@ -88,6 +88,8 @@ typedef struct IOAPICCommonClass {
void (*post_load)(IOAPICCommonState *s);
} IOAPICCommonClass;
+#define IOAPIC_NUM_PINS 24
+
struct IOAPICCommonState {
SysBusDevice busdev;
MemoryRegion io_memory;
diff --git a/hw/kvm/ioapic.c b/hw/kvm/ioapic.c
index 6c3b8fe..e88843e 100644
--- a/hw/kvm/ioapic.c
+++ b/hw/kvm/ioapic.c
@@ -15,13 +15,6 @@
#include "hw/apic_internal.h"
#include "kvm.h"
-typedef struct KVMIOAPICState KVMIOAPICState;
-
-struct KVMIOAPICState {
- IOAPICCommonState ioapic;
- uint32_t kvm_gsi_base;
-};
-
static void kvm_ioapic_get(IOAPICCommonState *s)
{
struct kvm_irqchip chip;
@@ -111,7 +104,7 @@ static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
}
static TypeInfo kvm_ioapic_info = {
- .name = "kvm-ioapic",
+ .name = TYPE_KVM_IOAPIC,
.parent = TYPE_IOAPIC_COMMON,
.instance_size = sizeof(KVMIOAPICState),
.class_init = kvm_ioapic_class_init,
diff --git a/hw/pc.c b/hw/pc.c
index 74cec55..31031fa 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -79,6 +79,8 @@
BusState *idebus[MAX_IDE_BUS];
+GSIState *gsi_state;
+
struct e820_entry {
uint64_t address;
uint64_t length;
@@ -1011,30 +1013,6 @@ static void kvm_piix3_gsi_handler(void *opaque, int n, int level)
}
}
-static void ioapic_init(GSIState *gsi_state)
-{
- DeviceState *dev;
- SysBusDevice *d;
- unsigned int i;
-
- if (kvm_irqchip_in_kernel()) {
- dev = qdev_create(NULL, "kvm-ioapic");
- } else {
- dev = qdev_create(NULL, "ioapic");
- }
-
- /* FIXME: this should be under the piix3. */
- object_property_add_child(object_resolve_path("i440fx", NULL),
- "ioapic", OBJECT(dev), NULL);
- qdev_init_nofail(dev);
- d = sysbus_from_qdev(dev);
- sysbus_mmio_map(d, 0, 0xfec00000);
-
- for (i = 0; i < IOAPIC_NUM_PINS; i++) {
- gsi_state->ioapic_irq[i] = qdev_get_gpio_in(dev, i);
- }
-}
-
static PCIBus *i440fx_init(I440FXPMCState **pi440fx_state, int *piix3_devfn,
ISABus **isa_bus, qemu_irq *pic,
MemoryRegion *address_space_mem,
@@ -1091,7 +1069,6 @@ static void pc_init1(MemoryRegion *system_memory,
qemu_irq *gsi;
qemu_irq *i8259;
qemu_irq *smi_irq;
- GSIState *gsi_state;
ISADevice *rtc_state;
ISADevice *floppy;
@@ -1153,9 +1130,6 @@ static void pc_init1(MemoryRegion *system_memory,
for (i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i];
}
- if (pci_enabled) {
- ioapic_init(gsi_state);
- }
pc_register_ferr_irq(gsi[13]);
diff --git a/hw/pc.h b/hw/pc.h
index 620349f..7f6ff93 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -54,6 +54,8 @@ typedef struct GSIState {
qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
} GSIState;
+extern GSIState *gsi_state;
+
void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque);
void vmmouse_get_data(uint32_t *data);
void vmmouse_set_data(const uint32_t *data);
diff --git a/hw/piix3.c b/hw/piix3.c
index 7ca0f83..99b1ecc 100644
--- a/hw/piix3.c
+++ b/hw/piix3.c
@@ -203,6 +203,7 @@ static int piix3_realize(PCIDevice *dev)
qemu_irq *a20_line;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
int i;
+ SysBusDevice *d;
/* Initialize ISA Bus */
s->bus = isa_bus_new(DEVICE(dev), pci_address_space_io(dev));
@@ -313,6 +314,31 @@ static int piix3_realize(PCIDevice *dev)
}
}
+ /* Realize the IOAPIC */
+ if (pci_is_enabled) {
+ if (kvm_irqchip_in_kernel()) {
+ qdev_set_parent_bus(DEVICE(&s->ioapic.kvm_ioapic),
+ sysbus_get_default());
+ qdev_init_nofail(DEVICE(&s->ioapic.kvm_ioapic));
+ d = sysbus_from_qdev(DEVICE(&s->ioapic.kvm_ioapic));
+ sysbus_mmio_map(d, 0, 0xfec00000);
+ for (i = 0; i < IOAPIC_NUM_PINS; i++) {
+ gsi_state->ioapic_irq[i] = qdev_get_gpio_in(
+ DEVICE(&s->ioapic.kvm_ioapic), i);
+ }
+ } else {
+ qdev_set_parent_bus(DEVICE(&s->ioapic.ioapic),
+ sysbus_get_default());
+ qdev_init_nofail(DEVICE(&s->ioapic.ioapic));
+ d = sysbus_from_qdev(DEVICE(&s->ioapic.ioapic));
+ sysbus_mmio_map(d, 0, 0xfec00000);
+ for (i = 0; i < IOAPIC_NUM_PINS; i++) {
+ gsi_state->ioapic_irq[i] = qdev_get_gpio_in(
+ DEVICE(&s->ioapic.ioapic), i);
+ }
+ }
+ }
+
return 0;
}
@@ -375,6 +401,18 @@ static void piix3_initfn(Object *obj)
object_property_add_child(obj, "isa-ide",
OBJECT(&s->ide.isa), NULL);
}
+
+ if (pci_is_enabled) {
+ if (kvm_irqchip_in_kernel()) {
+ object_initialize(&s->ioapic.kvm_ioapic, TYPE_KVM_IOAPIC);
+ object_property_add_child(obj, "kvm-ioapic",
+ OBJECT(&s->ioapic.kvm_ioapic), NULL);
+ } else {
+ object_initialize(&s->ioapic.ioapic, TYPE_IOAPIC);
+ object_property_add_child(obj,
+ "ioapic", OBJECT(&s->ioapic.ioapic), NULL);
+ }
+ }
}
static void piix3_class_init(ObjectClass *klass, void *data)
diff --git a/hw/piix3.h b/hw/piix3.h
index 8916e4a..c6be9e6 100644
--- a/hw/piix3.h
+++ b/hw/piix3.h
@@ -38,6 +38,7 @@
#include "ps2.h"
#include "console.h"
#include "ide/pci.h"
+#include "ioapic_internal.h"
#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */
#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */
@@ -64,6 +65,9 @@ typedef struct KVMPITState {
#define MAX_IDE_BUS 2
+#define TYPE_IOAPIC "ioapic"
+#define TYPE_KVM_IOAPIC "kvm-ioapic"
+
typedef struct _VMMouseState {
ISADevice dev;
uint32_t queue[VMMOUSE_QUEUE_SIZE];
@@ -112,6 +116,11 @@ typedef struct ISAKBDState {
MemoryRegion io[2];
} ISAKBDState;
+typedef struct KVMIOAPICState {
+ IOAPICCommonState ioapic;
+ uint32_t kvm_gsi_base;
+} KVMIOAPICState;
+
typedef struct PIIX3State {
PCIDevice dev;
@@ -148,6 +157,10 @@ typedef struct PIIX3State {
ISAIDEState isa;
PCIIDEState pci;
} ide;
+ union {
+ IOAPICCommonState ioapic;
+ KVMIOAPICState kvm_ioapic;
+ } ioapic;
qemu_irq *pic;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-11-08 5:37 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-08 5:36 [Qemu-devel] [PATCH 00/10] piix3: create all child devices as proper QOM children Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 01/10] convert RTC as piix3 proper QOM child Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 02/10] convert HPET " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 03/10] convert PIT " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 04/10] convert PCSPK " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 05/10] convert PORT92 " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 06/10] convert i8042 " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 07/10] convert VMPORT " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 08/10] convert VMMOUSE " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 09/10] convert IDE " Wanpeng Li
2012-11-08 5:36 ` [Qemu-devel] [PATCH 10/10] convert IOAPIC " Wanpeng Li
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).