From: "Andreas Färber" <andreas.faerber@web.de>
To: qemu-devel@nongnu.org
Cc: "Andreas Färber" <andreas.faerber@web.de>,
"Juan Quintela" <quintela@redhat.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>
Subject: [Qemu-devel] [RFC v5 10/23] isa: Provide enable and disable callbacks
Date: Tue, 14 Jun 2011 04:37:44 +0200 [thread overview]
Message-ID: <1308019077-61957-11-git-send-email-andreas.faerber@web.de> (raw)
In-Reply-To: <1308019077-61957-10-git-send-email-andreas.faerber@web.de>
To allow enabling/disabling present ISA devices without hotplug,
keep track of state and add a helper to avoid enabling twice.
Since the properties to be configured are defined at device level,
delegate the actual work to callback functions. Use separate ones
for enable and disable, otherwise the functions ended up as a big
"if" statement.
If no callback is supplied, the device can't be disabled.
Prepare VMSTATE_ISA_DEVICE for devices that support disabling.
Legacy devices never change their state and won't need this yet.
For those that do, supply a "needed" callback.
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>
Cc: Juan Quintela <quintela@redhat.com>
Signed-off-by: Andreas Färber <andreas.faerber@web.de>
---
hw/hw.h | 15 +++++++++++++++
hw/isa-bus.c | 39 +++++++++++++++++++++++++++++++++++++++
hw/isa.h | 6 ++++++
3 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/hw/hw.h b/hw/hw.h
index 56447a7..32226b1 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -628,6 +628,21 @@ extern const VMStateInfo vmstate_info_unused_buffer;
.info = &vmstate_info_unused_buffer, \
.flags = VMS_BUFFER, \
}
+
+extern const VMStateDescription vmstate_isa_device;
+
+#define VMSTATE_ISA_DEVICE_V(_field, _state, _version) { \
+ .name = (stringify(_field)), \
+ .version_id = (_version), \
+ .size = sizeof(ISADevice), \
+ .vmsd = &vmstate_isa_device, \
+ .flags = VMS_STRUCT, \
+ .offset = vmstate_offset_value(_state, _field, ISADevice), \
+}
+
+#define VMSTATE_ISA_DEVICE(_field, _state) \
+ VMSTATE_ISA_DEVICE_V(_field, _state, 0)
+
extern const VMStateDescription vmstate_pci_device;
#define VMSTATE_PCI_DEVICE(_field, _state) { \
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 2765543..bbafb75 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -112,6 +112,9 @@ static int isa_qdev_init(DeviceState *qdev, DeviceInfo *base)
dev->isairq[0] = -1;
dev->isairq[1] = -1;
+ dev->enabled = true; /* XXX for legacy devices without qdev property */
+
+ dev->initially_enabled = dev->enabled;
return info->init(dev);
}
@@ -156,6 +159,42 @@ ISADevice *isa_create_simple(const char *name)
return dev;
}
+const VMStateDescription vmstate_isa_device = {
+ .name = "ISADevice",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .fields = (VMStateField []) {
+ VMSTATE_BOOL(enabled, ISADevice),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+int isa_set_state(ISADevice *dev, bool enabled)
+{
+ ISADeviceInfo *info = DO_UPCAST(ISADeviceInfo, qdev, dev->qdev.info);
+ isa_qdev_initfn statefn = enabled ? info->enable : info->disable;
+ int err;
+
+ if (dev->enabled == enabled) {
+ return 0;
+ } else if (statefn == NULL) {
+ return -1;
+ }
+ err = statefn(dev);
+ if (err < 0) {
+ return err;
+ }
+ dev->enabled = enabled;
+ return err;
+}
+
+bool isa_vmstate_needed(void *opaque)
+{
+ ISADevice *s = opaque;
+
+ return s->initially_enabled != s->enabled;
+}
+
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent)
{
ISADevice *d = DO_UPCAST(ISADevice, qdev, dev);
diff --git a/hw/isa.h b/hw/isa.h
index d2b6126..1eefd17 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -16,12 +16,16 @@ struct ISADevice {
int nirqs;
uint16_t ioports[32];
int nioports;
+ bool enabled;
+ bool initially_enabled;
};
typedef int (*isa_qdev_initfn)(ISADevice *dev);
struct ISADeviceInfo {
DeviceInfo qdev;
isa_qdev_initfn init;
+ isa_qdev_initfn enable;
+ isa_qdev_initfn disable;
};
ISABus *isa_bus_new(DeviceState *dev);
@@ -34,6 +38,8 @@ void isa_qdev_register(ISADeviceInfo *info);
ISADevice *isa_create(const char *name);
ISADevice *isa_try_create(const char *name);
ISADevice *isa_create_simple(const char *name);
+int isa_set_state(ISADevice *dev, bool enabled);
+bool isa_vmstate_needed(void *opaque);
extern target_phys_addr_t isa_mem_base;
--
1.7.5.3
next prev parent reply other threads:[~2011-06-14 2:38 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-14 2:37 [Qemu-devel] [RFC 00/23] PReP 40P emulation Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [PATCH RFC 01/23] prep: Refactor CPU initialization Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 02/23] prep: qdev'ify PCI Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 03/23] prep: Prepare emulation of an IBM RS/6000 6015 / 7020 (40p) Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 04/23] 40p: Add PCI host Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 05/23] prep: Add i82374 DMA emulation Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 06/23] prep: Add i82378 PCI-to-ISA bridge emulation Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 07/23] 40p: Add a PCI to ISA bridge (i82378) Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [PATCH v5 08/23] qdev: Add support for property type bool Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [PATCH v5 09/23] qdev: Add helpers for reading properties Andreas Färber
2011-06-14 2:37 ` Andreas Färber [this message]
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 11/23] isa: Allow to un-assign I/O ports Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 12/23] isa: Allow to un-associate an IRQ Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 13/23] parallel: Implement ISA state callbacks Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 14/23] serial: " Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [PATCH v5 15/23] fdc: Parametrize ISA base, IRQ and DMA Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 16/23] fdc: Implement ISA state callbacks Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 17/23] ide: Allow to discard I/O ports Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 18/23] ide: Implement ISA state callbacks Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC v5 19/23] prep: Add pc87312 Super I/O emulation Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 20/23] 40p: Add the Super I/O chip (pc87312) Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 21/23] 40p: Add an audio card and a keyboard Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 22/23] prep: qdev'ify System I/O (WIP) Andreas Färber
2011-06-14 2:37 ` [Qemu-devel] [RFC 23/23] 40p: Add an 8514/A graphics card Andreas Färber
2011-06-15 4:33 ` Roy Tam
2011-06-15 18:11 ` Andreas Färber
2011-06-16 0:02 ` [Qemu-devel] [RFC v2 23/23] 40p: Add an IBM " Andreas Färber
2011-06-18 20:42 ` Blue Swirl
2011-06-19 10:04 ` Andreas Färber
2011-06-19 12:10 ` Hervé Poussineau
2011-06-19 13:27 ` Blue Swirl
2011-06-19 18:40 ` Andreas Färber
2011-06-19 19:03 ` Blue Swirl
2011-06-19 21:38 ` Andreas Färber
2011-06-19 21:43 ` [Qemu-devel] [RFC v3 " Andreas Färber
2011-06-16 0:05 ` [Qemu-devel] [RFC 23/23] 40p: Add an " Andreas Färber
2011-06-16 1:22 ` Roy Tam
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1308019077-61957-11-git-send-email-andreas.faerber@web.de \
--to=andreas.faerber@web.de \
--cc=armbru@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).