All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR
@ 2019-10-23 17:31 Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 01/33] qdev: remove unused qdev_prop_int64 Marc-André Lureau
                   ` (32 more replies)
  0 siblings, 33 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi,

QDEV_PROP_PTR is marked in multiple places as "FIXME/TODO/remove
me". In most cases, it can be easily replaced with QDEV_PROP_LINK when
the pointer points to an Object.

There are a few places where such substitution isn't possible. For
those places, it seems reasonable to use a specific setter method
instead, and keep the user_creatable = false. In other places,
proper usage of qemu_irq is the solution.

The serial code wasn't converted to qdev, which makes it a bit more
archaic to deal with. Let's convert it first, so we can more easily
embed it from other devices, and re-export some properties.

v3:
 - introduce SerialMM and SerialIO sysbus devices
 - remove serial_mm_connect introduced in v2
 - replace "base" property introduced in v2, use "instance-id" for
   vmstate purpose only
 - add a few preliminary clean-ups

v2:
 - qom-ify serial
 - embed the serial from sm501, and expose a "chardev" property
 - add "leon3: use qemu_irq framework instead of callback as property"
 - add "sparc: move PIL irq handling to cpu.c"
 - add "cris: improve passing PIC interrupt vector to the CPU"
 - misc comment/todo changes, add r-b tags

Marc-André Lureau (33):
  qdev: remove unused qdev_prop_int64
  sysbus: remove unused sysbus_try_create*
  sysbus: remove outdated comment
  chardev: generate an internal id when none given
  serial-pci-multi: factor out multi_serial_get_nr_ports
  serial: initial qom-ification
  serial: register vmsd with DeviceClass
  serial: add "chardev" property
  serial: add "baudbase" property
  serial: add "instance-id" property
  serial: realize the serial device
  serial: replace serial_exit_core() with unrealize
  serial: start making SerialMM a sysbus device
  serial-mm: add "regshift" property
  serial-mm: add endianness property
  serial-mm: use sysbus facilities
  serial: make SerialIO a sysbus device
  mips: inline serial_init
  sm501: make SerialMM a child, export chardev property
  vmmouse: replace PROP_PTR with PROP_LINK
  lance: replace PROP_PTR with PROP_LINK
  etraxfs: remove PROP_PTR usage
  dp8393x: replace PROP_PTR with PROP_LINK
  leon3: use qemu_irq framework instead of callback as property
  sparc: move PIL irq handling to cpu.c
  RFC: mips/cps: fix setting saar property
  cris: improve passing PIC interrupt vector to the CPU
  smbus-eeprom: remove PROP_PTR
  omap-intc: remove PROP_PTR
  omap-i2c: remove PROP_PTR
  omap-gpio: remove PROP_PTR
  qdev: remove PROP_MEMORY_REGION
  qdev: remove QDEV_PROP_PTR

 chardev/char.c               |  32 +++++--
 hw/arm/omap1.c               |   8 +-
 hw/arm/omap2.c               |  25 +++---
 hw/char/omap_uart.c          |   2 +-
 hw/char/serial-isa.c         |  11 ++-
 hw/char/serial-pci-multi.c   |  45 +++++++---
 hw/char/serial-pci.c         |  17 +++-
 hw/char/serial.c             | 164 ++++++++++++++++++++++++++++-------
 hw/core/qdev-properties.c    |  50 -----------
 hw/core/sysbus.c             |  32 -------
 hw/cris/axis_dev88.c         |   4 -
 hw/display/sm501.c           |  31 +++++--
 hw/dma/sparc32_dma.c         |   2 +-
 hw/gpio/omap_gpio.c          |  42 ++++-----
 hw/i2c/omap_i2c.c            |  19 ++--
 hw/i2c/smbus_eeprom.c        |  17 ++--
 hw/i386/pc.c                 |   7 +-
 hw/i386/vmmouse.c            |   8 +-
 hw/input/pckbd.c             |   8 +-
 hw/intc/etraxfs_pic.c        |  26 +-----
 hw/intc/grlib_irqmp.c        |  35 +-------
 hw/intc/omap_intc.c          |  17 ++--
 hw/mips/boston.c             |   2 +-
 hw/mips/cps.c                |   2 +-
 hw/mips/mips_jazz.c          |   3 +-
 hw/mips/mips_malta.c         |   2 +-
 hw/mips/mips_mipssim.c       |  13 ++-
 hw/net/dp8393x.c             |   7 +-
 hw/net/etraxfs_eth.c         |  44 +++++++---
 hw/net/lance.c               |   5 +-
 hw/net/pcnet-pci.c           |   2 +-
 hw/net/pcnet.h               |   2 +-
 hw/sh4/r2d.c                 |   2 +-
 hw/sparc/leon3.c             |  38 +-------
 hw/sparc/trace-events        |   4 -
 include/hw/arm/omap.h        |  52 +++++++++++
 include/hw/char/serial.h     |  44 +++++++---
 include/hw/cris/etraxfs.h    |  20 +----
 include/hw/input/i8042.h     |   4 +-
 include/hw/qdev-properties.h |  27 ------
 include/hw/sysbus.h          |  13 +--
 include/qemu/id.h            |   1 +
 target/cris/cpu.c            |   8 ++
 target/cris/cpu.h            |   1 +
 target/sparc/cpu.c           |  39 +++++++++
 target/sparc/cpu.h           |   1 +
 target/sparc/trace-events    |   4 +
 util/id.c                    |   1 +
 48 files changed, 515 insertions(+), 428 deletions(-)

-- 
2.23.0.606.g08da6496b6



^ permalink raw reply	[flat|nested] 99+ messages in thread

* [PATCH v3 01/33] qdev: remove unused qdev_prop_int64
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:01   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 02/33] sysbus: remove unused sysbus_try_create* Marc-André Lureau
                   ` (31 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev-properties.c    | 32 --------------------------------
 include/hw/qdev-properties.h |  3 ---
 2 files changed, 35 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index ac28890e5a..be4cb01f0b 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -409,31 +409,6 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,
     visit_type_uint64(v, name, ptr, errp);
 }
 
-static void get_int64(Object *obj, Visitor *v, const char *name,
-                      void *opaque, Error **errp)
-{
-    DeviceState *dev = DEVICE(obj);
-    Property *prop = opaque;
-    int64_t *ptr = qdev_get_prop_ptr(dev, prop);
-
-    visit_type_int64(v, name, ptr, errp);
-}
-
-static void set_int64(Object *obj, Visitor *v, const char *name,
-                      void *opaque, Error **errp)
-{
-    DeviceState *dev = DEVICE(obj);
-    Property *prop = opaque;
-    int64_t *ptr = qdev_get_prop_ptr(dev, prop);
-
-    if (dev->realized) {
-        qdev_prop_set_after_realize(dev, name, errp);
-        return;
-    }
-
-    visit_type_int64(v, name, ptr, errp);
-}
-
 const PropertyInfo qdev_prop_uint64 = {
     .name  = "uint64",
     .get   = get_uint64,
@@ -441,13 +416,6 @@ const PropertyInfo qdev_prop_uint64 = {
     .set_default_value = set_default_value_uint,
 };
 
-const PropertyInfo qdev_prop_int64 = {
-    .name  = "int64",
-    .get   = get_int64,
-    .set   = set_int64,
-    .set_default_value = set_default_value_int,
-};
-
 /* --- string --- */
 
 static void release_string(Object *obj, const char *name, void *opaque)
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index c6a8cb5516..690ff07ae2 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -13,7 +13,6 @@ extern const PropertyInfo qdev_prop_uint16;
 extern const PropertyInfo qdev_prop_uint32;
 extern const PropertyInfo qdev_prop_int32;
 extern const PropertyInfo qdev_prop_uint64;
-extern const PropertyInfo qdev_prop_int64;
 extern const PropertyInfo qdev_prop_size;
 extern const PropertyInfo qdev_prop_string;
 extern const PropertyInfo qdev_prop_chr;
@@ -164,8 +163,6 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
     DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int32, int32_t)
 #define DEFINE_PROP_UINT64(_n, _s, _f, _d)                      \
     DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
-#define DEFINE_PROP_INT64(_n, _s, _f, _d)                      \
-    DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int64, int64_t)
 #define DEFINE_PROP_SIZE(_n, _s, _f, _d)                       \
     DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size, uint64_t)
 #define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d)                   \
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 02/33] sysbus: remove unused sysbus_try_create*
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 01/33] qdev: remove unused qdev_prop_int64 Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:35   ` Philippe Mathieu-Daudé
  2019-11-18 14:02   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 03/33] sysbus: remove outdated comment Marc-André Lureau
                   ` (30 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/sysbus.c    | 32 --------------------------------
 hw/i386/pc.c        |  1 -
 include/hw/sysbus.h |  9 +--------
 3 files changed, 1 insertion(+), 41 deletions(-)

diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 9e69c83aed..08b0311c5f 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -250,38 +250,6 @@ DeviceState *sysbus_create_varargs(const char *name,
     return dev;
 }
 
-DeviceState *sysbus_try_create_varargs(const char *name,
-                                       hwaddr addr, ...)
-{
-    DeviceState *dev;
-    SysBusDevice *s;
-    va_list va;
-    qemu_irq irq;
-    int n;
-
-    dev = qdev_try_create(NULL, name);
-    if (!dev) {
-        return NULL;
-    }
-    s = SYS_BUS_DEVICE(dev);
-    qdev_init_nofail(dev);
-    if (addr != (hwaddr)-1) {
-        sysbus_mmio_map(s, 0, addr);
-    }
-    va_start(va, addr);
-    n = 0;
-    while (1) {
-        irq = va_arg(va, qemu_irq);
-        if (!irq) {
-            break;
-        }
-        sysbus_connect_irq(s, n, irq);
-        n++;
-    }
-    va_end(va);
-    return dev;
-}
-
 static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
 {
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 4b1904237e..00ee16ccab 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1902,7 +1902,6 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
      * 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())) {
-        /* In order to set property, here not using sysbus_try_create_simple */
         hpet = qdev_try_create(NULL, TYPE_HPET);
         if (hpet) {
             /* For pc-piix-*, hpet's intcap is always IRQ2. For pc-q35-1.7
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 27e80881da..2eb0484388 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -117,8 +117,7 @@ void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque);
 /* Legacy helper function for creating devices.  */
 DeviceState *sysbus_create_varargs(const char *name,
                                  hwaddr addr, ...);
-DeviceState *sysbus_try_create_varargs(const char *name,
-                                       hwaddr addr, ...);
+
 static inline DeviceState *sysbus_create_simple(const char *name,
                                               hwaddr addr,
                                               qemu_irq irq)
@@ -126,11 +125,5 @@ static inline DeviceState *sysbus_create_simple(const char *name,
     return sysbus_create_varargs(name, addr, irq, NULL);
 }
 
-static inline DeviceState *sysbus_try_create_simple(const char *name,
-                                                    hwaddr addr,
-                                                    qemu_irq irq)
-{
-    return sysbus_try_create_varargs(name, addr, irq, NULL);
-}
 
 #endif /* HW_SYSBUS_H */
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 03/33] sysbus: remove outdated comment
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 01/33] qdev: remove unused qdev_prop_int64 Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 02/33] sysbus: remove unused sysbus_try_create* Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:36   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 04/33] chardev: generate an internal id when none given Marc-André Lureau
                   ` (29 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

The init callback is no more since commit
817a17fc60f44e29a1944b60d32f45ea127f0cf9 ("core/sysbus: remove the
SysBusDeviceClass::init path")

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/sysbus.h | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 2eb0484388..c4a1c0adfa 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -24,10 +24,6 @@ typedef struct SysBusDevice SysBusDevice;
 
 /**
  * SysBusDeviceClass:
- * @init: Callback function invoked when the #DeviceState.realized property
- * is changed to %true. Deprecated, new types inheriting directly from
- * TYPE_SYS_BUS_DEVICE should use #DeviceClass.realize instead, new leaf
- * types should consult their respective parent type.
  *
  * SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
  * classes overriding it are not required to invoke its implementation.
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 04/33] chardev: generate an internal id when none given
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (2 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 03/33] sysbus: remove outdated comment Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:12   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports Marc-André Lureau
                   ` (28 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Internally, qemu may create chardev without ID. Those will not be
looked up with qemu_chr_find(), which prevents using qdev_prop_set_chr().

Use id_generate(), to generate an internal name (prefixed with #), so
no conflict exist with user-named chardev.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 chardev/char.c    | 32 ++++++++++++++++++++++++--------
 include/qemu/id.h |  1 +
 util/id.c         |  1 +
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/chardev/char.c b/chardev/char.c
index 7b6b2cb123..e7e7492b0e 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -37,6 +37,7 @@
 #include "qemu/help_option.h"
 #include "qemu/module.h"
 #include "qemu/option.h"
+#include "qemu/id.h"
 
 #include "chardev/char-mux.h"
 
@@ -944,10 +945,10 @@ void qemu_chr_set_feature(Chardev *chr,
     return set_bit(feature, chr->features);
 }
 
-Chardev *qemu_chardev_new(const char *id, const char *typename,
-                          ChardevBackend *backend,
-                          GMainContext *gcontext,
-                          Error **errp)
+static Chardev *chardev_new(const char *id, const char *typename,
+                            ChardevBackend *backend,
+                            GMainContext *gcontext,
+                            Error **errp)
 {
     Object *obj;
     Chardev *chr = NULL;
@@ -991,6 +992,21 @@ end:
     return chr;
 }
 
+Chardev *qemu_chardev_new(const char *id, const char *typename,
+                          ChardevBackend *backend,
+                          GMainContext *gcontext,
+                          Error **errp)
+{
+    g_autofree char *genid = NULL;
+
+    if (!id) {
+        genid = id_generate(ID_CHR);
+        id = genid;
+    }
+
+    return chardev_new(id, typename, backend, gcontext, errp);
+}
+
 ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
                                Error **errp)
 {
@@ -1003,8 +1019,8 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
         return NULL;
     }
 
-    chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
-                           backend, NULL, errp);
+    chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
+                      backend, NULL, errp);
     if (!chr) {
         return NULL;
     }
@@ -1061,8 +1077,8 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
         return NULL;
     }
 
-    chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
-                               backend, chr->gcontext, errp);
+    chr_new = chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
+                          backend, chr->gcontext, errp);
     if (!chr_new) {
         return NULL;
     }
diff --git a/include/qemu/id.h b/include/qemu/id.h
index 40c70103e4..b55c406e69 100644
--- a/include/qemu/id.h
+++ b/include/qemu/id.h
@@ -4,6 +4,7 @@
 typedef enum IdSubSystems {
     ID_QDEV,
     ID_BLOCK,
+    ID_CHR,
     ID_MAX      /* last element, used as array size */
 } IdSubSystems;
 
diff --git a/util/id.c b/util/id.c
index af1c5f1b81..5addb4460e 100644
--- a/util/id.c
+++ b/util/id.c
@@ -34,6 +34,7 @@ bool id_wellformed(const char *id)
 static const char *const id_subsys_str[ID_MAX] = {
     [ID_QDEV]  = "qdev",
     [ID_BLOCK] = "block",
+    [ID_CHR] = "chr",
 };
 
 /*
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (3 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 04/33] chardev: generate an internal id when none given Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:41   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 06/33] serial: initial qom-ification Marc-André Lureau
                   ` (27 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Reused in following patch.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial-pci-multi.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 5f13b5663b..6fa1cc6225 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -77,24 +77,26 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
     pci_set_irq(&pci->dev, pending);
 }
 
+static int multi_serial_get_nr_ports(PCIDeviceClass *pc)
+{
+    switch (pc->device_id) {
+    case 0x0003:
+        return 2;
+    case 0x0004:
+        return 4;
+    }
+
+    g_assert_not_reached();
+}
+
+
 static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
 {
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
     SerialState *s;
     Error *err = NULL;
-    int i, nr_ports = 0;
-
-    switch (pc->device_id) {
-    case 0x0003:
-        nr_ports = 2;
-        break;
-    case 0x0004:
-        nr_ports = 4;
-        break;
-    }
-    assert(nr_ports > 0);
-    assert(nr_ports <= PCI_SERIAL_MAX_PORTS);
+    int i, nr_ports = multi_serial_get_nr_ports(pc);
 
     pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
     pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 06/33] serial: initial qom-ification
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (4 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-24  8:48   ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 07/33] serial: register vmsd with DeviceClass Marc-André Lureau
                   ` (26 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Make SerialState a device (the following patches will introduce IO/MM
sysbus serial devices)

None of the serial_{,mm}_init() callers actually free the returned
value (even if they did, it would be quite harmless), so we can change
the object allocation at will.

However, the devices that embed SerialState must now have their field
QOM-initialized manually (isa, pci, pci-multi).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial-isa.c       |  9 +++++++++
 hw/char/serial-pci-multi.c | 15 +++++++++++++++
 hw/char/serial-pci.c       | 13 ++++++++++++-
 hw/char/serial.c           | 25 +++++++++++++++++++------
 include/hw/char/serial.h   |  7 ++++++-
 5 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index 9e31c51bb6..9a5928b3ee 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -111,10 +111,19 @@ static void serial_isa_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
+static void serial_isa_initfn(Object *o)
+{
+    ISASerialState *self = ISA_SERIAL(o);
+
+    object_initialize_child(o, "serial", &self->state, sizeof(self->state),
+                            TYPE_SERIAL, &error_abort, NULL);
+}
+
 static const TypeInfo serial_isa_info = {
     .name          = TYPE_ISA_SERIAL,
     .parent        = TYPE_ISA_DEVICE,
     .instance_size = sizeof(ISASerialState),
+    .instance_init = serial_isa_initfn,
     .class_init    = serial_isa_class_initfn,
 };
 
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 6fa1cc6225..3485bdad87 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -182,10 +182,24 @@ static void multi_4x_serial_pci_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
+static void multi_serial_init(Object *o)
+{
+    PCIDevice *dev = PCI_DEVICE(o);
+    PCIMultiSerialState *self = DO_UPCAST(PCIMultiSerialState, dev, dev);
+    int i, nr_ports = multi_serial_get_nr_ports(PCI_DEVICE_GET_CLASS(dev));
+
+    for (i = 0; i < nr_ports; i++) {
+        object_initialize_child(o, "serial[*]", &self->state[i],
+                                sizeof(self->state[i]),
+                                TYPE_SERIAL, &error_abort, NULL);
+    }
+}
+
 static const TypeInfo multi_2x_serial_pci_info = {
     .name          = "pci-serial-2x",
     .parent        = TYPE_PCI_DEVICE,
     .instance_size = sizeof(PCIMultiSerialState),
+    .instance_init = multi_serial_init,
     .class_init    = multi_2x_serial_pci_class_initfn,
     .interfaces = (InterfaceInfo[]) {
         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
@@ -197,6 +211,7 @@ static const TypeInfo multi_4x_serial_pci_info = {
     .name          = "pci-serial-4x",
     .parent        = TYPE_PCI_DEVICE,
     .instance_size = sizeof(PCIMultiSerialState),
+    .instance_init = multi_serial_init,
     .class_init    = multi_4x_serial_pci_class_initfn,
     .interfaces = (InterfaceInfo[]) {
         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index cb9b76e22b..a33264a1fb 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -40,6 +40,8 @@ typedef struct PCISerialState {
     uint8_t prog_if;
 } PCISerialState;
 
+#define TYPE_PCI_SERIAL "pci-serial"
+#define PCI_SERIAL(s) OBJECT_CHECK(PCISerialState, (s), TYPE_PCI_SERIAL)
 
 static void serial_pci_realize(PCIDevice *dev, Error **errp)
 {
@@ -103,10 +105,19 @@ static void serial_pci_class_initfn(ObjectClass *klass, void *data)
     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
 }
 
+static void serial_pci_init(Object *o)
+{
+    PCISerialState *self = PCI_SERIAL(o);
+
+    object_initialize_child(o, "serial", &self->state, sizeof(self->state),
+                            TYPE_SERIAL, &error_abort, NULL);
+}
+
 static const TypeInfo serial_pci_info = {
-    .name          = "pci-serial",
+    .name          = TYPE_PCI_SERIAL,
     .parent        = TYPE_PCI_DEVICE,
     .instance_size = sizeof(PCISerialState),
+    .instance_init = serial_pci_init,
     .class_init    = serial_pci_class_initfn,
     .interfaces = (InterfaceInfo[]) {
         { INTERFACE_CONVENTIONAL_PCI_DEVICE },
diff --git a/hw/char/serial.c b/hw/char/serial.c
index b4aa250950..c839035fdd 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -983,9 +983,8 @@ const MemoryRegionOps serial_io_ops = {
 SerialState *serial_init(int base, qemu_irq irq, int baudbase,
                          Chardev *chr, MemoryRegion *system_io)
 {
-    SerialState *s;
-
-    s = g_malloc0(sizeof(SerialState));
+    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
+    SerialState *s = SERIAL(dev);
 
     s->irq = irq;
     s->baudbase = baudbase;
@@ -993,6 +992,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     serial_realize_core(s, &error_fatal);
 
     vmstate_register(NULL, base, &vmstate_serial, s);
+    qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
     memory_region_add_subregion(system_io, base, &s->io);
@@ -1000,6 +1000,12 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     return s;
 }
 
+static const TypeInfo serial_info = {
+    .name = TYPE_SERIAL,
+    .parent = TYPE_DEVICE,
+    .instance_size = sizeof(SerialState),
+};
+
 /* Memory mapped interface */
 static uint64_t serial_mm_read(void *opaque, hwaddr addr,
                                unsigned size)
@@ -1045,9 +1051,8 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
                             qemu_irq irq, int baudbase,
                             Chardev *chr, enum device_endian end)
 {
-    SerialState *s;
-
-    s = g_malloc0(sizeof(SerialState));
+    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
+    SerialState *s = SERIAL(dev);
 
     s->it_shift = it_shift;
     s->irq = irq;
@@ -1056,9 +1061,17 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
 
     serial_realize_core(s, &error_fatal);
     vmstate_register(NULL, base, &vmstate_serial, s);
+    qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
                           "serial", 8 << it_shift);
     memory_region_add_subregion(address_space, base, &s->io);
     return s;
 }
+
+static void serial_register_types(void)
+{
+    type_register_static(&serial_info);
+}
+
+type_init(serial_register_types)
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 8be3d8a4f9..180cc7c24e 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -30,10 +30,13 @@
 #include "exec/memory.h"
 #include "qemu/fifo8.h"
 #include "chardev/char.h"
+#include "hw/sysbus.h"
 
 #define UART_FIFO_LENGTH    16      /* 16550A Fifo Length */
 
 typedef struct SerialState {
+    DeviceState parent;
+
     uint16_t divider;
     uint8_t rbr; /* receive register */
     uint8_t thr; /* transmit holding register */
@@ -84,7 +87,9 @@ void serial_realize_core(SerialState *s, Error **errp);
 void serial_exit_core(SerialState *s);
 void serial_set_frequency(SerialState *s, uint32_t frequency);
 
-/* legacy pre qom */
+#define TYPE_SERIAL "serial"
+#define SERIAL(s) OBJECT_CHECK(SerialState, (s), TYPE_SERIAL)
+
 SerialState *serial_init(int base, qemu_irq irq, int baudbase,
                          Chardev *chr, MemoryRegion *system_io);
 SerialState *serial_mm_init(MemoryRegion *address_space,
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (5 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 06/33] serial: initial qom-ification Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:21   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 08/33] serial: add "chardev" property Marc-André Lureau
                   ` (25 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

QOM-ify further.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index c839035fdd..4af8b0ce4c 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -990,8 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     s->baudbase = baudbase;
     qemu_chr_fe_init(&s->chr, chr, &error_abort);
     serial_realize_core(s, &error_fatal);
-
-    vmstate_register(NULL, base, &vmstate_serial, s);
+    qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
@@ -1000,9 +999,17 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     return s;
 }
 
+static void serial_class_init(ObjectClass *klass, void* data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->vmsd = &vmstate_serial;
+}
+
 static const TypeInfo serial_info = {
     .name = TYPE_SERIAL,
     .parent = TYPE_DEVICE,
+    .class_init = serial_class_init,
     .instance_size = sizeof(SerialState),
 };
 
@@ -1060,7 +1067,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
     qemu_chr_fe_init(&s->chr, chr, &error_abort);
 
     serial_realize_core(s, &error_fatal);
-    vmstate_register(NULL, base, &vmstate_serial, s);
+    qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 08/33] serial: add "chardev" property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (6 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 07/33] serial: register vmsd with DeviceClass Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:39   ` Philippe Mathieu-Daudé
  2019-11-18 14:23   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 09/33] serial: add "baudbase" property Marc-André Lureau
                   ` (24 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

This is more QOM-friendly, callers may set/get the property themself.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 4af8b0ce4c..09e89727a6 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -34,6 +34,7 @@
 #include "sysemu/runstate.h"
 #include "qemu/error-report.h"
 #include "trace.h"
+#include "hw/qdev-properties.h"
 
 //#define DEBUG_SERIAL
 
@@ -988,7 +989,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
 
     s->irq = irq;
     s->baudbase = baudbase;
-    qemu_chr_fe_init(&s->chr, chr, &error_abort);
+    qdev_prop_set_chr(dev, "chardev", chr);
     serial_realize_core(s, &error_fatal);
     qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
@@ -999,11 +1000,17 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     return s;
 }
 
+static Property serial_properties[] = {
+    DEFINE_PROP_CHR("chardev", SerialState, chr),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void serial_class_init(ObjectClass *klass, void* data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &vmstate_serial;
+    dc->props = serial_properties;
 }
 
 static const TypeInfo serial_info = {
@@ -1064,7 +1071,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
     s->it_shift = it_shift;
     s->irq = irq;
     s->baudbase = baudbase;
-    qemu_chr_fe_init(&s->chr, chr, &error_abort);
+    qdev_prop_set_chr(dev, "chardev", chr);
 
     serial_realize_core(s, &error_fatal);
     qdev_set_legacy_instance_id(dev, base, 2);
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 09/33] serial: add "baudbase" property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (7 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 08/33] serial: add "chardev" property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:40   ` Philippe Mathieu-Daudé
  2019-11-18 14:26   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 10/33] serial: add "instance-id" property Marc-André Lureau
                   ` (23 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 5 +++--
 include/hw/char/serial.h | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 09e89727a6..069d8715d0 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -988,7 +988,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     SerialState *s = SERIAL(dev);
 
     s->irq = irq;
-    s->baudbase = baudbase;
+    qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
     serial_realize_core(s, &error_fatal);
     qdev_set_legacy_instance_id(dev, base, 2);
@@ -1002,6 +1002,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
 
 static Property serial_properties[] = {
     DEFINE_PROP_CHR("chardev", SerialState, chr),
+    DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -1070,7 +1071,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
 
     s->it_shift = it_shift;
     s->irq = irq;
-    s->baudbase = baudbase;
+    qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
 
     serial_realize_core(s, &error_fatal);
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 180cc7c24e..3dc618598e 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -58,7 +58,7 @@ typedef struct SerialState {
     CharBackend chr;
     int last_break_enable;
     int it_shift;
-    int baudbase;
+    uint32_t baudbase;
     uint32_t tsr_retry;
     guint watch_tag;
     uint32_t wakeup;
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 10/33] serial: add "instance-id" property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (8 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 09/33] serial: add "baudbase" property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:29   ` Peter Maydell
  2019-11-20  9:06   ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 11/33] serial: realize the serial device Marc-André Lureau
                   ` (22 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

This property will be used to move common vmstate registration to
device realize in following patch.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 3 +++
 include/hw/char/serial.h | 1 +
 2 files changed, 4 insertions(+)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 069d8715d0..0b61a71e4e 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -990,6 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     s->irq = irq;
     qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
+    qdev_prop_set_int32(dev, "instance-id", base);
     serial_realize_core(s, &error_fatal);
     qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
@@ -1003,6 +1004,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
 static Property serial_properties[] = {
     DEFINE_PROP_CHR("chardev", SerialState, chr),
     DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
+    DEFINE_PROP_INT32("instance-id", SerialState, instance_id, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -1073,6 +1075,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
     s->irq = irq;
     qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
+    qdev_prop_set_int32(dev, "instance-id", base);
 
     serial_realize_core(s, &error_fatal);
     qdev_set_legacy_instance_id(dev, base, 2);
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 3dc618598e..b472c7cd57 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -78,6 +78,7 @@ typedef struct SerialState {
 
     QEMUTimer *modem_status_poll;
     MemoryRegion io;
+    int instance_id;
 } SerialState;
 
 extern const VMStateDescription vmstate_serial;
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 11/33] serial: realize the serial device
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (9 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 10/33] serial: add "instance-id" property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize Marc-André Lureau
                   ` (21 subsequent siblings)
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Instead of calling serial_realize_core(), use the QDev realize
callback. Move qdev_set_legacy_instance_id() there.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial-isa.c       |  2 +-
 hw/char/serial-pci-multi.c |  2 +-
 hw/char/serial-pci.c       |  2 +-
 hw/char/serial.c           | 11 +++++------
 include/hw/char/serial.h   |  1 -
 5 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
index 9a5928b3ee..33e093f1e6 100644
--- a/hw/char/serial-isa.c
+++ b/hw/char/serial-isa.c
@@ -75,7 +75,7 @@ static void serial_isa_realizefn(DeviceState *dev, Error **errp)
 
     s->baudbase = 115200;
     isa_init_irq(isadev, &s->irq, isa->isairq);
-    serial_realize_core(s, errp);
+    object_property_set_bool(OBJECT(s), true, "realized", errp);
     qdev_set_legacy_instance_id(dev, isa->iobase, 3);
 
     memory_region_init_io(&s->io, OBJECT(isa), &serial_io_ops, s, "serial", 8);
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 3485bdad87..60c1c948b8 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -108,7 +108,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
     for (i = 0; i < nr_ports; i++) {
         s = pci->state + i;
         s->baudbase = 115200;
-        serial_realize_core(s, &err);
+        object_property_set_bool(OBJECT(s), true, "realized", &err);
         if (err != NULL) {
             error_propagate(errp, err);
             multi_serial_pci_exit(dev);
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index a33264a1fb..35a8552674 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -50,7 +50,7 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
     Error *err = NULL;
 
     s->baudbase = 115200;
-    serial_realize_core(s, &err);
+    object_property_set_bool(OBJECT(s), true, "realized", &err);
     if (err != NULL) {
         error_propagate(errp, err);
         return;
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 0b61a71e4e..bf34d9594e 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -934,8 +934,10 @@ static int serial_be_change(void *opaque)
     return 0;
 }
 
-void serial_realize_core(SerialState *s, Error **errp)
+static void serial_realize(DeviceState *dev, Error **errp)
 {
+    SerialState *s = SERIAL(dev);
+
     s->modem_status_poll = timer_new_ns(QEMU_CLOCK_VIRTUAL, (QEMUTimerCB *) serial_update_msl, s);
 
     s->fifo_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, (QEMUTimerCB *) fifo_timeout_int, s);
@@ -946,6 +948,7 @@ void serial_realize_core(SerialState *s, Error **errp)
     fifo8_create(&s->recv_fifo, UART_FIFO_LENGTH);
     fifo8_create(&s->xmit_fifo, UART_FIFO_LENGTH);
     serial_reset(s);
+    qdev_set_legacy_instance_id(dev, s->instance_id, 2);
 }
 
 void serial_exit_core(SerialState *s)
@@ -991,8 +994,6 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
     qdev_prop_set_int32(dev, "instance-id", base);
-    serial_realize_core(s, &error_fatal);
-    qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
@@ -1012,6 +1013,7 @@ static void serial_class_init(ObjectClass *klass, void* data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
+    dc->realize = serial_realize;
     dc->vmsd = &vmstate_serial;
     dc->props = serial_properties;
 }
@@ -1076,9 +1078,6 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
     qdev_prop_set_uint32(dev, "baudbase", baudbase);
     qdev_prop_set_chr(dev, "chardev", chr);
     qdev_prop_set_int32(dev, "instance-id", base);
-
-    serial_realize_core(s, &error_fatal);
-    qdev_set_legacy_instance_id(dev, base, 2);
     qdev_init_nofail(dev);
 
     memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index b472c7cd57..b445df5951 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -84,7 +84,6 @@ typedef struct SerialState {
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
-void serial_realize_core(SerialState *s, Error **errp);
 void serial_exit_core(SerialState *s);
 void serial_set_frequency(SerialState *s, uint32_t frequency);
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (10 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 11/33] serial: realize the serial device Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:32   ` Peter Maydell
  2019-11-20 12:32   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 13/33] serial: start making SerialMM a sysbus device Marc-André Lureau
                   ` (20 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Instead of calling serial_exit_core() directly, use the QDev unrealize
callback.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial-pci-multi.c | 2 +-
 hw/char/serial-pci.c       | 2 +-
 hw/char/serial.c           | 5 ++++-
 include/hw/char/serial.h   | 1 -
 4 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 60c1c948b8..a3200555aa 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -56,7 +56,7 @@ static void multi_serial_pci_exit(PCIDevice *dev)
 
     for (i = 0; i < pci->ports; i++) {
         s = pci->state + i;
-        serial_exit_core(s);
+        object_property_set_bool(OBJECT(s), false, "realized", NULL);
         memory_region_del_subregion(&pci->iobar, &s->io);
         g_free(pci->name[i]);
     }
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 35a8552674..54bdd98325 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -69,7 +69,7 @@ static void serial_pci_exit(PCIDevice *dev)
     PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
     SerialState *s = &pci->state;
 
-    serial_exit_core(s);
+    object_property_set_bool(OBJECT(s), false, "realized", NULL);
     qemu_free_irq(s->irq);
 }
 
diff --git a/hw/char/serial.c b/hw/char/serial.c
index bf34d9594e..667570e310 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -951,8 +951,10 @@ static void serial_realize(DeviceState *dev, Error **errp)
     qdev_set_legacy_instance_id(dev, s->instance_id, 2);
 }
 
-void serial_exit_core(SerialState *s)
+static void serial_unrealize(DeviceState *dev, Error **errp)
 {
+    SerialState *s = SERIAL(dev);
+
     qemu_chr_fe_deinit(&s->chr, false);
 
     timer_del(s->modem_status_poll);
@@ -1014,6 +1016,7 @@ static void serial_class_init(ObjectClass *klass, void* data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = serial_realize;
+    dc->unrealize = serial_unrealize;
     dc->vmsd = &vmstate_serial;
     dc->props = serial_properties;
 }
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index b445df5951..7cc6304f1d 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -84,7 +84,6 @@ typedef struct SerialState {
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
-void serial_exit_core(SerialState *s);
 void serial_set_frequency(SerialState *s, uint32_t frequency);
 
 #define TYPE_SERIAL "serial"
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (11 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:43   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 14/33] serial-mm: add "regshift" property Marc-André Lureau
                   ` (19 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Memory mapped serial device is in fact a sysbus device. The following
patches will make use of sysbus facilities for resource and
registration.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/omap_uart.c      |  2 +-
 hw/char/serial.c         | 47 ++++++++++++++++++++++++++++------------
 hw/mips/boston.c         |  2 +-
 hw/mips/mips_malta.c     |  2 +-
 include/hw/char/serial.h | 20 ++++++++++++-----
 5 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/hw/char/omap_uart.c b/hw/char/omap_uart.c
index 13e4f43c4c..e8da933378 100644
--- a/hw/char/omap_uart.c
+++ b/hw/char/omap_uart.c
@@ -27,7 +27,7 @@
 struct omap_uart_s {
     MemoryRegion iomem;
     hwaddr base;
-    SerialState *serial; /* TODO */
+    SerialMM *serial; /* TODO */
     struct omap_target_agent_s *ta;
     omap_clk fclk;
     qemu_irq irq;
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 667570e310..0290b3c633 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1032,16 +1032,16 @@ static const TypeInfo serial_info = {
 static uint64_t serial_mm_read(void *opaque, hwaddr addr,
                                unsigned size)
 {
-    SerialState *s = opaque;
-    return serial_ioport_read(s, addr >> s->it_shift, 1);
+    SerialMM *s = SERIAL_MM(opaque);
+    return serial_ioport_read(&s->serial, addr >> s->it_shift, 1);
 }
 
 static void serial_mm_write(void *opaque, hwaddr addr,
                             uint64_t value, unsigned size)
 {
-    SerialState *s = opaque;
+    SerialMM *s = SERIAL_MM(opaque);
     value &= 255;
-    serial_ioport_write(s, addr >> s->it_shift, value, 1);
+    serial_ioport_write(&s->serial, addr >> s->it_shift, value, 1);
 }
 
 static const MemoryRegionOps serial_mm_ops[3] = {
@@ -1068,30 +1068,49 @@ static const MemoryRegionOps serial_mm_ops[3] = {
     },
 };
 
-SerialState *serial_mm_init(MemoryRegion *address_space,
+SerialMM *serial_mm_init(MemoryRegion *address_space,
                             hwaddr base, int it_shift,
                             qemu_irq irq, int baudbase,
                             Chardev *chr, enum device_endian end)
 {
-    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
-    SerialState *s = SERIAL(dev);
+    SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
+    SerialState *s = &self->serial;
 
-    s->it_shift = it_shift;
+    self->it_shift = it_shift;
     s->irq = irq;
-    qdev_prop_set_uint32(dev, "baudbase", baudbase);
-    qdev_prop_set_chr(dev, "chardev", chr);
-    qdev_prop_set_int32(dev, "instance-id", base);
-    qdev_init_nofail(dev);
+    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
+    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
+    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
+
+    qdev_init_nofail(DEVICE(s));
+    qdev_init_nofail(DEVICE(self));
 
-    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
+    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
                           "serial", 8 << it_shift);
     memory_region_add_subregion(address_space, base, &s->io);
-    return s;
+
+    return self;
+}
+
+static void serial_mm_instance_init(Object *o)
+{
+    SerialMM *self = SERIAL_MM(o);
+
+    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
+                            TYPE_SERIAL, &error_abort, NULL);
 }
 
+static const TypeInfo serial_mm_info = {
+    .name = TYPE_SERIAL_MM,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_init = serial_mm_instance_init,
+    .instance_size = sizeof(SerialMM),
+};
+
 static void serial_register_types(void)
 {
     type_register_static(&serial_info);
+    type_register_static(&serial_mm_info);
 }
 
 type_init(serial_register_types)
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index ca7d813a52..23fdd5ec6a 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -50,7 +50,7 @@ typedef struct {
 
     MachineState *mach;
     MIPSCPSState cps;
-    SerialState *uart;
+    SerialMM *uart;
 
     CharBackend lcd_display;
     char lcd_content[8];
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 4d9c64b36a..efc3307973 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -86,7 +86,7 @@ typedef struct {
     uint32_t i2csel;
     CharBackend display;
     char display_text[9];
-    SerialState *uart;
+    SerialMM *uart;
     bool display_inited;
 } MaltaFPGAState;
 
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 7cc6304f1d..f146d426c2 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -57,7 +57,6 @@ typedef struct SerialState {
     qemu_irq irq;
     CharBackend chr;
     int last_break_enable;
-    int it_shift;
     uint32_t baudbase;
     uint32_t tsr_retry;
     guint watch_tag;
@@ -81,6 +80,14 @@ typedef struct SerialState {
     int instance_id;
 } SerialState;
 
+typedef struct SerialMM {
+    SysBusDevice parent;
+
+    SerialState serial;
+
+    int it_shift;
+} SerialMM;
+
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
@@ -89,12 +96,15 @@ void serial_set_frequency(SerialState *s, uint32_t frequency);
 #define TYPE_SERIAL "serial"
 #define SERIAL(s) OBJECT_CHECK(SerialState, (s), TYPE_SERIAL)
 
+#define TYPE_SERIAL_MM "serial-mm"
+#define SERIAL_MM(s) OBJECT_CHECK(SerialMM, (s), TYPE_SERIAL_MM)
+
 SerialState *serial_init(int base, qemu_irq irq, int baudbase,
                          Chardev *chr, MemoryRegion *system_io);
-SerialState *serial_mm_init(MemoryRegion *address_space,
-                            hwaddr base, int it_shift,
-                            qemu_irq irq, int baudbase,
-                            Chardev *chr, enum device_endian end);
+SerialMM *serial_mm_init(MemoryRegion *address_space,
+                         hwaddr base, int it_shift,
+                         qemu_irq irq, int baudbase,
+                         Chardev *chr, enum device_endian end);
 
 /* serial-isa.c */
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 14/33] serial-mm: add "regshift" property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (12 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 13/33] serial: start making SerialMM a sysbus device Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:54   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
                   ` (18 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

And a property and rename "it_shift" field to "regshift", as it seems
to be more popular (and I don't know what "it" stands for).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 23 ++++++++++++++++++-----
 include/hw/char/serial.h |  4 ++--
 2 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 0290b3c633..c28cfc94fd 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1033,7 +1033,7 @@ static uint64_t serial_mm_read(void *opaque, hwaddr addr,
                                unsigned size)
 {
     SerialMM *s = SERIAL_MM(opaque);
-    return serial_ioport_read(&s->serial, addr >> s->it_shift, 1);
+    return serial_ioport_read(&s->serial, addr >> s->regshift, 1);
 }
 
 static void serial_mm_write(void *opaque, hwaddr addr,
@@ -1041,7 +1041,7 @@ static void serial_mm_write(void *opaque, hwaddr addr,
 {
     SerialMM *s = SERIAL_MM(opaque);
     value &= 255;
-    serial_ioport_write(&s->serial, addr >> s->it_shift, value, 1);
+    serial_ioport_write(&s->serial, addr >> s->regshift, value, 1);
 }
 
 static const MemoryRegionOps serial_mm_ops[3] = {
@@ -1069,14 +1069,14 @@ static const MemoryRegionOps serial_mm_ops[3] = {
 };
 
 SerialMM *serial_mm_init(MemoryRegion *address_space,
-                            hwaddr base, int it_shift,
+                            hwaddr base, int regshift,
                             qemu_irq irq, int baudbase,
                             Chardev *chr, enum device_endian end)
 {
     SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
     SerialState *s = &self->serial;
 
-    self->it_shift = it_shift;
+    qdev_prop_set_uint8(DEVICE(self), "regshift", regshift);
     s->irq = irq;
     qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
     qdev_prop_set_chr(DEVICE(s), "chardev", chr);
@@ -1086,7 +1086,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
     qdev_init_nofail(DEVICE(self));
 
     memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
-                          "serial", 8 << it_shift);
+                          "serial", 8 << regshift);
     memory_region_add_subregion(address_space, base, &s->io);
 
     return self;
@@ -1100,11 +1100,24 @@ static void serial_mm_instance_init(Object *o)
                             TYPE_SERIAL, &error_abort, NULL);
 }
 
+static Property serial_mm_properties[] = {
+    DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void serial_mm_class_init(ObjectClass *klass, void* data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->props = serial_mm_properties;
+}
+
 static const TypeInfo serial_mm_info = {
     .name = TYPE_SERIAL_MM,
     .parent = TYPE_SYS_BUS_DEVICE,
     .instance_init = serial_mm_instance_init,
     .instance_size = sizeof(SerialMM),
+    .class_init = serial_mm_class_init,
 };
 
 static void serial_register_types(void)
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index f146d426c2..759c85976d 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -85,7 +85,7 @@ typedef struct SerialMM {
 
     SerialState serial;
 
-    int it_shift;
+    uint8_t regshift;
 } SerialMM;
 
 extern const VMStateDescription vmstate_serial;
@@ -102,7 +102,7 @@ void serial_set_frequency(SerialState *s, uint32_t frequency);
 SerialState *serial_init(int base, qemu_irq irq, int baudbase,
                          Chardev *chr, MemoryRegion *system_io);
 SerialMM *serial_mm_init(MemoryRegion *address_space,
-                         hwaddr base, int it_shift,
+                         hwaddr base, int regshift,
                          qemu_irq irq, int baudbase,
                          Chardev *chr, enum device_endian end);
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 15/33] serial-mm: add endianness property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (13 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 14/33] serial-mm: add "regshift" property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:02   ` Peter Maydell
                     ` (2 more replies)
  2019-10-23 17:31 ` [PATCH v3 16/33] serial-mm: use sysbus facilities Marc-André Lureau
                   ` (17 subsequent siblings)
  32 siblings, 3 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Add a qdev property for endianness, so memory region setup can be done
in realize.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 2 ++
 include/hw/char/serial.h | 1 +
 2 files changed, 3 insertions(+)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index c28cfc94fd..2f7667c30c 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1081,6 +1081,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
     qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
     qdev_prop_set_chr(DEVICE(s), "chardev", chr);
     qdev_prop_set_int32(DEVICE(s), "instance-id", base);
+    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
 
     qdev_init_nofail(DEVICE(s));
     qdev_init_nofail(DEVICE(self));
@@ -1102,6 +1103,7 @@ static void serial_mm_instance_init(Object *o)
 
 static Property serial_mm_properties[] = {
     DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
+    DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 759c85976d..2d0802a909 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -86,6 +86,7 @@ typedef struct SerialMM {
     SerialState serial;
 
     uint8_t regshift;
+    uint8_t endianness;
 } SerialMM;
 
 extern const VMStateDescription vmstate_serial;
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 16/33] serial-mm: use sysbus facilities
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (14 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:09   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 17/33] serial: make SerialIO a sysbus device Marc-André Lureau
                   ` (16 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Make SerialMM a regular sysbus device, by registering the irq, and the
mmio region. Reexport the internal serial properties.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c | 35 ++++++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 2f7667c30c..a40bc3ab81 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1074,21 +1074,18 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
                             Chardev *chr, enum device_endian end)
 {
     SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
-    SerialState *s = &self->serial;
+    MemoryRegion *mr;
 
     qdev_prop_set_uint8(DEVICE(self), "regshift", regshift);
-    s->irq = irq;
-    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
-    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
-    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
-    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
-
-    qdev_init_nofail(DEVICE(s));
+    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
+    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
+    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
+    qdev_prop_set_uint8(DEVICE(self), "endianness", end);
     qdev_init_nofail(DEVICE(self));
 
-    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
-                          "serial", 8 << regshift);
-    memory_region_add_subregion(address_space, base, &s->io);
+    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
+    mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(self), 0);
+    memory_region_add_subregion(address_space, base, mr);
 
     return self;
 }
@@ -1099,6 +1096,8 @@ static void serial_mm_instance_init(Object *o)
 
     object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
                             TYPE_SERIAL, &error_abort, NULL);
+
+    qdev_alias_all_properties(DEVICE(&self->serial), o);
 }
 
 static Property serial_mm_properties[] = {
@@ -1107,11 +1106,25 @@ static Property serial_mm_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
+static void serial_mm_realize(DeviceState *dev, Error **errp)
+{
+    SerialMM *self = SERIAL_MM(dev);
+    SerialState *s = &self->serial;
+
+    qdev_init_nofail(DEVICE(s));
+
+    memory_region_init_io(&s->io, NULL, &serial_mm_ops[self->endianness], self,
+                          "serial", 8 << self->regshift);
+    sysbus_init_mmio(SYS_BUS_DEVICE(self), &s->io);
+    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);
+}
+
 static void serial_mm_class_init(ObjectClass *klass, void* data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->props = serial_mm_properties;
+    dc->realize = serial_mm_realize;
 }
 
 static const TypeInfo serial_mm_info = {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 17/33] serial: make SerialIO a sysbus device
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (15 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 16/33] serial-mm: use sysbus facilities Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:16   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 18/33] mips: inline serial_init Marc-André Lureau
                   ` (15 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Make serial IO a proper sysbus device, similar to serial MM.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 58 ++++++++++++++++++++++++++++++++--------
 include/hw/char/serial.h | 13 +++++++--
 2 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index a40bc3ab81..84de2740a7 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -986,22 +986,57 @@ const MemoryRegionOps serial_io_ops = {
     .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
-SerialState *serial_init(int base, qemu_irq irq, int baudbase,
-                         Chardev *chr, MemoryRegion *system_io)
+static void serial_io_realize(DeviceState *dev, Error **errp)
 {
-    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
-    SerialState *s = SERIAL(dev);
+    SerialIO *self = SERIAL_IO(dev);
+    SerialState *s = &self->serial;
 
-    s->irq = irq;
-    qdev_prop_set_uint32(dev, "baudbase", baudbase);
-    qdev_prop_set_chr(dev, "chardev", chr);
-    qdev_prop_set_int32(dev, "instance-id", base);
-    qdev_init_nofail(dev);
+    qdev_init_nofail(DEVICE(s));
 
     memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
-    memory_region_add_subregion(system_io, base, &s->io);
+    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);
+}
+
+static void serial_io_class_init(ObjectClass *klass, void* data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = serial_io_realize;
+}
+
+static void serial_io_instance_init(Object *o)
+{
+    SerialIO *self = SERIAL_IO(o);
+
+    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
+                            TYPE_SERIAL, &error_abort, NULL);
+
+    qdev_alias_all_properties(DEVICE(&self->serial), o);
+}
+
+
+static const TypeInfo serial_io_info = {
+    .name = TYPE_SERIAL_IO,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(SerialIO),
+    .instance_init = serial_io_instance_init,
+    .class_init = serial_io_class_init,
+};
+
+SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
+                         Chardev *chr, MemoryRegion *system_io)
+{
+    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
 
-    return s;
+    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
+    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
+    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
+    qdev_init_nofail(DEVICE(self));
+
+    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
+    memory_region_add_subregion(system_io, base, &self->serial.io);
+
+    return self;
 }
 
 static Property serial_properties[] = {
@@ -1138,6 +1173,7 @@ static const TypeInfo serial_mm_info = {
 static void serial_register_types(void)
 {
     type_register_static(&serial_info);
+    type_register_static(&serial_io_info);
     type_register_static(&serial_mm_info);
 }
 
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 2d0802a909..cf9cdafaee 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -89,6 +89,12 @@ typedef struct SerialMM {
     uint8_t endianness;
 } SerialMM;
 
+typedef struct SerialIO {
+    SysBusDevice parent;
+
+    SerialState serial;
+} SerialIO;
+
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
@@ -100,8 +106,11 @@ void serial_set_frequency(SerialState *s, uint32_t frequency);
 #define TYPE_SERIAL_MM "serial-mm"
 #define SERIAL_MM(s) OBJECT_CHECK(SerialMM, (s), TYPE_SERIAL_MM)
 
-SerialState *serial_init(int base, qemu_irq irq, int baudbase,
-                         Chardev *chr, MemoryRegion *system_io);
+#define TYPE_SERIAL_IO "serial-io"
+#define SERIAL_IO(s) OBJECT_CHECK(SerialIO, (s), TYPE_SERIAL_IO)
+
+SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
+                      Chardev *chr, MemoryRegion *system_io);
 SerialMM *serial_mm_init(MemoryRegion *address_space,
                          hwaddr base, int regshift,
                          qemu_irq irq, int baudbase,
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 18/33] mips: inline serial_init
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (16 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 17/33] serial: make SerialIO a sysbus device Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:24   ` Peter Maydell
  2019-11-20  0:07   ` Aleksandar Markovic
  2019-10-23 17:31 ` [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property Marc-André Lureau
                   ` (14 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

The function is specific to mipssim, let's inline it.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/char/serial.c         | 16 ----------------
 hw/mips/mips_mipssim.c   | 13 ++++++++++---
 include/hw/char/serial.h |  2 --
 3 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/hw/char/serial.c b/hw/char/serial.c
index 84de2740a7..ca95e09ec9 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1023,22 +1023,6 @@ static const TypeInfo serial_io_info = {
     .class_init = serial_io_class_init,
 };
 
-SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
-                         Chardev *chr, MemoryRegion *system_io)
-{
-    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
-
-    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
-    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
-    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
-    qdev_init_nofail(DEVICE(self));
-
-    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
-    memory_region_add_subregion(system_io, base, &self->serial.io);
-
-    return self;
-}
-
 static Property serial_properties[] = {
     DEFINE_PROP_CHR("chardev", SerialState, chr),
     DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 282bbecb24..26fb8fa4de 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -40,6 +40,7 @@
 #include "hw/loader.h"
 #include "elf.h"
 #include "hw/sysbus.h"
+#include "hw/qdev-properties.h"
 #include "exec/address-spaces.h"
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
@@ -219,9 +220,15 @@ mips_mipssim_init(MachineState *machine)
      * A single 16450 sits at offset 0x3f8. It is attached to
      * MIPS CPU INT2, which is interrupt 4.
      */
-    if (serial_hd(0))
-        serial_init(0x3f8, env->irq[4], 115200, serial_hd(0),
-                    get_system_io());
+    if (serial_hd(0)) {
+        DeviceState *dev = qdev_create(NULL, TYPE_SERIAL_IO);
+
+        qdev_prop_set_chr(dev, "chardev", serial_hd(0));
+        qdev_prop_set_int32(dev, "instance-id", 0x3f8);
+        qdev_init_nofail(dev);
+        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, env->irq[4]);
+        sysbus_add_io(SYS_BUS_DEVICE(dev), 0x3f8, &SERIAL_IO(dev)->serial.io);
+    }
 
     if (nd_table[0].used)
         /* MIPSnet uses the MIPS CPU INT0, which is interrupt 2. */
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index cf9cdafaee..40e35e6fff 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -109,8 +109,6 @@ void serial_set_frequency(SerialState *s, uint32_t frequency);
 #define TYPE_SERIAL_IO "serial-io"
 #define SERIAL_IO(s) OBJECT_CHECK(SerialIO, (s), TYPE_SERIAL_IO)
 
-SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
-                      Chardev *chr, MemoryRegion *system_io);
 SerialMM *serial_mm_init(MemoryRegion *address_space,
                          hwaddr base, int regshift,
                          qemu_irq irq, int baudbase,
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (17 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 18/33] mips: inline serial_init Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:57   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK Marc-André Lureau
                   ` (13 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Embed the SerialMM sybus device, and re-export its "chardev" property.
That way, we can get rid of PROP_PTR "chr-state" and better track
devices relationship.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/display/sm501.c | 31 ++++++++++++++++++++++---------
 hw/sh4/r2d.c       |  2 +-
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 1f33c87e65..6efdf764c1 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -1930,13 +1930,14 @@ typedef struct {
     SM501State state;
     uint32_t vram_size;
     uint32_t base;
-    void *chr_state;
+    SerialMM serial;
 } SM501SysBusState;
 
 static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
 {
     SM501SysBusState *s = SYSBUS_SM501(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
+    SerialState *ss = &s->serial.serial;
     DeviceState *usb_dev;
 
     sm501_init(&s->state, dev, s->vram_size);
@@ -1958,17 +1959,18 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
     sysbus_pass_irq(sbd, SYS_BUS_DEVICE(usb_dev));
 
     /* bridge to serial emulation module */
-    if (s->chr_state) {
-        serial_mm_init(&s->state.mmio_region, SM501_UART0, 2,
-                       NULL, /* TODO : chain irq to IRL */
-                       115200, s->chr_state, DEVICE_LITTLE_ENDIAN);
+    if (qemu_chr_fe_backend_connected(&ss->chr)) {
+        MemoryRegion *mr;
+        qdev_init_nofail(DEVICE(&s->serial));
+        mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->serial), 0);
+        memory_region_add_subregion(&s->state.mmio_region, SM501_UART0, mr);
+        /* TODO : chain irq to IRL */
     }
 }
 
 static Property sm501_sysbus_properties[] = {
     DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0),
     DEFINE_PROP_UINT32("base", SM501SysBusState, base, 0),
-    DEFINE_PROP_PTR("chr-state", SM501SysBusState, chr_state),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -1999,9 +2001,19 @@ static void sm501_sysbus_class_init(ObjectClass *klass, void *data)
     dc->props = sm501_sysbus_properties;
     dc->reset = sm501_reset_sysbus;
     dc->vmsd = &vmstate_sm501_sysbus;
-    /* Note: pointer property "chr-state" may remain null, thus
-     * no need for dc->user_creatable = false;
-     */
+}
+
+static void sm501_sysbus_init(Object *o)
+{
+    SM501SysBusState *self = SYSBUS_SM501(o);
+    SerialMM *s = &self->serial;
+
+    sysbus_init_child_obj(o, "serial", s, sizeof(SerialMM), TYPE_SERIAL_MM);
+    qdev_prop_set_int32(DEVICE(s), "instance-id", SM501_UART0);
+    qdev_prop_set_uint8(DEVICE(s), "regshift", 2);
+    qdev_prop_set_uint8(DEVICE(s), "endianness", DEVICE_LITTLE_ENDIAN);
+
+    object_property_add_alias(o, "chardev", OBJECT(s), "chardev", &error_abort);
 }
 
 static const TypeInfo sm501_sysbus_info = {
@@ -2009,6 +2021,7 @@ static const TypeInfo sm501_sysbus_info = {
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(SM501SysBusState),
     .class_init    = sm501_sysbus_class_init,
+    .instance_init = sm501_sysbus_init,
 };
 
 #define TYPE_PCI_SM501 "sm501"
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index ee0840f380..72bb5285cc 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -272,7 +272,7 @@ static void r2d_init(MachineState *machine)
     busdev = SYS_BUS_DEVICE(dev);
     qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE);
     qdev_prop_set_uint32(dev, "base", 0x10000000);
-    qdev_prop_set_ptr(dev, "chr-state", serial_hd(2));
+    qdev_prop_set_chr(dev, "chardev", serial_hd(2));
     qdev_init_nofail(dev);
     sysbus_mmio_map(busdev, 0, 0x10000000);
     sysbus_mmio_map(busdev, 1, 0x13e00000);
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (18 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 22:59   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 21/33] lance: " Marc-André Lureau
                   ` (12 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

While at it, use the expected type.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/i386/pc.c             | 6 +++---
 hw/i386/vmmouse.c        | 8 +++-----
 hw/input/pckbd.c         | 8 +++-----
 include/hw/input/i8042.h | 4 +++-
 4 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 00ee16ccab..021ec8c593 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1861,9 +1861,9 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl, bool no_vmport)
         vmmouse = NULL;
     }
     if (vmmouse) {
-        DeviceState *dev = DEVICE(vmmouse);
-        qdev_prop_set_ptr(dev, "ps2_mouse", i8042);
-        qdev_init_nofail(dev);
+        object_property_set_link(OBJECT(vmmouse), OBJECT(i8042),
+                                 "i8042", &error_abort);
+        qdev_init_nofail(DEVICE(vmmouse));
     }
     port92 = isa_create_simple(isa_bus, "port92");
 
diff --git a/hw/i386/vmmouse.c b/hw/i386/vmmouse.c
index 41ad91ad53..c0c329f817 100644
--- a/hw/i386/vmmouse.c
+++ b/hw/i386/vmmouse.c
@@ -66,7 +66,7 @@ typedef struct VMMouseState
     uint16_t status;
     uint8_t absolute;
     QEMUPutMouseEntry *entry;
-    void *ps2_mouse;
+    ISAKBDState *i8042;
 } VMMouseState;
 
 static uint32_t vmmouse_get_status(VMMouseState *s)
@@ -105,7 +105,7 @@ static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_
 
     /* need to still generate PS2 events to notify driver to
        read from queue */
-    i8042_isa_mouse_fake_event(s->ps2_mouse);
+    i8042_isa_mouse_fake_event(s->i8042);
 }
 
 static void vmmouse_remove_handler(VMMouseState *s)
@@ -275,7 +275,7 @@ static void vmmouse_realizefn(DeviceState *dev, Error **errp)
 }
 
 static Property vmmouse_properties[] = {
-    DEFINE_PROP_PTR("ps2_mouse", VMMouseState, ps2_mouse),
+    DEFINE_PROP_LINK("i8042", VMMouseState, i8042, TYPE_I8042, ISAKBDState *),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -287,8 +287,6 @@ static void vmmouse_class_initfn(ObjectClass *klass, void *data)
     dc->reset = vmmouse_reset;
     dc->vmsd = &vmstate_vmmouse;
     dc->props = vmmouse_properties;
-    /* Reason: pointer property "ps2_mouse" */
-    dc->user_creatable = false;
 }
 
 static const TypeInfo vmmouse_info = {
diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
index f0acfd86f7..9b641021c9 100644
--- a/hw/input/pckbd.c
+++ b/hw/input/pckbd.c
@@ -483,17 +483,15 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
 
 #define I8042(obj) OBJECT_CHECK(ISAKBDState, (obj), TYPE_I8042)
 
-typedef struct ISAKBDState {
+struct ISAKBDState {
     ISADevice parent_obj;
 
     KBDState kbd;
     MemoryRegion io[2];
-} ISAKBDState;
+};
 
-void i8042_isa_mouse_fake_event(void *opaque)
+void i8042_isa_mouse_fake_event(ISAKBDState *isa)
 {
-    ISADevice *dev = opaque;
-    ISAKBDState *isa = I8042(dev);
     KBDState *s = &isa->kbd;
 
     ps2_mouse_fake_event(s->mouse);
diff --git a/include/hw/input/i8042.h b/include/hw/input/i8042.h
index 246e6f3335..8eaebf50ce 100644
--- a/include/hw/input/i8042.h
+++ b/include/hw/input/i8042.h
@@ -14,10 +14,12 @@
 
 #define I8042_A20_LINE "a20"
 
+typedef struct ISAKBDState ISAKBDState;
+
 void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
                    MemoryRegion *region, ram_addr_t size,
                    hwaddr mask);
-void i8042_isa_mouse_fake_event(void *opaque);
+void i8042_isa_mouse_fake_event(ISAKBDState *isa);
 void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
 
 #endif /* HW_INPUT_I8042_H */
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (19 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 23:00   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 22/33] etraxfs: remove PROP_PTR usage Marc-André Lureau
                   ` (11 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/dma/sparc32_dma.c | 2 +-
 hw/net/lance.c       | 5 ++---
 hw/net/pcnet-pci.c   | 2 +-
 hw/net/pcnet.h       | 2 +-
 4 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 0e5bbcdc7f..3e4da0c47f 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
     d = qdev_create(NULL, TYPE_LANCE);
     object_property_add_child(OBJECT(dev), "lance", OBJECT(d), errp);
     qdev_set_nic_properties(d, nd);
-    qdev_prop_set_ptr(d, "dma", dev);
+    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", errp);
     qdev_init_nofail(d);
 }
 
diff --git a/hw/net/lance.c b/hw/net/lance.c
index 6631e2a4e0..4d96299041 100644
--- a/hw/net/lance.c
+++ b/hw/net/lance.c
@@ -138,7 +138,8 @@ static void lance_instance_init(Object *obj)
 }
 
 static Property lance_properties[] = {
-    DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
+    DEFINE_PROP_LINK("dma", SysBusPCNetState, state.dma_opaque,
+                     TYPE_DEVICE, DeviceState *),
     DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -153,8 +154,6 @@ static void lance_class_init(ObjectClass *klass, void *data)
     dc->reset = lance_reset;
     dc->vmsd = &vmstate_lance;
     dc->props = lance_properties;
-    /* Reason: pointer property "dma" */
-    dc->user_creatable = false;
 }
 
 static const TypeInfo lance_info = {
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index 4723c30c79..d067d21e2c 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -231,7 +231,7 @@ static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
     s->irq = pci_allocate_irq(pci_dev);
     s->phys_mem_read = pci_physical_memory_read;
     s->phys_mem_write = pci_physical_memory_write;
-    s->dma_opaque = pci_dev;
+    s->dma_opaque = DEVICE(pci_dev);
 
     pcnet_common_init(DEVICE(pci_dev), s, &net_pci_pcnet_info);
 }
diff --git a/hw/net/pcnet.h b/hw/net/pcnet.h
index 28d19a5c6f..f49b213c57 100644
--- a/hw/net/pcnet.h
+++ b/hw/net/pcnet.h
@@ -50,7 +50,7 @@ struct PCNetState_st {
                          uint8_t *buf, int len, int do_bswap);
     void (*phys_mem_write)(void *dma_opaque, hwaddr addr,
                           uint8_t *buf, int len, int do_bswap);
-    void *dma_opaque;
+    DeviceState *dma_opaque;
     int tx_busy;
     int looptest;
 };
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 22/33] etraxfs: remove PROP_PTR usage
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (20 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 21/33] lance: " Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:28   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK Marc-André Lureau
                   ` (10 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

etraxfs_dma_client are not Object, so can't be exposed to user with
QOM path. Let's remove property usage and move the constructor to the
.c unit, simplifying some code on the way.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/net/etraxfs_eth.c      | 44 +++++++++++++++++++++++++++++----------
 include/hw/cris/etraxfs.h | 20 +++---------------
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/hw/net/etraxfs_eth.c b/hw/net/etraxfs_eth.c
index 4cfbf1135a..f30d963487 100644
--- a/hw/net/etraxfs_eth.c
+++ b/hw/net/etraxfs_eth.c
@@ -338,14 +338,8 @@ typedef struct ETRAXFSEthState
     uint8_t macaddr[2][6];
     uint32_t regs[FS_ETH_MAX_REGS];
 
-    union {
-        void *vdma_out;
-        struct etraxfs_dma_client *dma_out;
-    };
-    union {
-        void *vdma_in;
-        struct etraxfs_dma_client *dma_in;
-    };
+    struct etraxfs_dma_client *dma_out;
+    struct etraxfs_dma_client *dma_in;
 
     /* MDIO bus.  */
     struct qemu_mdio mdio_bus;
@@ -635,8 +629,6 @@ static void etraxfs_eth_realize(DeviceState *dev, Error **errp)
 
 static Property etraxfs_eth_properties[] = {
     DEFINE_PROP_UINT32("phyaddr", ETRAXFSEthState, phyaddr, 1),
-    DEFINE_PROP_PTR("dma_out", ETRAXFSEthState, vdma_out),
-    DEFINE_PROP_PTR("dma_in", ETRAXFSEthState, vdma_in),
     DEFINE_NIC_PROPERTIES(ETRAXFSEthState, conf),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -648,10 +640,40 @@ static void etraxfs_eth_class_init(ObjectClass *klass, void *data)
     dc->realize = etraxfs_eth_realize;
     dc->reset = etraxfs_eth_reset;
     dc->props = etraxfs_eth_properties;
-    /* Reason: pointer properties "dma_out", "dma_in" */
+    /* Reason: dma_out, dma_in are not user settable */
     dc->user_creatable = false;
 }
 
+
+/* Instantiate an ETRAXFS Ethernet MAC.  */
+DeviceState *
+etraxfs_eth_init(NICInfo *nd, hwaddr base, int phyaddr,
+                 struct etraxfs_dma_client *dma_out,
+                 struct etraxfs_dma_client *dma_in)
+{
+    DeviceState *dev;
+    qemu_check_nic_model(nd, "fseth");
+
+    dev = qdev_create(NULL, "etraxfs-eth");
+    qdev_set_nic_properties(dev, nd);
+    qdev_prop_set_uint32(dev, "phyaddr", phyaddr);
+
+    /*
+     * TODO: QOM design, define a QOM interface for "I am an etraxfs
+     * DMA client" (which replaces the current 'struct
+     * etraxfs_dma_client' ad-hoc interface), implement it on the
+     * ethernet device, and then have QOM link properties on the DMA
+     * controller device so that you can pass the interface
+     * implementations to it.
+     */
+    ETRAX_FS_ETH(dev)->dma_out = dma_out;
+    ETRAX_FS_ETH(dev)->dma_in = dma_in;
+    qdev_init_nofail(dev);
+    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
+
+    return dev;
+}
+
 static const TypeInfo etraxfs_eth_info = {
     .name          = TYPE_ETRAX_FS_ETH,
     .parent        = TYPE_SYS_BUS_DEVICE,
diff --git a/include/hw/cris/etraxfs.h b/include/hw/cris/etraxfs.h
index aa146a2cd8..403e7f95e6 100644
--- a/include/hw/cris/etraxfs.h
+++ b/include/hw/cris/etraxfs.h
@@ -30,23 +30,9 @@
 #include "hw/qdev-properties.h"
 #include "hw/sysbus.h"
 
-/* Instantiate an ETRAXFS Ethernet MAC.  */
-static inline DeviceState *
-etraxfs_eth_init(NICInfo *nd, hwaddr base, int phyaddr,
-                 void *dma_out, void *dma_in)
-{
-    DeviceState *dev;
-    qemu_check_nic_model(nd, "fseth");
-
-    dev = qdev_create(NULL, "etraxfs-eth");
-    qdev_set_nic_properties(dev, nd);
-    qdev_prop_set_uint32(dev, "phyaddr", phyaddr);
-    qdev_prop_set_ptr(dev, "dma_out", dma_out);
-    qdev_prop_set_ptr(dev, "dma_in", dma_in);
-    qdev_init_nofail(dev);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
-    return dev;
-}
+DeviceState *etraxfs_eth_init(NICInfo *nd, hwaddr base, int phyaddr,
+                              struct etraxfs_dma_client *dma_out,
+                              struct etraxfs_dma_client *dma_in);
 
 static inline DeviceState *etraxfs_ser_create(hwaddr addr,
                                               qemu_irq irq,
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (21 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 22/33] etraxfs: remove PROP_PTR usage Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 23:02   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
                   ` (9 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Link property is the correct way to pass a MemoryRegion to a device
for DMA purposes.

Sidenote: as a sysbus device, this remains non-usercreatable
even though we can drop the specific flag here.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/mips/mips_jazz.c | 3 ++-
 hw/net/dp8393x.c    | 7 +++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 8d010a0b6e..878925a963 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -284,7 +284,8 @@ static void mips_jazz_init(MachineState *machine,
             dev = qdev_create(NULL, "dp8393x");
             qdev_set_nic_properties(dev, nd);
             qdev_prop_set_uint8(dev, "it_shift", 2);
-            qdev_prop_set_ptr(dev, "dma_mr", rc4030_dma_mr);
+            object_property_set_link(OBJECT(dev), OBJECT(rc4030_dma_mr),
+                                     "dma_mr", &error_abort);
             qdev_init_nofail(dev);
             sysbus = SYS_BUS_DEVICE(dev);
             sysbus_mmio_map(sysbus, 0, 0x80001000);
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index a5678e11fa..946c7a8f64 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -173,7 +173,7 @@ typedef struct dp8393xState {
     int loopback_packet;
 
     /* Memory access */
-    void *dma_mr;
+    MemoryRegion *dma_mr;
     AddressSpace as;
 } dp8393xState;
 
@@ -922,7 +922,8 @@ static const VMStateDescription vmstate_dp8393x = {
 
 static Property dp8393x_properties[] = {
     DEFINE_NIC_PROPERTIES(dp8393xState, conf),
-    DEFINE_PROP_PTR("dma_mr", dp8393xState, dma_mr),
+    DEFINE_PROP_LINK("dma_mr", dp8393xState, dma_mr,
+                     TYPE_MEMORY_REGION, MemoryRegion *),
     DEFINE_PROP_UINT8("it_shift", dp8393xState, it_shift, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -936,8 +937,6 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
     dc->reset = dp8393x_reset;
     dc->vmsd = &vmstate_dp8393x;
     dc->props = dp8393x_properties;
-    /* Reason: dma_mr property can't be set */
-    dc->user_creatable = false;
 }
 
 static const TypeInfo dp8393x_info = {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (22 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 14:15   ` KONRAD Frederic
  2019-11-18 15:34   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c Marc-André Lureau
                   ` (8 subsequent siblings)
  32 siblings, 2 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

"set_pin_in" property is used to define a callback mechanism where the
device says "call the callback function, passing it an opaque cookie
and a 32-bit value". We already have a generic mechanism for doing
that, which is the qemu_irq. So we should just use that.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/intc/grlib_irqmp.c | 35 ++++-------------------------------
 hw/sparc/leon3.c      |  9 +++++----
 target/sparc/cpu.h    |  1 +
 3 files changed, 10 insertions(+), 35 deletions(-)

diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
index bc78e1a14f..794c643af2 100644
--- a/hw/intc/grlib_irqmp.c
+++ b/hw/intc/grlib_irqmp.c
@@ -25,6 +25,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "hw/irq.h"
 #include "hw/sysbus.h"
 #include "cpu.h"
 
@@ -58,10 +59,8 @@ typedef struct IRQMP {
 
     MemoryRegion iomem;
 
-    void *set_pil_in;
-    void *set_pil_in_opaque;
-
     IRQMPState *state;
+    qemu_irq irq;
 } IRQMP;
 
 struct IRQMPState {
@@ -82,7 +81,6 @@ static void grlib_irqmp_check_irqs(IRQMPState *state)
     uint32_t      pend   = 0;
     uint32_t      level0 = 0;
     uint32_t      level1 = 0;
-    set_pil_in_fn set_pil_in;
 
     assert(state != NULL);
     assert(state->parent != NULL);
@@ -97,14 +95,8 @@ static void grlib_irqmp_check_irqs(IRQMPState *state)
     trace_grlib_irqmp_check_irqs(state->pending, state->force[0],
                                  state->mask[0], level1, level0);
 
-    set_pil_in = (set_pil_in_fn)state->parent->set_pil_in;
-
     /* Trigger level1 interrupt first and level0 if there is no level1 */
-    if (level1 != 0) {
-        set_pil_in(state->parent->set_pil_in_opaque, level1);
-    } else {
-        set_pil_in(state->parent->set_pil_in_opaque, level0);
-    }
+    qemu_set_irq(state->parent->irq, level1 ?: level0);
 }
 
 static void grlib_irqmp_ack_mask(IRQMPState *state, uint32_t mask)
@@ -335,6 +327,7 @@ static void grlib_irqmp_init(Object *obj)
     IRQMP *irqmp = GRLIB_IRQMP(obj);
     SysBusDevice *dev = SYS_BUS_DEVICE(obj);
 
+    qdev_init_gpio_out_named(DEVICE(obj), &irqmp->irq, "grlib-irq", 1);
     memory_region_init_io(&irqmp->iomem, obj, &grlib_irqmp_ops, irqmp,
                           "irqmp", IRQMP_REG_SIZE);
 
@@ -343,31 +336,11 @@ static void grlib_irqmp_init(Object *obj)
     sysbus_init_mmio(dev, &irqmp->iomem);
 }
 
-static void grlib_irqmp_realize(DeviceState *dev, Error **errp)
-{
-    IRQMP *irqmp = GRLIB_IRQMP(dev);
-
-        /* Check parameters */
-    if (irqmp->set_pil_in == NULL) {
-        error_setg(errp, "set_pil_in cannot be NULL.");
-    }
-}
-
-static Property grlib_irqmp_properties[] = {
-    DEFINE_PROP_PTR("set_pil_in", IRQMP, set_pil_in),
-    DEFINE_PROP_PTR("set_pil_in_opaque", IRQMP, set_pil_in_opaque),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void grlib_irqmp_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->reset = grlib_irqmp_reset;
-    dc->props = grlib_irqmp_properties;
-    /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */
-    dc->user_creatable = false;
-    dc->realize = grlib_irqmp_realize;
 }
 
 static const TypeInfo grlib_irqmp_info = {
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index c5f1b1ee72..6db6ea9b5c 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -143,9 +143,10 @@ void leon3_irq_ack(void *irq_manager, int intno)
     grlib_irqmp_ack((DeviceState *)irq_manager, intno);
 }
 
-static void leon3_set_pil_in(void *opaque, uint32_t pil_in)
+static void leon3_set_pil_in(void *opaque, int n, int level)
 {
-    CPUSPARCState *env = (CPUSPARCState *)opaque;
+    CPUSPARCState *env = opaque;
+    uint32_t pil_in = level;
     CPUState *cs;
 
     assert(env != NULL);
@@ -225,8 +226,8 @@ static void leon3_generic_hw_init(MachineState *machine)
 
     /* Allocate IRQ manager */
     dev = qdev_create(NULL, TYPE_GRLIB_IRQMP);
-    qdev_prop_set_ptr(dev, "set_pil_in", leon3_set_pil_in);
-    qdev_prop_set_ptr(dev, "set_pil_in_opaque", env);
+    env->pil_irq = qemu_allocate_irq(leon3_set_pil_in, env, 0);
+    qdev_connect_gpio_out_named(dev, "grlib-irq", 0, env->pil_irq);
     qdev_init_nofail(dev);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_IRQMP_OFFSET);
     env->irq_manager = dev;
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
index 778aa8e073..709215f8c1 100644
--- a/target/sparc/cpu.h
+++ b/target/sparc/cpu.h
@@ -508,6 +508,7 @@ struct CPUSPARCState {
 #endif
     sparc_def_t def;
 
+    qemu_irq pil_irq;
     void *irq_manager;
     void (*qemu_irq_ack)(CPUSPARCState *env, void *irq_manager, int intno);
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (23 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:38   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 26/33] RFC: mips/cps: fix setting saar property Marc-André Lureau
                   ` (7 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Rather than tweaking CPU bits from leon3 machine, move it to cpu.c.

Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/sparc/leon3.c          | 37 -------------------------------------
 hw/sparc/trace-events     |  4 ----
 target/sparc/cpu.c        | 39 +++++++++++++++++++++++++++++++++++++++
 target/sparc/trace-events |  4 ++++
 4 files changed, 43 insertions(+), 41 deletions(-)

diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 6db6ea9b5c..fec460f524 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -38,7 +38,6 @@
 #include "hw/boards.h"
 #include "hw/loader.h"
 #include "elf.h"
-#include "trace.h"
 #include "exec/address-spaces.h"
 
 #include "hw/sparc/grlib.h"
@@ -143,41 +142,6 @@ void leon3_irq_ack(void *irq_manager, int intno)
     grlib_irqmp_ack((DeviceState *)irq_manager, intno);
 }
 
-static void leon3_set_pil_in(void *opaque, int n, int level)
-{
-    CPUSPARCState *env = opaque;
-    uint32_t pil_in = level;
-    CPUState *cs;
-
-    assert(env != NULL);
-
-    env->pil_in = pil_in;
-
-    if (env->pil_in && (env->interrupt_index == 0 ||
-                        (env->interrupt_index & ~15) == TT_EXTINT)) {
-        unsigned int i;
-
-        for (i = 15; i > 0; i--) {
-            if (env->pil_in & (1 << i)) {
-                int old_interrupt = env->interrupt_index;
-
-                env->interrupt_index = TT_EXTINT | i;
-                if (old_interrupt != env->interrupt_index) {
-                    cs = env_cpu(env);
-                    trace_leon3_set_irq(i);
-                    cpu_interrupt(cs, CPU_INTERRUPT_HARD);
-                }
-                break;
-            }
-        }
-    } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
-        cs = env_cpu(env);
-        trace_leon3_reset_irq(env->interrupt_index & 15);
-        env->interrupt_index = 0;
-        cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
-    }
-}
-
 static void leon3_generic_hw_init(MachineState *machine)
 {
     ram_addr_t ram_size = machine->ram_size;
@@ -226,7 +190,6 @@ static void leon3_generic_hw_init(MachineState *machine)
 
     /* Allocate IRQ manager */
     dev = qdev_create(NULL, TYPE_GRLIB_IRQMP);
-    env->pil_irq = qemu_allocate_irq(leon3_set_pil_in, env, 0);
     qdev_connect_gpio_out_named(dev, "grlib-irq", 0, env->pil_irq);
     qdev_init_nofail(dev);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_IRQMP_OFFSET);
diff --git a/hw/sparc/trace-events b/hw/sparc/trace-events
index 355b07ae05..0299df24d4 100644
--- a/hw/sparc/trace-events
+++ b/hw/sparc/trace-events
@@ -15,7 +15,3 @@ sun4m_iommu_mem_writel_pgflush(uint32_t val) "page flush 0x%x"
 sun4m_iommu_page_get_flags(uint64_t pa, uint64_t iopte, uint32_t ret) "get flags addr 0x%"PRIx64" => pte 0x%"PRIx64", *pte = 0x%x"
 sun4m_iommu_translate_pa(uint64_t addr, uint64_t pa, uint32_t iopte) "xlate dva 0x%"PRIx64" => pa 0x%"PRIx64" iopte = 0x%x"
 sun4m_iommu_bad_addr(uint64_t addr) "bad addr 0x%"PRIx64
-
-# leon3.c
-leon3_set_irq(int intno) "Set CPU IRQ %d"
-leon3_reset_irq(int intno) "Reset CPU IRQ %d"
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index bc65929552..693ffef3d1 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -25,6 +25,8 @@
 #include "exec/exec-all.h"
 #include "hw/qdev-properties.h"
 #include "qapi/visitor.h"
+#include "trace.h"
+#include "hw/irq.h"
 
 //#define DEBUG_FEATURES
 
@@ -540,6 +542,41 @@ static const sparc_def_t sparc_defs[] = {
 #endif
 };
 
+static void sparc_set_pil_in(void *opaque, int n, int level)
+{
+    CPUSPARCState *env = opaque;
+    uint32_t pil_in = level;
+    CPUState *cs;
+
+    assert(env != NULL);
+
+    env->pil_in = pil_in;
+
+    if (env->pil_in && (env->interrupt_index == 0 ||
+                        (env->interrupt_index & ~15) == TT_EXTINT)) {
+        unsigned int i;
+
+        for (i = 15; i > 0; i--) {
+            if (env->pil_in & (1 << i)) {
+                int old_interrupt = env->interrupt_index;
+
+                env->interrupt_index = TT_EXTINT | i;
+                if (old_interrupt != env->interrupt_index) {
+                    cs = env_cpu(env);
+                    trace_sparc_set_irq(i);
+                    cpu_interrupt(cs, CPU_INTERRUPT_HARD);
+                }
+                break;
+            }
+        }
+    } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
+        cs = env_cpu(env);
+        trace_sparc_reset_irq(env->interrupt_index & 15);
+        env->interrupt_index = 0;
+        cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
+    }
+}
+
 static const char * const feature_name[] = {
     "float",
     "float128",
@@ -762,6 +799,8 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
     env->version |= env->def.nwindows - 1;
 #endif
 
+    env->pil_irq = qemu_allocate_irq(sparc_set_pil_in, env, 0);
+
     cpu_exec_realizefn(cs, &local_err);
     if (local_err != NULL) {
         error_propagate(errp, local_err);
diff --git a/target/sparc/trace-events b/target/sparc/trace-events
index 6a064e2327..01c3174067 100644
--- a/target/sparc/trace-events
+++ b/target/sparc/trace-events
@@ -26,3 +26,7 @@ win_helper_no_switch_pstate(uint32_t new_pstate_regs) "change_pstate: regs new=0
 win_helper_wrpil(uint32_t psrpil, uint32_t new_pil) "old=0x%x new=0x%x"
 win_helper_done(uint32_t tl) "tl=%d"
 win_helper_retry(uint32_t tl) "tl=%d"
+
+# cpu.c
+sparc_set_irq(int intno) "Set CPU IRQ %d"
+sparc_reset_irq(int intno) "Reset CPU IRQ %d"
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 26/33] RFC: mips/cps: fix setting saar property
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (24 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU Marc-André Lureau
                   ` (6 subsequent siblings)
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

There is no "saar" property. Note: I haven't been able to test this
code. Help welcome.

May fix commit 043715d1e0fbb3e3411be3f898c5b77b7f90327a ("target/mips:
Update ITU to utilize SAARI and SAAR CP0 registers")

Cc: Aleksandar Markovic <amarkovic@wavecomp.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/mips/cps.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index 1660f86908..c49868d5da 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -106,7 +106,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
         object_property_set_bool(OBJECT(&s->itu), saar_present, "saar-present",
                                  &err);
         if (saar_present) {
-            qdev_prop_set_ptr(DEVICE(&s->itu), "saar", (void *)&env->CP0_SAAR);
+            s->itu.saar = &env->CP0_SAAR;
         }
         object_property_set_bool(OBJECT(&s->itu), true, "realized", &err);
         if (err != NULL) {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (25 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 26/33] RFC: mips/cps: fix setting saar property Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-11-18 15:40   ` Peter Maydell
  2019-10-23 17:31 ` [PATCH v3 28/33] smbus-eeprom: remove PROP_PTR Marc-André Lureau
                   ` (5 subsequent siblings)
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Instead of accessing cpu interrupt vector directly from PIC, send the
vector value over the qemu_irq.

Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/cris/axis_dev88.c  |  4 ----
 hw/intc/etraxfs_pic.c | 26 +-------------------------
 target/cris/cpu.c     |  8 ++++++++
 target/cris/cpu.h     |  1 +
 4 files changed, 10 insertions(+), 29 deletions(-)

diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 940c7dd122..be7760476a 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -253,7 +253,6 @@ void axisdev88_init(MachineState *machine)
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     CRISCPU *cpu;
-    CPUCRISState *env;
     DeviceState *dev;
     SysBusDevice *s;
     DriveInfo *nand;
@@ -267,7 +266,6 @@ void axisdev88_init(MachineState *machine)
 
     /* init CPUs */
     cpu = CRIS_CPU(cpu_create(machine->cpu_type));
-    env = &cpu->env;
 
     /* allocate RAM */
     memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
@@ -297,8 +295,6 @@ void axisdev88_init(MachineState *machine)
 
 
     dev = qdev_create(NULL, "etraxfs,pic");
-    /* FIXME: Is there a proper way to signal vectors to the CPU core?  */
-    qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
     qdev_init_nofail(dev);
     s = SYS_BUS_DEVICE(dev);
     sysbus_mmio_map(s, 0, 0x3001c000);
diff --git a/hw/intc/etraxfs_pic.c b/hw/intc/etraxfs_pic.c
index 77f652acec..12988c7aa9 100644
--- a/hw/intc/etraxfs_pic.c
+++ b/hw/intc/etraxfs_pic.c
@@ -27,8 +27,6 @@
 #include "qemu/module.h"
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
-//#include "pc.h"
-//#include "etraxfs.h"
 
 #define D(x)
 
@@ -48,7 +46,6 @@ struct etrax_pic
     SysBusDevice parent_obj;
 
     MemoryRegion mmio;
-    void *interrupt_vector;
     qemu_irq parent_irq;
     qemu_irq parent_nmi;
     uint32_t regs[R_MAX];
@@ -79,11 +76,7 @@ static void pic_update(struct etrax_pic *fs)
         }
     }
 
-    if (fs->interrupt_vector) {
-        /* hack alert: ptr property */
-        *(uint32_t*)(fs->interrupt_vector) = vector;
-    }
-    qemu_set_irq(fs->parent_irq, !!vector);
+    qemu_set_irq(fs->parent_irq, vector);
 }
 
 static uint64_t
@@ -163,28 +156,11 @@ static void etraxfs_pic_init(Object *obj)
     sysbus_init_mmio(sbd, &s->mmio);
 }
 
-static Property etraxfs_pic_properties[] = {
-    DEFINE_PROP_PTR("interrupt_vector", struct etrax_pic, interrupt_vector),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
-static void etraxfs_pic_class_init(ObjectClass *klass, void *data)
-{
-    DeviceClass *dc = DEVICE_CLASS(klass);
-
-    dc->props = etraxfs_pic_properties;
-    /*
-     * Note: pointer property "interrupt_vector" may remain null, thus
-     * no need for dc->user_creatable = false;
-     */
-}
-
 static const TypeInfo etraxfs_pic_info = {
     .name          = TYPE_ETRAX_FS_PIC,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(struct etrax_pic),
     .instance_init = etraxfs_pic_init,
-    .class_init    = etraxfs_pic_class_init,
 };
 
 static void etraxfs_pic_register_types(void)
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
index 7adfd6caf4..6a857f548d 100644
--- a/target/cris/cpu.c
+++ b/target/cris/cpu.c
@@ -147,6 +147,14 @@ static void cris_cpu_set_irq(void *opaque, int irq, int level)
     CPUState *cs = CPU(cpu);
     int type = irq == CRIS_CPU_IRQ ? CPU_INTERRUPT_HARD : CPU_INTERRUPT_NMI;
 
+    if (irq == CRIS_CPU_IRQ) {
+        /*
+         * The PIC passes us the vector for the IRQ as the value it sends
+         * over the qemu_irq line
+         */
+        cpu->env.interrupt_vector = level;
+    }
+
     if (level) {
         cpu_interrupt(cs, type);
     } else {
diff --git a/target/cris/cpu.h b/target/cris/cpu.h
index aba0a66474..a7c2a8e15b 100644
--- a/target/cris/cpu.h
+++ b/target/cris/cpu.h
@@ -34,6 +34,7 @@
 #define CPU_INTERRUPT_NMI       CPU_INTERRUPT_TGT_EXT_3
 
 /* CRUS CPU device objects interrupt lines.  */
+/* PIC passes the vector for the IRQ as the value of it sends over qemu_irq */
 #define CRIS_CPU_IRQ 0
 #define CRIS_CPU_NMI 1
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 28/33] smbus-eeprom: remove PROP_PTR
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (26 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 29/33] omap-intc: " Marc-André Lureau
                   ` (4 subsequent siblings)
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Instead, set the initial data field directly.

(the initial data is an array of 256 bytes. As I don't know if it may
change over time, I keep the pointer to original buffer as is, but it
might be worth to consider to copy it instead)

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/i2c/smbus_eeprom.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
index 54c86a0112..533c728b3b 100644
--- a/hw/i2c/smbus_eeprom.c
+++ b/hw/i2c/smbus_eeprom.c
@@ -44,7 +44,7 @@
 typedef struct SMBusEEPROMDevice {
     SMBusDevice smbusdev;
     uint8_t data[SMBUS_EEPROM_SIZE];
-    void *init_data;
+    uint8_t *init_data;
     uint8_t offset;
     bool accessed;
 } SMBusEEPROMDevice;
@@ -129,14 +129,14 @@ static void smbus_eeprom_reset(DeviceState *dev)
 
 static void smbus_eeprom_realize(DeviceState *dev, Error **errp)
 {
+    SMBusEEPROMDevice *eeprom = SMBUS_EEPROM(dev);
+
     smbus_eeprom_reset(dev);
+    if (eeprom->init_data == NULL) {
+        error_setg(errp, "init_data cannot be NULL");
+    }
 }
 
-static Property smbus_eeprom_properties[] = {
-    DEFINE_PROP_PTR("data", SMBusEEPROMDevice, init_data),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
 static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -146,9 +146,8 @@ static void smbus_eeprom_class_initfn(ObjectClass *klass, void *data)
     dc->reset = smbus_eeprom_reset;
     sc->receive_byte = eeprom_receive_byte;
     sc->write_data = eeprom_write_data;
-    dc->props = smbus_eeprom_properties;
     dc->vmsd = &vmstate_smbus_eeprom;
-    /* Reason: pointer property "data" */
+    /* Reason: init_data */
     dc->user_creatable = false;
 }
 
@@ -172,7 +171,7 @@ void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
 
     dev = qdev_create((BusState *) smbus, TYPE_SMBUS_EEPROM);
     qdev_prop_set_uint8(dev, "address", address);
-    qdev_prop_set_ptr(dev, "data", eeprom_buf);
+    SMBUS_EEPROM(dev)->init_data = eeprom_buf;
     qdev_init_nofail(dev);
 }
 
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 29/33] omap-intc: remove PROP_PTR
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (27 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 28/33] smbus-eeprom: remove PROP_PTR Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 30/33] omap-i2c: " Marc-André Lureau
                   ` (3 subsequent siblings)
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Since clocks are not QOM objects, replace PROP_PTR of clocks with
setters methods.

(in theory there should probably be different methods for omap1 &
omap2 intc, but this is left as a future improvement)

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/arm/omap1.c        |  4 ++--
 hw/arm/omap2.c        |  4 ++--
 hw/intc/omap_intc.c   | 17 ++++++++++-------
 include/hw/arm/omap.h | 14 ++++++++++++++
 4 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 6ce038a453..1afd1d3d7f 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -3889,7 +3889,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
 
     s->ih[0] = qdev_create(NULL, "omap-intc");
     qdev_prop_set_uint32(s->ih[0], "size", 0x100);
-    qdev_prop_set_ptr(s->ih[0], "clk", omap_findclk(s, "arminth_ck"));
+    omap_intc_set_iclk(OMAP_INTC(s->ih[0]), omap_findclk(s, "arminth_ck"));
     qdev_init_nofail(s->ih[0]);
     busdev = SYS_BUS_DEVICE(s->ih[0]);
     sysbus_connect_irq(busdev, 0,
@@ -3899,7 +3899,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
     sysbus_mmio_map(busdev, 0, 0xfffecb00);
     s->ih[1] = qdev_create(NULL, "omap-intc");
     qdev_prop_set_uint32(s->ih[1], "size", 0x800);
-    qdev_prop_set_ptr(s->ih[1], "clk", omap_findclk(s, "arminth_ck"));
+    omap_intc_set_iclk(OMAP_INTC(s->ih[1]), omap_findclk(s, "arminth_ck"));
     qdev_init_nofail(s->ih[1]);
     busdev = SYS_BUS_DEVICE(s->ih[1]);
     sysbus_connect_irq(busdev, 0,
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
index 457f152bac..1d7cc435ef 100644
--- a/hw/arm/omap2.c
+++ b/hw/arm/omap2.c
@@ -2308,8 +2308,8 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
     /* Actually mapped at any 2K boundary in the ARM11 private-peripheral if */
     s->ih[0] = qdev_create(NULL, "omap2-intc");
     qdev_prop_set_uint8(s->ih[0], "revision", 0x21);
-    qdev_prop_set_ptr(s->ih[0], "fclk", omap_findclk(s, "mpu_intc_fclk"));
-    qdev_prop_set_ptr(s->ih[0], "iclk", omap_findclk(s, "mpu_intc_iclk"));
+    omap_intc_set_fclk(OMAP_INTC(s->ih[0]), omap_findclk(s, "mpu_intc_fclk"));
+    omap_intc_set_iclk(OMAP_INTC(s->ih[0]), omap_findclk(s, "mpu_intc_iclk"));
     qdev_init_nofail(s->ih[0]);
     busdev = SYS_BUS_DEVICE(s->ih[0]);
     sysbus_connect_irq(busdev, 0,
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
index 854b709ca0..73bb1c2af4 100644
--- a/hw/intc/omap_intc.c
+++ b/hw/intc/omap_intc.c
@@ -38,10 +38,6 @@ struct omap_intr_handler_bank_s {
     unsigned char priority[32];
 };
 
-#define TYPE_OMAP_INTC "common-omap-intc"
-#define OMAP_INTC(obj) \
-    OBJECT_CHECK(struct omap_intr_handler_s, (obj), TYPE_OMAP_INTC)
-
 struct omap_intr_handler_s {
     SysBusDevice parent_obj;
 
@@ -391,9 +387,18 @@ static void omap_intc_realize(DeviceState *dev, Error **errp)
     }
 }
 
+void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk)
+{
+    intc->iclk = clk;
+}
+
+void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk)
+{
+    intc->fclk = clk;
+}
+
 static Property omap_intc_properties[] = {
     DEFINE_PROP_UINT32("size", struct omap_intr_handler_s, size, 0x100),
-    DEFINE_PROP_PTR("clk", struct omap_intr_handler_s, iclk),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -647,8 +652,6 @@ static void omap2_intc_realize(DeviceState *dev, Error **errp)
 static Property omap2_intc_properties[] = {
     DEFINE_PROP_UINT8("revision", struct omap_intr_handler_s,
     revision, 0x21),
-    DEFINE_PROP_PTR("iclk", struct omap_intr_handler_s, iclk),
-    DEFINE_PROP_PTR("fclk", struct omap_intr_handler_s, fclk),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index f3aa670036..bcecf19f89 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -67,6 +67,20 @@ void omap_clk_setrate(omap_clk clk, int divide, int multiply);
 int64_t omap_clk_getrate(omap_clk clk);
 void omap_clk_reparent(omap_clk clk, omap_clk parent);
 
+/* omap_intc.c */
+#define TYPE_OMAP_INTC "common-omap-intc"
+#define OMAP_INTC(obj)                                              \
+    OBJECT_CHECK(omap_intr_handler, (obj), TYPE_OMAP_INTC)
+
+typedef struct omap_intr_handler_s omap_intr_handler;
+
+/*
+ * TODO: Ideally we should have a clock framework that
+ * let us wire these clocks up with QOM properties or links.
+ */
+void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk);
+void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
+
 /* OMAP2 l4 Interconnect */
 struct omap_l4_s;
 struct omap_l4_region_s {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 30/33] omap-i2c: remove PROP_PTR
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (28 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 29/33] omap-intc: " Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 31/33] omap-gpio: " Marc-André Lureau
                   ` (2 subsequent siblings)
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Since clocks are not QOM objects, replace PROP_PTR of clocks with
setters methods.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/arm/omap1.c        |  2 +-
 hw/arm/omap2.c        |  8 ++++----
 hw/i2c/omap_i2c.c     | 19 ++++++++++++-------
 include/hw/arm/omap.h | 13 +++++++++++++
 4 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 1afd1d3d7f..807e5f70d1 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -4030,7 +4030,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
 
     s->i2c[0] = qdev_create(NULL, "omap_i2c");
     qdev_prop_set_uint8(s->i2c[0], "revision", 0x11);
-    qdev_prop_set_ptr(s->i2c[0], "fclk", omap_findclk(s, "mpuper_ck"));
+    omap_i2c_set_fclk(OMAP_I2C(s->i2c[0]), omap_findclk(s, "mpuper_ck"));
     qdev_init_nofail(s->i2c[0]);
     busdev = SYS_BUS_DEVICE(s->i2c[0]);
     sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(s->ih[1], OMAP_INT_I2C));
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
index 1d7cc435ef..171e2d0472 100644
--- a/hw/arm/omap2.c
+++ b/hw/arm/omap2.c
@@ -2425,8 +2425,8 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
 
     s->i2c[0] = qdev_create(NULL, "omap_i2c");
     qdev_prop_set_uint8(s->i2c[0], "revision", 0x34);
-    qdev_prop_set_ptr(s->i2c[0], "iclk", omap_findclk(s, "i2c1.iclk"));
-    qdev_prop_set_ptr(s->i2c[0], "fclk", omap_findclk(s, "i2c1.fclk"));
+    omap_i2c_set_iclk(OMAP_I2C(s->i2c[0]), omap_findclk(s, "i2c1.iclk"));
+    omap_i2c_set_fclk(OMAP_I2C(s->i2c[0]), omap_findclk(s, "i2c1.fclk"));
     qdev_init_nofail(s->i2c[0]);
     busdev = SYS_BUS_DEVICE(s->i2c[0]);
     sysbus_connect_irq(busdev, 0,
@@ -2437,8 +2437,8 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
 
     s->i2c[1] = qdev_create(NULL, "omap_i2c");
     qdev_prop_set_uint8(s->i2c[1], "revision", 0x34);
-    qdev_prop_set_ptr(s->i2c[1], "iclk", omap_findclk(s, "i2c2.iclk"));
-    qdev_prop_set_ptr(s->i2c[1], "fclk", omap_findclk(s, "i2c2.fclk"));
+    omap_i2c_set_iclk(OMAP_I2C(s->i2c[1]), omap_findclk(s, "i2c2.iclk"));
+    omap_i2c_set_fclk(OMAP_I2C(s->i2c[1]), omap_findclk(s, "i2c2.fclk"));
     qdev_init_nofail(s->i2c[1]);
     busdev = SYS_BUS_DEVICE(s->i2c[1]);
     sysbus_connect_irq(busdev, 0,
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
index 3ba965a58f..3ccbd5cc2c 100644
--- a/hw/i2c/omap_i2c.c
+++ b/hw/i2c/omap_i2c.c
@@ -28,10 +28,7 @@
 #include "qemu/error-report.h"
 #include "qapi/error.h"
 
-#define TYPE_OMAP_I2C "omap_i2c"
-#define OMAP_I2C(obj) OBJECT_CHECK(OMAPI2CState, (obj), TYPE_OMAP_I2C)
-
-typedef struct OMAPI2CState {
+struct OMAPI2CState {
     SysBusDevice parent_obj;
 
     MemoryRegion iomem;
@@ -56,7 +53,7 @@ typedef struct OMAPI2CState {
     uint8_t divider;
     uint8_t times[2];
     uint16_t test;
-} OMAPI2CState;
+};
 
 #define OMAP2_INTR_REV	0x34
 #define OMAP2_GC_REV	0x34
@@ -504,10 +501,18 @@ static void omap_i2c_realize(DeviceState *dev, Error **errp)
     }
 }
 
+void omap_i2c_set_iclk(OMAPI2CState *i2c, omap_clk clk)
+{
+    i2c->iclk = clk;
+}
+
+void omap_i2c_set_fclk(OMAPI2CState *i2c, omap_clk clk)
+{
+    i2c->fclk = clk;
+}
+
 static Property omap_i2c_properties[] = {
     DEFINE_PROP_UINT8("revision", OMAPI2CState, revision, 0),
-    DEFINE_PROP_PTR("iclk", OMAPI2CState, iclk),
-    DEFINE_PROP_PTR("fclk", OMAPI2CState, fclk),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index bcecf19f89..39a295ba20 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -81,6 +81,19 @@ typedef struct omap_intr_handler_s omap_intr_handler;
 void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk);
 void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
 
+/* omap_i2c.c */
+#define TYPE_OMAP_I2C "omap_i2c"
+#define OMAP_I2C(obj) OBJECT_CHECK(OMAPI2CState, (obj), TYPE_OMAP_I2C)
+
+typedef struct OMAPI2CState OMAPI2CState;
+
+/*
+ * TODO: Ideally we should have a clock framework that
+ * let us wire these clocks up with QOM properties or links.
+ */
+void omap_i2c_set_iclk(OMAPI2CState *i2c, omap_clk clk);
+void omap_i2c_set_fclk(OMAPI2CState *i2c, omap_clk clk);
+
 /* OMAP2 l4 Interconnect */
 struct omap_l4_s;
 struct omap_l4_region_s {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 31/33] omap-gpio: remove PROP_PTR
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (29 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 30/33] omap-i2c: " Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION Marc-André Lureau
  2019-10-23 17:31 ` [PATCH v3 33/33] qdev: remove QDEV_PROP_PTR Marc-André Lureau
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Since clocks are not QOM objects, replace PROP_PTR of clocks with
setters methods.

Move/adapt the existing TODO comment about a clock framework.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/arm/omap1.c        |  2 +-
 hw/arm/omap2.c        | 13 +++++++------
 hw/gpio/omap_gpio.c   | 42 +++++++++++++++---------------------------
 include/hw/arm/omap.h | 33 +++++++++++++++++++++++++++++----
 4 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
index 807e5f70d1..761cc17ea9 100644
--- a/hw/arm/omap1.c
+++ b/hw/arm/omap1.c
@@ -4012,7 +4012,7 @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
 
     s->gpio = qdev_create(NULL, "omap-gpio");
     qdev_prop_set_int32(s->gpio, "mpu_model", s->mpu_model);
-    qdev_prop_set_ptr(s->gpio, "clk", omap_findclk(s, "arm_gpio_ck"));
+    omap_gpio_set_clk(OMAP1_GPIO(s->gpio), omap_findclk(s, "arm_gpio_ck"));
     qdev_init_nofail(s->gpio);
     sysbus_connect_irq(SYS_BUS_DEVICE(s->gpio), 0,
                        qdev_get_gpio_in(s->ih[0], OMAP_INT_GPIO_BANK1));
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
index 171e2d0472..e1c11de5ce 100644
--- a/hw/arm/omap2.c
+++ b/hw/arm/omap2.c
@@ -2449,13 +2449,14 @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
 
     s->gpio = qdev_create(NULL, "omap2-gpio");
     qdev_prop_set_int32(s->gpio, "mpu_model", s->mpu_model);
-    qdev_prop_set_ptr(s->gpio, "iclk", omap_findclk(s, "gpio_iclk"));
-    qdev_prop_set_ptr(s->gpio, "fclk0", omap_findclk(s, "gpio1_dbclk"));
-    qdev_prop_set_ptr(s->gpio, "fclk1", omap_findclk(s, "gpio2_dbclk"));
-    qdev_prop_set_ptr(s->gpio, "fclk2", omap_findclk(s, "gpio3_dbclk"));
-    qdev_prop_set_ptr(s->gpio, "fclk3", omap_findclk(s, "gpio4_dbclk"));
+    omap2_gpio_set_iclk(OMAP2_GPIO(s->gpio), omap_findclk(s, "gpio_iclk"));
+    omap2_gpio_set_fclk(OMAP2_GPIO(s->gpio), 0, omap_findclk(s, "gpio1_dbclk"));
+    omap2_gpio_set_fclk(OMAP2_GPIO(s->gpio), 1, omap_findclk(s, "gpio2_dbclk"));
+    omap2_gpio_set_fclk(OMAP2_GPIO(s->gpio), 2, omap_findclk(s, "gpio3_dbclk"));
+    omap2_gpio_set_fclk(OMAP2_GPIO(s->gpio), 3, omap_findclk(s, "gpio4_dbclk"));
     if (s->mpu_model == omap2430) {
-        qdev_prop_set_ptr(s->gpio, "fclk4", omap_findclk(s, "gpio5_dbclk"));
+        omap2_gpio_set_fclk(OMAP2_GPIO(s->gpio), 4,
+                            omap_findclk(s, "gpio5_dbclk"));
     }
     qdev_init_nofail(s->gpio);
     busdev = SYS_BUS_DEVICE(s->gpio);
diff --git a/hw/gpio/omap_gpio.c b/hw/gpio/omap_gpio.c
index 41e1aa798c..85c16897ae 100644
--- a/hw/gpio/omap_gpio.c
+++ b/hw/gpio/omap_gpio.c
@@ -40,10 +40,6 @@ struct omap_gpio_s {
     uint16_t pins;
 };
 
-#define TYPE_OMAP1_GPIO "omap-gpio"
-#define OMAP1_GPIO(obj) \
-    OBJECT_CHECK(struct omap_gpif_s, (obj), TYPE_OMAP1_GPIO)
-
 struct omap_gpif_s {
     SysBusDevice parent_obj;
 
@@ -212,10 +208,6 @@ struct omap2_gpio_s {
     uint8_t delay;
 };
 
-#define TYPE_OMAP2_GPIO "omap2-gpio"
-#define OMAP2_GPIO(obj) \
-    OBJECT_CHECK(struct omap2_gpif_s, (obj), TYPE_OMAP2_GPIO)
-
 struct omap2_gpif_s {
     SysBusDevice parent_obj;
 
@@ -747,21 +739,13 @@ static void omap2_gpio_realize(DeviceState *dev, Error **errp)
     }
 }
 
-/* Using qdev pointer properties for the clocks is not ideal.
- * qdev should support a generic means of defining a 'port' with
- * an arbitrary interface for connecting two devices. Then we
- * could reframe the omap clock API in terms of clock ports,
- * and get some type safety. For now the best qdev provides is
- * passing an arbitrary pointer.
- * (It's not possible to pass in the string which is the clock
- * name, because this device does not have the necessary information
- * (ie the struct omap_mpu_state_s*) to do the clockname to pointer
- * translation.)
- */
+void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk)
+{
+    gpio->clk = clk;
+}
 
 static Property omap_gpio_properties[] = {
     DEFINE_PROP_INT32("mpu_model", struct omap_gpif_s, mpu_model, 0),
-    DEFINE_PROP_PTR("clk", struct omap_gpif_s, clk),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -784,15 +768,19 @@ static const TypeInfo omap_gpio_info = {
     .class_init    = omap_gpio_class_init,
 };
 
+void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk)
+{
+    gpio->iclk = clk;
+}
+
+void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk)
+{
+    assert(i <= 5);
+    gpio->fclk[i] = clk;
+}
+
 static Property omap2_gpio_properties[] = {
     DEFINE_PROP_INT32("mpu_model", struct omap2_gpif_s, mpu_model, 0),
-    DEFINE_PROP_PTR("iclk", struct omap2_gpif_s, iclk),
-    DEFINE_PROP_PTR("fclk0", struct omap2_gpif_s, fclk[0]),
-    DEFINE_PROP_PTR("fclk1", struct omap2_gpif_s, fclk[1]),
-    DEFINE_PROP_PTR("fclk2", struct omap2_gpif_s, fclk[2]),
-    DEFINE_PROP_PTR("fclk3", struct omap2_gpif_s, fclk[3]),
-    DEFINE_PROP_PTR("fclk4", struct omap2_gpif_s, fclk[4]),
-    DEFINE_PROP_PTR("fclk5", struct omap2_gpif_s, fclk[5]),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/arm/omap.h b/include/hw/arm/omap.h
index 39a295ba20..6be386d0e2 100644
--- a/include/hw/arm/omap.h
+++ b/include/hw/arm/omap.h
@@ -77,6 +77,16 @@ typedef struct omap_intr_handler_s omap_intr_handler;
 /*
  * TODO: Ideally we should have a clock framework that
  * let us wire these clocks up with QOM properties or links.
+ *
+ * qdev should support a generic means of defining a 'port' with
+ * an arbitrary interface for connecting two devices. Then we
+ * could reframe the omap clock API in terms of clock ports,
+ * and get some type safety. For now the best qdev provides is
+ * passing an arbitrary pointer.
+ * (It's not possible to pass in the string which is the clock
+ * name, because this device does not have the necessary information
+ * (ie the struct omap_mpu_state_s*) to do the clockname to pointer
+ * translation.)
  */
 void omap_intc_set_iclk(omap_intr_handler *intc, omap_clk clk);
 void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
@@ -87,13 +97,28 @@ void omap_intc_set_fclk(omap_intr_handler *intc, omap_clk clk);
 
 typedef struct OMAPI2CState OMAPI2CState;
 
-/*
- * TODO: Ideally we should have a clock framework that
- * let us wire these clocks up with QOM properties or links.
- */
+/* TODO: clock framework (see above) */
 void omap_i2c_set_iclk(OMAPI2CState *i2c, omap_clk clk);
 void omap_i2c_set_fclk(OMAPI2CState *i2c, omap_clk clk);
 
+/* omap_gpio.c */
+#define TYPE_OMAP1_GPIO "omap-gpio"
+#define OMAP1_GPIO(obj)                                         \
+    OBJECT_CHECK(struct omap_gpif_s, (obj), TYPE_OMAP1_GPIO)
+
+#define TYPE_OMAP2_GPIO "omap2-gpio"
+#define OMAP2_GPIO(obj)                                         \
+    OBJECT_CHECK(struct omap2_gpif_s, (obj), TYPE_OMAP2_GPIO)
+
+typedef struct omap_gpif_s omap_gpif;
+typedef struct omap2_gpif_s omap2_gpif;
+
+/* TODO: clock framework (see above) */
+void omap_gpio_set_clk(omap_gpif *gpio, omap_clk clk);
+
+void omap2_gpio_set_iclk(omap2_gpif *gpio, omap_clk clk);
+void omap2_gpio_set_fclk(omap2_gpif *gpio, uint8_t i, omap_clk clk);
+
 /* OMAP2 l4 Interconnect */
 struct omap_l4_s;
 struct omap_l4_region_s {
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (30 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 31/33] omap-gpio: " Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  2019-10-23 23:07   ` Philippe Mathieu-Daudé
  2019-10-23 17:31 ` [PATCH v3 33/33] qdev: remove QDEV_PROP_PTR Marc-André Lureau
  32 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

PROP_MEMORY_REGION was a derivative of PROP_PTR, added in commit
ed03d749f3f513b8fb0287757cfda2cb6825f063 (qdev: add MemoryRegion
property) and thankfully no longer needed since commit
3eff40dbf44896a8180c86c84dbdefb2eb173fbe (hw/misc: Remove
mmio_interface device).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 include/hw/qdev-properties.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 690ff07ae2..5bba033b7b 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -213,8 +213,6 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
     DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
 #define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
     DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
-#define DEFINE_PROP_MEMORY_REGION(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *)
 #define DEFINE_PROP_OFF_AUTO_PCIBAR(_n, _s, _f, _d) \
     DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_off_auto_pcibar, \
                         OffAutoPCIBAR)
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* [PATCH v3 33/33] qdev: remove QDEV_PROP_PTR
  2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
                   ` (31 preceding siblings ...)
  2019-10-23 17:31 ` [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION Marc-André Lureau
@ 2019-10-23 17:31 ` Marc-André Lureau
  32 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-23 17:31 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

No longer used in the tree. The comment about user_creatable is still
quite relevant, but there is already a similar comment in qdev-core.h.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/qdev-properties.c    | 18 ------------------
 include/hw/qdev-properties.h | 22 ----------------------
 2 files changed, 40 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index be4cb01f0b..6271169d7d 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -469,13 +469,6 @@ const PropertyInfo qdev_prop_string = {
     .set   = set_string,
 };
 
-/* --- pointer --- */
-
-/* Not a proper property, just for dirty hacks.  TODO Remove it!  */
-const PropertyInfo qdev_prop_ptr = {
-    .name  = "ptr",
-};
-
 /* --- mac address --- */
 
 /*
@@ -1133,17 +1126,6 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
                             name, &error_abort);
 }
 
-void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
-{
-    Property *prop;
-    void **ptr;
-
-    prop = qdev_prop_find(dev, name);
-    assert(prop && prop->info == &qdev_prop_ptr);
-    ptr = qdev_get_prop_ptr(dev, prop);
-    *ptr = value;
-}
-
 static GPtrArray *global_props(void)
 {
     static GPtrArray *gp;
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 5bba033b7b..a708c3870b 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -17,7 +17,6 @@ extern const PropertyInfo qdev_prop_size;
 extern const PropertyInfo qdev_prop_string;
 extern const PropertyInfo qdev_prop_chr;
 extern const PropertyInfo qdev_prop_tpm;
-extern const PropertyInfo qdev_prop_ptr;
 extern const PropertyInfo qdev_prop_macaddr;
 extern const PropertyInfo qdev_prop_on_off_auto;
 extern const PropertyInfo qdev_prop_losttickpolicy;
@@ -168,25 +167,6 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
 #define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d)                   \
     DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_pci_devfn, int32_t)
 
-/*
- * Please avoid pointer properties.  If you must use them, you must
- * cover them in their device's class init function as follows:
- *
- * - If the property must be set, the device cannot be used with
- *   device_add, so add code like this:
- *   |* Reason: pointer property "NAME-OF-YOUR-PROP" *|
- *   DeviceClass *dc = DEVICE_CLASS(class);
- *   dc->user_creatable = false;
- *
- * - If the property may safely remain null, document it like this:
- *   |*
- *    * Note: pointer property "interrupt_vector" may remain null, thus
- *    * no need for dc->user_creatable = false;
- *    *|
- */
-#define DEFINE_PROP_PTR(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
-
 #define DEFINE_PROP_CHR(_n, _s, _f)             \
     DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharBackend)
 #define DEFINE_PROP_STRING(_n, _s, _f)             \
@@ -259,8 +239,6 @@ void qdev_prop_set_drive(DeviceState *dev, const char *name,
 void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
                            const uint8_t *value);
 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value);
-/* FIXME: Remove opaque pointer properties.  */
-void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
 
 void qdev_prop_register_global(GlobalProperty *prop);
 int qdev_prop_check_globals(void);
-- 
2.23.0.606.g08da6496b6



^ permalink raw reply related	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 02/33] sysbus: remove unused sysbus_try_create*
  2019-10-23 17:31 ` [PATCH v3 02/33] sysbus: remove unused sysbus_try_create* Marc-André Lureau
@ 2019-10-23 22:35   ` Philippe Mathieu-Daudé
  2019-11-18 14:02   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:35 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

"Last user removed in commit 7a10ef51c (2013)."

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>   hw/core/sysbus.c    | 32 --------------------------------
>   hw/i386/pc.c        |  1 -
>   include/hw/sysbus.h |  9 +--------
>   3 files changed, 1 insertion(+), 41 deletions(-)
> 
> diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
> index 9e69c83aed..08b0311c5f 100644
> --- a/hw/core/sysbus.c
> +++ b/hw/core/sysbus.c
> @@ -250,38 +250,6 @@ DeviceState *sysbus_create_varargs(const char *name,
>       return dev;
>   }
>   
> -DeviceState *sysbus_try_create_varargs(const char *name,
> -                                       hwaddr addr, ...)
> -{
> -    DeviceState *dev;
> -    SysBusDevice *s;
> -    va_list va;
> -    qemu_irq irq;
> -    int n;
> -
> -    dev = qdev_try_create(NULL, name);
> -    if (!dev) {
> -        return NULL;
> -    }
> -    s = SYS_BUS_DEVICE(dev);
> -    qdev_init_nofail(dev);
> -    if (addr != (hwaddr)-1) {
> -        sysbus_mmio_map(s, 0, addr);
> -    }
> -    va_start(va, addr);
> -    n = 0;
> -    while (1) {
> -        irq = va_arg(va, qemu_irq);
> -        if (!irq) {
> -            break;
> -        }
> -        sysbus_connect_irq(s, n, irq);
> -        n++;
> -    }
> -    va_end(va);
> -    return dev;
> -}
> -
>   static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
>   {
>       SysBusDevice *s = SYS_BUS_DEVICE(dev);
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 4b1904237e..00ee16ccab 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1902,7 +1902,6 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
>        * 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())) {
> -        /* In order to set property, here not using sysbus_try_create_simple */
>           hpet = qdev_try_create(NULL, TYPE_HPET);
>           if (hpet) {
>               /* For pc-piix-*, hpet's intcap is always IRQ2. For pc-q35-1.7
> diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
> index 27e80881da..2eb0484388 100644
> --- a/include/hw/sysbus.h
> +++ b/include/hw/sysbus.h
> @@ -117,8 +117,7 @@ void foreach_dynamic_sysbus_device(FindSysbusDeviceFunc *func, void *opaque);
>   /* Legacy helper function for creating devices.  */
>   DeviceState *sysbus_create_varargs(const char *name,
>                                    hwaddr addr, ...);
> -DeviceState *sysbus_try_create_varargs(const char *name,
> -                                       hwaddr addr, ...);
> +
>   static inline DeviceState *sysbus_create_simple(const char *name,
>                                                 hwaddr addr,
>                                                 qemu_irq irq)
> @@ -126,11 +125,5 @@ static inline DeviceState *sysbus_create_simple(const char *name,
>       return sysbus_create_varargs(name, addr, irq, NULL);
>   }
>   
> -static inline DeviceState *sysbus_try_create_simple(const char *name,
> -                                                    hwaddr addr,
> -                                                    qemu_irq irq)
> -{
> -    return sysbus_try_create_varargs(name, addr, irq, NULL);
> -}
>   
>   #endif /* HW_SYSBUS_H */
> 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 03/33] sysbus: remove outdated comment
  2019-10-23 17:31 ` [PATCH v3 03/33] sysbus: remove outdated comment Marc-André Lureau
@ 2019-10-23 22:36   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:36 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	KONRAD Frederic, Edgar E. Iglesias, Paul Burton, Peter Maydell,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Mao Zhongyi, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> The init callback is no more since commit
> 817a17fc60f44e29a1944b60d32f45ea127f0cf9 ("core/sysbus: remove the
> SysBusDeviceClass::init path")
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   include/hw/sysbus.h | 4 ----
>   1 file changed, 4 deletions(-)
> 
> diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
> index 2eb0484388..c4a1c0adfa 100644
> --- a/include/hw/sysbus.h
> +++ b/include/hw/sysbus.h
> @@ -24,10 +24,6 @@ typedef struct SysBusDevice SysBusDevice;
>   
>   /**
>    * SysBusDeviceClass:
> - * @init: Callback function invoked when the #DeviceState.realized property
> - * is changed to %true. Deprecated, new types inheriting directly from
> - * TYPE_SYS_BUS_DEVICE should use #DeviceClass.realize instead, new leaf
> - * types should consult their respective parent type.
>    *
>    * SysBusDeviceClass is not overriding #DeviceClass.realize, so derived
>    * classes overriding it are not required to invoke its implementation.
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 08/33] serial: add "chardev" property
  2019-10-23 17:31 ` [PATCH v3 08/33] serial: add "chardev" property Marc-André Lureau
@ 2019-10-23 22:39   ` Philippe Mathieu-Daudé
  2019-11-18 14:23   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:39 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> This is more QOM-friendly, callers may set/get the property themself.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/char/serial.c | 11 +++++++++--
>   1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 4af8b0ce4c..09e89727a6 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -34,6 +34,7 @@
>   #include "sysemu/runstate.h"
>   #include "qemu/error-report.h"
>   #include "trace.h"
> +#include "hw/qdev-properties.h"
>   
>   //#define DEBUG_SERIAL
>   
> @@ -988,7 +989,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>   
>       s->irq = irq;
>       s->baudbase = baudbase;
> -    qemu_chr_fe_init(&s->chr, chr, &error_abort);
> +    qdev_prop_set_chr(dev, "chardev", chr);
>       serial_realize_core(s, &error_fatal);
>       qdev_set_legacy_instance_id(dev, base, 2);
>       qdev_init_nofail(dev);
> @@ -999,11 +1000,17 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>       return s;
>   }
>   
> +static Property serial_properties[] = {
> +    DEFINE_PROP_CHR("chardev", SerialState, chr),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
>   static void serial_class_init(ObjectClass *klass, void* data)
>   {
>       DeviceClass *dc = DEVICE_CLASS(klass);
>   
>       dc->vmsd = &vmstate_serial;
> +    dc->props = serial_properties;
>   }
>   
>   static const TypeInfo serial_info = {
> @@ -1064,7 +1071,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
>       s->it_shift = it_shift;
>       s->irq = irq;
>       s->baudbase = baudbase;
> -    qemu_chr_fe_init(&s->chr, chr, &error_abort);
> +    qdev_prop_set_chr(dev, "chardev", chr);
>   
>       serial_realize_core(s, &error_fatal);
>       qdev_set_legacy_instance_id(dev, base, 2);
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 09/33] serial: add "baudbase" property
  2019-10-23 17:31 ` [PATCH v3 09/33] serial: add "baudbase" property Marc-André Lureau
@ 2019-10-23 22:40   ` Philippe Mathieu-Daudé
  2019-11-18 14:26   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:40 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/char/serial.c         | 5 +++--
>   include/hw/char/serial.h | 2 +-
>   2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 09e89727a6..069d8715d0 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -988,7 +988,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>       SerialState *s = SERIAL(dev);
>   
>       s->irq = irq;
> -    s->baudbase = baudbase;
> +    qdev_prop_set_uint32(dev, "baudbase", baudbase);
>       qdev_prop_set_chr(dev, "chardev", chr);
>       serial_realize_core(s, &error_fatal);
>       qdev_set_legacy_instance_id(dev, base, 2);
> @@ -1002,6 +1002,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>   
>   static Property serial_properties[] = {
>       DEFINE_PROP_CHR("chardev", SerialState, chr),
> +    DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
>       DEFINE_PROP_END_OF_LIST(),
>   };
>   
> @@ -1070,7 +1071,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
>   
>       s->it_shift = it_shift;
>       s->irq = irq;
> -    s->baudbase = baudbase;
> +    qdev_prop_set_uint32(dev, "baudbase", baudbase);
>       qdev_prop_set_chr(dev, "chardev", chr);
>   
>       serial_realize_core(s, &error_fatal);
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index 180cc7c24e..3dc618598e 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -58,7 +58,7 @@ typedef struct SerialState {
>       CharBackend chr;
>       int last_break_enable;
>       int it_shift;
> -    int baudbase;
> +    uint32_t baudbase;
>       uint32_t tsr_retry;
>       guint watch_tag;
>       uint32_t wakeup;
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports
  2019-10-23 17:31 ` [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports Marc-André Lureau
@ 2019-10-23 22:41   ` Philippe Mathieu-Daudé
  2019-10-24  9:59     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:41 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Reused in following patch.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/char/serial-pci-multi.c | 26 ++++++++++++++------------
>   1 file changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 5f13b5663b..6fa1cc6225 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -77,24 +77,26 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
>       pci_set_irq(&pci->dev, pending);
>   }
>   
> +static int multi_serial_get_nr_ports(PCIDeviceClass *pc)

static size_t multi_serial_get_port_count()?

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +{
> +    switch (pc->device_id) {
> +    case 0x0003:
> +        return 2;
> +    case 0x0004:
> +        return 4;
> +    }
> +
> +    g_assert_not_reached();
> +}
> +
> +
>   static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
>   {
>       PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
>       PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
>       SerialState *s;
>       Error *err = NULL;
> -    int i, nr_ports = 0;
> -
> -    switch (pc->device_id) {
> -    case 0x0003:
> -        nr_ports = 2;
> -        break;
> -    case 0x0004:
> -        nr_ports = 4;
> -        break;
> -    }
> -    assert(nr_ports > 0);
> -    assert(nr_ports <= PCI_SERIAL_MAX_PORTS);
> +    int i, nr_ports = multi_serial_get_nr_ports(pc);
>   
>       pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
>       pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
> 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property
  2019-10-23 17:31 ` [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property Marc-André Lureau
@ 2019-10-23 22:57   ` Philippe Mathieu-Daudé
  2019-10-24 10:28     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:57 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Embed the SerialMM sybus device, and re-export its "chardev" property.
> That way, we can get rid of PROP_PTR "chr-state" and better track
> devices relationship.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/display/sm501.c | 31 ++++++++++++++++++++++---------
>   hw/sh4/r2d.c       |  2 +-
>   2 files changed, 23 insertions(+), 10 deletions(-)
> 
> diff --git a/hw/display/sm501.c b/hw/display/sm501.c
> index 1f33c87e65..6efdf764c1 100644
> --- a/hw/display/sm501.c
> +++ b/hw/display/sm501.c
> @@ -1930,13 +1930,14 @@ typedef struct {
>       SM501State state;
>       uint32_t vram_size;
>       uint32_t base;
> -    void *chr_state;
> +    SerialMM serial;
>   } SM501SysBusState;
>   
>   static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
>   {
>       SM501SysBusState *s = SYSBUS_SM501(dev);
>       SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> +    SerialState *ss = &s->serial.serial;
>       DeviceState *usb_dev;
>   
>       sm501_init(&s->state, dev, s->vram_size);
> @@ -1958,17 +1959,18 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
>       sysbus_pass_irq(sbd, SYS_BUS_DEVICE(usb_dev));
>   
>       /* bridge to serial emulation module */
> -    if (s->chr_state) {
> -        serial_mm_init(&s->state.mmio_region, SM501_UART0, 2,
> -                       NULL, /* TODO : chain irq to IRL */
> -                       115200, s->chr_state, DEVICE_LITTLE_ENDIAN);
> +    if (qemu_chr_fe_backend_connected(&ss->chr)) {

Oh, this is a Companion Chip (Northbridge + Southbridge), mostly 
implementing the display part, that's why it is in hw/display/.

The SM501_UART0 is always mapped here, no need to check for the backend.
(Not related to your series goal, but cleaning this might simplify this 
patch).

> +        MemoryRegion *mr;
> +        qdev_init_nofail(DEVICE(&s->serial));
> +        mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->serial), 0);
> +        memory_region_add_subregion(&s->state.mmio_region, SM501_UART0, mr);
> +        /* TODO : chain irq to IRL */
>       }
>   }
>   
>   static Property sm501_sysbus_properties[] = {
>       DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0),
>       DEFINE_PROP_UINT32("base", SM501SysBusState, base, 0),
> -    DEFINE_PROP_PTR("chr-state", SM501SysBusState, chr_state),
>       DEFINE_PROP_END_OF_LIST(),
>   };
>   
> @@ -1999,9 +2001,19 @@ static void sm501_sysbus_class_init(ObjectClass *klass, void *data)
>       dc->props = sm501_sysbus_properties;
>       dc->reset = sm501_reset_sysbus;
>       dc->vmsd = &vmstate_sm501_sysbus;
> -    /* Note: pointer property "chr-state" may remain null, thus
> -     * no need for dc->user_creatable = false;
> -     */
> +}
> +
> +static void sm501_sysbus_init(Object *o)
> +{
> +    SM501SysBusState *self = SYSBUS_SM501(o);
> +    SerialMM *s = &self->serial;
> +
> +    sysbus_init_child_obj(o, "serial", s, sizeof(SerialMM), TYPE_SERIAL_MM);
> +    qdev_prop_set_int32(DEVICE(s), "instance-id", SM501_UART0);
> +    qdev_prop_set_uint8(DEVICE(s), "regshift", 2);
> +    qdev_prop_set_uint8(DEVICE(s), "endianness", DEVICE_LITTLE_ENDIAN);
> +
> +    object_property_add_alias(o, "chardev", OBJECT(s), "chardev", &error_abort);
>   }
>   
>   static const TypeInfo sm501_sysbus_info = {
> @@ -2009,6 +2021,7 @@ static const TypeInfo sm501_sysbus_info = {
>       .parent        = TYPE_SYS_BUS_DEVICE,
>       .instance_size = sizeof(SM501SysBusState),
>       .class_init    = sm501_sysbus_class_init,
> +    .instance_init = sm501_sysbus_init,
>   };
>   
>   #define TYPE_PCI_SM501 "sm501"
> diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
> index ee0840f380..72bb5285cc 100644
> --- a/hw/sh4/r2d.c
> +++ b/hw/sh4/r2d.c
> @@ -272,7 +272,7 @@ static void r2d_init(MachineState *machine)
>       busdev = SYS_BUS_DEVICE(dev);
>       qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE);
>       qdev_prop_set_uint32(dev, "base", 0x10000000);
> -    qdev_prop_set_ptr(dev, "chr-state", serial_hd(2));
> +    qdev_prop_set_chr(dev, "chardev", serial_hd(2));
>       qdev_init_nofail(dev);
>       sysbus_mmio_map(busdev, 0, 0x10000000);
>       sysbus_mmio_map(busdev, 1, 0x13e00000);
> 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 ` [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK Marc-André Lureau
@ 2019-10-23 22:59   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 22:59 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> While at it, use the expected type.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   hw/i386/pc.c             | 6 +++---
>   hw/i386/vmmouse.c        | 8 +++-----
>   hw/input/pckbd.c         | 8 +++-----
>   include/hw/input/i8042.h | 4 +++-
>   4 files changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 00ee16ccab..021ec8c593 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1861,9 +1861,9 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl, bool no_vmport)
>           vmmouse = NULL;
>       }
>       if (vmmouse) {
> -        DeviceState *dev = DEVICE(vmmouse);
> -        qdev_prop_set_ptr(dev, "ps2_mouse", i8042);
> -        qdev_init_nofail(dev);
> +        object_property_set_link(OBJECT(vmmouse), OBJECT(i8042),
> +                                 "i8042", &error_abort);
> +        qdev_init_nofail(DEVICE(vmmouse));
>       }
>       port92 = isa_create_simple(isa_bus, "port92");
>   
> diff --git a/hw/i386/vmmouse.c b/hw/i386/vmmouse.c
> index 41ad91ad53..c0c329f817 100644
> --- a/hw/i386/vmmouse.c
> +++ b/hw/i386/vmmouse.c
> @@ -66,7 +66,7 @@ typedef struct VMMouseState
>       uint16_t status;
>       uint8_t absolute;
>       QEMUPutMouseEntry *entry;
> -    void *ps2_mouse;
> +    ISAKBDState *i8042;
>   } VMMouseState;
>   
>   static uint32_t vmmouse_get_status(VMMouseState *s)
> @@ -105,7 +105,7 @@ static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_
>   
>       /* need to still generate PS2 events to notify driver to
>          read from queue */
> -    i8042_isa_mouse_fake_event(s->ps2_mouse);
> +    i8042_isa_mouse_fake_event(s->i8042);
>   }
>   
>   static void vmmouse_remove_handler(VMMouseState *s)
> @@ -275,7 +275,7 @@ static void vmmouse_realizefn(DeviceState *dev, Error **errp)
>   }
>   
>   static Property vmmouse_properties[] = {
> -    DEFINE_PROP_PTR("ps2_mouse", VMMouseState, ps2_mouse),
> +    DEFINE_PROP_LINK("i8042", VMMouseState, i8042, TYPE_I8042, ISAKBDState *),
>       DEFINE_PROP_END_OF_LIST(),
>   };
>   
> @@ -287,8 +287,6 @@ static void vmmouse_class_initfn(ObjectClass *klass, void *data)
>       dc->reset = vmmouse_reset;
>       dc->vmsd = &vmstate_vmmouse;
>       dc->props = vmmouse_properties;
> -    /* Reason: pointer property "ps2_mouse" */
> -    dc->user_creatable = false;
>   }
>   
>   static const TypeInfo vmmouse_info = {
> diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
> index f0acfd86f7..9b641021c9 100644
> --- a/hw/input/pckbd.c
> +++ b/hw/input/pckbd.c
> @@ -483,17 +483,15 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
>   
>   #define I8042(obj) OBJECT_CHECK(ISAKBDState, (obj), TYPE_I8042)
>   
> -typedef struct ISAKBDState {
> +struct ISAKBDState {
>       ISADevice parent_obj;
>   
>       KBDState kbd;
>       MemoryRegion io[2];
> -} ISAKBDState;
> +};
>   
> -void i8042_isa_mouse_fake_event(void *opaque)
> +void i8042_isa_mouse_fake_event(ISAKBDState *isa)
>   {
> -    ISADevice *dev = opaque;
> -    ISAKBDState *isa = I8042(dev);
>       KBDState *s = &isa->kbd;
>   
>       ps2_mouse_fake_event(s->mouse);
> diff --git a/include/hw/input/i8042.h b/include/hw/input/i8042.h
> index 246e6f3335..8eaebf50ce 100644
> --- a/include/hw/input/i8042.h
> +++ b/include/hw/input/i8042.h
> @@ -14,10 +14,12 @@
>   
>   #define I8042_A20_LINE "a20"
>   
> +typedef struct ISAKBDState ISAKBDState;
> +
>   void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
>                      MemoryRegion *region, ram_addr_t size,
>                      hwaddr mask);
> -void i8042_isa_mouse_fake_event(void *opaque);
> +void i8042_isa_mouse_fake_event(ISAKBDState *isa);
>   void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
>   
>   #endif /* HW_INPUT_I8042_H */
> 

Nice!

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 ` [PATCH v3 21/33] lance: " Marc-André Lureau
@ 2019-10-23 23:00   ` Philippe Mathieu-Daudé
  2019-10-24 11:09     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 23:00 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   hw/dma/sparc32_dma.c | 2 +-
>   hw/net/lance.c       | 5 ++---
>   hw/net/pcnet-pci.c   | 2 +-
>   hw/net/pcnet.h       | 2 +-
>   4 files changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
> index 0e5bbcdc7f..3e4da0c47f 100644
> --- a/hw/dma/sparc32_dma.c
> +++ b/hw/dma/sparc32_dma.c
> @@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
>       d = qdev_create(NULL, TYPE_LANCE);
>       object_property_add_child(OBJECT(dev), "lance", OBJECT(d), errp);
>       qdev_set_nic_properties(d, nd);
> -    qdev_prop_set_ptr(d, "dma", dev);
> +    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", errp);
>       qdev_init_nofail(d);
>   }
>   
> diff --git a/hw/net/lance.c b/hw/net/lance.c
> index 6631e2a4e0..4d96299041 100644
> --- a/hw/net/lance.c
> +++ b/hw/net/lance.c
> @@ -138,7 +138,8 @@ static void lance_instance_init(Object *obj)
>   }
>   
>   static Property lance_properties[] = {
> -    DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
> +    DEFINE_PROP_LINK("dma", SysBusPCNetState, state.dma_opaque,
> +                     TYPE_DEVICE, DeviceState *),
>       DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
>       DEFINE_PROP_END_OF_LIST(),
>   };
> @@ -153,8 +154,6 @@ static void lance_class_init(ObjectClass *klass, void *data)
>       dc->reset = lance_reset;
>       dc->vmsd = &vmstate_lance;
>       dc->props = lance_properties;
> -    /* Reason: pointer property "dma" */
> -    dc->user_creatable = false;

But we still can not start it with the -device option and set the dma, 
can we?

>   }
>   
>   static const TypeInfo lance_info = {
> diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
> index 4723c30c79..d067d21e2c 100644
> --- a/hw/net/pcnet-pci.c
> +++ b/hw/net/pcnet-pci.c
> @@ -231,7 +231,7 @@ static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
>       s->irq = pci_allocate_irq(pci_dev);
>       s->phys_mem_read = pci_physical_memory_read;
>       s->phys_mem_write = pci_physical_memory_write;
> -    s->dma_opaque = pci_dev;
> +    s->dma_opaque = DEVICE(pci_dev);
>   
>       pcnet_common_init(DEVICE(pci_dev), s, &net_pci_pcnet_info);
>   }
> diff --git a/hw/net/pcnet.h b/hw/net/pcnet.h
> index 28d19a5c6f..f49b213c57 100644
> --- a/hw/net/pcnet.h
> +++ b/hw/net/pcnet.h
> @@ -50,7 +50,7 @@ struct PCNetState_st {
>                            uint8_t *buf, int len, int do_bswap);
>       void (*phys_mem_write)(void *dma_opaque, hwaddr addr,
>                             uint8_t *buf, int len, int do_bswap);
> -    void *dma_opaque;
> +    DeviceState *dma_opaque;
>       int tx_busy;
>       int looptest;
>   };
> 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK
  2019-10-23 17:31 ` [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK Marc-André Lureau
@ 2019-10-23 23:02   ` Philippe Mathieu-Daudé
  2019-10-24 11:12     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 23:02 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Link property is the correct way to pass a MemoryRegion to a device
> for DMA purposes.
> 
> Sidenote: as a sysbus device, this remains non-usercreatable
> even though we can drop the specific flag here.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   hw/mips/mips_jazz.c | 3 ++-
>   hw/net/dp8393x.c    | 7 +++----
>   2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> index 8d010a0b6e..878925a963 100644
> --- a/hw/mips/mips_jazz.c
> +++ b/hw/mips/mips_jazz.c
> @@ -284,7 +284,8 @@ static void mips_jazz_init(MachineState *machine,
>               dev = qdev_create(NULL, "dp8393x");
>               qdev_set_nic_properties(dev, nd);
>               qdev_prop_set_uint8(dev, "it_shift", 2);
> -            qdev_prop_set_ptr(dev, "dma_mr", rc4030_dma_mr);
> +            object_property_set_link(OBJECT(dev), OBJECT(rc4030_dma_mr),
> +                                     "dma_mr", &error_abort);
>               qdev_init_nofail(dev);
>               sysbus = SYS_BUS_DEVICE(dev);
>               sysbus_mmio_map(sysbus, 0, 0x80001000);
> diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> index a5678e11fa..946c7a8f64 100644
> --- a/hw/net/dp8393x.c
> +++ b/hw/net/dp8393x.c
> @@ -173,7 +173,7 @@ typedef struct dp8393xState {
>       int loopback_packet;
>   
>       /* Memory access */
> -    void *dma_mr;
> +    MemoryRegion *dma_mr;
>       AddressSpace as;
>   } dp8393xState;
>   
> @@ -922,7 +922,8 @@ static const VMStateDescription vmstate_dp8393x = {
>   
>   static Property dp8393x_properties[] = {
>       DEFINE_NIC_PROPERTIES(dp8393xState, conf),
> -    DEFINE_PROP_PTR("dma_mr", dp8393xState, dma_mr),
> +    DEFINE_PROP_LINK("dma_mr", dp8393xState, dma_mr,
> +                     TYPE_MEMORY_REGION, MemoryRegion *),
>       DEFINE_PROP_UINT8("it_shift", dp8393xState, it_shift, 0),
>       DEFINE_PROP_END_OF_LIST(),
>   };
> @@ -936,8 +937,6 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
>       dc->reset = dp8393x_reset;
>       dc->vmsd = &vmstate_dp8393x;
>       dc->props = dp8393x_properties;
> -    /* Reason: dma_mr property can't be set */
> -    dc->user_creatable = false;

Patch is OK except this user_creatable change I don't understand.

>   }
>   
>   static const TypeInfo dp8393x_info = {
> 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION
  2019-10-23 17:31 ` [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION Marc-André Lureau
@ 2019-10-23 23:07   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-23 23:07 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> PROP_MEMORY_REGION was a derivative of PROP_PTR, added in commit
> ed03d749f3f513b8fb0287757cfda2cb6825f063 (qdev: add MemoryRegion
> property) and thankfully no longer needed since commit
> 3eff40dbf44896a8180c86c84dbdefb2eb173fbe (hw/misc: Remove
> mmio_interface device).
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>   include/hw/qdev-properties.h | 2 --
>   1 file changed, 2 deletions(-)
> 
> diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
> index 690ff07ae2..5bba033b7b 100644
> --- a/include/hw/qdev-properties.h
> +++ b/include/hw/qdev-properties.h
> @@ -213,8 +213,6 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
>       DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
>   #define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
>       DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
> -#define DEFINE_PROP_MEMORY_REGION(_n, _s, _f)             \
> -    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *)
>   #define DEFINE_PROP_OFF_AUTO_PCIBAR(_n, _s, _f, _d) \
>       DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_off_auto_pcibar, \
>                           OffAutoPCIBAR)
> 

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 06/33] serial: initial qom-ification
  2019-10-23 17:31 ` [PATCH v3 06/33] serial: initial qom-ification Marc-André Lureau
@ 2019-10-24  8:48   ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24  8:48 UTC (permalink / raw)
  To: QEMU
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, open list:sPAPR pseries, Mark Cave-Ayland,
	Fabien Chouteau, Aleksandar Rikalo, KONRAD Frederic,
	open list:ARM, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

On Wed, Oct 23, 2019 at 9:06 PM Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Make SerialState a device (the following patches will introduce IO/MM
> sysbus serial devices)
>
> None of the serial_{,mm}_init() callers actually free the returned
> value (even if they did, it would be quite harmless), so we can change
> the object allocation at will.
>
> However, the devices that embed SerialState must now have their field
> QOM-initialized manually (isa, pci, pci-multi).
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial-isa.c       |  9 +++++++++
>  hw/char/serial-pci-multi.c | 15 +++++++++++++++
>  hw/char/serial-pci.c       | 13 ++++++++++++-
>  hw/char/serial.c           | 25 +++++++++++++++++++------
>  include/hw/char/serial.h   |  7 ++++++-
>  5 files changed, 61 insertions(+), 8 deletions(-)
>
> diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c
> index 9e31c51bb6..9a5928b3ee 100644
> --- a/hw/char/serial-isa.c
> +++ b/hw/char/serial-isa.c
> @@ -111,10 +111,19 @@ static void serial_isa_class_initfn(ObjectClass *klass, void *data)
>      set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
>  }
>
> +static void serial_isa_initfn(Object *o)
> +{
> +    ISASerialState *self = ISA_SERIAL(o);
> +
> +    object_initialize_child(o, "serial", &self->state, sizeof(self->state),
> +                            TYPE_SERIAL, &error_abort, NULL);
> +}
> +
>  static const TypeInfo serial_isa_info = {
>      .name          = TYPE_ISA_SERIAL,
>      .parent        = TYPE_ISA_DEVICE,
>      .instance_size = sizeof(ISASerialState),
> +    .instance_init = serial_isa_initfn,
>      .class_init    = serial_isa_class_initfn,
>  };
>
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 6fa1cc6225..3485bdad87 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -182,10 +182,24 @@ static void multi_4x_serial_pci_class_initfn(ObjectClass *klass, void *data)
>      set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
>  }
>
> +static void multi_serial_init(Object *o)
> +{
> +    PCIDevice *dev = PCI_DEVICE(o);
> +    PCIMultiSerialState *self = DO_UPCAST(PCIMultiSerialState, dev, dev);
> +    int i, nr_ports = multi_serial_get_nr_ports(PCI_DEVICE_GET_CLASS(dev));
> +
> +    for (i = 0; i < nr_ports; i++) {
> +        object_initialize_child(o, "serial[*]", &self->state[i],
> +                                sizeof(self->state[i]),
> +                                TYPE_SERIAL, &error_abort, NULL);
> +    }
> +}
> +
>  static const TypeInfo multi_2x_serial_pci_info = {
>      .name          = "pci-serial-2x",
>      .parent        = TYPE_PCI_DEVICE,
>      .instance_size = sizeof(PCIMultiSerialState),
> +    .instance_init = multi_serial_init,
>      .class_init    = multi_2x_serial_pci_class_initfn,
>      .interfaces = (InterfaceInfo[]) {
>          { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> @@ -197,6 +211,7 @@ static const TypeInfo multi_4x_serial_pci_info = {
>      .name          = "pci-serial-4x",
>      .parent        = TYPE_PCI_DEVICE,
>      .instance_size = sizeof(PCIMultiSerialState),
> +    .instance_init = multi_serial_init,
>      .class_init    = multi_4x_serial_pci_class_initfn,
>      .interfaces = (InterfaceInfo[]) {
>          { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
> index cb9b76e22b..a33264a1fb 100644
> --- a/hw/char/serial-pci.c
> +++ b/hw/char/serial-pci.c
> @@ -40,6 +40,8 @@ typedef struct PCISerialState {
>      uint8_t prog_if;
>  } PCISerialState;
>
> +#define TYPE_PCI_SERIAL "pci-serial"
> +#define PCI_SERIAL(s) OBJECT_CHECK(PCISerialState, (s), TYPE_PCI_SERIAL)
>
>  static void serial_pci_realize(PCIDevice *dev, Error **errp)
>  {
> @@ -103,10 +105,19 @@ static void serial_pci_class_initfn(ObjectClass *klass, void *data)
>      set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
>  }
>
> +static void serial_pci_init(Object *o)
> +{
> +    PCISerialState *self = PCI_SERIAL(o);
> +
> +    object_initialize_child(o, "serial", &self->state, sizeof(self->state),
> +                            TYPE_SERIAL, &error_abort, NULL);
> +}
> +
>  static const TypeInfo serial_pci_info = {
> -    .name          = "pci-serial",
> +    .name          = TYPE_PCI_SERIAL,
>      .parent        = TYPE_PCI_DEVICE,
>      .instance_size = sizeof(PCISerialState),
> +    .instance_init = serial_pci_init,
>      .class_init    = serial_pci_class_initfn,
>      .interfaces = (InterfaceInfo[]) {
>          { INTERFACE_CONVENTIONAL_PCI_DEVICE },
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index b4aa250950..c839035fdd 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -983,9 +983,8 @@ const MemoryRegionOps serial_io_ops = {
>  SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>                           Chardev *chr, MemoryRegion *system_io)
>  {
> -    SerialState *s;
> -
> -    s = g_malloc0(sizeof(SerialState));
> +    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> +    SerialState *s = SERIAL(dev);
>
>      s->irq = irq;
>      s->baudbase = baudbase;
> @@ -993,6 +992,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      serial_realize_core(s, &error_fatal);
>
>      vmstate_register(NULL, base, &vmstate_serial, s);
> +    qdev_init_nofail(dev);
>
>      memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
>      memory_region_add_subregion(system_io, base, &s->io);
> @@ -1000,6 +1000,12 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      return s;
>  }
>
> +static const TypeInfo serial_info = {
> +    .name = TYPE_SERIAL,
> +    .parent = TYPE_DEVICE,
> +    .instance_size = sizeof(SerialState),
> +};
> +

I added a class_init to set user_creatable=false: the base device is
useless when created from command line.

>  /* Memory mapped interface */
>  static uint64_t serial_mm_read(void *opaque, hwaddr addr,
>                                 unsigned size)
> @@ -1045,9 +1051,8 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
>                              qemu_irq irq, int baudbase,
>                              Chardev *chr, enum device_endian end)
>  {
> -    SerialState *s;
> -
> -    s = g_malloc0(sizeof(SerialState));
> +    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> +    SerialState *s = SERIAL(dev);
>
>      s->it_shift = it_shift;
>      s->irq = irq;
> @@ -1056,9 +1061,17 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
>
>      serial_realize_core(s, &error_fatal);
>      vmstate_register(NULL, base, &vmstate_serial, s);
> +    qdev_init_nofail(dev);
>
>      memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
>                            "serial", 8 << it_shift);
>      memory_region_add_subregion(address_space, base, &s->io);
>      return s;
>  }
> +
> +static void serial_register_types(void)
> +{
> +    type_register_static(&serial_info);
> +}
> +
> +type_init(serial_register_types)
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index 8be3d8a4f9..180cc7c24e 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -30,10 +30,13 @@
>  #include "exec/memory.h"
>  #include "qemu/fifo8.h"
>  #include "chardev/char.h"
> +#include "hw/sysbus.h"
>
>  #define UART_FIFO_LENGTH    16      /* 16550A Fifo Length */
>
>  typedef struct SerialState {
> +    DeviceState parent;
> +
>      uint16_t divider;
>      uint8_t rbr; /* receive register */
>      uint8_t thr; /* transmit holding register */
> @@ -84,7 +87,9 @@ void serial_realize_core(SerialState *s, Error **errp);
>  void serial_exit_core(SerialState *s);
>  void serial_set_frequency(SerialState *s, uint32_t frequency);
>
> -/* legacy pre qom */
> +#define TYPE_SERIAL "serial"
> +#define SERIAL(s) OBJECT_CHECK(SerialState, (s), TYPE_SERIAL)
> +
>  SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>                           Chardev *chr, MemoryRegion *system_io);
>  SerialState *serial_mm_init(MemoryRegion *address_space,
> --
> 2.23.0.606.g08da6496b6
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports
  2019-10-23 22:41   ` Philippe Mathieu-Daudé
@ 2019-10-24  9:59     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24  9:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On Thu, Oct 24, 2019 at 12:41 AM Philippe Mathieu-Daudé
<philmd@redhat.com> wrote:
>
> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> > Reused in following patch.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >   hw/char/serial-pci-multi.c | 26 ++++++++++++++------------
> >   1 file changed, 14 insertions(+), 12 deletions(-)
> >
> > diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> > index 5f13b5663b..6fa1cc6225 100644
> > --- a/hw/char/serial-pci-multi.c
> > +++ b/hw/char/serial-pci-multi.c
> > @@ -77,24 +77,26 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
> >       pci_set_irq(&pci->dev, pending);
> >   }
> >
> > +static int multi_serial_get_nr_ports(PCIDeviceClass *pc)
>
> static size_t multi_serial_get_port_count()?
>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

works for me, thanks

>
> > +{
> > +    switch (pc->device_id) {
> > +    case 0x0003:
> > +        return 2;
> > +    case 0x0004:
> > +        return 4;
> > +    }
> > +
> > +    g_assert_not_reached();
> > +}
> > +
> > +
> >   static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
> >   {
> >       PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
> >       PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
> >       SerialState *s;
> >       Error *err = NULL;
> > -    int i, nr_ports = 0;
> > -
> > -    switch (pc->device_id) {
> > -    case 0x0003:
> > -        nr_ports = 2;
> > -        break;
> > -    case 0x0004:
> > -        nr_ports = 4;
> > -        break;
> > -    }
> > -    assert(nr_ports > 0);
> > -    assert(nr_ports <= PCI_SERIAL_MAX_PORTS);
> > +    int i, nr_ports = multi_serial_get_nr_ports(pc);
> >
> >       pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
> >       pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
> >


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property
  2019-10-23 22:57   ` Philippe Mathieu-Daudé
@ 2019-10-24 10:28     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24 10:28 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

Hi

On Thu, Oct 24, 2019 at 12:58 AM Philippe Mathieu-Daudé
<philmd@redhat.com> wrote:
>
> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> > Embed the SerialMM sybus device, and re-export its "chardev" property.
> > That way, we can get rid of PROP_PTR "chr-state" and better track
> > devices relationship.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >   hw/display/sm501.c | 31 ++++++++++++++++++++++---------
> >   hw/sh4/r2d.c       |  2 +-
> >   2 files changed, 23 insertions(+), 10 deletions(-)
> >
> > diff --git a/hw/display/sm501.c b/hw/display/sm501.c
> > index 1f33c87e65..6efdf764c1 100644
> > --- a/hw/display/sm501.c
> > +++ b/hw/display/sm501.c
> > @@ -1930,13 +1930,14 @@ typedef struct {
> >       SM501State state;
> >       uint32_t vram_size;
> >       uint32_t base;
> > -    void *chr_state;
> > +    SerialMM serial;
> >   } SM501SysBusState;
> >
> >   static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
> >   {
> >       SM501SysBusState *s = SYSBUS_SM501(dev);
> >       SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
> > +    SerialState *ss = &s->serial.serial;
> >       DeviceState *usb_dev;
> >
> >       sm501_init(&s->state, dev, s->vram_size);
> > @@ -1958,17 +1959,18 @@ static void sm501_realize_sysbus(DeviceState *dev, Error **errp)
> >       sysbus_pass_irq(sbd, SYS_BUS_DEVICE(usb_dev));
> >
> >       /* bridge to serial emulation module */
> > -    if (s->chr_state) {
> > -        serial_mm_init(&s->state.mmio_region, SM501_UART0, 2,
> > -                       NULL, /* TODO : chain irq to IRL */
> > -                       115200, s->chr_state, DEVICE_LITTLE_ENDIAN);
> > +    if (qemu_chr_fe_backend_connected(&ss->chr)) {
>
> Oh, this is a Companion Chip (Northbridge + Southbridge), mostly
> implementing the display part, that's why it is in hw/display/.
>
> The SM501_UART0 is always mapped here, no need to check for the backend.
> (Not related to your series goal, but cleaning this might simplify this
> patch).

I see, I will drop a FIXME. Otherwise, it looks ok?


>
> > +        MemoryRegion *mr;
> > +        qdev_init_nofail(DEVICE(&s->serial));
> > +        mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->serial), 0);
> > +        memory_region_add_subregion(&s->state.mmio_region, SM501_UART0, mr);
> > +        /* TODO : chain irq to IRL */
> >       }
> >   }
> >
> >   static Property sm501_sysbus_properties[] = {
> >       DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0),
> >       DEFINE_PROP_UINT32("base", SM501SysBusState, base, 0),
> > -    DEFINE_PROP_PTR("chr-state", SM501SysBusState, chr_state),
> >       DEFINE_PROP_END_OF_LIST(),
> >   };
> >
> > @@ -1999,9 +2001,19 @@ static void sm501_sysbus_class_init(ObjectClass *klass, void *data)
> >       dc->props = sm501_sysbus_properties;
> >       dc->reset = sm501_reset_sysbus;
> >       dc->vmsd = &vmstate_sm501_sysbus;
> > -    /* Note: pointer property "chr-state" may remain null, thus
> > -     * no need for dc->user_creatable = false;
> > -     */
> > +}
> > +
> > +static void sm501_sysbus_init(Object *o)
> > +{
> > +    SM501SysBusState *self = SYSBUS_SM501(o);
> > +    SerialMM *s = &self->serial;
> > +
> > +    sysbus_init_child_obj(o, "serial", s, sizeof(SerialMM), TYPE_SERIAL_MM);
> > +    qdev_prop_set_int32(DEVICE(s), "instance-id", SM501_UART0);
> > +    qdev_prop_set_uint8(DEVICE(s), "regshift", 2);
> > +    qdev_prop_set_uint8(DEVICE(s), "endianness", DEVICE_LITTLE_ENDIAN);
> > +
> > +    object_property_add_alias(o, "chardev", OBJECT(s), "chardev", &error_abort);
> >   }
> >
> >   static const TypeInfo sm501_sysbus_info = {
> > @@ -2009,6 +2021,7 @@ static const TypeInfo sm501_sysbus_info = {
> >       .parent        = TYPE_SYS_BUS_DEVICE,
> >       .instance_size = sizeof(SM501SysBusState),
> >       .class_init    = sm501_sysbus_class_init,
> > +    .instance_init = sm501_sysbus_init,
> >   };
> >
> >   #define TYPE_PCI_SM501 "sm501"
> > diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
> > index ee0840f380..72bb5285cc 100644
> > --- a/hw/sh4/r2d.c
> > +++ b/hw/sh4/r2d.c
> > @@ -272,7 +272,7 @@ static void r2d_init(MachineState *machine)
> >       busdev = SYS_BUS_DEVICE(dev);
> >       qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE);
> >       qdev_prop_set_uint32(dev, "base", 0x10000000);
> > -    qdev_prop_set_ptr(dev, "chr-state", serial_hd(2));
> > +    qdev_prop_set_chr(dev, "chardev", serial_hd(2));
> >       qdev_init_nofail(dev);
> >       sysbus_mmio_map(busdev, 0, 0x10000000);
> >       sysbus_mmio_map(busdev, 1, 0x13e00000);
> >


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-23 23:00   ` Philippe Mathieu-Daudé
@ 2019-10-24 11:09     ` Marc-André Lureau
  2019-10-24 11:47       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24 11:09 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

Hi


On Thu, Oct 24, 2019 at 1:01 AM Philippe Mathieu-Daudé
<philmd@redhat.com> wrote:
>
> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> >   hw/dma/sparc32_dma.c | 2 +-
> >   hw/net/lance.c       | 5 ++---
> >   hw/net/pcnet-pci.c   | 2 +-
> >   hw/net/pcnet.h       | 2 +-
> >   4 files changed, 5 insertions(+), 6 deletions(-)
> >
> > diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
> > index 0e5bbcdc7f..3e4da0c47f 100644
> > --- a/hw/dma/sparc32_dma.c
> > +++ b/hw/dma/sparc32_dma.c
> > @@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
> >       d = qdev_create(NULL, TYPE_LANCE);
> >       object_property_add_child(OBJECT(dev), "lance", OBJECT(d), errp);
> >       qdev_set_nic_properties(d, nd);
> > -    qdev_prop_set_ptr(d, "dma", dev);
> > +    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", errp);
> >       qdev_init_nofail(d);
> >   }
> >
> > diff --git a/hw/net/lance.c b/hw/net/lance.c
> > index 6631e2a4e0..4d96299041 100644
> > --- a/hw/net/lance.c
> > +++ b/hw/net/lance.c
> > @@ -138,7 +138,8 @@ static void lance_instance_init(Object *obj)
> >   }
> >
> >   static Property lance_properties[] = {
> > -    DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
> > +    DEFINE_PROP_LINK("dma", SysBusPCNetState, state.dma_opaque,
> > +                     TYPE_DEVICE, DeviceState *),
> >       DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
> >       DEFINE_PROP_END_OF_LIST(),
> >   };
> > @@ -153,8 +154,6 @@ static void lance_class_init(ObjectClass *klass, void *data)
> >       dc->reset = lance_reset;
> >       dc->vmsd = &vmstate_lance;
> >       dc->props = lance_properties;
> > -    /* Reason: pointer property "dma" */
> > -    dc->user_creatable = false;
>
> But we still can not start it with the -device option and set the dma,
> can we?

This is a sysbus device, so you can't. I'll add a commit comment.

In theory, link property allows you to pass a QOM path to reference a
QOM instance from -device.

>
> >   }
> >
> >   static const TypeInfo lance_info = {
> > diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
> > index 4723c30c79..d067d21e2c 100644
> > --- a/hw/net/pcnet-pci.c
> > +++ b/hw/net/pcnet-pci.c
> > @@ -231,7 +231,7 @@ static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
> >       s->irq = pci_allocate_irq(pci_dev);
> >       s->phys_mem_read = pci_physical_memory_read;
> >       s->phys_mem_write = pci_physical_memory_write;
> > -    s->dma_opaque = pci_dev;
> > +    s->dma_opaque = DEVICE(pci_dev);
> >
> >       pcnet_common_init(DEVICE(pci_dev), s, &net_pci_pcnet_info);
> >   }
> > diff --git a/hw/net/pcnet.h b/hw/net/pcnet.h
> > index 28d19a5c6f..f49b213c57 100644
> > --- a/hw/net/pcnet.h
> > +++ b/hw/net/pcnet.h
> > @@ -50,7 +50,7 @@ struct PCNetState_st {
> >                            uint8_t *buf, int len, int do_bswap);
> >       void (*phys_mem_write)(void *dma_opaque, hwaddr addr,
> >                             uint8_t *buf, int len, int do_bswap);
> > -    void *dma_opaque;
> > +    DeviceState *dma_opaque;
> >       int tx_busy;
> >       int looptest;
> >   };
> >


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK
  2019-10-23 23:02   ` Philippe Mathieu-Daudé
@ 2019-10-24 11:12     ` Marc-André Lureau
  2019-10-24 11:48       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24 11:12 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On Thu, Oct 24, 2019 at 1:02 AM Philippe Mathieu-Daudé
<philmd@redhat.com> wrote:
>
> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> > Link property is the correct way to pass a MemoryRegion to a device
> > for DMA purposes.
> >
> > Sidenote: as a sysbus device, this remains non-usercreatable
> > even though we can drop the specific flag here.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> >   hw/mips/mips_jazz.c | 3 ++-
> >   hw/net/dp8393x.c    | 7 +++----
> >   2 files changed, 5 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> > index 8d010a0b6e..878925a963 100644
> > --- a/hw/mips/mips_jazz.c
> > +++ b/hw/mips/mips_jazz.c
> > @@ -284,7 +284,8 @@ static void mips_jazz_init(MachineState *machine,
> >               dev = qdev_create(NULL, "dp8393x");
> >               qdev_set_nic_properties(dev, nd);
> >               qdev_prop_set_uint8(dev, "it_shift", 2);
> > -            qdev_prop_set_ptr(dev, "dma_mr", rc4030_dma_mr);
> > +            object_property_set_link(OBJECT(dev), OBJECT(rc4030_dma_mr),
> > +                                     "dma_mr", &error_abort);
> >               qdev_init_nofail(dev);
> >               sysbus = SYS_BUS_DEVICE(dev);
> >               sysbus_mmio_map(sysbus, 0, 0x80001000);
> > diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> > index a5678e11fa..946c7a8f64 100644
> > --- a/hw/net/dp8393x.c
> > +++ b/hw/net/dp8393x.c
> > @@ -173,7 +173,7 @@ typedef struct dp8393xState {
> >       int loopback_packet;
> >
> >       /* Memory access */
> > -    void *dma_mr;
> > +    MemoryRegion *dma_mr;
> >       AddressSpace as;
> >   } dp8393xState;
> >
> > @@ -922,7 +922,8 @@ static const VMStateDescription vmstate_dp8393x = {
> >
> >   static Property dp8393x_properties[] = {
> >       DEFINE_NIC_PROPERTIES(dp8393xState, conf),
> > -    DEFINE_PROP_PTR("dma_mr", dp8393xState, dma_mr),
> > +    DEFINE_PROP_LINK("dma_mr", dp8393xState, dma_mr,
> > +                     TYPE_MEMORY_REGION, MemoryRegion *),
> >       DEFINE_PROP_UINT8("it_shift", dp8393xState, it_shift, 0),
> >       DEFINE_PROP_END_OF_LIST(),
> >   };
> > @@ -936,8 +937,6 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
> >       dc->reset = dp8393x_reset;
> >       dc->vmsd = &vmstate_dp8393x;
> >       dc->props = dp8393x_properties;
> > -    /* Reason: dma_mr property can't be set */
> > -    dc->user_creatable = false;
>
> Patch is OK except this user_creatable change I don't understand.

It's a sysbus device, so it's not user-creatable anyway. I'll add a
commit comment.

>
> >   }
> >
> >   static const TypeInfo dp8393x_info = {
> >


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-24 11:09     ` Marc-André Lureau
@ 2019-10-24 11:47       ` Philippe Mathieu-Daudé
  2019-10-24 11:52         ` Peter Maydell
  2019-10-24 12:25         ` Marc-André Lureau
  0 siblings, 2 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-24 11:47 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On 10/24/19 1:09 PM, Marc-André Lureau wrote:
> Hi
> 
> 
> On Thu, Oct 24, 2019 at 1:01 AM Philippe Mathieu-Daudé
> <philmd@redhat.com> wrote:
>>
>> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
>>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>>> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>>> ---
>>>    hw/dma/sparc32_dma.c | 2 +-
>>>    hw/net/lance.c       | 5 ++---
>>>    hw/net/pcnet-pci.c   | 2 +-
>>>    hw/net/pcnet.h       | 2 +-
>>>    4 files changed, 5 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
>>> index 0e5bbcdc7f..3e4da0c47f 100644
>>> --- a/hw/dma/sparc32_dma.c
>>> +++ b/hw/dma/sparc32_dma.c
>>> @@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
>>>        d = qdev_create(NULL, TYPE_LANCE);
>>>        object_property_add_child(OBJECT(dev), "lance", OBJECT(d), errp);
>>>        qdev_set_nic_properties(d, nd);
>>> -    qdev_prop_set_ptr(d, "dma", dev);
>>> +    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", errp);
>>>        qdev_init_nofail(d);
>>>    }
>>>
>>> diff --git a/hw/net/lance.c b/hw/net/lance.c
>>> index 6631e2a4e0..4d96299041 100644
>>> --- a/hw/net/lance.c
>>> +++ b/hw/net/lance.c
>>> @@ -138,7 +138,8 @@ static void lance_instance_init(Object *obj)
>>>    }
>>>
>>>    static Property lance_properties[] = {
>>> -    DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
>>> +    DEFINE_PROP_LINK("dma", SysBusPCNetState, state.dma_opaque,
>>> +                     TYPE_DEVICE, DeviceState *),
>>>        DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
>>>        DEFINE_PROP_END_OF_LIST(),
>>>    };
>>> @@ -153,8 +154,6 @@ static void lance_class_init(ObjectClass *klass, void *data)
>>>        dc->reset = lance_reset;
>>>        dc->vmsd = &vmstate_lance;
>>>        dc->props = lance_properties;
>>> -    /* Reason: pointer property "dma" */
>>> -    dc->user_creatable = false;
>>
>> But we still can not start it with the -device option and set the dma,
>> can we?
> 
> This is a sysbus device, so you can't. I'll add a commit comment.

Ah OK, understood now.

With comment:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> 
> In theory, link property allows you to pass a QOM path to reference a
> QOM instance from -device.

Just wondering, if we had a "bus_address" property to the abstract 
SysBus class (and eventually "bus_name" for later) we could create/map
sysbus devices from command line?

>>
>>>    }
>>>
>>>    static const TypeInfo lance_info = {
>>> diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
>>> index 4723c30c79..d067d21e2c 100644
>>> --- a/hw/net/pcnet-pci.c
>>> +++ b/hw/net/pcnet-pci.c
>>> @@ -231,7 +231,7 @@ static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
>>>        s->irq = pci_allocate_irq(pci_dev);
>>>        s->phys_mem_read = pci_physical_memory_read;
>>>        s->phys_mem_write = pci_physical_memory_write;
>>> -    s->dma_opaque = pci_dev;
>>> +    s->dma_opaque = DEVICE(pci_dev);
>>>
>>>        pcnet_common_init(DEVICE(pci_dev), s, &net_pci_pcnet_info);
>>>    }
>>> diff --git a/hw/net/pcnet.h b/hw/net/pcnet.h
>>> index 28d19a5c6f..f49b213c57 100644
>>> --- a/hw/net/pcnet.h
>>> +++ b/hw/net/pcnet.h
>>> @@ -50,7 +50,7 @@ struct PCNetState_st {
>>>                             uint8_t *buf, int len, int do_bswap);
>>>        void (*phys_mem_write)(void *dma_opaque, hwaddr addr,
>>>                              uint8_t *buf, int len, int do_bswap);
>>> -    void *dma_opaque;
>>> +    DeviceState *dma_opaque;
>>>        int tx_busy;
>>>        int looptest;
>>>    };
>>>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK
  2019-10-24 11:12     ` Marc-André Lureau
@ 2019-10-24 11:48       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-10-24 11:48 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On 10/24/19 1:12 PM, Marc-André Lureau wrote:
> On Thu, Oct 24, 2019 at 1:02 AM Philippe Mathieu-Daudé
> <philmd@redhat.com> wrote:
>>
>> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
>>> Link property is the correct way to pass a MemoryRegion to a device
>>> for DMA purposes.
>>>
>>> Sidenote: as a sysbus device, this remains non-usercreatable
>>> even though we can drop the specific flag here.
>>>
>>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>>> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>>> ---
>>>    hw/mips/mips_jazz.c | 3 ++-
>>>    hw/net/dp8393x.c    | 7 +++----
>>>    2 files changed, 5 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
>>> index 8d010a0b6e..878925a963 100644
>>> --- a/hw/mips/mips_jazz.c
>>> +++ b/hw/mips/mips_jazz.c
>>> @@ -284,7 +284,8 @@ static void mips_jazz_init(MachineState *machine,
>>>                dev = qdev_create(NULL, "dp8393x");
>>>                qdev_set_nic_properties(dev, nd);
>>>                qdev_prop_set_uint8(dev, "it_shift", 2);
>>> -            qdev_prop_set_ptr(dev, "dma_mr", rc4030_dma_mr);
>>> +            object_property_set_link(OBJECT(dev), OBJECT(rc4030_dma_mr),
>>> +                                     "dma_mr", &error_abort);
>>>                qdev_init_nofail(dev);
>>>                sysbus = SYS_BUS_DEVICE(dev);
>>>                sysbus_mmio_map(sysbus, 0, 0x80001000);
>>> diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
>>> index a5678e11fa..946c7a8f64 100644
>>> --- a/hw/net/dp8393x.c
>>> +++ b/hw/net/dp8393x.c
>>> @@ -173,7 +173,7 @@ typedef struct dp8393xState {
>>>        int loopback_packet;
>>>
>>>        /* Memory access */
>>> -    void *dma_mr;
>>> +    MemoryRegion *dma_mr;
>>>        AddressSpace as;
>>>    } dp8393xState;
>>>
>>> @@ -922,7 +922,8 @@ static const VMStateDescription vmstate_dp8393x = {
>>>
>>>    static Property dp8393x_properties[] = {
>>>        DEFINE_NIC_PROPERTIES(dp8393xState, conf),
>>> -    DEFINE_PROP_PTR("dma_mr", dp8393xState, dma_mr),
>>> +    DEFINE_PROP_LINK("dma_mr", dp8393xState, dma_mr,
>>> +                     TYPE_MEMORY_REGION, MemoryRegion *),
>>>        DEFINE_PROP_UINT8("it_shift", dp8393xState, it_shift, 0),
>>>        DEFINE_PROP_END_OF_LIST(),
>>>    };
>>> @@ -936,8 +937,6 @@ static void dp8393x_class_init(ObjectClass *klass, void *data)
>>>        dc->reset = dp8393x_reset;
>>>        dc->vmsd = &vmstate_dp8393x;
>>>        dc->props = dp8393x_properties;
>>> -    /* Reason: dma_mr property can't be set */
>>> -    dc->user_creatable = false;
>>
>> Patch is OK except this user_creatable change I don't understand.
> 
> It's a sysbus device, so it's not user-creatable anyway. I'll add a
> commit comment.

With comment:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> 
>>
>>>    }
>>>
>>>    static const TypeInfo dp8393x_info = {
>>>


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-24 11:47       ` Philippe Mathieu-Daudé
@ 2019-10-24 11:52         ` Peter Maydell
  2019-10-24 18:07           ` Eduardo Habkost
  2019-10-24 12:25         ` Marc-André Lureau
  1 sibling, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-10-24 11:52 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Marc-André Lureau, Artyom Tarasenko, Eduardo Habkost,
	Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Thu, 24 Oct 2019 at 12:48, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> Just wondering, if we had a "bus_address" property to the abstract
> SysBus class (and eventually "bus_name" for later) we could create/map
> sysbus devices from command line?

I don't think this is a good plan -- users shouldn't have to know
about the memory map of their boards. Plus it doesn't deal with
the complications of multiple address spaces, DMA, wiring up
irq lines to an interrupt controller, SoC reset handling,
clocks, power-managment...  Command line -device was designed
for pluggable devices, where in the world of real hardware
the device can be physically plugged and unplugged and there's
a clear interface that can be modelled. You can't add an
extra UART to an embedded board in real hardware either.

The only plausible argument I've seen for command-line
plugging of embedded devices is as a sort of side-effect
of having a configuration language syntax for them for
the purpose of being able to write board models as
data-driven config files rather than in C code. But
that would be a lot of design and engineering work, and
if we want that I think we should approach it forwards,
not arrive at it backwards by adding gradual tweaks like
'address' properties to devices.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-24 11:47       ` Philippe Mathieu-Daudé
  2019-10-24 11:52         ` Peter Maydell
@ 2019-10-24 12:25         ` Marc-André Lureau
  1 sibling, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-10-24 12:25 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

On Thu, Oct 24, 2019 at 2:17 PM Philippe Mathieu-Daudé
<philmd@redhat.com> wrote:
>
> On 10/24/19 1:09 PM, Marc-André Lureau wrote:
> > Hi
> >
> >
> > On Thu, Oct 24, 2019 at 1:01 AM Philippe Mathieu-Daudé
> > <philmd@redhat.com> wrote:
> >>
> >> On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> >>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> >>> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
> >>> ---
> >>>    hw/dma/sparc32_dma.c | 2 +-
> >>>    hw/net/lance.c       | 5 ++---
> >>>    hw/net/pcnet-pci.c   | 2 +-
> >>>    hw/net/pcnet.h       | 2 +-
> >>>    4 files changed, 5 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
> >>> index 0e5bbcdc7f..3e4da0c47f 100644
> >>> --- a/hw/dma/sparc32_dma.c
> >>> +++ b/hw/dma/sparc32_dma.c
> >>> @@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
> >>>        d = qdev_create(NULL, TYPE_LANCE);
> >>>        object_property_add_child(OBJECT(dev), "lance", OBJECT(d), errp);
> >>>        qdev_set_nic_properties(d, nd);
> >>> -    qdev_prop_set_ptr(d, "dma", dev);
> >>> +    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", errp);
> >>>        qdev_init_nofail(d);
> >>>    }
> >>>
> >>> diff --git a/hw/net/lance.c b/hw/net/lance.c
> >>> index 6631e2a4e0..4d96299041 100644
> >>> --- a/hw/net/lance.c
> >>> +++ b/hw/net/lance.c
> >>> @@ -138,7 +138,8 @@ static void lance_instance_init(Object *obj)
> >>>    }
> >>>
> >>>    static Property lance_properties[] = {
> >>> -    DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
> >>> +    DEFINE_PROP_LINK("dma", SysBusPCNetState, state.dma_opaque,
> >>> +                     TYPE_DEVICE, DeviceState *),
> >>>        DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
> >>>        DEFINE_PROP_END_OF_LIST(),
> >>>    };
> >>> @@ -153,8 +154,6 @@ static void lance_class_init(ObjectClass *klass, void *data)
> >>>        dc->reset = lance_reset;
> >>>        dc->vmsd = &vmstate_lance;
> >>>        dc->props = lance_properties;
> >>> -    /* Reason: pointer property "dma" */
> >>> -    dc->user_creatable = false;
> >>
> >> But we still can not start it with the -device option and set the dma,
> >> can we?
> >
> > This is a sysbus device, so you can't. I'll add a commit comment.
>
> Ah OK, understood now.
>
> With comment:
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>
> >
> > In theory, link property allows you to pass a QOM path to reference a
> > QOM instance from -device.
>
> Just wondering, if we had a "bus_address" property to the abstract
> SysBus class (and eventually "bus_name" for later) we could create/map
> sysbus devices from command line?

I can't tell much, as I am not very familiar with the various sysbus
devices. I think you'll have troubles to specify the various io/mmio &
irq to map to. In theory though, we could probably go in that
direction, even perhaps make "machine" from command line or
description file... I am not sure it's worth though.

>
> >>
> >>>    }
> >>>
> >>>    static const TypeInfo lance_info = {
> >>> diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
> >>> index 4723c30c79..d067d21e2c 100644
> >>> --- a/hw/net/pcnet-pci.c
> >>> +++ b/hw/net/pcnet-pci.c
> >>> @@ -231,7 +231,7 @@ static void pci_pcnet_realize(PCIDevice *pci_dev, Error **errp)
> >>>        s->irq = pci_allocate_irq(pci_dev);
> >>>        s->phys_mem_read = pci_physical_memory_read;
> >>>        s->phys_mem_write = pci_physical_memory_write;
> >>> -    s->dma_opaque = pci_dev;
> >>> +    s->dma_opaque = DEVICE(pci_dev);
> >>>
> >>>        pcnet_common_init(DEVICE(pci_dev), s, &net_pci_pcnet_info);
> >>>    }
> >>> diff --git a/hw/net/pcnet.h b/hw/net/pcnet.h
> >>> index 28d19a5c6f..f49b213c57 100644
> >>> --- a/hw/net/pcnet.h
> >>> +++ b/hw/net/pcnet.h
> >>> @@ -50,7 +50,7 @@ struct PCNetState_st {
> >>>                             uint8_t *buf, int len, int do_bswap);
> >>>        void (*phys_mem_write)(void *dma_opaque, hwaddr addr,
> >>>                              uint8_t *buf, int len, int do_bswap);
> >>> -    void *dma_opaque;
> >>> +    DeviceState *dma_opaque;
> >>>        int tx_busy;
> >>>        int looptest;
> >>>    };
> >>>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-24 11:52         ` Peter Maydell
@ 2019-10-24 18:07           ` Eduardo Habkost
  2019-10-25  7:31             ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Eduardo Habkost @ 2019-10-24 18:07 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Paul Burton, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias,
	Aleksandar Rikalo, Michael S. Tsirkin, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau,
	Philippe Mathieu-Daudé,
	Artyom Tarasenko, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Thu, Oct 24, 2019 at 12:52:28PM +0100, Peter Maydell wrote:
> On Thu, 24 Oct 2019 at 12:48, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
> > Just wondering, if we had a "bus_address" property to the abstract
> > SysBus class (and eventually "bus_name" for later) we could create/map
> > sysbus devices from command line?
> 
> I don't think this is a good plan -- users shouldn't have to know
> about the memory map of their boards. Plus it doesn't deal with
> the complications of multiple address spaces, DMA, wiring up
> irq lines to an interrupt controller, SoC reset handling,
> clocks, power-managment...  Command line -device was designed
> for pluggable devices, where in the world of real hardware
> the device can be physically plugged and unplugged and there's
> a clear interface that can be modelled. You can't add an
> extra UART to an embedded board in real hardware either.
> 
> The only plausible argument I've seen for command-line
> plugging of embedded devices is as a sort of side-effect
> of having a configuration language syntax for them for
> the purpose of being able to write board models as
> data-driven config files rather than in C code. But
> that would be a lot of design and engineering work, and
> if we want that I think we should approach it forwards,
> not arrive at it backwards by adding gradual tweaks like
> 'address' properties to devices.

The QEMU community spent years designing QOM and QMP with that
goal.  Which other pieces to you consider to be missing, to
make you reject making gradual changes towards it?

I agree we shouldn't be introducing new external interfaces
without careful thought.  But I welcome gradual internal API
changes that are helpful for our long term goals.

-- 
Eduardo



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 21/33] lance: replace PROP_PTR with PROP_LINK
  2019-10-24 18:07           ` Eduardo Habkost
@ 2019-10-25  7:31             ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-10-25  7:31 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Corey Minyard, Paul Burton, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias,
	Aleksandar Rikalo, Michael S. Tsirkin, Magnus Damm,
	Hervé Poussineau, Marc-André Lureau,
	Philippe Mathieu-Daudé,
	Artyom Tarasenko, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Thu, 24 Oct 2019 at 19:07, Eduardo Habkost <ehabkost@redhat.com> wrote:
> On Thu, Oct 24, 2019 at 12:52:28PM +0100, Peter Maydell wrote:
> > I don't think this is a good plan -- users shouldn't have to know
> > about the memory map of their boards. Plus it doesn't deal with
> > the complications of multiple address spaces, DMA, wiring up
> > irq lines to an interrupt controller, SoC reset handling,
> > clocks, power-managment...  Command line -device was designed
> > for pluggable devices, where in the world of real hardware
> > the device can be physically plugged and unplugged and there's
> > a clear interface that can be modelled. You can't add an
> > extra UART to an embedded board in real hardware either.
> >
> > The only plausible argument I've seen for command-line
> > plugging of embedded devices is as a sort of side-effect
> > of having a configuration language syntax for them for
> > the purpose of being able to write board models as
> > data-driven config files rather than in C code. But
> > that would be a lot of design and engineering work, and
> > if we want that I think we should approach it forwards,
> > not arrive at it backwards by adding gradual tweaks like
> > 'address' properties to devices.
>
> The QEMU community spent years designing QOM and QMP with that
> goal.  Which other pieces to you consider to be missing, to
> make you reject making gradual changes towards it?

QOM is an *internal* object model. It's fine for building
machine models *in C*. We have no mechanism for doing
this on the command line or via QMP, because there are
lots of parts of machine models (listed in the first
paragraph above) which aren't possible to do with purely
generic links and properties.

> I agree we shouldn't be introducing new external interfaces
> without careful thought.  But I welcome gradual internal API
> changes that are helpful for our long term goals.

Yeah, I have no objection to useful internal changes that
move generally in directions we'd like to go. But if
"machines via config files" really is a goal I'd like to
see at least a sketch of a design, rationale, summary of
what would need to change and proposals for what would be
done. And I don't think we should be exposing "MMIO addresses"
to users without at least some idea of why that would
fit in with other things we would be doing to move
towards where we're going.

(TBH: I also don't really see 'machines via config
files' as a serious project goal -- we haven't really moved
towards doing that in a decade, as far as I can see.)

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 01/33] qdev: remove unused qdev_prop_int64
  2019-10-23 17:31 ` [PATCH v3 01/33] qdev: remove unused qdev_prop_int64 Marc-André Lureau
@ 2019-11-18 14:01   ` Peter Maydell
  2019-11-20  3:36     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:01 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:32, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/core/qdev-properties.c    | 32 --------------------------------
>  include/hw/qdev-properties.h |  3 ---
>  2 files changed, 35 deletions(-)

I think I'd rather keep this. It's weird to not have a symmetric
set of properties for the common integer types, and annoying
for whoever next runs into a need for an int64 property to
have to reinstate the deleted code. (Yes, I know we don't
currently have int8 or int16.)

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 02/33] sysbus: remove unused sysbus_try_create*
  2019-10-23 17:31 ` [PATCH v3 02/33] sysbus: remove unused sysbus_try_create* Marc-André Lureau
  2019-10-23 22:35   ` Philippe Mathieu-Daudé
@ 2019-11-18 14:02   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:02 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:32, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/core/sysbus.c    | 32 --------------------------------
>  hw/i386/pc.c        |  1 -
>  include/hw/sysbus.h |  9 +--------
>  3 files changed, 1 insertion(+), 41 deletions(-)
>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 04/33] chardev: generate an internal id when none given
  2019-10-23 17:31 ` [PATCH v3 04/33] chardev: generate an internal id when none given Marc-André Lureau
@ 2019-11-18 14:12   ` Peter Maydell
  2019-11-18 18:54     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:12 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Internally, qemu may create chardev without ID. Those will not be
> looked up with qemu_chr_find(), which prevents using qdev_prop_set_chr().
>
> Use id_generate(), to generate an internal name (prefixed with #), so
> no conflict exist with user-named chardev.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> -Chardev *qemu_chardev_new(const char *id, const char *typename,
> -                          ChardevBackend *backend,
> -                          GMainContext *gcontext,
> -                          Error **errp)
> +static Chardev *chardev_new(const char *id, const char *typename,
> +                            ChardevBackend *backend,
> +                            GMainContext *gcontext,
> +                            Error **errp)
>  {
>      Object *obj;
>      Chardev *chr = NULL;
> @@ -991,6 +992,21 @@ end:
>      return chr;
>  }
>
> +Chardev *qemu_chardev_new(const char *id, const char *typename,
> +                          ChardevBackend *backend,
> +                          GMainContext *gcontext,
> +                          Error **errp)
> +{
> +    g_autofree char *genid = NULL;
> +
> +    if (!id) {
> +        genid = id_generate(ID_CHR);
> +        id = genid;
> +    }
> +
> +    return chardev_new(id, typename, backend, gcontext, errp);
> +}

So presumably the idea is that chardev_new() now must be
called with a non-NULL id (should it assert() that?),
and qemu_chardev_new() can be called with a NULL id, in
which case it will create one ?

> +
>  ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
>                                 Error **errp)
>  {
> @@ -1003,8 +1019,8 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
>          return NULL;
>      }
>
> -    chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
> -                           backend, NULL, errp);
> +    chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
> +                      backend, NULL, errp);
>      if (!chr) {
>          return NULL;
>      }
> @@ -1061,8 +1077,8 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
>          return NULL;
>      }
>
> -    chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
> -                               backend, chr->gcontext, errp);
> +    chr_new = chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
> +                          backend, chr->gcontext, errp);

...but if that's so, why are we calling chardev_new() here
and passing a NULL pointer ?

How many callsites actually pass NULL, anyway? My grep
seems to show:
 * this qmp_chardev_change() call
 * gdbstub.c
 * hw/bt/hci-csr.c
 * tests/test-char.c

Maybe we should just make them all pass in ID strings instead ?

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property
  2019-10-23 17:31 ` [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
@ 2019-11-18 14:15   ` KONRAD Frederic
  2019-11-18 15:34   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: KONRAD Frederic @ 2019-11-18 14:15 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi Marc-André,

Le 10/23/19 à 7:31 PM, Marc-André Lureau a écrit :
> "set_pin_in" property is used to define a callback mechanism where the
> device says "call the callback function, passing it an opaque cookie
> and a 32-bit value". We already have a generic mechanism for doing
> that, which is the qemu_irq. So we should just use that.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/intc/grlib_irqmp.c | 35 ++++-------------------------------
>   hw/sparc/leon3.c      |  9 +++++----
>   target/sparc/cpu.h    |  1 +
>   3 files changed, 10 insertions(+), 35 deletions(-)
> 
> diff --git a/hw/intc/grlib_irqmp.c b/hw/intc/grlib_irqmp.c
> index bc78e1a14f..794c643af2 100644
> --- a/hw/intc/grlib_irqmp.c
> +++ b/hw/intc/grlib_irqmp.c
> @@ -25,6 +25,7 @@
>    */
>   
>   #include "qemu/osdep.h"
> +#include "hw/irq.h"
>   #include "hw/sysbus.h"
>   #include "cpu.h"
>   
> @@ -58,10 +59,8 @@ typedef struct IRQMP {
>   
>       MemoryRegion iomem;
>   
> -    void *set_pil_in;
> -    void *set_pil_in_opaque;
> -
>       IRQMPState *state;
> +    qemu_irq irq;
>   } IRQMP;
>   
>   struct IRQMPState {
> @@ -82,7 +81,6 @@ static void grlib_irqmp_check_irqs(IRQMPState *state)
>       uint32_t      pend   = 0;
>       uint32_t      level0 = 0;
>       uint32_t      level1 = 0;
> -    set_pil_in_fn set_pil_in;
>   
>       assert(state != NULL);
>       assert(state->parent != NULL);
> @@ -97,14 +95,8 @@ static void grlib_irqmp_check_irqs(IRQMPState *state)
>       trace_grlib_irqmp_check_irqs(state->pending, state->force[0],
>                                    state->mask[0], level1, level0);
>   
> -    set_pil_in = (set_pil_in_fn)state->parent->set_pil_in;
> -
>       /* Trigger level1 interrupt first and level0 if there is no level1 */
> -    if (level1 != 0) {
> -        set_pil_in(state->parent->set_pil_in_opaque, level1);
> -    } else {
> -        set_pil_in(state->parent->set_pil_in_opaque, level0);
> -    }
> +    qemu_set_irq(state->parent->irq, level1 ?: level0);
>   }
>   
>   static void grlib_irqmp_ack_mask(IRQMPState *state, uint32_t mask)
> @@ -335,6 +327,7 @@ static void grlib_irqmp_init(Object *obj)
>       IRQMP *irqmp = GRLIB_IRQMP(obj);
>       SysBusDevice *dev = SYS_BUS_DEVICE(obj);
>   
> +    qdev_init_gpio_out_named(DEVICE(obj), &irqmp->irq, "grlib-irq", 1);
>       memory_region_init_io(&irqmp->iomem, obj, &grlib_irqmp_ops, irqmp,
>                             "irqmp", IRQMP_REG_SIZE);
>   
> @@ -343,31 +336,11 @@ static void grlib_irqmp_init(Object *obj)
>       sysbus_init_mmio(dev, &irqmp->iomem);
>   }
>   
> -static void grlib_irqmp_realize(DeviceState *dev, Error **errp)
> -{
> -    IRQMP *irqmp = GRLIB_IRQMP(dev);
> -
> -        /* Check parameters */
> -    if (irqmp->set_pil_in == NULL) {
> -        error_setg(errp, "set_pil_in cannot be NULL.");
> -    }
> -}
> -
> -static Property grlib_irqmp_properties[] = {
> -    DEFINE_PROP_PTR("set_pil_in", IRQMP, set_pil_in),
> -    DEFINE_PROP_PTR("set_pil_in_opaque", IRQMP, set_pil_in_opaque),
> -    DEFINE_PROP_END_OF_LIST(),
> -};
> -
>   static void grlib_irqmp_class_init(ObjectClass *klass, void *data)
>   {
>       DeviceClass *dc = DEVICE_CLASS(klass);
>   
>       dc->reset = grlib_irqmp_reset;
> -    dc->props = grlib_irqmp_properties;
> -    /* Reason: pointer properties "set_pil_in", "set_pil_in_opaque" */
> -    dc->user_creatable = false;

Was confused first, since we don't want this device to be user creatable. But I
think that SysBusDevice has that set to "false" anyway so it's all right.

> -    dc->realize = grlib_irqmp_realize;
>   }
>   
>   static const TypeInfo grlib_irqmp_info = {
> diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
> index c5f1b1ee72..6db6ea9b5c 100644
> --- a/hw/sparc/leon3.c
> +++ b/hw/sparc/leon3.c
> @@ -143,9 +143,10 @@ void leon3_irq_ack(void *irq_manager, int intno)
>       grlib_irqmp_ack((DeviceState *)irq_manager, intno);
>   }
>   
> -static void leon3_set_pil_in(void *opaque, uint32_t pil_in)
> +static void leon3_set_pil_in(void *opaque, int n, int level)
>   {
> -    CPUSPARCState *env = (CPUSPARCState *)opaque;
> +    CPUSPARCState *env = opaque;
> +    uint32_t pil_in = level;
>       CPUState *cs;
>   
>       assert(env != NULL);
> @@ -225,8 +226,8 @@ static void leon3_generic_hw_init(MachineState *machine)
>   
>       /* Allocate IRQ manager */
>       dev = qdev_create(NULL, TYPE_GRLIB_IRQMP);
> -    qdev_prop_set_ptr(dev, "set_pil_in", leon3_set_pil_in);
> -    qdev_prop_set_ptr(dev, "set_pil_in_opaque", env);
> +    env->pil_irq = qemu_allocate_irq(leon3_set_pil_in, env, 0);
> +    qdev_connect_gpio_out_named(dev, "grlib-irq", 0, env->pil_irq);
>       qdev_init_nofail(dev);
>       sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, LEON3_IRQMP_OFFSET);
>       env->irq_manager = dev;
> diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
> index 778aa8e073..709215f8c1 100644
> --- a/target/sparc/cpu.h
> +++ b/target/sparc/cpu.h
> @@ -508,6 +508,7 @@ struct CPUSPARCState {
>   #endif
>       sparc_def_t def;
>   
> +    qemu_irq pil_irq;
>       void *irq_manager;
>       void (*qemu_irq_ack)(CPUSPARCState *env, void *irq_manager, int intno);
>   
> 

Seems ok to me.

Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>

Thanks,
Fred


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-10-23 17:31 ` [PATCH v3 07/33] serial: register vmsd with DeviceClass Marc-André Lureau
@ 2019-11-18 14:21   ` Peter Maydell
  2019-11-19 10:22     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:21 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> QOM-ify further.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index c839035fdd..4af8b0ce4c 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -990,8 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      s->baudbase = baudbase;
>      qemu_chr_fe_init(&s->chr, chr, &error_abort);
>      serial_realize_core(s, &error_fatal);
> -
> -    vmstate_register(NULL, base, &vmstate_serial, s);
> +    qdev_set_legacy_instance_id(dev, base, 2);
>      qdev_init_nofail(dev);

Did you test whether migration still works from a QEMU
version without this patch to one with it? (The migration
vmstate code is too complicated for me to be able to figure
out whether passing the 'dev' pointer makes a difference
to whot it names the state sections and whether the
'qdev_set_legacy_instance_id' suffices to avoid problems.)

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 08/33] serial: add "chardev" property
  2019-10-23 17:31 ` [PATCH v3 08/33] serial: add "chardev" property Marc-André Lureau
  2019-10-23 22:39   ` Philippe Mathieu-Daudé
@ 2019-11-18 14:23   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:23 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> This is more QOM-friendly, callers may set/get the property themself.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 09/33] serial: add "baudbase" property
  2019-10-23 17:31 ` [PATCH v3 09/33] serial: add "baudbase" property Marc-André Lureau
  2019-10-23 22:40   ` Philippe Mathieu-Daudé
@ 2019-11-18 14:26   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:26 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 5 +++--
>  include/hw/char/serial.h | 2 +-
>  2 files changed, 4 insertions(+), 3 deletions(-)


> +    DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),

You could also remove the explicit setting of s->baudbase = 115200
in serial-isa.c/serial-pci-multi.c/serial-pci.c, I think? (or maybe
you do that in a later patch).

Anyway
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 10/33] serial: add "instance-id" property
  2019-10-23 17:31 ` [PATCH v3 10/33] serial: add "instance-id" property Marc-André Lureau
@ 2019-11-18 14:29   ` Peter Maydell
  2019-11-19 10:32     ` Marc-André Lureau
  2019-11-20  9:06   ` Marc-André Lureau
  1 sibling, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:29 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> This property will be used to move common vmstate registration to
> device realize in following patch.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 3 +++
>  include/hw/char/serial.h | 1 +
>  2 files changed, 4 insertions(+)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 069d8715d0..0b61a71e4e 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -990,6 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      s->irq = irq;
>      qdev_prop_set_uint32(dev, "baudbase", baudbase);
>      qdev_prop_set_chr(dev, "chardev", chr);
> +    qdev_prop_set_int32(dev, "instance-id", base);
>      serial_realize_core(s, &error_fatal);
>      qdev_set_legacy_instance_id(dev, base, 2);
>      qdev_init_nofail(dev);
> @@ -1003,6 +1004,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>  static Property serial_properties[] = {
>      DEFINE_PROP_CHR("chardev", SerialState, chr),
>      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> +    DEFINE_PROP_INT32("instance-id", SerialState, instance_id, 0),

This could use an explanatory comment, because I have no
idea what it does or when a user of the device would want
or need to set it... (I am guessing that part of the answer
may be "needed only by legacy users of this device that don't
want to break migration compatibility" ?)

>      DEFINE_PROP_END_OF_LIST(),
>  };

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize
  2019-10-23 17:31 ` [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize Marc-André Lureau
@ 2019-11-18 14:32   ` Peter Maydell
  2019-11-20 12:32   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:32 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Instead of calling serial_exit_core() directly, use the QDev unrealize
> callback.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-10-23 17:31 ` [PATCH v3 13/33] serial: start making SerialMM a sysbus device Marc-André Lureau
@ 2019-11-18 14:43   ` Peter Maydell
  2019-11-20  7:34     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:43 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Memory mapped serial device is in fact a sysbus device. The following
> patches will make use of sysbus facilities for resource and
> registration.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/omap_uart.c      |  2 +-
>  hw/char/serial.c         | 47 ++++++++++++++++++++++++++++------------
>  hw/mips/boston.c         |  2 +-
>  hw/mips/mips_malta.c     |  2 +-
>  include/hw/char/serial.h | 20 ++++++++++++-----
>  5 files changed, 51 insertions(+), 22 deletions(-)


> -SerialState *serial_mm_init(MemoryRegion *address_space,
> +SerialMM *serial_mm_init(MemoryRegion *address_space,
>                              hwaddr base, int it_shift,
>                              qemu_irq irq, int baudbase,
>                              Chardev *chr, enum device_endian end)
>  {
> -    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> -    SerialState *s = SERIAL(dev);
> +    SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
> +    SerialState *s = &self->serial;
>
> -    s->it_shift = it_shift;
> +    self->it_shift = it_shift;
>      s->irq = irq;
> -    qdev_prop_set_uint32(dev, "baudbase", baudbase);
> -    qdev_prop_set_chr(dev, "chardev", chr);
> -    qdev_prop_set_int32(dev, "instance-id", base);
> -    qdev_init_nofail(dev);
> +    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
> +    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
> +    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> +
> +    qdev_init_nofail(DEVICE(s));
> +    qdev_init_nofail(DEVICE(self));

Something odd is going on here. This is a convenience
wrapper around creating the SERIAL_MM device, so it's
correct that it has to init DEVICE(self). But it should
not be doing anything with the internals of 'self'.
It's the instance_init/realize of the SERIAL_MM object that should
instance_init/realize the 'self->serial' object. You have the
code below to do the 'instance_init' in the serial_mm_instance_init
function, but are missing the equivalent realize code.

> -    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
> +    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
>                            "serial", 8 << it_shift);
>      memory_region_add_subregion(address_space, base, &s->io);
> -    return s;
> +
> +    return self;
> +}
> +
> +static void serial_mm_instance_init(Object *o)
> +{
> +    SerialMM *self = SERIAL_MM(o);

'self' is not idiomatic for the name of the variable containing
the pointer to the object in QOM code ("git grep '\Wself\W' hw"
shows no uses of it at all, which is quite unusual for us --
usually the codebase has at least a few uses of any non-standard
way of writing something ;-))

Usually we use something approximating to the abbreviation
of the type name, so here 'smm' would do.

> +
> +    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
> +                            TYPE_SERIAL, &error_abort, NULL);
>  }

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 14/33] serial-mm: add "regshift" property
  2019-10-23 17:31 ` [PATCH v3 14/33] serial-mm: add "regshift" property Marc-André Lureau
@ 2019-11-18 14:54   ` Peter Maydell
  2019-11-20  7:53     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 14:54 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> And a property and rename "it_shift" field to "regshift", as it seems
> to be more popular (and I don't know what "it" stands for).
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

I have no idea what it_shift means either (I had a look in the
git history but it seems to have been added with that name
very early on when the commit logs were generally not very
informative); 'regshift' sounds good to me too.

> +static Property serial_mm_properties[] = {
> +    DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),

This could use a comment describing what the property does.

> +    DEFINE_PROP_END_OF_LIST(),

Otherwise
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 15/33] serial-mm: add endianness property
  2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
@ 2019-11-18 15:02   ` Peter Maydell
  2019-11-18 15:07   ` Peter Maydell
  2019-11-20 12:57   ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:02 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Add a qdev property for endianness, so memory region setup can be done
> in realize.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 2 ++
>  include/hw/char/serial.h | 1 +
>  2 files changed, 3 insertions(+)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index c28cfc94fd..2f7667c30c 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1081,6 +1081,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
>      qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
>      qdev_prop_set_chr(DEVICE(s), "chardev", chr);
>      qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> +    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
>
>      qdev_init_nofail(DEVICE(s));
>      qdev_init_nofail(DEVICE(self));
> @@ -1102,6 +1103,7 @@ static void serial_mm_instance_init(Object *o)
>
>  static Property serial_mm_properties[] = {
>      DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
> +    DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),

Again, a brief comment documenting the property here would be nice.

>      DEFINE_PROP_END_OF_LIST(),
>  };
>
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index 759c85976d..2d0802a909 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -86,6 +86,7 @@ typedef struct SerialMM {
>      SerialState serial;
>
>      uint8_t regshift;
> +    uint8_t endianness;
>  } SerialMM;

(The type-checking on the property-setting macros doesn't let
us define this as 'enum device_endian'.)

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 15/33] serial-mm: add endianness property
  2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
  2019-11-18 15:02   ` Peter Maydell
@ 2019-11-18 15:07   ` Peter Maydell
  2019-11-20  7:59     ` Marc-André Lureau
  2019-11-20 12:57   ` Philippe Mathieu-Daudé
  2 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:07 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Add a qdev property for endianness, so memory region setup can be done
> in realize.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 2 ++
>  include/hw/char/serial.h | 1 +
>  2 files changed, 3 insertions(+)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index c28cfc94fd..2f7667c30c 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1081,6 +1081,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
>      qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
>      qdev_prop_set_chr(DEVICE(s), "chardev", chr);
>      qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> +    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
>
>      qdev_init_nofail(DEVICE(s));
>      qdev_init_nofail(DEVICE(self));
> @@ -1102,6 +1103,7 @@ static void serial_mm_instance_init(Object *o)
>
>  static Property serial_mm_properties[] = {
>      DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
> +    DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),
>      DEFINE_PROP_END_OF_LIST(),
>  };

...on reading patch 16, I just noticed that here in patch 15
you define the 'endianness' property on the SerialMM object, but
you're trying to set it on the SerialState object. This bug then
gets fixed in passing in patch 16, but we should just be
setting it on the right object to start with.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 16/33] serial-mm: use sysbus facilities
  2019-10-23 17:31 ` [PATCH v3 16/33] serial-mm: use sysbus facilities Marc-André Lureau
@ 2019-11-18 15:09   ` Peter Maydell
  2019-11-20  8:30     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:09 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Make SerialMM a regular sysbus device, by registering the irq, and the
> mmio region. Reexport the internal serial properties.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c | 35 ++++++++++++++++++++++++-----------
>  1 file changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 2f7667c30c..a40bc3ab81 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1074,21 +1074,18 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
>                              Chardev *chr, enum device_endian end)
>  {
>      SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
> -    SerialState *s = &self->serial;
> +    MemoryRegion *mr;
>
>      qdev_prop_set_uint8(DEVICE(self), "regshift", regshift);
> -    s->irq = irq;
> -    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
> -    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
> -    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> -    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
> -
> -    qdev_init_nofail(DEVICE(s));
> +    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> +    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> +    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> +    qdev_prop_set_uint8(DEVICE(self), "endianness", end);

(this last line should be in patch 15)

>      qdev_init_nofail(DEVICE(self));
>
> -    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
> -                          "serial", 8 << regshift);
> -    memory_region_add_subregion(address_space, base, &s->io);
> +    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> +    mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(self), 0);
> +    memory_region_add_subregion(address_space, base, mr);
>
>      return self;
>  }
> @@ -1099,6 +1096,8 @@ static void serial_mm_instance_init(Object *o)
>
>      object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
>                              TYPE_SERIAL, &error_abort, NULL);
> +
> +    qdev_alias_all_properties(DEVICE(&self->serial), o);
>  }
>
>  static Property serial_mm_properties[] = {
> @@ -1107,11 +1106,25 @@ static Property serial_mm_properties[] = {
>      DEFINE_PROP_END_OF_LIST(),
>  };
>
> +static void serial_mm_realize(DeviceState *dev, Error **errp)
> +{
> +    SerialMM *self = SERIAL_MM(dev);
> +    SerialState *s = &self->serial;

Again, 'self' isn't idiomatic in QOM methods.

> +
> +    qdev_init_nofail(DEVICE(s));
> +
> +    memory_region_init_io(&s->io, NULL, &serial_mm_ops[self->endianness], self,
> +                          "serial", 8 << self->regshift);
> +    sysbus_init_mmio(SYS_BUS_DEVICE(self), &s->io);
> +    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);
> +}
> +
>  static void serial_mm_class_init(ObjectClass *klass, void* data)
>  {
>      DeviceClass *dc = DEVICE_CLASS(klass);
>
>      dc->props = serial_mm_properties;
> +    dc->realize = serial_mm_realize;
>  }
>
>  static const TypeInfo serial_mm_info = {
> --
> 2.23.0.606.g08da6496b6

Otherwise
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 17/33] serial: make SerialIO a sysbus device
  2019-10-23 17:31 ` [PATCH v3 17/33] serial: make SerialIO a sysbus device Marc-André Lureau
@ 2019-11-18 15:16   ` Peter Maydell
  2019-11-20  8:41     ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:16 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Make serial IO a proper sysbus device, similar to serial MM.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 58 ++++++++++++++++++++++++++++++++--------
>  include/hw/char/serial.h | 13 +++++++--
>  2 files changed, 58 insertions(+), 13 deletions(-)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index a40bc3ab81..84de2740a7 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -986,22 +986,57 @@ const MemoryRegionOps serial_io_ops = {
>      .endianness = DEVICE_LITTLE_ENDIAN,
>  };
>
> -SerialState *serial_init(int base, qemu_irq irq, int baudbase,
> -                         Chardev *chr, MemoryRegion *system_io)
> +static void serial_io_realize(DeviceState *dev, Error **errp)
>  {
> -    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> -    SerialState *s = SERIAL(dev);
> +    SerialIO *self = SERIAL_IO(dev);

"sio" or something rather than "self".

> +    SerialState *s = &self->serial;
>
> -    s->irq = irq;
> -    qdev_prop_set_uint32(dev, "baudbase", baudbase);
> -    qdev_prop_set_chr(dev, "chardev", chr);
> -    qdev_prop_set_int32(dev, "instance-id", base);
> -    qdev_init_nofail(dev);
> +    qdev_init_nofail(DEVICE(s));
>
>      memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
> -    memory_region_add_subregion(system_io, base, &s->io);
> +    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);

You could say '&s->irq' here, since you have the local variable.

> +}
> +
> +static void serial_io_class_init(ObjectClass *klass, void* data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +
> +    dc->realize = serial_io_realize;

For class methods where the class has no data that needs
to be migrated it's helpful to have a comment
  /* No dc->vmsd: class has no migratable state */
(which lets us know that it's intentional and not a forgotten
thing). Some day I will get round to writing a patch so you
can say "dc->vmsd = no_migratable_state;" ...

> +}
> +
> +static void serial_io_instance_init(Object *o)
> +{
> +    SerialIO *self = SERIAL_IO(o);
> +
> +    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
> +                            TYPE_SERIAL, &error_abort, NULL);
> +
> +    qdev_alias_all_properties(DEVICE(&self->serial), o);
> +}
> +
> +
> +static const TypeInfo serial_io_info = {
> +    .name = TYPE_SERIAL_IO,
> +    .parent = TYPE_SYS_BUS_DEVICE,
> +    .instance_size = sizeof(SerialIO),
> +    .instance_init = serial_io_instance_init,
> +    .class_init = serial_io_class_init,
> +};
> +
> +SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> +                         Chardev *chr, MemoryRegion *system_io)
> +{
> +    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
>
> -    return s;
> +    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> +    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> +    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> +    qdev_init_nofail(DEVICE(self));
> +
> +    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> +    memory_region_add_subregion(system_io, base, &self->serial.io);
> +
> +    return self;
>  }

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 18/33] mips: inline serial_init
  2019-10-23 17:31 ` [PATCH v3 18/33] mips: inline serial_init Marc-André Lureau
@ 2019-11-18 15:24   ` Peter Maydell
  2019-11-20 11:14     ` Marc-André Lureau
  2019-11-20  0:07   ` Aleksandar Markovic
  1 sibling, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:24 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> The function is specific to mipssim, let's inline it.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 16 ----------------
>  hw/mips/mips_mipssim.c   | 13 ++++++++++---
>  include/hw/char/serial.h |  2 --
>  3 files changed, 10 insertions(+), 21 deletions(-)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 84de2740a7..ca95e09ec9 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1023,22 +1023,6 @@ static const TypeInfo serial_io_info = {
>      .class_init = serial_io_class_init,
>  };
>
> -SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> -                         Chardev *chr, MemoryRegion *system_io)
> -{
> -    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
> -
> -    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> -    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> -    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> -    qdev_init_nofail(DEVICE(self));
> -
> -    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> -    memory_region_add_subregion(system_io, base, &self->serial.io);
> -
> -    return self;
> -}
> -
>  static Property serial_properties[] = {
>      DEFINE_PROP_CHR("chardev", SerialState, chr),
>      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index 282bbecb24..26fb8fa4de 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -40,6 +40,7 @@
>  #include "hw/loader.h"
>  #include "elf.h"
>  #include "hw/sysbus.h"
> +#include "hw/qdev-properties.h"
>  #include "exec/address-spaces.h"
>  #include "qemu/error-report.h"
>  #include "sysemu/qtest.h"
> @@ -219,9 +220,15 @@ mips_mipssim_init(MachineState *machine)
>       * A single 16450 sits at offset 0x3f8. It is attached to
>       * MIPS CPU INT2, which is interrupt 4.
>       */
> -    if (serial_hd(0))
> -        serial_init(0x3f8, env->irq[4], 115200, serial_hd(0),
> -                    get_system_io());
> +    if (serial_hd(0)) {
> +        DeviceState *dev = qdev_create(NULL, TYPE_SERIAL_IO);
> +
> +        qdev_prop_set_chr(dev, "chardev", serial_hd(0));
> +        qdev_prop_set_int32(dev, "instance-id", 0x3f8);
> +        qdev_init_nofail(dev);
> +        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, env->irq[4]);
> +        sysbus_add_io(SYS_BUS_DEVICE(dev), 0x3f8, &SERIAL_IO(dev)->serial.io);
> +    }

The code being inlined here doesn't seem to be identical to the
code in the function above (it uses sysbus_add_io() rather than
memory_region_add_subregion()).

It's also a bit ugly that the code has to reach into the
internals of the device to get the MemoryRegion pointer.
Would it work to have the device use sysbus_init_mmio()
in its init or realize method to register the IO port MemoryRegion,
and then we could use sysbus_mmio_get_region() to get the
MemoryRegion pointer ?

(If that does work, we should someday refactor
sysbus_add_io() so that all the devices it's used with
register the MemoryRegions that way, and then sysbus_add_io()
can just take an 'int n' the way sysbus_mmio_map() does.
But not today.)

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 22/33] etraxfs: remove PROP_PTR usage
  2019-10-23 17:31 ` [PATCH v3 22/33] etraxfs: remove PROP_PTR usage Marc-André Lureau
@ 2019-11-18 15:28   ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:28 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> etraxfs_dma_client are not Object, so can't be exposed to user with
> QOM path. Let's remove property usage and move the constructor to the
> .c unit, simplifying some code on the way.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/net/etraxfs_eth.c      | 44 +++++++++++++++++++++++++++++----------
>  include/hw/cris/etraxfs.h | 20 +++---------------
>  2 files changed, 36 insertions(+), 28 deletions(-)
>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property
  2019-10-23 17:31 ` [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
  2019-11-18 14:15   ` KONRAD Frederic
@ 2019-11-18 15:34   ` Peter Maydell
  1 sibling, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:34 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> "set_pin_in" property is used to define a callback mechanism where the
> device says "call the callback function, passing it an opaque cookie
> and a 32-bit value". We already have a generic mechanism for doing
> that, which is the qemu_irq. So we should just use that.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---

This is probably a good place to put a comment:

/*
 * This device assumes that the incoming 'level' value on the
 * qemu_irq is the interrupt number, not just a simple 0/1 level.
 */

> -static void leon3_set_pil_in(void *opaque, uint32_t pil_in)
> +static void leon3_set_pil_in(void *opaque, int n, int level)
>  {
> -    CPUSPARCState *env = (CPUSPARCState *)opaque;
> +    CPUSPARCState *env = opaque;
> +    uint32_t pil_in = level;
>      CPUState *cs;
>
>      assert(env != NULL);

Otherwise
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c
  2019-10-23 17:31 ` [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c Marc-André Lureau
@ 2019-11-18 15:38   ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:38 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Rather than tweaking CPU bits from leon3 machine, move it to cpu.c.
>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/sparc/leon3.c          | 37 -------------------------------------
>  hw/sparc/trace-events     |  4 ----
>  target/sparc/cpu.c        | 39 +++++++++++++++++++++++++++++++++++++++
>  target/sparc/trace-events |  4 ++++
>  4 files changed, 43 insertions(+), 41 deletions(-)

> @@ -762,6 +799,8 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
>      env->version |= env->def.nwindows - 1;
>  #endif
>
> +    env->pil_irq = qemu_allocate_irq(sparc_set_pil_in, env, 0);
> +

I think what I had in mind when I suggested this was that
once this was part of a DeviceState device you would then
create the IRQs with gpio_init_gpio_in_named() and
connect them on the board side with the usual gpio
connection functions.

I also don't know enough SPARC stuff to suggest whether this
irq creation should be conditional on "is this CPU a leon3"
or not.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU
  2019-10-23 17:31 ` [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU Marc-André Lureau
@ 2019-11-18 15:40   ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-18 15:40 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 23 Oct 2019 at 18:35, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Instead of accessing cpu interrupt vector directly from PIC, send the
> vector value over the qemu_irq.
>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/cris/axis_dev88.c  |  4 ----
>  hw/intc/etraxfs_pic.c | 26 +-------------------------
>  target/cris/cpu.c     |  8 ++++++++
>  target/cris/cpu.h     |  1 +
>  4 files changed, 10 insertions(+), 29 deletions(-)
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 04/33] chardev: generate an internal id when none given
  2019-11-18 14:12   ` Peter Maydell
@ 2019-11-18 18:54     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-18 18:54 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 6:12 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Internally, qemu may create chardev without ID. Those will not be
> > looked up with qemu_chr_find(), which prevents using qdev_prop_set_chr().
> >
> > Use id_generate(), to generate an internal name (prefixed with #), so
> > no conflict exist with user-named chardev.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> > -Chardev *qemu_chardev_new(const char *id, const char *typename,
> > -                          ChardevBackend *backend,
> > -                          GMainContext *gcontext,
> > -                          Error **errp)
> > +static Chardev *chardev_new(const char *id, const char *typename,
> > +                            ChardevBackend *backend,
> > +                            GMainContext *gcontext,
> > +                            Error **errp)
> >  {
> >      Object *obj;
> >      Chardev *chr = NULL;
> > @@ -991,6 +992,21 @@ end:
> >      return chr;
> >  }
> >
> > +Chardev *qemu_chardev_new(const char *id, const char *typename,
> > +                          ChardevBackend *backend,
> > +                          GMainContext *gcontext,
> > +                          Error **errp)
> > +{
> > +    g_autofree char *genid = NULL;
> > +
> > +    if (!id) {
> > +        genid = id_generate(ID_CHR);
> > +        id = genid;
> > +    }
> > +
> > +    return chardev_new(id, typename, backend, gcontext, errp);
> > +}
>
> So presumably the idea is that chardev_new() now must be
> called with a non-NULL id (should it assert() that?),

Not, it can still be called with NULL (mostly for qmp_chardev_change()).

> and qemu_chardev_new() can be called with a NULL id, in
> which case it will create one ?

Right

>
> > +
> >  ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
> >                                 Error **errp)
> >  {
> > @@ -1003,8 +1019,8 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
> >          return NULL;
> >      }
> >
> > -    chr = qemu_chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
> > -                           backend, NULL, errp);
> > +    chr = chardev_new(id, object_class_get_name(OBJECT_CLASS(cc)),
> > +                      backend, NULL, errp);
> >      if (!chr) {
> >          return NULL;
> >      }
> > @@ -1061,8 +1077,8 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
> >          return NULL;
> >      }
> >
> > -    chr_new = qemu_chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
> > -                               backend, chr->gcontext, errp);
> > +    chr_new = chardev_new(NULL, object_class_get_name(OBJECT_CLASS(cc)),
> > +                          backend, chr->gcontext, errp);
>
> ...but if that's so, why are we calling chardev_new() here
> and passing a NULL pointer ?

Because it's qmp_chardev_change(), it's a transient state, the id is
set after, and reparenting too. The code could probably be structured
differently.

>
> How many callsites actually pass NULL, anyway? My grep
> seems to show:
>  * this qmp_chardev_change() call
>  * gdbstub.c
>  * hw/bt/hci-csr.c
>  * tests/test-char.c
>
> Maybe we should just make them all pass in ID strings instead ?

Well, in this case, we must be sure it doesn't conflict with user ID
(presumably with # prefix), or duplicate etc. Why not leave it to
id_generate() then?



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-11-18 14:21   ` Peter Maydell
@ 2019-11-19 10:22     ` Marc-André Lureau
  2019-11-19 10:33       ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-19 10:22 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Mon, Nov 18, 2019 at 6:22 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > QOM-ify further.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c | 13 ++++++++++---
> >  1 file changed, 10 insertions(+), 3 deletions(-)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index c839035fdd..4af8b0ce4c 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -990,8 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
> >      s->baudbase = baudbase;
> >      qemu_chr_fe_init(&s->chr, chr, &error_abort);
> >      serial_realize_core(s, &error_fatal);
> > -
> > -    vmstate_register(NULL, base, &vmstate_serial, s);
> > +    qdev_set_legacy_instance_id(dev, base, 2);
> >      qdev_init_nofail(dev);
>
> Did you test whether migration still works from a QEMU
> version without this patch to one with it? (The migration

Yes, I thought I did test correctly, but I realized testing with x86
isn't correct.

So with arm/musicpal for ex, I can migrate from before->after, however
after->before won't work. Is that ok?

> vmstate code is too complicated for me to be able to figure
> out whether passing the 'dev' pointer makes a difference
> to whot it names the state sections and whether the
> 'qdev_set_legacy_instance_id' suffices to avoid problems.)

I don't see a way to fix after->before, because the instance id is
initially 0 with the new code, and the old code expect a different
value.



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 10/33] serial: add "instance-id" property
  2019-11-18 14:29   ` Peter Maydell
@ 2019-11-19 10:32     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-19 10:32 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 6:30 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > This property will be used to move common vmstate registration to
> > device realize in following patch.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c         | 3 +++
> >  include/hw/char/serial.h | 1 +
> >  2 files changed, 4 insertions(+)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index 069d8715d0..0b61a71e4e 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -990,6 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
> >      s->irq = irq;
> >      qdev_prop_set_uint32(dev, "baudbase", baudbase);
> >      qdev_prop_set_chr(dev, "chardev", chr);
> > +    qdev_prop_set_int32(dev, "instance-id", base);
> >      serial_realize_core(s, &error_fatal);
> >      qdev_set_legacy_instance_id(dev, base, 2);
> >      qdev_init_nofail(dev);
> > @@ -1003,6 +1004,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
> >  static Property serial_properties[] = {
> >      DEFINE_PROP_CHR("chardev", SerialState, chr),
> >      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> > +    DEFINE_PROP_INT32("instance-id", SerialState, instance_id, 0),
>
> This could use an explanatory comment, because I have no
> idea what it does or when a user of the device would want
> or need to set it... (I am guessing that part of the answer
> may be "needed only by legacy users of this device that don't
> want to break migration compatibility" ?)

That's right, I'll add that comment.

>
> >      DEFINE_PROP_END_OF_LIST(),
> >  };
>
> thanks
> -- PMM
>



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-11-19 10:22     ` Marc-André Lureau
@ 2019-11-19 10:33       ` Peter Maydell
  2019-11-19 11:57         ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-19 10:33 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Tue, 19 Nov 2019 at 10:23, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
> On Mon, Nov 18, 2019 at 6:22 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > Did you test whether migration still works from a QEMU
> > version without this patch to one with it? (The migration
>
> Yes, I thought I did test correctly, but I realized testing with x86
> isn't correct.
>
> So with arm/musicpal for ex, I can migrate from before->after, however
> after->before won't work. Is that ok?

Broadly speaking, the only case where we care about not
breaking cross-version migration is where we have a versioned
machine type. So musicpal doesn't matter too much. Beyond
that, yes, generally before->after is more important than
after->before. I have a feeling Red Hat downstream cares about
after->before migration at least for x86 but you or your colleagues
would know that better than me :-)

> > vmstate code is too complicated for me to be able to figure
> > out whether passing the 'dev' pointer makes a difference
> > to whot it names the state sections and whether the
> > 'qdev_set_legacy_instance_id' suffices to avoid problems.)
>
> I don't see a way to fix after->before, because the instance id is
> initially 0 with the new code, and the old code expect a different
> value.

Can you explain how the instance ID stuff works? I was
expecting that the result of setting the legacy instance ID
would just be that the new version would always have
the older setting, so if it works for old->new it would also
work for new->old. But as I say I don't understand this bit
of the migration code.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-11-19 10:33       ` Peter Maydell
@ 2019-11-19 11:57         ` Marc-André Lureau
  2019-11-20 18:54           ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-19 11:57 UTC (permalink / raw)
  To: Peter Maydell, Dr. David Alan Gilbert
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

On Tue, Nov 19, 2019 at 2:35 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Tue, 19 Nov 2019 at 10:23, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> > On Mon, Nov 18, 2019 at 6:22 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > > Did you test whether migration still works from a QEMU
> > > version without this patch to one with it? (The migration
> >
> > Yes, I thought I did test correctly, but I realized testing with x86
> > isn't correct.
> >
> > So with arm/musicpal for ex, I can migrate from before->after, however
> > after->before won't work. Is that ok?
>
> Broadly speaking, the only case where we care about not
> breaking cross-version migration is where we have a versioned
> machine type. So musicpal doesn't matter too much. Beyond
> that, yes, generally before->after is more important than
> after->before. I have a feeling Red Hat downstream cares about
> after->before migration at least for x86 but you or your colleagues
> would know that better than me :-)
>
> > > vmstate code is too complicated for me to be able to figure
> > > out whether passing the 'dev' pointer makes a difference
> > > to whot it names the state sections and whether the
> > > 'qdev_set_legacy_instance_id' suffices to avoid problems.)
> >
> > I don't see a way to fix after->before, because the instance id is
> > initially 0 with the new code, and the old code expect a different
> > value.
>
> Can you explain how the instance ID stuff works? I was
> expecting that the result of setting the legacy instance ID
> would just be that the new version would always have
> the older setting, so if it works for old->new it would also
> work for new->old. But as I say I don't understand this bit
> of the migration code.

From what I understand, the alias_id is only used in
savevm.c:find_se(), and thus can only be used to match against
"legacy" instance id values. On new code, instance_id is generated
incrementally from 0 with calculate_new_instance_id(), based on
"qdev-path/vmsd-name".



-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 18/33] mips: inline serial_init
  2019-10-23 17:31 ` [PATCH v3 18/33] mips: inline serial_init Marc-André Lureau
  2019-11-18 15:24   ` Peter Maydell
@ 2019-11-20  0:07   ` Aleksandar Markovic
  1 sibling, 0 replies; 99+ messages in thread
From: Aleksandar Markovic @ 2019-11-20  0:07 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	qemu-devel, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Peter Maydell, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	Aleksandar Rikalo, qemu-ppc, Aleksandar Markovic, Paolo Bonzini,
	Aurelien Jarno

[-- Attachment #1: Type: text/plain, Size: 3562 bytes --]

On Wednesday, October 23, 2019, Marc-André Lureau <
marcandre.lureau@redhat.com> wrote:

> The function is specific to mipssim, let's inline it.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/char/serial.c         | 16 ----------------
>  hw/mips/mips_mipssim.c   | 13 ++++++++++---
>  include/hw/char/serial.h |  2 --
>  3 files changed, 10 insertions(+), 21 deletions(-)


Marc-André, hi!

Mismatch between the commit message and the patch content. Not acceptable.

Yours,
Aleksandar


>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 84de2740a7..ca95e09ec9 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1023,22 +1023,6 @@ static const TypeInfo serial_io_info = {
>      .class_init = serial_io_class_init,
>  };
>
> -SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> -                         Chardev *chr, MemoryRegion *system_io)
> -{
> -    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
> -
> -    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> -    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> -    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> -    qdev_init_nofail(DEVICE(self));
> -
> -    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> -    memory_region_add_subregion(system_io, base, &self->serial.io);
> -
> -    return self;
> -}
> -
>  static Property serial_properties[] = {
>      DEFINE_PROP_CHR("chardev", SerialState, chr),
>      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index 282bbecb24..26fb8fa4de 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -40,6 +40,7 @@
>  #include "hw/loader.h"
>  #include "elf.h"
>  #include "hw/sysbus.h"
> +#include "hw/qdev-properties.h"
>  #include "exec/address-spaces.h"
>  #include "qemu/error-report.h"
>  #include "sysemu/qtest.h"
> @@ -219,9 +220,15 @@ mips_mipssim_init(MachineState *machine)
>       * A single 16450 sits at offset 0x3f8. It is attached to
>       * MIPS CPU INT2, which is interrupt 4.
>       */
> -    if (serial_hd(0))
> -        serial_init(0x3f8, env->irq[4], 115200, serial_hd(0),
> -                    get_system_io());
> +    if (serial_hd(0)) {
> +        DeviceState *dev = qdev_create(NULL, TYPE_SERIAL_IO);
> +
> +        qdev_prop_set_chr(dev, "chardev", serial_hd(0));
> +        qdev_prop_set_int32(dev, "instance-id", 0x3f8);
> +        qdev_init_nofail(dev);
> +        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, env->irq[4]);
> +        sysbus_add_io(SYS_BUS_DEVICE(dev), 0x3f8, &SERIAL_IO(dev)->
> serial.io);
> +    }
>
>      if (nd_table[0].used)
>          /* MIPSnet uses the MIPS CPU INT0, which is interrupt 2. */
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index cf9cdafaee..40e35e6fff 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -109,8 +109,6 @@ void serial_set_frequency(SerialState *s, uint32_t
> frequency);
>  #define TYPE_SERIAL_IO "serial-io"
>  #define SERIAL_IO(s) OBJECT_CHECK(SerialIO, (s), TYPE_SERIAL_IO)
>
> -SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> -                      Chardev *chr, MemoryRegion *system_io);
>  SerialMM *serial_mm_init(MemoryRegion *address_space,
>                           hwaddr base, int regshift,
>                           qemu_irq irq, int baudbase,
> --
> 2.23.0.606.g08da6496b6
>
>
>

[-- Attachment #2: Type: text/html, Size: 4629 bytes --]

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 01/33] qdev: remove unused qdev_prop_int64
  2019-11-18 14:01   ` Peter Maydell
@ 2019-11-20  3:36     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  3:36 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Aleksandar Rikalo, Magnus Damm, Hervé Poussineau,
	Artyom Tarasenko, Eduardo Habkost, Fabien Chouteau, qemu-arm,
	Richard Henderson, Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 6:01 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:32, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/core/qdev-properties.c    | 32 --------------------------------
> >  include/hw/qdev-properties.h |  3 ---
> >  2 files changed, 35 deletions(-)
>
> I think I'd rather keep this. It's weird to not have a symmetric
> set of properties for the common integer types, and annoying
> for whoever next runs into a need for an int64 property to
> have to reinstate the deleted code. (Yes, I know we don't
> currently have int8 or int16.)
>

I don't think we should aim at being complete. Whenever we identify
dead code, unused for a long while, we should clean it up.

In this case, it is even worse, this has never been used since its
introduction in commit 07d1d063d3235c02f60dc92ec174d419e6f8a750, in
2017.



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-11-18 14:43   ` Peter Maydell
@ 2019-11-20  7:34     ` Marc-André Lureau
  2019-11-20 10:36       ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  7:34 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 6:43 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:33, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Memory mapped serial device is in fact a sysbus device. The following
> > patches will make use of sysbus facilities for resource and
> > registration.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/omap_uart.c      |  2 +-
> >  hw/char/serial.c         | 47 ++++++++++++++++++++++++++++------------
> >  hw/mips/boston.c         |  2 +-
> >  hw/mips/mips_malta.c     |  2 +-
> >  include/hw/char/serial.h | 20 ++++++++++++-----
> >  5 files changed, 51 insertions(+), 22 deletions(-)
>
>
> > -SerialState *serial_mm_init(MemoryRegion *address_space,
> > +SerialMM *serial_mm_init(MemoryRegion *address_space,
> >                              hwaddr base, int it_shift,
> >                              qemu_irq irq, int baudbase,
> >                              Chardev *chr, enum device_endian end)
> >  {
> > -    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> > -    SerialState *s = SERIAL(dev);
> > +    SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
> > +    SerialState *s = &self->serial;
> >
> > -    s->it_shift = it_shift;
> > +    self->it_shift = it_shift;
> >      s->irq = irq;
> > -    qdev_prop_set_uint32(dev, "baudbase", baudbase);
> > -    qdev_prop_set_chr(dev, "chardev", chr);
> > -    qdev_prop_set_int32(dev, "instance-id", base);
> > -    qdev_init_nofail(dev);
> > +    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
> > +    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
> > +    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> > +
> > +    qdev_init_nofail(DEVICE(s));
> > +    qdev_init_nofail(DEVICE(self));
>
> Something odd is going on here. This is a convenience
> wrapper around creating the SERIAL_MM device, so it's
> correct that it has to init DEVICE(self). But it should
> not be doing anything with the internals of 'self'.
> It's the instance_init/realize of the SERIAL_MM object that should
> instance_init/realize the 'self->serial' object. You have the
> code below to do the 'instance_init' in the serial_mm_instance_init
> function, but are missing the equivalent realize code.

This should be addressed later with "serial-mm: use sysbus
facilities". I'll add a comment.

>
> > -    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
> > +    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
> >                            "serial", 8 << it_shift);
> >      memory_region_add_subregion(address_space, base, &s->io);
> > -    return s;
> > +
> > +    return self;
> > +}
> > +
> > +static void serial_mm_instance_init(Object *o)
> > +{
> > +    SerialMM *self = SERIAL_MM(o);
>
> 'self' is not idiomatic for the name of the variable containing
> the pointer to the object in QOM code ("git grep '\Wself\W' hw"
> shows no uses of it at all, which is quite unusual for us --
> usually the codebase has at least a few uses of any non-standard
> way of writing something ;-))
>
> Usually we use something approximating to the abbreviation
> of the type name, so here 'smm' would do.

I would prefer something more straightforward than having to come up
with various name mangling.

Imho, we loose some readability, consistency & semantic by not naming
the object argument of the method "self"

>
> > +
> > +    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
> > +                            TYPE_SERIAL, &error_abort, NULL);
> >  }
>
> thanks
> -- PMM
>



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 14/33] serial-mm: add "regshift" property
  2019-11-18 14:54   ` Peter Maydell
@ 2019-11-20  7:53     ` Marc-André Lureau
  2019-11-20 10:43       ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  7:53 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 6:54 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > And a property and rename "it_shift" field to "regshift", as it seems
> > to be more popular (and I don't know what "it" stands for).
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> I have no idea what it_shift means either (I had a look in the
> git history but it seems to have been added with that name
> very early on when the commit logs were generally not very
> informative); 'regshift' sounds good to me too.
>
> > +static Property serial_mm_properties[] = {
> > +    DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
>
> This could use a comment describing what the property does.

"Set the register shift value"? Half-kidding, do you have better
comment to make? Otherwise, it's probably not worth.

From what I understand, it's just applying a shift on the IO addr,
probably for alignment/access arch-specific reasons. You probably know
better than me ;)

>
> > +    DEFINE_PROP_END_OF_LIST(),
>
> Otherwise
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>

thanks



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 15/33] serial-mm: add endianness property
  2019-11-18 15:07   ` Peter Maydell
@ 2019-11-20  7:59     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  7:59 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Mon, Nov 18, 2019 at 7:07 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Add a qdev property for endianness, so memory region setup can be done
> > in realize.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c         | 2 ++
> >  include/hw/char/serial.h | 1 +
> >  2 files changed, 3 insertions(+)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index c28cfc94fd..2f7667c30c 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -1081,6 +1081,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
> >      qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
> >      qdev_prop_set_chr(DEVICE(s), "chardev", chr);
> >      qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> > +    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
> >
> >      qdev_init_nofail(DEVICE(s));
> >      qdev_init_nofail(DEVICE(self));
> > @@ -1102,6 +1103,7 @@ static void serial_mm_instance_init(Object *o)
> >
> >  static Property serial_mm_properties[] = {
> >      DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
> > +    DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),
> >      DEFINE_PROP_END_OF_LIST(),
> >  };
>
> ...on reading patch 16, I just noticed that here in patch 15
> you define the 'endianness' property on the SerialMM object, but
> you're trying to set it on the SerialState object. This bug then
> gets fixed in passing in patch 16, but we should just be
> setting it on the right object to start with.

Correct! fixed.

thanks



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 16/33] serial-mm: use sysbus facilities
  2019-11-18 15:09   ` Peter Maydell
@ 2019-11-20  8:30     ` Marc-André Lureau
  2019-11-20 10:46       ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  8:30 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 7:09 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Make SerialMM a regular sysbus device, by registering the irq, and the
> > mmio region. Reexport the internal serial properties.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c | 35 ++++++++++++++++++++++++-----------
> >  1 file changed, 24 insertions(+), 11 deletions(-)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index 2f7667c30c..a40bc3ab81 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -1074,21 +1074,18 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
> >                              Chardev *chr, enum device_endian end)
> >  {
> >      SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
> > -    SerialState *s = &self->serial;
> > +    MemoryRegion *mr;
> >
> >      qdev_prop_set_uint8(DEVICE(self), "regshift", regshift);
> > -    s->irq = irq;
> > -    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
> > -    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
> > -    qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> > -    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
> > -
> > -    qdev_init_nofail(DEVICE(s));
> > +    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> > +    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> > +    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> > +    qdev_prop_set_uint8(DEVICE(self), "endianness", end);
>
> (this last line should be in patch 15)
>
> >      qdev_init_nofail(DEVICE(self));
> >
> > -    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], self,
> > -                          "serial", 8 << regshift);
> > -    memory_region_add_subregion(address_space, base, &s->io);
> > +    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> > +    mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(self), 0);
> > +    memory_region_add_subregion(address_space, base, mr);
> >
> >      return self;
> >  }
> > @@ -1099,6 +1096,8 @@ static void serial_mm_instance_init(Object *o)
> >
> >      object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
> >                              TYPE_SERIAL, &error_abort, NULL);
> > +
> > +    qdev_alias_all_properties(DEVICE(&self->serial), o);
> >  }
> >
> >  static Property serial_mm_properties[] = {
> > @@ -1107,11 +1106,25 @@ static Property serial_mm_properties[] = {
> >      DEFINE_PROP_END_OF_LIST(),
> >  };
> >
> > +static void serial_mm_realize(DeviceState *dev, Error **errp)
> > +{
> > +    SerialMM *self = SERIAL_MM(dev);
> > +    SerialState *s = &self->serial;
>
> Again, 'self' isn't idiomatic in QOM methods.

I made my argument earlier about why I prefer "self" even though it's
not represented today in hw/

> > +
> > +    qdev_init_nofail(DEVICE(s));
> > +
> > +    memory_region_init_io(&s->io, NULL, &serial_mm_ops[self->endianness], self,
> > +                          "serial", 8 << self->regshift);
> > +    sysbus_init_mmio(SYS_BUS_DEVICE(self), &s->io);
> > +    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);
> > +}
> > +
> >  static void serial_mm_class_init(ObjectClass *klass, void* data)
> >  {
> >      DeviceClass *dc = DEVICE_CLASS(klass);
> >
> >      dc->props = serial_mm_properties;
> > +    dc->realize = serial_mm_realize;
> >  }
> >
> >  static const TypeInfo serial_mm_info = {
> > --
> > 2.23.0.606.g08da6496b6
>
> Otherwise
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

Does your r-b stands if I keep "self"? Or do you feel strongly about it?

thanks



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 17/33] serial: make SerialIO a sysbus device
  2019-11-18 15:16   ` Peter Maydell
@ 2019-11-20  8:41     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  8:41 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

Hi

On Mon, Nov 18, 2019 at 7:17 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > Make serial IO a proper sysbus device, similar to serial MM.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c         | 58 ++++++++++++++++++++++++++++++++--------
> >  include/hw/char/serial.h | 13 +++++++--
> >  2 files changed, 58 insertions(+), 13 deletions(-)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index a40bc3ab81..84de2740a7 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -986,22 +986,57 @@ const MemoryRegionOps serial_io_ops = {
> >      .endianness = DEVICE_LITTLE_ENDIAN,
> >  };
> >
> > -SerialState *serial_init(int base, qemu_irq irq, int baudbase,
> > -                         Chardev *chr, MemoryRegion *system_io)
> > +static void serial_io_realize(DeviceState *dev, Error **errp)
> >  {
> > -    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
> > -    SerialState *s = SERIAL(dev);
> > +    SerialIO *self = SERIAL_IO(dev);
>
> "sio" or something rather than "self".

"sio", or something, "s", "si", "serialio"... "self"? Isn't it more
clear that we are talking about the instance itself? No ambiguity,
less weird naming. Isn't this more familar to any OO programmer? Let's
keep the discussion in "serial: start making SerialMM a sysbus
device".


>
> > +    SerialState *s = &self->serial;
> >
> > -    s->irq = irq;
> > -    qdev_prop_set_uint32(dev, "baudbase", baudbase);
> > -    qdev_prop_set_chr(dev, "chardev", chr);
> > -    qdev_prop_set_int32(dev, "instance-id", base);
> > -    qdev_init_nofail(dev);
> > +    qdev_init_nofail(DEVICE(s));
> >
> >      memory_region_init_io(&s->io, NULL, &serial_io_ops, s, "serial", 8);
> > -    memory_region_add_subregion(system_io, base, &s->io);
> > +    sysbus_init_irq(SYS_BUS_DEVICE(self), &self->serial.irq);
>
> You could say '&s->irq' here, since you have the local variable.

right, fixed

>
> > +}
> > +
> > +static void serial_io_class_init(ObjectClass *klass, void* data)
> > +{
> > +    DeviceClass *dc = DEVICE_CLASS(klass);
> > +
> > +    dc->realize = serial_io_realize;
>
> For class methods where the class has no data that needs
> to be migrated it's helpful to have a comment
>   /* No dc->vmsd: class has no migratable state */
> (which lets us know that it's intentional and not a forgotten
> thing). Some day I will get round to writing a patch so you
> can say "dc->vmsd = no_migratable_state;" ...
>

added

thanks

> > +}
> > +
> > +static void serial_io_instance_init(Object *o)
> > +{
> > +    SerialIO *self = SERIAL_IO(o);
> > +
> > +    object_initialize_child(o, "serial", &self->serial, sizeof(self->serial),
> > +                            TYPE_SERIAL, &error_abort, NULL);
> > +
> > +    qdev_alias_all_properties(DEVICE(&self->serial), o);
> > +}
> > +
> > +
> > +static const TypeInfo serial_io_info = {
> > +    .name = TYPE_SERIAL_IO,
> > +    .parent = TYPE_SYS_BUS_DEVICE,
> > +    .instance_size = sizeof(SerialIO),
> > +    .instance_init = serial_io_instance_init,
> > +    .class_init = serial_io_class_init,
> > +};
> > +
> > +SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> > +                         Chardev *chr, MemoryRegion *system_io)
> > +{
> > +    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
> >
> > -    return s;
> > +    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> > +    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> > +    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> > +    qdev_init_nofail(DEVICE(self));
> > +
> > +    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> > +    memory_region_add_subregion(system_io, base, &self->serial.io);
> > +
> > +    return self;
> >  }
>
> thanks
> -- PMM
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 10/33] serial: add "instance-id" property
  2019-10-23 17:31 ` [PATCH v3 10/33] serial: add "instance-id" property Marc-André Lureau
  2019-11-18 14:29   ` Peter Maydell
@ 2019-11-20  9:06   ` Marc-André Lureau
  1 sibling, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20  9:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Corey Minyard, Peter Maydell, Michael S. Tsirkin, Jason Wang,
	Mark Cave-Ayland, KONRAD Frederic, Edgar E. Iglesias,
	Paul Burton, Aleksandar Rikalo, Magnus Damm,
	Hervé Poussineau, Artyom Tarasenko, Eduardo Habkost,
	Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Wed, Oct 23, 2019 at 9:33 PM Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> This property will be used to move common vmstate registration to
> device realize in following patch.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

I realize adding a "instance-id" property instead of calling
qdev_set_legacy_instance_id() manually doesn't really help.
Patch dropped.

> ---
>  hw/char/serial.c         | 3 +++
>  include/hw/char/serial.h | 1 +
>  2 files changed, 4 insertions(+)
>
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 069d8715d0..0b61a71e4e 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -990,6 +990,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      s->irq = irq;
>      qdev_prop_set_uint32(dev, "baudbase", baudbase);
>      qdev_prop_set_chr(dev, "chardev", chr);
> +    qdev_prop_set_int32(dev, "instance-id", base);
>      serial_realize_core(s, &error_fatal);
>      qdev_set_legacy_instance_id(dev, base, 2);
>      qdev_init_nofail(dev);
> @@ -1003,6 +1004,7 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>  static Property serial_properties[] = {
>      DEFINE_PROP_CHR("chardev", SerialState, chr),
>      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> +    DEFINE_PROP_INT32("instance-id", SerialState, instance_id, 0),
>      DEFINE_PROP_END_OF_LIST(),
>  };
>
> @@ -1073,6 +1075,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
>      s->irq = irq;
>      qdev_prop_set_uint32(dev, "baudbase", baudbase);
>      qdev_prop_set_chr(dev, "chardev", chr);
> +    qdev_prop_set_int32(dev, "instance-id", base);
>
>      serial_realize_core(s, &error_fatal);
>      qdev_set_legacy_instance_id(dev, base, 2);
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index 3dc618598e..b472c7cd57 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -78,6 +78,7 @@ typedef struct SerialState {
>
>      QEMUTimer *modem_status_poll;
>      MemoryRegion io;
> +    int instance_id;
>  } SerialState;
>
>  extern const VMStateDescription vmstate_serial;
> --
> 2.23.0.606.g08da6496b6
>



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-11-20  7:34     ` Marc-André Lureau
@ 2019-11-20 10:36       ` Peter Maydell
  2019-11-20 10:40         ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-20 10:36 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 20 Nov 2019 at 07:34, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:

> > > +static void serial_mm_instance_init(Object *o)
> > > +{
> > > +    SerialMM *self = SERIAL_MM(o);
> >
> > 'self' is not idiomatic for the name of the variable containing
> > the pointer to the object in QOM code ("git grep '\Wself\W' hw"
> > shows no uses of it at all, which is quite unusual for us --
> > usually the codebase has at least a few uses of any non-standard
> > way of writing something ;-))
> >
> > Usually we use something approximating to the abbreviation
> > of the type name, so here 'smm' would do.
>
> I would prefer something more straightforward than having to come up
> with various name mangling.
>
> Imho, we loose some readability, consistency & semantic by not naming
> the object argument of the method "self"

There are two problems here:
 (1) "self" gives no hint at all about whether it's the Object*,
the DeviceState*, or the SerialMM*. All of those are the
object the method is operating on, but the type differences matter.

(2) *Absolutely nobody anywhere else in any other device model
is using the 'self' argument name*. It's not a convention if
only this one file is using it, and adopting it here gives us
absolutely no consistency -- exactly the opposite.

Item (1) is part of why we do things the way we do; item (2)
is why we should not make the 16550 UART some weird
exception from the way we do things.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-11-20 10:36       ` Peter Maydell
@ 2019-11-20 10:40         ` Marc-André Lureau
  2019-11-20 10:58           ` Peter Maydell
  0 siblings, 1 reply; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20 10:40 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

Hi

On Wed, Nov 20, 2019 at 2:36 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 20 Nov 2019 at 07:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
>
> > > > +static void serial_mm_instance_init(Object *o)
> > > > +{
> > > > +    SerialMM *self = SERIAL_MM(o);
> > >
> > > 'self' is not idiomatic for the name of the variable containing
> > > the pointer to the object in QOM code ("git grep '\Wself\W' hw"
> > > shows no uses of it at all, which is quite unusual for us --
> > > usually the codebase has at least a few uses of any non-standard
> > > way of writing something ;-))
> > >
> > > Usually we use something approximating to the abbreviation
> > > of the type name, so here 'smm' would do.
> >
> > I would prefer something more straightforward than having to come up
> > with various name mangling.
> >
> > Imho, we loose some readability, consistency & semantic by not naming
> > the object argument of the method "self"
>
> There are two problems here:
>  (1) "self" gives no hint at all about whether it's the Object*,
> the DeviceState*, or the SerialMM*. All of those are the
> object the method is operating on, but the type differences matter.

"self" should have the type of the object that is being implemented.

serial_mm_instance_init ->  SerialMM *self

>
> (2) *Absolutely nobody anywhere else in any other device model
> is using the 'self' argument name*. It's not a convention if
> only this one file is using it, and adopting it here gives us
> absolutely no consistency -- exactly the opposite.

Since there is no clear convention, then adding "self" isn't breaking
any convention.

>
> Item (1) is part of why we do things the way we do; item (2)
> is why we should not make the 16550 UART some weird
> exception from the way we do things.

It's about trying to make things better, and not about staying in the
current undefined/free zone.

-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 14/33] serial-mm: add "regshift" property
  2019-11-20  7:53     ` Marc-André Lureau
@ 2019-11-20 10:43       ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-20 10:43 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 20 Nov 2019 at 07:54, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Hi
>
> On Mon, Nov 18, 2019 at 6:54 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> > <marcandre.lureau@redhat.com> wrote:
> > > +static Property serial_mm_properties[] = {
> > > +    DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
> >
> > This could use a comment describing what the property does.
>
> "Set the register shift value"? Half-kidding, do you have better
> comment to make? Otherwise, it's probably not worth.
>
> From what I understand, it's just applying a shift on the IO addr,
> probably for alignment/access arch-specific reasons. You probably know
> better than me ;)

What this is doing is defining the spacing between adjacent
registers. Some MMIO-based 16550 implementations have the registers
at byte offsets from each other (that's regshift 0). Some have
them at halfword offsets (regshift 1); and some use 4-byte
offsets (regshift 2). Something like this will do:

 /*
  * Set the spacing between adjacent memory-mapped UART registers.
  * Each register will be at (1 << regshift) bytes after the previous one.
  */

(basically the comment bridges the gap between what I know as
somebody trying to use the 16550 model, ie the behaviour of
the hardware I'm trying to model, and what I need to do to configure
the QEMU code to give that behaviour.)

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 16/33] serial-mm: use sysbus facilities
  2019-11-20  8:30     ` Marc-André Lureau
@ 2019-11-20 10:46       ` Peter Maydell
  0 siblings, 0 replies; 99+ messages in thread
From: Peter Maydell @ 2019-11-20 10:46 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

On Wed, 20 Nov 2019 at 08:30, Marc-André Lureau
<marcandre.lureau@redhat.com> wrote:
>
> Hi
>
> On Mon, Nov 18, 2019 at 7:09 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > Otherwise
> > Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>
> Does your r-b stands if I keep "self"? Or do you feel strongly about it?

Yes, I do strongly think you need to change that (see argument in other thread).

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-11-20 10:40         ` Marc-André Lureau
@ 2019-11-20 10:58           ` Peter Maydell
  2019-11-20 11:03             ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Peter Maydell @ 2019-11-20 10:58 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

On Wed, 20 Nov 2019 at 10:40, Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
> On Wed, Nov 20, 2019 at 2:36 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > There are two problems here:
> >  (1) "self" gives no hint at all about whether it's the Object*,
> > the DeviceState*, or the SerialMM*. All of those are the
> > object the method is operating on, but the type differences matter.
>
> "self" should have the type of the object that is being implemented.
>
> serial_mm_instance_init ->  SerialMM *self

In a typical device implementation, some functions take the
object as a "SerialMM" or other specific pointer. Some take
an Object*. Some take a DeviceState*. Some take void*.
Which of those is "the type of the object that is being implemented" ?

> > (2) *Absolutely nobody anywhere else in any other device model
> > is using the 'self' argument name*. It's not a convention if
> > only this one file is using it, and adopting it here gives us
> > absolutely no consistency -- exactly the opposite.
>
> Since there is no clear convention, then adding "self" isn't breaking
> any convention.

There is a clear convention, which I explained to you already
(variable is named with some abbreviation/initialism of
the type name, or sometimes just 's' for "state"). You are trying
to write code which ignores that convention and does something
else *which no other code is doing*. Please stop doing that -- in
particular, don't do it in one device in the middle of a refactoring
series.

If you want to argue that we should change our convention for
how we write QOM code, feel free -- but that should be a separate
discussion and probably ought to come with a plan for how
to do a general update of the codebase to avoid a weird
mix of styles.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 13/33] serial: start making SerialMM a sysbus device
  2019-11-20 10:58           ` Peter Maydell
@ 2019-11-20 11:03             ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20 11:03 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Hervé Poussineau, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Paul Burton, Artyom Tarasenko, Richard Henderson

Hi

On Wed, Nov 20, 2019 at 2:58 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 20 Nov 2019 at 10:40, Marc-André Lureau
> <marcandre.lureau@gmail.com> wrote:
> > On Wed, Nov 20, 2019 at 2:36 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > > There are two problems here:
> > >  (1) "self" gives no hint at all about whether it's the Object*,
> > > the DeviceState*, or the SerialMM*. All of those are the
> > > object the method is operating on, but the type differences matter.
> >
> > "self" should have the type of the object that is being implemented.
> >
> > serial_mm_instance_init ->  SerialMM *self
>
> In a typical device implementation, some functions take the
> object as a "SerialMM" or other specific pointer. Some take
> an Object*. Some take a DeviceState*. Some take void*.
> Which of those is "the type of the object that is being implemented" ?

In OOP, you implement methods for a specific type. "self" is of the
type that is being implemented.

serial_mm_foo(SerialMM *self);

serial_mm_instance_init(Object *o) {
  SerialMM *self = SERIAL_MM(o);
  ..
}


If you have a generic function, not tied to a specific class, this
rule doesn't apply.

do_this(some arg, SerialMM *smm)

>
> > > (2) *Absolutely nobody anywhere else in any other device model
> > > is using the 'self' argument name*. It's not a convention if
> > > only this one file is using it, and adopting it here gives us
> > > absolutely no consistency -- exactly the opposite.
> >
> > Since there is no clear convention, then adding "self" isn't breaking
> > any convention.
>
> There is a clear convention, which I explained to you already
> (variable is named with some abbreviation/initialism of
> the type name, or sometimes just 's' for "state"). You are trying
> to write code which ignores that convention and does something
> else *which no other code is doing*. Please stop doing that -- in
> particular, don't do it in one device in the middle of a refactoring
> series.
>
> If you want to argue that we should change our convention for
> how we write QOM code, feel free -- but that should be a separate
> discussion and probably ought to come with a plan for how
> to do a general update of the codebase to avoid a weird
> mix of styles.
>

Fair enough

We can only change things incrementally, and while doing refactoring
is the right moment to write better and more readable code.


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 18/33] mips: inline serial_init
  2019-11-18 15:24   ` Peter Maydell
@ 2019-11-20 11:14     ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-20 11:14 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Corey Minyard, Michael S. Tsirkin, Jason Wang, Mark Cave-Ayland,
	QEMU Developers, KONRAD Frederic, Edgar E. Iglesias, Paul Burton,
	Magnus Damm, Hervé Poussineau, Artyom Tarasenko,
	Eduardo Habkost, Fabien Chouteau, qemu-arm, Richard Henderson,
	Daniel P. Berrangé,
	qemu-ppc, Aleksandar Markovic, Paolo Bonzini, Aurelien Jarno

Hi

On Mon, Nov 18, 2019 at 7:25 PM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau
> <marcandre.lureau@redhat.com> wrote:
> >
> > The function is specific to mipssim, let's inline it.
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  hw/char/serial.c         | 16 ----------------
> >  hw/mips/mips_mipssim.c   | 13 ++++++++++---
> >  include/hw/char/serial.h |  2 --
> >  3 files changed, 10 insertions(+), 21 deletions(-)
> >
> > diff --git a/hw/char/serial.c b/hw/char/serial.c
> > index 84de2740a7..ca95e09ec9 100644
> > --- a/hw/char/serial.c
> > +++ b/hw/char/serial.c
> > @@ -1023,22 +1023,6 @@ static const TypeInfo serial_io_info = {
> >      .class_init = serial_io_class_init,
> >  };
> >
> > -SerialIO *serial_init(int base, qemu_irq irq, int baudbase,
> > -                         Chardev *chr, MemoryRegion *system_io)
> > -{
> > -    SerialIO *self = SERIAL_IO(qdev_create(NULL, TYPE_SERIAL_IO));
> > -
> > -    qdev_prop_set_uint32(DEVICE(self), "baudbase", baudbase);
> > -    qdev_prop_set_chr(DEVICE(self), "chardev", chr);
> > -    qdev_prop_set_int32(DEVICE(self), "instance-id", base);
> > -    qdev_init_nofail(DEVICE(self));
> > -
> > -    sysbus_connect_irq(SYS_BUS_DEVICE(self), 0, irq);
> > -    memory_region_add_subregion(system_io, base, &self->serial.io);
> > -
> > -    return self;
> > -}
> > -
> >  static Property serial_properties[] = {
> >      DEFINE_PROP_CHR("chardev", SerialState, chr),
> >      DEFINE_PROP_UINT32("baudbase", SerialState, baudbase, 115200),
> > diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> > index 282bbecb24..26fb8fa4de 100644
> > --- a/hw/mips/mips_mipssim.c
> > +++ b/hw/mips/mips_mipssim.c
> > @@ -40,6 +40,7 @@
> >  #include "hw/loader.h"
> >  #include "elf.h"
> >  #include "hw/sysbus.h"
> > +#include "hw/qdev-properties.h"
> >  #include "exec/address-spaces.h"
> >  #include "qemu/error-report.h"
> >  #include "sysemu/qtest.h"
> > @@ -219,9 +220,15 @@ mips_mipssim_init(MachineState *machine)
> >       * A single 16450 sits at offset 0x3f8. It is attached to
> >       * MIPS CPU INT2, which is interrupt 4.
> >       */
> > -    if (serial_hd(0))
> > -        serial_init(0x3f8, env->irq[4], 115200, serial_hd(0),
> > -                    get_system_io());
> > +    if (serial_hd(0)) {
> > +        DeviceState *dev = qdev_create(NULL, TYPE_SERIAL_IO);
> > +
> > +        qdev_prop_set_chr(dev, "chardev", serial_hd(0));
> > +        qdev_prop_set_int32(dev, "instance-id", 0x3f8);
> > +        qdev_init_nofail(dev);
> > +        sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, env->irq[4]);
> > +        sysbus_add_io(SYS_BUS_DEVICE(dev), 0x3f8, &SERIAL_IO(dev)->serial.io);
> > +    }
>
> The code being inlined here doesn't seem to be identical to the
> code in the function above (it uses sysbus_add_io() rather than
> memory_region_add_subregion()).

sysbus_add_io() is memory_region_add_subregion(get_system_io(), ...).

I went a step too fast, let's make it a seperate patch to clarify it then.

>
> It's also a bit ugly that the code has to reach into the
> internals of the device to get the MemoryRegion pointer.
> Would it work to have the device use sysbus_init_mmio()
> in its init or realize method to register the IO port MemoryRegion,
> and then we could use sysbus_mmio_get_region() to get the
> MemoryRegion pointer ?

Sure, seems fine to me. The caller must have extra knowledge of the
memory region number though. This seems a bit fragile to me, compared
to static compilation checking.

>
> (If that does work, we should someday refactor
> sysbus_add_io() so that all the devices it's used with
> register the MemoryRegions that way, and then sysbus_add_io()
> can just take an 'int n' the way sysbus_mmio_map() does.
> But not today.)

I see, left for another day



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize
  2019-10-23 17:31 ` [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize Marc-André Lureau
  2019-11-18 14:32   ` Peter Maydell
@ 2019-11-20 12:32   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-11-20 12:32 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Instead of calling serial_exit_core() directly, use the QDev unrealize
> callback.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/char/serial-pci-multi.c | 2 +-
>   hw/char/serial-pci.c       | 2 +-
>   hw/char/serial.c           | 5 ++++-
>   include/hw/char/serial.h   | 1 -
>   4 files changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 60c1c948b8..a3200555aa 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -56,7 +56,7 @@ static void multi_serial_pci_exit(PCIDevice *dev)
>   
>       for (i = 0; i < pci->ports; i++) {
>           s = pci->state + i;
> -        serial_exit_core(s);
> +        object_property_set_bool(OBJECT(s), false, "realized", NULL);
>           memory_region_del_subregion(&pci->iobar, &s->io);
>           g_free(pci->name[i]);
>       }
> diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
> index 35a8552674..54bdd98325 100644
> --- a/hw/char/serial-pci.c
> +++ b/hw/char/serial-pci.c
> @@ -69,7 +69,7 @@ static void serial_pci_exit(PCIDevice *dev)
>       PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
>       SerialState *s = &pci->state;
>   
> -    serial_exit_core(s);
> +    object_property_set_bool(OBJECT(s), false, "realized", NULL);
>       qemu_free_irq(s->irq);
>   }
>   
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index bf34d9594e..667570e310 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -951,8 +951,10 @@ static void serial_realize(DeviceState *dev, Error **errp)
>       qdev_set_legacy_instance_id(dev, s->instance_id, 2);
>   }
>   
> -void serial_exit_core(SerialState *s)
> +static void serial_unrealize(DeviceState *dev, Error **errp)
>   {
> +    SerialState *s = SERIAL(dev);
> +
>       qemu_chr_fe_deinit(&s->chr, false);
>   
>       timer_del(s->modem_status_poll);
> @@ -1014,6 +1016,7 @@ static void serial_class_init(ObjectClass *klass, void* data)
>       DeviceClass *dc = DEVICE_CLASS(klass);
>   
>       dc->realize = serial_realize;
> +    dc->unrealize = serial_unrealize;
>       dc->vmsd = &vmstate_serial;
>       dc->props = serial_properties;
>   }
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index b445df5951..7cc6304f1d 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -84,7 +84,6 @@ typedef struct SerialState {
>   extern const VMStateDescription vmstate_serial;
>   extern const MemoryRegionOps serial_io_ops;
>   
> -void serial_exit_core(SerialState *s);
>   void serial_set_frequency(SerialState *s, uint32_t frequency);
>   
>   #define TYPE_SERIAL "serial"
> 

Nice.
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 15/33] serial-mm: add endianness property
  2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
  2019-11-18 15:02   ` Peter Maydell
  2019-11-18 15:07   ` Peter Maydell
@ 2019-11-20 12:57   ` Philippe Mathieu-Daudé
  2 siblings, 0 replies; 99+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-11-20 12:57 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Corey Minyard, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, Peter Maydell, Magnus Damm,
	Jason Wang, qemu-ppc, Mark Cave-Ayland, Fabien Chouteau,
	Aleksandar Rikalo, KONRAD Frederic, qemu-arm,
	Hervé Poussineau, Aurelien Jarno, Aleksandar Markovic,
	Paolo Bonzini, Edgar E. Iglesias, Paul Burton, Artyom Tarasenko,
	Richard Henderson

On 10/23/19 7:31 PM, Marc-André Lureau wrote:
> Add a qdev property for endianness, so memory region setup can be done
> in realize.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/char/serial.c         | 2 ++
>   include/hw/char/serial.h | 1 +
>   2 files changed, 3 insertions(+)
> 
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index c28cfc94fd..2f7667c30c 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -1081,6 +1081,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space,
>       qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
>       qdev_prop_set_chr(DEVICE(s), "chardev", chr);
>       qdev_prop_set_int32(DEVICE(s), "instance-id", base);
> +    qdev_prop_set_uint8(DEVICE(s), "endianness", end);
>   
>       qdev_init_nofail(DEVICE(s));
>       qdev_init_nofail(DEVICE(self));
> @@ -1102,6 +1103,7 @@ static void serial_mm_instance_init(Object *o)
>   
>   static Property serial_mm_properties[] = {
>       DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0),
> +    DEFINE_PROP_UINT8("endianness", SerialMM, endianness, DEVICE_NATIVE_ENDIAN),

The endianess is related to how the chipset is wired, but is not an 
intrinsic part of it.
Previously, serial_mm_init() was taking care of doing the correct wiring.
Now it seems the endianess is a property from the hardware.

Anyway:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

>       DEFINE_PROP_END_OF_LIST(),
>   };
>   
> diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
> index 759c85976d..2d0802a909 100644
> --- a/include/hw/char/serial.h
> +++ b/include/hw/char/serial.h
> @@ -86,6 +86,7 @@ typedef struct SerialMM {
>       SerialState serial;
>   
>       uint8_t regshift;
> +    uint8_t endianness;
>   } SerialMM;
>   
>   extern const VMStateDescription vmstate_serial;
> 



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-11-19 11:57         ` Marc-André Lureau
@ 2019-11-20 18:54           ` Dr. David Alan Gilbert
  2019-11-21  6:49             ` Marc-André Lureau
  0 siblings, 1 reply; 99+ messages in thread
From: Dr. David Alan Gilbert @ 2019-11-20 18:54 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Peter Maydell, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Corey Minyard, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Richard Henderson, Paul Burton, Artyom Tarasenko,
	Hervé Poussineau

* Marc-André Lureau (marcandre.lureau@gmail.com) wrote:
> On Tue, Nov 19, 2019 at 2:35 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > On Tue, 19 Nov 2019 at 10:23, Marc-André Lureau
> > <marcandre.lureau@redhat.com> wrote:
> > > On Mon, Nov 18, 2019 at 6:22 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > > > Did you test whether migration still works from a QEMU
> > > > version without this patch to one with it? (The migration
> > >
> > > Yes, I thought I did test correctly, but I realized testing with x86
> > > isn't correct.
> > >
> > > So with arm/musicpal for ex, I can migrate from before->after, however
> > > after->before won't work. Is that ok?
> >
> > Broadly speaking, the only case where we care about not
> > breaking cross-version migration is where we have a versioned
> > machine type. So musicpal doesn't matter too much. Beyond
> > that, yes, generally before->after is more important than
> > after->before. I have a feeling Red Hat downstream cares about
> > after->before migration at least for x86 but you or your colleagues
> > would know that better than me :-)
> >
> > > > vmstate code is too complicated for me to be able to figure
> > > > out whether passing the 'dev' pointer makes a difference
> > > > to whot it names the state sections and whether the
> > > > 'qdev_set_legacy_instance_id' suffices to avoid problems.)
> > >
> > > I don't see a way to fix after->before, because the instance id is
> > > initially 0 with the new code, and the old code expect a different
> > > value.
> >
> > Can you explain how the instance ID stuff works? I was
> > expecting that the result of setting the legacy instance ID
> > would just be that the new version would always have
> > the older setting, so if it works for old->new it would also
> > work for new->old. But as I say I don't understand this bit
> > of the migration code.
> 
> From what I understand, the alias_id is only used in
> savevm.c:find_se(), and thus can only be used to match against
> "legacy" instance id values. On new code, instance_id is generated
> incrementally from 0 with calculate_new_instance_id(), based on
> "qdev-path/vmsd-name".

I think there are cases here there's no qdev path that's viable;
e.g. for ISA devices, the ID is set to the ISA IO base:

hw/char/serial-isa.c
79:    qdev_set_legacy_instance_id(dev, isa->iobase, 3);

(In serial_isa_realizefn )

but to be honest I'd have to trace this out and see what values the
devices are actually using to be sure.

(And yes, please don't break backwards migration; otherwise I'll
end up having to figure out a fix).

Dave

> 
> 
> -- 
> Marc-André Lureau
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: [PATCH v3 07/33] serial: register vmsd with DeviceClass
  2019-11-20 18:54           ` Dr. David Alan Gilbert
@ 2019-11-21  6:49             ` Marc-André Lureau
  0 siblings, 0 replies; 99+ messages in thread
From: Marc-André Lureau @ 2019-11-21  6:49 UTC (permalink / raw)
  To: Dr. David Alan Gilbert
  Cc: Peter Maydell, Daniel P. Berrangé,
	Eduardo Habkost, Michael S. Tsirkin, qemu-ppc, Magnus Damm,
	Jason Wang, Mark Cave-Ayland, QEMU Developers, Fabien Chouteau,
	KONRAD Frederic, qemu-arm, Corey Minyard, Aurelien Jarno,
	Aleksandar Markovic, Paolo Bonzini, Edgar E. Iglesias,
	Richard Henderson, Paul Burton, Artyom Tarasenko,
	Hervé Poussineau

Hi

On Wed, Nov 20, 2019 at 10:54 PM Dr. David Alan Gilbert
<dgilbert@redhat.com> wrote:
>
> * Marc-André Lureau (marcandre.lureau@gmail.com) wrote:
> > On Tue, Nov 19, 2019 at 2:35 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > >
> > > On Tue, 19 Nov 2019 at 10:23, Marc-André Lureau
> > > <marcandre.lureau@redhat.com> wrote:
> > > > On Mon, Nov 18, 2019 at 6:22 PM Peter Maydell <peter.maydell@linaro.org> wrote:
> > > > > Did you test whether migration still works from a QEMU
> > > > > version without this patch to one with it? (The migration
> > > >
> > > > Yes, I thought I did test correctly, but I realized testing with x86
> > > > isn't correct.
> > > >
> > > > So with arm/musicpal for ex, I can migrate from before->after, however
> > > > after->before won't work. Is that ok?
> > >
> > > Broadly speaking, the only case where we care about not
> > > breaking cross-version migration is where we have a versioned
> > > machine type. So musicpal doesn't matter too much. Beyond
> > > that, yes, generally before->after is more important than
> > > after->before. I have a feeling Red Hat downstream cares about
> > > after->before migration at least for x86 but you or your colleagues
> > > would know that better than me :-)
> > >
> > > > > vmstate code is too complicated for me to be able to figure
> > > > > out whether passing the 'dev' pointer makes a difference
> > > > > to whot it names the state sections and whether the
> > > > > 'qdev_set_legacy_instance_id' suffices to avoid problems.)
> > > >
> > > > I don't see a way to fix after->before, because the instance id is
> > > > initially 0 with the new code, and the old code expect a different
> > > > value.
> > >
> > > Can you explain how the instance ID stuff works? I was
> > > expecting that the result of setting the legacy instance ID
> > > would just be that the new version would always have
> > > the older setting, so if it works for old->new it would also
> > > work for new->old. But as I say I don't understand this bit
> > > of the migration code.
> >
> > From what I understand, the alias_id is only used in
> > savevm.c:find_se(), and thus can only be used to match against
> > "legacy" instance id values. On new code, instance_id is generated
> > incrementally from 0 with calculate_new_instance_id(), based on
> > "qdev-path/vmsd-name".
>
> I think there are cases here there's no qdev path that's viable;
> e.g. for ISA devices, the ID is set to the ISA IO base:
>
> hw/char/serial-isa.c
> 79:    qdev_set_legacy_instance_id(dev, isa->iobase, 3);
>
> (In serial_isa_realizefn )
>
> but to be honest I'd have to trace this out and see what values the
> devices are actually using to be sure.

There is no qdev path, because ISA bus doesn't have get_dev_path()
implemented for some reason.

However, vmstate_register_with_alias_id() will use
calculate_new_instance_id(se->idstr) in this case.

>
> (And yes, please don't break backwards migration; otherwise I'll
> end up having to figure out a fix).

My understanding is that qdev_set_legacy_instance_id() always broke
backward migration.

To keep backward migration to work, we would need a mechanism to
"force" to use legacy instance id.

Would it be acceptable to have a patch that does that when the
original VM state uses legacy instance id?
If you start the VM with the new code path, and try to migrate to the
old / legacy it would fail. But migrating existing old VM back and
forth between old/new would work.





-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 99+ messages in thread

end of thread, other threads:[~2019-11-21  6:51 UTC | newest]

Thread overview: 99+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-23 17:31 [PATCH v3 00/33] Clean-ups: qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 01/33] qdev: remove unused qdev_prop_int64 Marc-André Lureau
2019-11-18 14:01   ` Peter Maydell
2019-11-20  3:36     ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 02/33] sysbus: remove unused sysbus_try_create* Marc-André Lureau
2019-10-23 22:35   ` Philippe Mathieu-Daudé
2019-11-18 14:02   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 03/33] sysbus: remove outdated comment Marc-André Lureau
2019-10-23 22:36   ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 04/33] chardev: generate an internal id when none given Marc-André Lureau
2019-11-18 14:12   ` Peter Maydell
2019-11-18 18:54     ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 05/33] serial-pci-multi: factor out multi_serial_get_nr_ports Marc-André Lureau
2019-10-23 22:41   ` Philippe Mathieu-Daudé
2019-10-24  9:59     ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 06/33] serial: initial qom-ification Marc-André Lureau
2019-10-24  8:48   ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 07/33] serial: register vmsd with DeviceClass Marc-André Lureau
2019-11-18 14:21   ` Peter Maydell
2019-11-19 10:22     ` Marc-André Lureau
2019-11-19 10:33       ` Peter Maydell
2019-11-19 11:57         ` Marc-André Lureau
2019-11-20 18:54           ` Dr. David Alan Gilbert
2019-11-21  6:49             ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 08/33] serial: add "chardev" property Marc-André Lureau
2019-10-23 22:39   ` Philippe Mathieu-Daudé
2019-11-18 14:23   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 09/33] serial: add "baudbase" property Marc-André Lureau
2019-10-23 22:40   ` Philippe Mathieu-Daudé
2019-11-18 14:26   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 10/33] serial: add "instance-id" property Marc-André Lureau
2019-11-18 14:29   ` Peter Maydell
2019-11-19 10:32     ` Marc-André Lureau
2019-11-20  9:06   ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 11/33] serial: realize the serial device Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 12/33] serial: replace serial_exit_core() with unrealize Marc-André Lureau
2019-11-18 14:32   ` Peter Maydell
2019-11-20 12:32   ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 13/33] serial: start making SerialMM a sysbus device Marc-André Lureau
2019-11-18 14:43   ` Peter Maydell
2019-11-20  7:34     ` Marc-André Lureau
2019-11-20 10:36       ` Peter Maydell
2019-11-20 10:40         ` Marc-André Lureau
2019-11-20 10:58           ` Peter Maydell
2019-11-20 11:03             ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 14/33] serial-mm: add "regshift" property Marc-André Lureau
2019-11-18 14:54   ` Peter Maydell
2019-11-20  7:53     ` Marc-André Lureau
2019-11-20 10:43       ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 15/33] serial-mm: add endianness property Marc-André Lureau
2019-11-18 15:02   ` Peter Maydell
2019-11-18 15:07   ` Peter Maydell
2019-11-20  7:59     ` Marc-André Lureau
2019-11-20 12:57   ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 16/33] serial-mm: use sysbus facilities Marc-André Lureau
2019-11-18 15:09   ` Peter Maydell
2019-11-20  8:30     ` Marc-André Lureau
2019-11-20 10:46       ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 17/33] serial: make SerialIO a sysbus device Marc-André Lureau
2019-11-18 15:16   ` Peter Maydell
2019-11-20  8:41     ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 18/33] mips: inline serial_init Marc-André Lureau
2019-11-18 15:24   ` Peter Maydell
2019-11-20 11:14     ` Marc-André Lureau
2019-11-20  0:07   ` Aleksandar Markovic
2019-10-23 17:31 ` [PATCH v3 19/33] sm501: make SerialMM a child, export chardev property Marc-André Lureau
2019-10-23 22:57   ` Philippe Mathieu-Daudé
2019-10-24 10:28     ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 20/33] vmmouse: replace PROP_PTR with PROP_LINK Marc-André Lureau
2019-10-23 22:59   ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 21/33] lance: " Marc-André Lureau
2019-10-23 23:00   ` Philippe Mathieu-Daudé
2019-10-24 11:09     ` Marc-André Lureau
2019-10-24 11:47       ` Philippe Mathieu-Daudé
2019-10-24 11:52         ` Peter Maydell
2019-10-24 18:07           ` Eduardo Habkost
2019-10-25  7:31             ` Peter Maydell
2019-10-24 12:25         ` Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 22/33] etraxfs: remove PROP_PTR usage Marc-André Lureau
2019-11-18 15:28   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 23/33] dp8393x: replace PROP_PTR with PROP_LINK Marc-André Lureau
2019-10-23 23:02   ` Philippe Mathieu-Daudé
2019-10-24 11:12     ` Marc-André Lureau
2019-10-24 11:48       ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 24/33] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
2019-11-18 14:15   ` KONRAD Frederic
2019-11-18 15:34   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 25/33] sparc: move PIL irq handling to cpu.c Marc-André Lureau
2019-11-18 15:38   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 26/33] RFC: mips/cps: fix setting saar property Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 27/33] cris: improve passing PIC interrupt vector to the CPU Marc-André Lureau
2019-11-18 15:40   ` Peter Maydell
2019-10-23 17:31 ` [PATCH v3 28/33] smbus-eeprom: remove PROP_PTR Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 29/33] omap-intc: " Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 30/33] omap-i2c: " Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 31/33] omap-gpio: " Marc-André Lureau
2019-10-23 17:31 ` [PATCH v3 32/33] qdev: remove PROP_MEMORY_REGION Marc-André Lureau
2019-10-23 23:07   ` Philippe Mathieu-Daudé
2019-10-23 17:31 ` [PATCH v3 33/33] qdev: remove QDEV_PROP_PTR Marc-André Lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.