All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [PULL 12/37] serial: start making SerialMM a sysbus device
Date: Tue,  7 Jan 2020 19:04:17 +0400	[thread overview]
Message-ID: <20200107150442.1727958-13-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20200107150442.1727958-1-marcandre.lureau@redhat.com>

Memory mapped serial device is in fact a sysbus device. The following
patches will make use of sysbus facilities for resource and
registration. In particular, "serial-mm: use sysbus facilities" will
move internal serial realization to serial_mm_realize callback to
follow qdev best practices.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
 include/hw/char/serial.h | 20 ++++++++---
 hw/char/omap_uart.c      |  2 +-
 hw/char/serial.c         | 72 ++++++++++++++++++++++++++++++----------
 hw/mips/boston.c         |  2 +-
 hw/mips/mips_malta.c     |  2 +-
 5 files changed, 73 insertions(+), 25 deletions(-)

diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 548944b06a..730165347c 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;
@@ -80,6 +79,14 @@ typedef struct SerialState {
     MemoryRegion io;
 } SerialState;
 
+typedef struct SerialMM {
+    SysBusDevice parent;
+
+    SerialState serial;
+
+    int it_shift;
+} SerialMM;
+
 extern const VMStateDescription vmstate_serial;
 extern const MemoryRegionOps serial_io_ops;
 
@@ -88,12 +95,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 */
 
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 ec388f3876..824390817c 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -1032,16 +1032,28 @@ 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 void serial_mm_realize(DeviceState *dev, Error **errp)
+{
+    SerialMM *s = SERIAL_MM(dev);
+    Error *local_err = NULL;
+
+    object_property_set_bool(OBJECT(&s->serial), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
 }
 
 static const MemoryRegionOps serial_mm_ops[3] = {
@@ -1068,30 +1080,56 @@ static const MemoryRegionOps serial_mm_ops[3] = {
     },
 };
 
-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)
 {
-    DeviceState *dev = DEVICE(object_new(TYPE_SERIAL));
-    SerialState *s = SERIAL(dev);
+    SerialMM *smm = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM));
+    SerialState *s = &smm->serial;
 
-    s->it_shift = it_shift;
+    smm->it_shift = it_shift;
     s->irq = irq;
-    qdev_prop_set_uint32(dev, "baudbase", baudbase);
-    qdev_prop_set_chr(dev, "chardev", chr);
-    qdev_set_legacy_instance_id(dev, base, 2);
-    qdev_init_nofail(dev);
+    qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase);
+    qdev_prop_set_chr(DEVICE(s), "chardev", chr);
+    qdev_set_legacy_instance_id(DEVICE(s), base, 2);
 
-    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], s,
+    qdev_init_nofail(DEVICE(smm));
+
+    memory_region_init_io(&s->io, NULL, &serial_mm_ops[end], smm,
                           "serial", 8 << it_shift);
     memory_region_add_subregion(address_space, base, &s->io);
-    return s;
+
+    return smm;
+}
+
+static void serial_mm_instance_init(Object *o)
+{
+    SerialMM *smm = SERIAL_MM(o);
+
+    object_initialize_child(o, "serial", &smm->serial, sizeof(smm->serial),
+                            TYPE_SERIAL, &error_abort, NULL);
 }
 
+static void serial_mm_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+
+    dc->realize = serial_mm_realize;
+}
+
+static const TypeInfo serial_mm_info = {
+    .name = TYPE_SERIAL_MM,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .class_init = serial_mm_class_init,
+    .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 783cd99848..ea92e5e27d 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -83,7 +83,7 @@ typedef struct {
     uint32_t i2csel;
     CharBackend display;
     char display_text[9];
-    SerialState *uart;
+    SerialMM *uart;
     bool display_inited;
 } MaltaFPGAState;
 
-- 
2.25.0.rc1.20.g2443f3f80d



  parent reply	other threads:[~2020-01-07 15:29 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-07 15:04 [PULL 00/37] qom-ify serial and remove QDEV_PROP_PTR Marc-André Lureau
2020-01-07 15:04 ` [PULL 01/37] hw/display/sm501: Always map the UART0 Marc-André Lureau
2020-01-07 15:04 ` [PULL 02/37] sysbus: remove unused sysbus_try_create* Marc-André Lureau
2020-01-07 15:04 ` [PULL 03/37] sysbus: remove outdated comment Marc-André Lureau
2020-01-07 15:04 ` [PULL 04/37] chardev: generate an internal id when none given Marc-André Lureau
2020-01-07 15:04 ` [PULL 05/37] serial-pci-multi: factor out multi_serial_get_port_count() Marc-André Lureau
2020-01-07 15:04 ` [PULL 06/37] serial: initial qom-ification Marc-André Lureau
2020-01-07 15:04 ` [PULL 07/37] serial: register vmsd with DeviceClass Marc-André Lureau
2020-01-07 15:04 ` [PULL 08/37] serial: add "chardev" property Marc-André Lureau
2020-01-07 15:04 ` [PULL 09/37] serial: add "baudbase" property Marc-André Lureau
2020-01-07 15:04 ` [PULL 10/37] serial: realize the serial device Marc-André Lureau
2020-01-07 15:04 ` [PULL 11/37] serial: replace serial_exit_core() with unrealize Marc-André Lureau
2020-01-07 15:04 ` Marc-André Lureau [this message]
2020-01-07 15:04 ` [PULL 13/37] serial-mm: add "regshift" property Marc-André Lureau
2020-01-07 15:04 ` [PULL 14/37] serial-mm: add endianness property Marc-André Lureau
2020-01-07 15:04 ` [PULL 15/37] serial-mm: use sysbus facilities Marc-André Lureau
2020-01-07 15:04 ` [PULL 16/37] serial: make SerialIO a sysbus device Marc-André Lureau
2020-01-07 15:04 ` [PULL 17/37] mips: inline serial_init() Marc-André Lureau
2020-01-07 15:04 ` [PULL 18/37] mips: baudbase is 115200 by default Marc-André Lureau
2020-01-07 15:04 ` [PULL 19/37] mips: use sysbus_add_io() Marc-André Lureau
2020-01-07 15:04 ` [PULL 20/37] mips: use sysbus_mmio_get_region() instead of internal fields Marc-André Lureau
2020-01-07 15:04 ` [PULL 21/37] sm501: make SerialMM a child, export chardev property Marc-André Lureau
2020-01-07 15:04 ` [PULL 22/37] vmmouse: replace PROP_PTR with PROP_LINK Marc-André Lureau
2020-01-07 15:04 ` [PULL 23/37] lance: " Marc-André Lureau
2020-01-07 15:04 ` [PULL 24/37] etraxfs: remove PROP_PTR usage Marc-André Lureau
2020-01-07 15:04 ` [PULL 25/37] dp8393x: replace PROP_PTR with PROP_LINK Marc-André Lureau
2020-01-07 15:04 ` [PULL 26/37] leon3: use qemu_irq framework instead of callback as property Marc-André Lureau
2020-01-07 15:04 ` [PULL 27/37] leon3: use qdev gpio facilities for the PIL Marc-André Lureau
2020-01-07 15:04 ` [PULL 28/37] qdev: use g_strcmp0() instead of open-coding it Marc-André Lureau
2020-01-07 15:04 ` [PULL 29/37] mips/cps: fix setting saar property Marc-André Lureau
2020-01-07 15:04 ` [PULL 30/37] cris: improve passing PIC interrupt vector to the CPU Marc-André Lureau
2020-01-07 15:04 ` [PULL 31/37] smbus-eeprom: remove PROP_PTR Marc-André Lureau
2020-01-07 15:04 ` [PULL 32/37] omap-intc: " Marc-André Lureau
2020-01-07 15:04 ` [PULL 33/37] omap-i2c: " Marc-André Lureau
2020-01-07 15:04 ` [PULL 34/37] omap-gpio: " Marc-André Lureau
2020-01-07 15:04 ` [PULL 35/37] qdev: remove PROP_MEMORY_REGION Marc-André Lureau
2020-01-07 15:04 ` [PULL 36/37] qdev: remove QDEV_PROP_PTR Marc-André Lureau
2020-07-06  8:44   ` Philippe Mathieu-Daudé
2020-07-06 10:01     ` Marc-André Lureau
2020-07-06 10:13       ` Philippe Mathieu-Daudé
2020-07-06 12:03         ` Markus Armbruster
2020-01-07 15:04 ` [PULL 37/37] qdev/qom: remove some TODO limitations now that PROP_PTR is gone Marc-André Lureau
2020-01-10 10:31 ` [PULL 00/37] qom-ify serial and remove QDEV_PROP_PTR Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200107150442.1727958-13-marcandre.lureau@redhat.com \
    --to=marcandre.lureau@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is 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.