* [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