From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: qemu-devel@nongnu.org
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>,
Paolo Bonzini <pbonzini@redhat.com>,
qemu-ppc@nongnu.org, Alexander Graf <agraf@suse.de>
Subject: [Qemu-devel] [PATCH v4 6/8] qdev: introduce FWPathProvider interface
Date: Wed, 11 Dec 2013 21:22:19 +1100 [thread overview]
Message-ID: <1386757341-12154-7-git-send-email-aik@ozlabs.ru> (raw)
In-Reply-To: <1386757341-12154-1-git-send-email-aik@ozlabs.ru>
QEMU supports firmware names for all devices in the QEMU tree but
some architectures expect some parts of firmware path names in different
format.
This introduces a firmware-pathname-change interface definition.
If some machines needs to redefine the firmware path format, it has
to add the TYPE_FW_PATH_PROVIDER interface to an object that is above
the device on the QOM tree (typically /machine).
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Changes:
v4:
* added fw-path-provider.o into tests/Makefile
* fixed 80chars warning from checkpatch.pl
---
hw/core/Makefile.objs | 1 +
hw/core/fw-path-provider.c | 36 ++++++++++++++++++++++++++++++++++++
hw/core/qdev.c | 18 +++++++++++++++++-
include/hw/fw-path-provider.h | 32 ++++++++++++++++++++++++++++++++
tests/Makefile | 1 +
5 files changed, 87 insertions(+), 1 deletion(-)
create mode 100644 hw/core/fw-path-provider.c
create mode 100644 include/hw/fw-path-provider.h
diff --git a/hw/core/Makefile.objs b/hw/core/Makefile.objs
index 950146c..d829479 100644
--- a/hw/core/Makefile.objs
+++ b/hw/core/Makefile.objs
@@ -1,5 +1,6 @@
# core qdev-related obj files, also used by *-user:
common-obj-y += qdev.o qdev-properties.o
+common-obj-y += fw-path-provider.o
# irq.o needed for qdev GPIO handling:
common-obj-y += irq.o
diff --git a/hw/core/fw-path-provider.c b/hw/core/fw-path-provider.c
new file mode 100644
index 0000000..0187568
--- /dev/null
+++ b/hw/core/fw-path-provider.c
@@ -0,0 +1,36 @@
+#include "hw/fw-path-provider.h"
+
+char *fw_path_provider_get_dev_path(FWPathProvider *p, BusState *bus,
+ DeviceState *dev)
+{
+ FWPathProviderClass *k = FW_PATH_PROVIDER_GET_CLASS(p);
+
+ return k->get_dev_path(p, bus, dev);
+}
+
+char *fw_path_provider_try_get_dev_path(Object *o, BusState *bus,
+ DeviceState *dev)
+{
+ FWPathProvider *p = (FWPathProvider *)
+ object_dynamic_cast(o, TYPE_FW_PATH_PROVIDER);
+
+ if (p) {
+ return fw_path_provider_get_dev_path(p, bus, dev);
+ }
+
+ return NULL;
+}
+
+static const TypeInfo fw_path_provider_info = {
+ .name = TYPE_FW_PATH_PROVIDER,
+ .parent = TYPE_INTERFACE,
+ .class_size = sizeof(FWPathProviderClass),
+};
+
+
+static void fw_path_provider_register_types(void)
+{
+ type_register_static(&fw_path_provider_info);
+}
+
+type_init(fw_path_provider_register_types)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 959130c..81a0e75 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -26,6 +26,7 @@
this API directly. */
#include "hw/qdev.h"
+#include "hw/fw-path-provider.h"
#include "sysemu/sysemu.h"
#include "qapi/error.h"
#include "qapi/qmp/qerror.h"
@@ -503,6 +504,18 @@ static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
return NULL;
}
+static char *qdev_get_fw_dev_path_from_handler(BusState *bus, DeviceState *dev)
+{
+ Object *obj = OBJECT(dev);
+ char *d = NULL;
+
+ while (!d && obj->parent) {
+ obj = obj->parent;
+ d = fw_path_provider_try_get_dev_path(obj, bus, dev);
+ }
+ return d;
+}
+
static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
{
int l = 0;
@@ -510,7 +523,10 @@ static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
if (dev && dev->parent_bus) {
char *d;
l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
- d = bus_get_fw_dev_path(dev->parent_bus, dev);
+ d = qdev_get_fw_dev_path_from_handler(dev->parent_bus, dev);
+ if (!d) {
+ d = bus_get_fw_dev_path(dev->parent_bus, dev);
+ }
if (d) {
l += snprintf(p + l, size - l, "%s", d);
g_free(d);
diff --git a/include/hw/fw-path-provider.h b/include/hw/fw-path-provider.h
new file mode 100644
index 0000000..765170b
--- /dev/null
+++ b/include/hw/fw-path-provider.h
@@ -0,0 +1,32 @@
+#ifndef FW_PATH_PROVIDER_H
+#define FW_PATH_PROVIDER_H 1
+
+#include "qemu-common.h"
+#include "qom/object.h"
+
+#define TYPE_FW_PATH_PROVIDER "fw-path-provider"
+
+#define FW_PATH_PROVIDER_CLASS(klass) \
+ OBJECT_CLASS_CHECK(FWPathProviderClass, (klass), TYPE_FW_PATH_PROVIDER)
+#define FW_PATH_PROVIDER_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(FWPathProviderClass, (obj), TYPE_FW_PATH_PROVIDER)
+#define FW_PATH_PROVIDER(obj) \
+ INTERFACE_CHECK(FWPathProvider, (obj), TYPE_FW_PATH_PROVIDER)
+
+typedef struct FWPathProvider {
+ Object Parent;
+} FWPathProvider;
+
+typedef void (*StreamCanPushNotifyFn)(void *opaque);
+
+typedef struct FWPathProviderClass {
+ InterfaceClass parent;
+ char *(*get_dev_path)(FWPathProvider *p, BusState *bus, DeviceState *dev);
+} FWPathProviderClass;
+
+char *fw_path_provider_get_dev_path(FWPathProvider *p, BusState *bus,
+ DeviceState *dev);
+char *fw_path_provider_try_get_dev_path(Object *o, BusState *bus,
+ DeviceState *dev);
+
+#endif /* FW_PATH_PROVIDER_H */
diff --git a/tests/Makefile b/tests/Makefile
index 379cdd9..09c42d0 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -160,6 +160,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
hw/core/qdev.o hw/core/qdev-properties.o \
hw/core/irq.o \
qom/object.o qom/container.o qom/qom-qobject.o \
+ hw/core/fw-path-provider.o \
$(test-qapi-obj-y) \
libqemuutil.a libqemustub.a
--
1.8.4.rc4
next prev parent reply other threads:[~2013-12-11 10:23 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-11 10:22 [Qemu-devel] [PATCH v4 0/8] spapr: bootindex support Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 1/8] qom: do not register interface "types" in the type table Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 2/8] qom: detect bad reentrance during object_class_foreach Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 3/8] boot: extend get_boot_devices_list() to ignore suffixes Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 4/8] spapr-llan: add to boot device list Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 5/8] spapr-vio: fix firmware names Alexey Kardashevskiy
2013-12-11 10:22 ` Alexey Kardashevskiy [this message]
2014-02-20 12:01 ` [Qemu-devel] [PATCH v4 6/8] qdev: introduce FWPathProvider interface Andreas Färber
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 7/8] vl: allow customizing the class of /machine Alexey Kardashevskiy
2013-12-11 10:22 ` [Qemu-devel] [PATCH v4 8/8] spapr: define interface to fix device pathname Alexey Kardashevskiy
2013-12-11 10:36 ` [Qemu-devel] [PATCH v4 0/8] spapr: bootindex support Paolo Bonzini
2013-12-12 14:05 ` Michael S. Tsirkin
2013-12-13 3:19 ` Alexey Kardashevskiy
2014-01-22 4:19 ` Alexey Kardashevskiy
2014-01-22 10:16 ` Paolo Bonzini
2014-01-22 12:17 ` Alexey Kardashevskiy
2014-02-14 3:25 ` Alexey Kardashevskiy
2014-02-14 7:29 ` Paolo Bonzini
2014-02-14 8:26 ` Alexey Kardashevskiy
2014-02-20 8:37 ` Alexey Kardashevskiy
2014-02-20 11:09 ` Paolo Bonzini
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=1386757341-12154-7-git-send-email-aik@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=agraf@suse.de \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/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).