kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs
@ 2023-02-15 17:43 Philippe Mathieu-Daudé
  2023-02-15 17:43 ` [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header Philippe Mathieu-Daudé
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé

i8254_pit_init() uses a odd pattern of "use this IRQ output
line if non-NULL, otherwise use the ISA IRQ #number as output".

Rework as simply "Use this IRQ output".

Un-inline/rename/document functions.

Based-on: <20230215161641.32663-1-philmd@linaro.org>
          "hw/ide: Untangle ISA/PCI abuses of ide_init_ioport" v2
https://lore.kernel.org/qemu-devel/20230215161641.32663-1-philmd@linaro.org/

Philippe Mathieu-Daudé (5):
  hw/timer/hpet: Include missing 'hw/qdev-properties.h' header
  hw/timer/i8254: Factor i8254_pit_create() out and document
  hw/i386/pc: Un-inline i8254_pit_init()
  hw/timer/i8254: Really inline i8254_pit_init()
  hw/i386/kvm: Factor i8254_pit_create_try_kvm() out

 hw/i386/kvm/i8254.c        | 18 ++++++++++++++
 hw/i386/microvm.c          |  6 +----
 hw/i386/pc.c               | 15 +++++-------
 hw/isa/i82378.c            |  2 +-
 hw/isa/piix4.c             |  4 ++--
 hw/isa/vt82c686.c          |  2 +-
 hw/mips/jazz.c             |  2 +-
 hw/timer/hpet.c            |  1 +
 hw/timer/i8254.c           | 16 +++++++++++++
 include/hw/timer/i8254.h   | 48 +++++++++++++-------------------------
 target/i386/kvm/kvm-stub.c |  6 +++++
 11 files changed, 69 insertions(+), 51 deletions(-)

-- 
2.38.1


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

* [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
@ 2023-02-15 17:43 ` Philippe Mathieu-Daudé
  2023-02-15 18:55   ` Richard Henderson
  2023-02-15 17:43 ` [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé

Avoid when refactoring unrelated headers:

  hw/timer/hpet.c:776:39: error: array has incomplete element type 'Property' (aka 'struct Property')
  static Property hpet_device_properties[] = {
                                        ^
  hw/timer/hpet.c:777:5: error: implicit declaration of function 'DEFINE_PROP_UINT8' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
      DEFINE_PROP_UINT8("timers", HPETState, num_timers, HPET_MIN_TIMERS),
      ^

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/timer/hpet.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 9520471be2..214d6a0501 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -30,6 +30,7 @@
 #include "qapi/error.h"
 #include "qemu/error-report.h"
 #include "qemu/timer.h"
+#include "hw/qdev-properties.h"
 #include "hw/timer/hpet.h"
 #include "hw/sysbus.h"
 #include "hw/rtc/mc146818rtc.h"
-- 
2.38.1


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

* [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
  2023-02-15 17:43 ` [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header Philippe Mathieu-Daudé
@ 2023-02-15 17:43 ` Philippe Mathieu-Daudé
  2023-02-15 18:56   ` Richard Henderson
  2023-02-15 17:43 ` [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init() Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/timer/i8254.c         | 16 ++++++++++++++++
 include/hw/timer/i8254.h | 24 +++++++++++++-----------
 2 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/hw/timer/i8254.c b/hw/timer/i8254.c
index c8388ea432..9b6932ab08 100644
--- a/hw/timer/i8254.c
+++ b/hw/timer/i8254.c
@@ -26,9 +26,11 @@
 #include "hw/irq.h"
 #include "qemu/module.h"
 #include "qemu/timer.h"
+#include "hw/qdev-properties.h"
 #include "hw/timer/i8254.h"
 #include "hw/timer/i8254_internal.h"
 #include "qom/object.h"
+#include "qapi/error.h"
 
 //#define DEBUG_PIT
 
@@ -47,6 +49,20 @@ struct PITClass {
     DeviceRealize parent_realize;
 };
 
+ISADevice *i8254_pit_create(ISABus *bus, int iobase, qemu_irq irq_in)
+{
+    DeviceState *dev;
+    ISADevice *d;
+
+    d = isa_new(TYPE_I8254);
+    dev = DEVICE(d);
+    qdev_prop_set_uint32(dev, "iobase", iobase);
+    isa_realize_and_unref(d, bus, &error_fatal);
+    qdev_connect_gpio_out(dev, 0, irq_in);
+
+    return d;
+}
+
 static void pit_irq_timer_update(PITChannelState *s, int64_t current_time);
 
 static int pit_get_count(PITChannelState *s)
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index 8402caad30..a0843cae07 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -45,21 +45,23 @@ OBJECT_DECLARE_TYPE(PITCommonState, PITCommonClass, PIT_COMMON)
 #define TYPE_I8254 "isa-pit"
 #define TYPE_KVM_I8254 "kvm-pit"
 
+/**
+ * Create and realize a I8254 PIT device on the heap.
+ * @bus: the #ISABus to put it on.
+ * @iobase: the base I/O port.
+ * @irq_in: qemu_irq to connect the PIT output IRQ to.
+ *
+ * Create the device state structure, initialize it, put it on the
+ * specified ISA @bus, and drop the reference to it (the device is realized).
+ */
+ISADevice *i8254_pit_create(ISABus *bus, int iobase, qemu_irq irq_in);
+
 static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
                                         qemu_irq alt_irq)
 {
-    DeviceState *dev;
-    ISADevice *d;
-
-    d = isa_new(TYPE_I8254);
-    dev = DEVICE(d);
-    qdev_prop_set_uint32(dev, "iobase", base);
-    isa_realize_and_unref(d, bus, &error_fatal);
-    qdev_connect_gpio_out(dev, 0,
-                          isa_irq >= 0 ? isa_bus_get_irq(bus, isa_irq)
+    return i8254_pit_create(bus, base, isa_irq >= 0
+                                       ? isa_bus_get_irq(bus, isa_irq)
                                        : alt_irq);
-
-    return d;
 }
 
 static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
-- 
2.38.1


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

* [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init()
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
  2023-02-15 17:43 ` [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header Philippe Mathieu-Daudé
  2023-02-15 17:43 ` [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document Philippe Mathieu-Daudé
@ 2023-02-15 17:43 ` Philippe Mathieu-Daudé
  2023-02-15 18:58   ` Richard Henderson
  2023-02-15 17:43 ` [PATCH 4/5] hw/timer/i8254: Really inline i8254_pit_init() Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé

pc_basic_device_init() is the single caller of i8254_pit_init()
with a non-NULL 'alt_irq' argument. Open-code i8254_pit_init()
by direclty calling i8254_pit_create().

To confirm all other callers pass a NULL 'alt_irq', add an
assertion in i8254_pit_init().

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/i386/pc.c             | 10 +++++-----
 include/hw/timer/i8254.h |  5 ++---
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 79297a6ecd..fe95f6e9f2 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1258,8 +1258,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
 {
     int i;
     DeviceState *hpet = NULL;
-    int pit_isa_irq = 0;
-    qemu_irq pit_alt_irq = NULL;
+    qemu_irq pit_irq;
     qemu_irq rtc_irq = NULL;
     ISADevice *pit = NULL;
     MemoryRegion *ioport80_io = g_new(MemoryRegion, 1);
@@ -1301,9 +1300,10 @@ void pc_basic_device_init(struct PCMachineState *pcms,
         for (i = 0; i < GSI_NUM_PINS; i++) {
             sysbus_connect_irq(SYS_BUS_DEVICE(hpet), i, gsi[i]);
         }
-        pit_isa_irq = -1;
-        pit_alt_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_PIT_INT);
+        pit_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_PIT_INT);
         rtc_irq = qdev_get_gpio_in(hpet, HPET_LEGACY_RTC_INT);
+    } else {
+        pit_irq = isa_bus_get_irq(isa_bus, 0);
     }
     *rtc_state = mc146818_rtc_init(isa_bus, 2000, rtc_irq);
 
@@ -1314,7 +1314,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
         if (kvm_pit_in_kernel()) {
             pit = kvm_pit_init(isa_bus, 0x40);
         } else {
-            pit = i8254_pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
+            pit = i8254_pit_create(isa_bus, 0x40, pit_irq);
         }
         if (hpet) {
             /* connect PIT to output control line of the HPET */
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index a0843cae07..0d837f3f41 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -59,9 +59,8 @@ ISADevice *i8254_pit_create(ISABus *bus, int iobase, qemu_irq irq_in);
 static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
                                         qemu_irq alt_irq)
 {
-    return i8254_pit_create(bus, base, isa_irq >= 0
-                                       ? isa_bus_get_irq(bus, isa_irq)
-                                       : alt_irq);
+    assert(isa_irq == 0 && alt_irq == NULL);
+    return i8254_pit_create(bus, base, isa_bus_get_irq(bus, 0));
 }
 
 static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
-- 
2.38.1


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

* [PATCH 4/5] hw/timer/i8254: Really inline i8254_pit_init()
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2023-02-15 17:43 ` [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init() Philippe Mathieu-Daudé
@ 2023-02-15 17:43 ` Philippe Mathieu-Daudé
  2023-02-15 17:43 ` [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out Philippe Mathieu-Daudé
  2023-03-01 21:54 ` [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Michael S. Tsirkin
  5 siblings, 0 replies; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé,
	Hervé Poussineau, Aurelien Jarno, Huacai Chen, Jiaxun Yang,
	Aleksandar Rikalo

In-line the one-line i8254_pit_create() call.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/i386/microvm.c        | 2 +-
 hw/isa/i82378.c          | 2 +-
 hw/isa/piix4.c           | 4 ++--
 hw/isa/vt82c686.c        | 2 +-
 hw/mips/jazz.c           | 2 +-
 include/hw/timer/i8254.h | 7 -------
 6 files changed, 6 insertions(+), 13 deletions(-)

diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 29f30dd6d3..9204bb4ff2 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -261,7 +261,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
         if (kvm_pit_in_kernel()) {
             kvm_pit_init(isa_bus, 0x40);
         } else {
-            i8254_pit_init(isa_bus, 0x40, 0, NULL);
+            i8254_pit_create(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
         }
     }
 
diff --git a/hw/isa/i82378.c b/hw/isa/i82378.c
index e3322e03bf..f75f5a23ba 100644
--- a/hw/isa/i82378.c
+++ b/hw/isa/i82378.c
@@ -99,7 +99,7 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
     isa_bus_irqs(isabus, s->i8259);
 
     /* 1 82C54 (pit) */
-    pit = i8254_pit_init(isabus, 0x40, 0, NULL);
+    pit = i8254_pit_create(isabus, 0x40, isa_bus_get_irq(isabus, 0));
 
     /* speaker */
     pcspk_init(isa_new(TYPE_PC_SPEAKER), isabus, pit);
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index 94e5dc7825..8ff118445f 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -214,8 +214,8 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
     /* initialize ISA irqs */
     isa_bus_irqs(isa_bus, s->isa);
 
-    /* initialize pit */
-    i8254_pit_init(isa_bus, 0x40, 0, NULL);
+    /* PIT */
+    i8254_pit_create(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
 
     /* DMA */
     i8257_dma_init(isa_bus, 0);
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 3f9bd0c04d..297bcda420 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -624,7 +624,7 @@ static void via_isa_realize(PCIDevice *d, Error **errp)
 
     s->isa_irqs = i8259_init(isa_bus, *isa_irq);
     isa_bus_irqs(isa_bus, s->isa_irqs);
-    i8254_pit_init(isa_bus, 0x40, 0, NULL);
+    i8254_pit_create(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
     i8257_dma_init(isa_bus, 0);
 
     /* RTC */
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 6aefe9a61b..856acfe2a7 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -251,7 +251,7 @@ static void mips_jazz_init(MachineState *machine,
     i8259 = i8259_init(isa_bus, env->irq[4]);
     isa_bus_irqs(isa_bus, i8259);
     i8257_dma_init(isa_bus, 0);
-    pit = i8254_pit_init(isa_bus, 0x40, 0, NULL);
+    pit = i8254_pit_create(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
     pcspk_init(isa_new(TYPE_PC_SPEAKER), isa_bus, pit);
 
     /* Video card */
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index 0d837f3f41..aa48c44d39 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -56,13 +56,6 @@ OBJECT_DECLARE_TYPE(PITCommonState, PITCommonClass, PIT_COMMON)
  */
 ISADevice *i8254_pit_create(ISABus *bus, int iobase, qemu_irq irq_in);
 
-static inline ISADevice *i8254_pit_init(ISABus *bus, int base, int isa_irq,
-                                        qemu_irq alt_irq)
-{
-    assert(isa_irq == 0 && alt_irq == NULL);
-    return i8254_pit_create(bus, base, isa_bus_get_irq(bus, 0));
-}
-
 static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
 {
     DeviceState *dev;
-- 
2.38.1


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

* [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2023-02-15 17:43 ` [PATCH 4/5] hw/timer/i8254: Really inline i8254_pit_init() Philippe Mathieu-Daudé
@ 2023-02-15 17:43 ` Philippe Mathieu-Daudé
  2023-02-15 19:02   ` Richard Henderson
  2023-03-01 21:54 ` [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Michael S. Tsirkin
  5 siblings, 1 reply; 11+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-02-15 17:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, Richard Henderson,
	kvm, Michael S. Tsirkin, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum, Philippe Mathieu-Daudé

Factor a new i8254_pit_create_try_kvm() helper out of the
following patter:

  if (kvm_pit_in_kernel()) {
      kvm_pit_init(...);
  } else }
    i8254_pit_create(...);
  }

(adding a stub for non-KVM builds).

Since kvm_pit_init() is only used once, un-inline it and
remove the now unused headers from "hw/timer/i8254.h".

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/i386/kvm/i8254.c        | 18 ++++++++++++++++++
 hw/i386/microvm.c          |  6 +-----
 hw/i386/pc.c               |  7 ++-----
 include/hw/timer/i8254.h   | 22 ++++++----------------
 target/i386/kvm/kvm-stub.c |  6 ++++++
 5 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c
index 191a26fa57..9520c98c76 100644
--- a/hw/i386/kvm/i8254.c
+++ b/hw/i386/kvm/i8254.c
@@ -35,6 +35,7 @@
 #include "hw/qdev-properties-system.h"
 #include "sysemu/kvm.h"
 #include "qom/object.h"
+#include "kvm/kvm_i386.h"
 
 #define KVM_PIT_REINJECT_BIT 0
 
@@ -59,6 +60,23 @@ struct KVMPITClass {
     DeviceRealize parent_realize;
 };
 
+ISADevice *i8254_pit_create_try_kvm(ISABus *bus, int iobase, qemu_irq irq_in)
+{
+    DeviceState *dev;
+    ISADevice *d;
+
+    if (!kvm_pit_in_kernel()) {
+        return i8254_pit_create(bus, iobase, irq_in);
+    }
+
+    d = isa_new(TYPE_KVM_I8254);
+    dev = DEVICE(d);
+    qdev_prop_set_uint32(dev, "iobase", iobase);
+    isa_realize_and_unref(d, bus, &error_fatal);
+
+    return d;
+}
+
 static void kvm_pit_update_clock_offset(KVMPITState *s)
 {
     int64_t offset, clock_offset;
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 9204bb4ff2..d93dc8a263 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -258,11 +258,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
     }
 
     if (x86ms->pit == ON_OFF_AUTO_ON || x86ms->pit == ON_OFF_AUTO_AUTO) {
-        if (kvm_pit_in_kernel()) {
-            kvm_pit_init(isa_bus, 0x40);
-        } else {
-            i8254_pit_create(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
-        }
+        i8254_pit_create_try_kvm(isa_bus, 0x40, isa_bus_get_irq(isa_bus, 0));
     }
 
     if (mms->rtc == ON_OFF_AUTO_ON ||
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index fe95f6e9f2..7d9f57c695 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1311,11 +1311,8 @@ void pc_basic_device_init(struct PCMachineState *pcms,
 
     if (!xen_enabled() &&
         (x86ms->pit == ON_OFF_AUTO_AUTO || x86ms->pit == ON_OFF_AUTO_ON)) {
-        if (kvm_pit_in_kernel()) {
-            pit = kvm_pit_init(isa_bus, 0x40);
-        } else {
-            pit = i8254_pit_create(isa_bus, 0x40, pit_irq);
-        }
+        pit = i8254_pit_create_try_kvm(isa_bus, 0x40, pit_irq);
+
         if (hpet) {
             /* connect PIT to output control line of the HPET */
             qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(DEVICE(pit), 0));
diff --git a/include/hw/timer/i8254.h b/include/hw/timer/i8254.h
index aa48c44d39..9fb18c4ff4 100644
--- a/include/hw/timer/i8254.h
+++ b/include/hw/timer/i8254.h
@@ -25,9 +25,6 @@
 #ifndef HW_I8254_H
 #define HW_I8254_H
 
-#include "hw/qdev-properties.h"
-#include "hw/isa/isa.h"
-#include "qapi/error.h"
 #include "qom/object.h"
 
 #define PIT_FREQ 1193182
@@ -55,19 +52,12 @@ OBJECT_DECLARE_TYPE(PITCommonState, PITCommonClass, PIT_COMMON)
  * specified ISA @bus, and drop the reference to it (the device is realized).
  */
 ISADevice *i8254_pit_create(ISABus *bus, int iobase, qemu_irq irq_in);
-
-static inline ISADevice *kvm_pit_init(ISABus *bus, int base)
-{
-    DeviceState *dev;
-    ISADevice *d;
-
-    d = isa_new(TYPE_KVM_I8254);
-    dev = DEVICE(d);
-    qdev_prop_set_uint32(dev, "iobase", base);
-    isa_realize_and_unref(d, bus, &error_fatal);
-
-    return d;
-}
+/**
+ * Try to create and realize a in-kernel I8254 PIT device on the heap.
+ * If KVM is not available or doesn't have in-kernel PIT support, a
+ * emulated PIT is used. See i8254_pit_create.
+ */
+ISADevice *i8254_pit_create_try_kvm(ISABus *bus, int iobase, qemu_irq irq_in);
 
 void pit_set_gate(ISADevice *dev, int channel, int val);
 void pit_get_channel_info(ISADevice *dev, int channel, PITChannelInfo *info);
diff --git a/target/i386/kvm/kvm-stub.c b/target/i386/kvm/kvm-stub.c
index e052f1c7b0..396da89f55 100644
--- a/target/i386/kvm/kvm-stub.c
+++ b/target/i386/kvm/kvm-stub.c
@@ -10,6 +10,7 @@
  *
  */
 #include "qemu/osdep.h"
+#include "hw/timer/i8254.h"
 #include "cpu.h"
 #include "kvm_i386.h"
 
@@ -49,3 +50,8 @@ void kvm_set_max_apic_id(uint32_t max_apic_id)
 {
     return;
 }
+
+ISADevice *i8254_pit_create_try_kvm(ISABus *bus, int iobase, qemu_irq irq_in)
+{
+    return i8254_pit_create(bus, iobase, irq_in);
+}
-- 
2.38.1


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

* Re: [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header
  2023-02-15 17:43 ` [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header Philippe Mathieu-Daudé
@ 2023-02-15 18:55   ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2023-02-15 18:55 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, kvm,
	Michael S. Tsirkin, Eduardo Habkost, qemu-ppc, Marcel Apfelbaum

On 2/15/23 07:43, Philippe Mathieu-Daudé wrote:
> Avoid when refactoring unrelated headers:
> 
>    hw/timer/hpet.c:776:39: error: array has incomplete element type 'Property' (aka 'struct Property')
>    static Property hpet_device_properties[] = {
>                                          ^
>    hw/timer/hpet.c:777:5: error: implicit declaration of function 'DEFINE_PROP_UINT8' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
>        DEFINE_PROP_UINT8("timers", HPETState, num_timers, HPET_MIN_TIMERS),
>        ^
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>   hw/timer/hpet.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
> index 9520471be2..214d6a0501 100644
> --- a/hw/timer/hpet.c
> +++ b/hw/timer/hpet.c
> @@ -30,6 +30,7 @@
>   #include "qapi/error.h"
>   #include "qemu/error-report.h"
>   #include "qemu/timer.h"
> +#include "hw/qdev-properties.h"
>   #include "hw/timer/hpet.h"
>   #include "hw/sysbus.h"
>   #include "hw/rtc/mc146818rtc.h"

Acked-by: Richard Henderson <richard.henderson@linaro.org>

r~

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

* Re: [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document
  2023-02-15 17:43 ` [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document Philippe Mathieu-Daudé
@ 2023-02-15 18:56   ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2023-02-15 18:56 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, kvm,
	Michael S. Tsirkin, Eduardo Habkost, qemu-ppc, Marcel Apfelbaum

On 2/15/23 07:43, Philippe Mathieu-Daudé wrote:
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/timer/i8254.c         | 16 ++++++++++++++++
>   include/hw/timer/i8254.h | 24 +++++++++++++-----------
>   2 files changed, 29 insertions(+), 11 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~

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

* Re: [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init()
  2023-02-15 17:43 ` [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init() Philippe Mathieu-Daudé
@ 2023-02-15 18:58   ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2023-02-15 18:58 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, kvm,
	Michael S. Tsirkin, Eduardo Habkost, qemu-ppc, Marcel Apfelbaum

On 2/15/23 07:43, Philippe Mathieu-Daudé wrote:
> pc_basic_device_init() is the single caller of i8254_pit_init()
> with a non-NULL 'alt_irq' argument. Open-code i8254_pit_init()
> by direclty calling i8254_pit_create().
> 
> To confirm all other callers pass a NULL 'alt_irq', add an
> assertion in i8254_pit_init().
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/i386/pc.c             | 10 +++++-----
>   include/hw/timer/i8254.h |  5 ++---
>   2 files changed, 7 insertions(+), 8 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~

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

* Re: [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out
  2023-02-15 17:43 ` [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out Philippe Mathieu-Daudé
@ 2023-02-15 19:02   ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2023-02-15 19:02 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Marcelo Tosatti, Sergio Lopez, Paolo Bonzini, kvm,
	Michael S. Tsirkin, Eduardo Habkost, qemu-ppc, Marcel Apfelbaum

On 2/15/23 07:43, Philippe Mathieu-Daudé wrote:
> Factor a new i8254_pit_create_try_kvm() helper out of the
> following patter:

pattern

> 
>    if (kvm_pit_in_kernel()) {
>        kvm_pit_init(...);
>    } else }
>      i8254_pit_create(...);
>    }
> 
> (adding a stub for non-KVM builds).
> 
> Since kvm_pit_init() is only used once, un-inline it and
> remove the now unused headers from "hw/timer/i8254.h".
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/i386/kvm/i8254.c        | 18 ++++++++++++++++++
>   hw/i386/microvm.c          |  6 +-----
>   hw/i386/pc.c               |  7 ++-----
>   include/hw/timer/i8254.h   | 22 ++++++----------------
>   target/i386/kvm/kvm-stub.c |  6 ++++++
>   5 files changed, 33 insertions(+), 26 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~

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

* Re: [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs
  2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2023-02-15 17:43 ` [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out Philippe Mathieu-Daudé
@ 2023-03-01 21:54 ` Michael S. Tsirkin
  5 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2023-03-01 21:54 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Marcelo Tosatti, Sergio Lopez, Paolo Bonzini,
	Richard Henderson, kvm, Eduardo Habkost, qemu-ppc,
	Marcel Apfelbaum

On Wed, Feb 15, 2023 at 06:43:48PM +0100, Philippe Mathieu-Daudé wrote:
> i8254_pit_init() uses a odd pattern of "use this IRQ output
> line if non-NULL, otherwise use the ISA IRQ #number as output".
> 
> Rework as simply "Use this IRQ output".


Acked-by: Michael S. Tsirkin <mst@redhat.com>


Given it also affects KVM I will let Paolo merge this.

> Un-inline/rename/document functions.
> 
> Based-on: <20230215161641.32663-1-philmd@linaro.org>
>           "hw/ide: Untangle ISA/PCI abuses of ide_init_ioport" v2
> https://lore.kernel.org/qemu-devel/20230215161641.32663-1-philmd@linaro.org/
> 
> Philippe Mathieu-Daudé (5):
>   hw/timer/hpet: Include missing 'hw/qdev-properties.h' header
>   hw/timer/i8254: Factor i8254_pit_create() out and document
>   hw/i386/pc: Un-inline i8254_pit_init()
>   hw/timer/i8254: Really inline i8254_pit_init()
>   hw/i386/kvm: Factor i8254_pit_create_try_kvm() out
> 
>  hw/i386/kvm/i8254.c        | 18 ++++++++++++++
>  hw/i386/microvm.c          |  6 +----
>  hw/i386/pc.c               | 15 +++++-------
>  hw/isa/i82378.c            |  2 +-
>  hw/isa/piix4.c             |  4 ++--
>  hw/isa/vt82c686.c          |  2 +-
>  hw/mips/jazz.c             |  2 +-
>  hw/timer/hpet.c            |  1 +
>  hw/timer/i8254.c           | 16 +++++++++++++
>  include/hw/timer/i8254.h   | 48 +++++++++++++-------------------------
>  target/i386/kvm/kvm-stub.c |  6 +++++
>  11 files changed, 69 insertions(+), 51 deletions(-)
> 
> -- 
> 2.38.1


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

end of thread, other threads:[~2023-03-01 21:55 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-15 17:43 [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Philippe Mathieu-Daudé
2023-02-15 17:43 ` [PATCH 1/5] hw/timer/hpet: Include missing 'hw/qdev-properties.h' header Philippe Mathieu-Daudé
2023-02-15 18:55   ` Richard Henderson
2023-02-15 17:43 ` [PATCH 2/5] hw/timer/i8254: Factor i8254_pit_create() out and document Philippe Mathieu-Daudé
2023-02-15 18:56   ` Richard Henderson
2023-02-15 17:43 ` [PATCH 3/5] hw/i386/pc: Un-inline i8254_pit_init() Philippe Mathieu-Daudé
2023-02-15 18:58   ` Richard Henderson
2023-02-15 17:43 ` [PATCH 4/5] hw/timer/i8254: Really inline i8254_pit_init() Philippe Mathieu-Daudé
2023-02-15 17:43 ` [PATCH 5/5] hw/i386/kvm: Factor i8254_pit_create_try_kvm() out Philippe Mathieu-Daudé
2023-02-15 19:02   ` Richard Henderson
2023-03-01 21:54 ` [PATCH 0/5] hw/timer/i8254: Un-inline and simplify IRQs Michael S. Tsirkin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).