All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1
@ 2023-06-04 13:14 Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
                   ` (22 more replies)
  0 siblings, 23 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

[MCA: the original series has now been split into 2 separate parts based upon
Phil's comments re: QOM parenting for objects in Q800MachineState. Part 1
consists of the Q800MachineState patches along with QOM parenting fixes and
the 2 mac_via RTC patches.]

This series contains the remaining patches needed to allow QEMU's q800
machine to boot MacOS Classic when used in conjunction with a real
Quadra 800 ROM image. In fact with this series applied it is possible
to boot all of the following OSs:

  - MacOS 7.1 - 8.1, with or without virtual memory enabled
  - A/UX 3.0.1
  - NetBSD 9.3
  - Linux (via EMILE)

If you are ready to experience some 90s nostalgia then all you need is
to grab yourself a copy of the Quadra 800 ROM (checksum 0xf1acad13) and a
suitable install ISO as follows:

  # Prepare a PRAM image
  $ qemu-img create -f raw pram.img 256b

  # Launch QEMU with blank disk and install CDROM
  $ ./qemu-system-m68k \
      -M q800 \
      -m 128 \
      -bios Quadra800.rom \
      -drive file=pram.img,format=raw,if=mtd \
      -drive file=disk.img,media=disk,format=raw,if=none,id=hd \
      -device scsi-hd,scsi-id=0,drive=hd \
      -drive file=cdrom.iso,media=cdrom,if=none,id=cd \
      -device scsi-cd,scsi-id=3,drive=cd

And off you go! For more in-depth information about the installation process
I highly recommend the installation guide over at emaculation.com [1].
Compatibility is generally very good, and I'm pleased to report it is possible
to run one of the most popular productivity apps from the 90s [2].

I'd like to add a big thank you to all the people who have helped me work on
this series, including testing on real hardware, answering questions about
MacOS Classic internals and helping to diagnose and fix bugs in the 68k
emulation. In particular thanks go to Laurent Vivier, Finn Thain, Howard
Spoelstra, Volker Rümelin, Richard Henderson, Martin Husemann, Rin Okuyama,
Elliot Nunn, and SolraBizna.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

[1] https://www.emaculation.com/doku.php/qemu
[2] https://www.youtube.com/watch?v=yI21gURQ1Ew


Patches missing review tags: 5, 19

v3:
- Add R-B tags from Phil and Laurent
- Add missing headers in patches indicated by Phil
- Change patch 5 to use valid_cpu_types Machine class property and the cpu_type
  Machine property to initialise the CPU
- Remove osdep.h header from dp8393x.h in patch 13 noticed by Phil
- Change sysbus_realize_and_unref() to sysbus_realize() in patch 19
- Use memory_region_add_subregion() instead of sysbus_mmio_map() in patch 19

v2:
- Split series into 2 parts (this is part 1)
- Update QOM parenting for objects in Q800MachineState (Phil)
- Split GLUE device into separate glue.c and glue.h files
- Split TYPE_DP8393X and dp8393xState into dp8393x.h
- Add R-B tags from Laurent (where I still believe they are valid)


Mark Cave-Ayland (23):
  q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty
    array
  q800: add missing space after parent object in GLUEState
  q800: introduce Q800MachineState
  q800: rename q800_init() to q800_machine_init()
  q800: move CPU object into Q800MachineState
  q800: move ROM memory region to Q800MachineState
  q800: move GLUE device into separate q800-glue.c file
  q800: move GLUE device to Q800MachineState
  q800: introduce mac-io container memory region
  q800: reimplement mac-io region aliasing using IO memory region
  q800: move VIA1 device to Q800MachineState
  q800: move VIA2 device to Q800MachineState
  hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  q800: move dp8393x device to Q800MachineState
  q800: move ESCC device to Q800MachineState
  q800: move escc_orgate device to Q800MachineState
  q800: move ESP device to Q800MachineState
  q800: move SWIM device to Q800MachineState
  q800: move mac-nubus-bridge device to Q800MachineState
  q800: don't access Nubus bus directly from the mac-nubus-bridge device
  q800: move macfb device to Q800MachineState
  mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf
  mac_via: fix rtc command decoding for the PRAM seconds registers

 MAINTAINERS                 |   3 +
 hw/m68k/meson.build         |   2 +-
 hw/m68k/q800-glue.c         | 252 +++++++++++++++++
 hw/m68k/q800.c              | 526 ++++++++++++++----------------------
 hw/misc/mac_via.c           |  13 +-
 hw/net/dp8393x.c            |  32 +--
 include/hw/m68k/q800-glue.h |  50 ++++
 include/hw/m68k/q800.h      |  66 +++++
 include/hw/net/dp8393x.h    |  60 ++++
 9 files changed, 638 insertions(+), 366 deletions(-)
 create mode 100644 hw/m68k/q800-glue.c
 create mode 100644 include/hw/m68k/q800-glue.h
 create mode 100644 include/hw/m68k/q800.h
 create mode 100644 include/hw/net/dp8393x.h

-- 
2.30.2



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

* [PATCH v3 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
                   ` (21 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Ensure there is a space before the final closing brace for all global
properties.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/m68k/q800.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index b35ecafbc7..1aead224e2 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -719,14 +719,14 @@ static void q800_init(MachineState *machine)
 }
 
 static GlobalProperty hw_compat_q800[] = {
-    { "scsi-hd", "quirk_mode_page_vendor_specific_apple", "on"},
+    { "scsi-hd", "quirk_mode_page_vendor_specific_apple", "on" },
     { "scsi-hd", "vendor", " SEAGATE" },
     { "scsi-hd", "product", "          ST225N" },
     { "scsi-hd", "ver", "1.0 " },
-    { "scsi-cd", "quirk_mode_page_apple_vendor", "on"},
-    { "scsi-cd", "quirk_mode_sense_rom_use_dbd", "on"},
-    { "scsi-cd", "quirk_mode_page_vendor_specific_apple", "on"},
-    { "scsi-cd", "quirk_mode_page_truncated", "on"},
+    { "scsi-cd", "quirk_mode_page_apple_vendor", "on" },
+    { "scsi-cd", "quirk_mode_sense_rom_use_dbd", "on" },
+    { "scsi-cd", "quirk_mode_page_vendor_specific_apple", "on" },
+    { "scsi-cd", "quirk_mode_page_truncated", "on" },
     { "scsi-cd", "vendor", "MATSHITA" },
     { "scsi-cd", "product", "CD-ROM CR-8005" },
     { "scsi-cd", "ver", "1.0k" },
-- 
2.30.2



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

* [PATCH v3 02/23] q800: add missing space after parent object in GLUEState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
                   ` (20 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

This brings GLUEState in line with our current QOM guidelines.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 1aead224e2..bb9e857632 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -100,6 +100,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
 
 struct GLUEState {
     SysBusDevice parent_obj;
+
     M68kCPU *cpu;
     uint8_t ipr;
     uint8_t auxmode;
-- 
2.30.2



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

* [PATCH v3 03/23] q800: introduce Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
                   ` (19 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

This provides an overall container and owner for Machine-related objects such
as MemoryRegions.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 MAINTAINERS            |  1 +
 hw/m68k/q800.c         |  2 ++
 include/hw/m68k/q800.h | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+)
 create mode 100644 include/hw/m68k/q800.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 89f274f85e..80bfd8859f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1234,6 +1234,7 @@ F: include/hw/misc/mac_via.h
 F: include/hw/nubus/*
 F: include/hw/display/macfb.h
 F: include/hw/block/swim.h
+F: include/hw/m68k/q800.h
 
 virt
 M: Laurent Vivier <laurent@vivier.eu>
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index bb9e857632..93a3f96991 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -38,6 +38,7 @@
 #include "standard-headers/asm-m68k/bootinfo.h"
 #include "standard-headers/asm-m68k/bootinfo-mac.h"
 #include "bootinfo.h"
+#include "hw/m68k/q800.h"
 #include "hw/misc/mac_via.h"
 #include "hw/input/adb.h"
 #include "hw/nubus/mac-nubus-bridge.h"
@@ -749,6 +750,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
 static const TypeInfo q800_machine_typeinfo = {
     .name       = MACHINE_TYPE_NAME("q800"),
     .parent     = TYPE_MACHINE,
+    .instance_size = sizeof(Q800MachineState),
     .class_init = q800_machine_class_init,
 };
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
new file mode 100644
index 0000000000..f3bc17aa1b
--- /dev/null
+++ b/include/hw/m68k/q800.h
@@ -0,0 +1,40 @@
+/*
+ * QEMU Motorla 680x0 Macintosh hardware System Emulator
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HW_Q800_H
+#define HW_Q800_H
+
+#include "hw/boards.h"
+#include "qom/object.h"
+
+/*
+ * The main Q800 machine
+ */
+
+struct Q800MachineState {
+    MachineState parent_obj;
+};
+
+#define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
+OBJECT_DECLARE_SIMPLE_TYPE(Q800MachineState, Q800_MACHINE)
+
+#endif
-- 
2.30.2



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

* [PATCH v3 04/23] q800: rename q800_init() to q800_machine_init()
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (2 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
                   ` (18 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

This will enable us later to distinguish between QOM initialisation and machine
initialisation.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/m68k/q800.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 93a3f96991..3730b30dd1 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -362,7 +362,7 @@ static uint8_t fake_mac_rom[] = {
     0x60, 0xFE                          /* bras [self] */
 };
 
-static void q800_init(MachineState *machine)
+static void q800_machine_init(MachineState *machine)
 {
     M68kCPU *cpu = NULL;
     int linux_boot;
@@ -738,8 +738,9 @@ static const size_t hw_compat_q800_len = G_N_ELEMENTS(hw_compat_q800);
 static void q800_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
+
     mc->desc = "Macintosh Quadra 800";
-    mc->init = q800_init;
+    mc->init = q800_machine_init;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
     mc->max_cpus = 1;
     mc->block_default_type = IF_SCSI;
-- 
2.30.2



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

* [PATCH v3 05/23] q800: move CPU object into Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (3 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 16:16   ` Laurent Vivier
  2023-06-05 12:33   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
                   ` (17 subsequent siblings)
  22 siblings, 2 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the CPU to use object_initialize_child()
followed by a separate realisation.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 18 +++++++++++++-----
 include/hw/m68k/q800.h |  3 +++
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 3730b30dd1..d0ceb64b70 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
 
 static void q800_machine_init(MachineState *machine)
 {
-    M68kCPU *cpu = NULL;
+    Q800MachineState *m = Q800_MACHINE(machine);
     int linux_boot;
     int32_t kernel_size;
     uint64_t elf_entry;
@@ -407,8 +407,9 @@ static void q800_machine_init(MachineState *machine)
     }
 
     /* init CPUs */
-    cpu = M68K_CPU(cpu_create(machine->cpu_type));
-    qemu_register_reset(main_cpu_reset, cpu);
+    object_initialize_child(OBJECT(machine), "cpu", &m->cpu, machine->cpu_type);
+    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
+    qemu_register_reset(main_cpu_reset, &m->cpu);
 
     /* RAM */
     memory_region_add_subregion(get_system_memory(), 0, machine->ram);
@@ -430,7 +431,8 @@ static void q800_machine_init(MachineState *machine)
 
     /* IRQ Glue */
     glue = qdev_new(TYPE_GLUE);
-    object_property_set_link(OBJECT(glue), "cpu", OBJECT(cpu), &error_abort);
+    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
+                             &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
 
     /* VIA 1 */
@@ -605,7 +607,7 @@ static void q800_machine_init(MachineState *machine)
 
     macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
 
-    cs = CPU(cpu);
+    cs = CPU(&m->cpu);
     if (linux_boot) {
         uint64_t high;
         void *param_blob, *param_ptr, *param_rng_seed;
@@ -735,6 +737,11 @@ static GlobalProperty hw_compat_q800[] = {
 };
 static const size_t hw_compat_q800_len = G_N_ELEMENTS(hw_compat_q800);
 
+static const char *q800_machine_valid_cpu_types[] = {
+    M68K_CPU_TYPE_NAME("m68040"),
+    NULL
+};
+
 static void q800_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
@@ -742,6 +749,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
     mc->desc = "Macintosh Quadra 800";
     mc->init = q800_machine_init;
     mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
+    mc->valid_cpu_types = q800_machine_valid_cpu_types;
     mc->max_cpus = 1;
     mc->block_default_type = IF_SCSI;
     mc->default_ram_id = "m68k_mac.ram";
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index f3bc17aa1b..4cb1a51dfe 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -25,6 +25,7 @@
 
 #include "hw/boards.h"
 #include "qom/object.h"
+#include "target/m68k/cpu-qom.h"
 
 /*
  * The main Q800 machine
@@ -32,6 +33,8 @@
 
 struct Q800MachineState {
     MachineState parent_obj;
+
+    M68kCPU cpu;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



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

* [PATCH v3 06/23] q800: move ROM memory region to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (4 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
                   ` (16 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 13 +++++--------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index d0ceb64b70..f99241fe16 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -372,7 +372,6 @@ static void q800_machine_init(MachineState *machine)
     int bios_size;
     ram_addr_t initrd_base;
     int32_t initrd_size;
-    MemoryRegion *rom;
     MemoryRegion *io;
     MemoryRegion *dp8393x_prom = g_new(MemoryRegion, 1);
     uint8_t *prom;
@@ -646,11 +645,10 @@ static void q800_machine_init(MachineState *machine)
         BOOTINFO1(param_ptr, BI_MAC_VROW, macfb_mode->stride);
         BOOTINFO1(param_ptr, BI_MAC_SCCBASE, SCC_BASE);
 
-        rom = g_malloc(sizeof(*rom));
-        memory_region_init_ram_ptr(rom, NULL, "m68k_fake_mac.rom",
+        memory_region_init_ram_ptr(&m->rom, NULL, "m68k_fake_mac.rom",
                                    sizeof(fake_mac_rom), fake_mac_rom);
-        memory_region_set_readonly(rom, true);
-        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom);
+        memory_region_set_readonly(&m->rom, true);
+        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
 
         if (kernel_cmdline) {
             BOOTINFOSTR(param_ptr, BI_COMMAND_LINE,
@@ -692,11 +690,10 @@ static void q800_machine_init(MachineState *machine)
     } else {
         uint8_t *ptr;
         /* allocate and load BIOS */
-        rom = g_malloc(sizeof(*rom));
-        memory_region_init_rom(rom, NULL, "m68k_mac.rom", MACROM_SIZE,
+        memory_region_init_rom(&m->rom, NULL, "m68k_mac.rom", MACROM_SIZE,
                                &error_abort);
         filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
-        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, rom);
+        memory_region_add_subregion(get_system_memory(), MACROM_ADDR, &m->rom);
 
         /* Load MacROM binary */
         if (filename) {
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 4cb1a51dfe..d1f1ae4b88 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -26,6 +26,7 @@
 #include "hw/boards.h"
 #include "qom/object.h"
 #include "target/m68k/cpu-qom.h"
+#include "exec/memory.h"
 
 /*
  * The main Q800 machine
@@ -35,6 +36,7 @@ struct Q800MachineState {
     MachineState parent_obj;
 
     M68kCPU cpu;
+    MemoryRegion rom;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



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

* [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (5 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-05 12:41   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
                   ` (15 subsequent siblings)
  22 siblings, 1 reply; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

This will allow the q800-glue.h header to be included separately so that the
GLUE device can be referenced externally.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 MAINTAINERS                 |   2 +
 hw/m68k/meson.build         |   2 +-
 hw/m68k/q800-glue.c         | 252 ++++++++++++++++++++++++++++++++++++
 hw/m68k/q800.c              | 238 +---------------------------------
 include/hw/m68k/q800-glue.h |  50 +++++++
 5 files changed, 306 insertions(+), 238 deletions(-)
 create mode 100644 hw/m68k/q800-glue.c
 create mode 100644 include/hw/m68k/q800-glue.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 80bfd8859f..1ca818e617 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1223,6 +1223,7 @@ q800
 M: Laurent Vivier <laurent@vivier.eu>
 S: Maintained
 F: hw/m68k/q800.c
+F: hw/m68k/q800-glue.c
 F: hw/misc/mac_via.c
 F: hw/nubus/*
 F: hw/display/macfb.c
@@ -1235,6 +1236,7 @@ F: include/hw/nubus/*
 F: include/hw/display/macfb.h
 F: include/hw/block/swim.h
 F: include/hw/m68k/q800.h
+F: include/hw/m68k/q800-glue.h
 
 virt
 M: Laurent Vivier <laurent@vivier.eu>
diff --git a/hw/m68k/meson.build b/hw/m68k/meson.build
index 31248641d3..84bc68fa4e 100644
--- a/hw/m68k/meson.build
+++ b/hw/m68k/meson.build
@@ -2,7 +2,7 @@ m68k_ss = ss.source_set()
 m68k_ss.add(when: 'CONFIG_AN5206', if_true: files('an5206.c', 'mcf5206.c'))
 m68k_ss.add(when: 'CONFIG_MCF5208', if_true: files('mcf5208.c', 'mcf_intc.c'))
 m68k_ss.add(when: 'CONFIG_NEXTCUBE', if_true: files('next-kbd.c', 'next-cube.c'))
-m68k_ss.add(when: 'CONFIG_Q800', if_true: files('q800.c'))
+m68k_ss.add(when: 'CONFIG_Q800', if_true: files('q800.c', 'q800-glue.c'))
 m68k_ss.add(when: 'CONFIG_M68K_VIRT', if_true: files('virt.c'))
 
 hw_arch += {'m68k': m68k_ss}
diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c
new file mode 100644
index 0000000000..793bdb110c
--- /dev/null
+++ b/hw/m68k/q800-glue.c
@@ -0,0 +1,252 @@
+/*
+ * QEMU q800 logic glue
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include "cpu.h"
+#include "hw/m68k/q800-glue.h"
+#include "hw/boards.h"
+#include "hw/irq.h"
+#include "hw/nmi.h"
+#include "hw/qdev-properties.h"
+#include "migration/vmstate.h"
+
+/*
+ * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
+ * that performs a variety of functions (RAM management, clock generation, ...).
+ * The GLUE chip receives interrupt requests from various devices,
+ * assign priority to each, and asserts one or more interrupt line to the
+ * CPU.
+ */
+
+/*
+ * The GLUE logic on the Quadra 800 supports 2 different IRQ routing modes
+ * controlled from the VIA1 auxmode GPIO (port B bit 6) which are documented
+ * in NetBSD as follows:
+ *
+ * A/UX mode (Linux, NetBSD, auxmode GPIO low)
+ *
+ *   Level 0:        Spurious: ignored
+ *   Level 1:        Software
+ *   Level 2:        VIA2 (except ethernet, sound)
+ *   Level 3:        Ethernet
+ *   Level 4:        Serial (SCC)
+ *   Level 5:        Sound
+ *   Level 6:        VIA1
+ *   Level 7:        NMIs: parity errors, RESET button, YANCC error
+ *
+ * Classic mode (default: used by MacOS, A/UX 3.0.1, auxmode GPIO high)
+ *
+ *   Level 0:        Spurious: ignored
+ *   Level 1:        VIA1 (clock, ADB)
+ *   Level 2:        VIA2 (NuBus, SCSI)
+ *   Level 3:
+ *   Level 4:        Serial (SCC)
+ *   Level 5:
+ *   Level 6:
+ *   Level 7:        Non-maskable: parity errors, RESET button
+ *
+ * Note that despite references to A/UX mode in Linux and NetBSD, at least
+ * A/UX 3.0.1 still uses Classic mode.
+ */
+
+static void GLUE_set_irq(void *opaque, int irq, int level)
+{
+    GLUEState *s = opaque;
+    int i;
+
+    if (s->auxmode) {
+        /* Classic mode */
+        switch (irq) {
+        case GLUE_IRQ_IN_VIA1:
+            irq = 0;
+            break;
+
+        case GLUE_IRQ_IN_VIA2:
+            irq = 1;
+            break;
+
+        case GLUE_IRQ_IN_SONIC:
+            /* Route to VIA2 instead */
+            qemu_set_irq(s->irqs[GLUE_IRQ_NUBUS_9], level);
+            return;
+
+        case GLUE_IRQ_IN_ESCC:
+            irq = 3;
+            break;
+
+        case GLUE_IRQ_IN_NMI:
+            irq = 6;
+            break;
+
+        default:
+            g_assert_not_reached();
+        }
+    } else {
+        /* A/UX mode */
+        switch (irq) {
+        case GLUE_IRQ_IN_VIA1:
+            irq = 5;
+            break;
+
+        case GLUE_IRQ_IN_VIA2:
+            irq = 1;
+            break;
+
+        case GLUE_IRQ_IN_SONIC:
+            irq = 2;
+            break;
+
+        case GLUE_IRQ_IN_ESCC:
+            irq = 3;
+            break;
+
+        case GLUE_IRQ_IN_NMI:
+            irq = 6;
+            break;
+
+        default:
+            g_assert_not_reached();
+        }
+    }
+
+    if (level) {
+        s->ipr |= 1 << irq;
+    } else {
+        s->ipr &= ~(1 << irq);
+    }
+
+    for (i = 7; i >= 0; i--) {
+        if ((s->ipr >> i) & 1) {
+            m68k_set_irq_level(s->cpu, i + 1, i + 25);
+            return;
+        }
+    }
+    m68k_set_irq_level(s->cpu, 0, 0);
+}
+
+static void glue_auxmode_set_irq(void *opaque, int irq, int level)
+{
+    GLUEState *s = GLUE(opaque);
+
+    s->auxmode = level;
+}
+
+static void glue_nmi(NMIState *n, int cpu_index, Error **errp)
+{
+    GLUEState *s = GLUE(n);
+
+    /* Hold NMI active for 100ms */
+    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1);
+    timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100);
+}
+
+static void glue_nmi_release(void *opaque)
+{
+    GLUEState *s = GLUE(opaque);
+
+    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 0);
+}
+
+static void glue_reset(DeviceState *dev)
+{
+    GLUEState *s = GLUE(dev);
+
+    s->ipr = 0;
+    s->auxmode = 0;
+
+    timer_del(s->nmi_release);
+}
+
+static const VMStateDescription vmstate_glue = {
+    .name = "q800-glue",
+    .version_id = 0,
+    .minimum_version_id = 0,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT8(ipr, GLUEState),
+        VMSTATE_UINT8(auxmode, GLUEState),
+        VMSTATE_TIMER_PTR(nmi_release, GLUEState),
+        VMSTATE_END_OF_LIST(),
+    },
+};
+
+/*
+ * If the m68k CPU implemented its inbound irq lines as GPIO lines
+ * rather than via the m68k_set_irq_level() function we would not need
+ * this cpu link property and could instead provide outbound IRQ lines
+ * that the board could wire up to the CPU.
+ */
+static Property glue_properties[] = {
+    DEFINE_PROP_LINK("cpu", GLUEState, cpu, TYPE_M68K_CPU, M68kCPU *),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void glue_finalize(Object *obj)
+{
+    GLUEState *s = GLUE(obj);
+
+    timer_free(s->nmi_release);
+}
+
+static void glue_init(Object *obj)
+{
+    DeviceState *dev = DEVICE(obj);
+    GLUEState *s = GLUE(dev);
+
+    qdev_init_gpio_in(dev, GLUE_set_irq, 8);
+    qdev_init_gpio_in_named(dev, glue_auxmode_set_irq, "auxmode", 1);
+
+    qdev_init_gpio_out(dev, s->irqs, 1);
+
+    /* NMI release timer */
+    s->nmi_release = timer_new_ms(QEMU_CLOCK_VIRTUAL, glue_nmi_release, s);
+}
+
+static void glue_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    NMIClass *nc = NMI_CLASS(klass);
+
+    dc->vmsd = &vmstate_glue;
+    dc->reset = glue_reset;
+    device_class_set_props(dc, glue_properties);
+    nc->nmi_monitor_handler = glue_nmi;
+}
+
+static const TypeInfo glue_info = {
+    .name = TYPE_GLUE,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(GLUEState),
+    .instance_init = glue_init,
+    .instance_finalize = glue_finalize,
+    .class_init = glue_class_init,
+    .interfaces = (InterfaceInfo[]) {
+         { TYPE_NMI },
+         { }
+    },
+};
+
+static void glue_register_types(void)
+{
+    type_register_static(&glue_info);
+}
+
+type_init(glue_register_types)
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index f99241fe16..fa63e2aacb 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -28,7 +28,6 @@
 #include "cpu.h"
 #include "hw/boards.h"
 #include "hw/or-irq.h"
-#include "hw/nmi.h"
 #include "elf.h"
 #include "hw/loader.h"
 #include "ui/console.h"
@@ -39,6 +38,7 @@
 #include "standard-headers/asm-m68k/bootinfo-mac.h"
 #include "bootinfo.h"
 #include "hw/m68k/q800.h"
+#include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
 #include "hw/input/adb.h"
 #include "hw/nubus/mac-nubus-bridge.h"
@@ -88,241 +88,6 @@
 #define Q800_NUBUS_SLOTS_AVAILABLE    (BIT(0x9) | BIT(0xc) | BIT(0xd) | \
                                        BIT(0xe))
 
-/*
- * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
- * that performs a variety of functions (RAM management, clock generation, ...).
- * The GLUE chip receives interrupt requests from various devices,
- * assign priority to each, and asserts one or more interrupt line to the
- * CPU.
- */
-
-#define TYPE_GLUE "q800-glue"
-OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
-
-struct GLUEState {
-    SysBusDevice parent_obj;
-
-    M68kCPU *cpu;
-    uint8_t ipr;
-    uint8_t auxmode;
-    qemu_irq irqs[1];
-    QEMUTimer *nmi_release;
-};
-
-#define GLUE_IRQ_IN_VIA1       0
-#define GLUE_IRQ_IN_VIA2       1
-#define GLUE_IRQ_IN_SONIC      2
-#define GLUE_IRQ_IN_ESCC       3
-#define GLUE_IRQ_IN_NMI        4
-
-#define GLUE_IRQ_NUBUS_9       0
-
-/*
- * The GLUE logic on the Quadra 800 supports 2 different IRQ routing modes
- * controlled from the VIA1 auxmode GPIO (port B bit 6) which are documented
- * in NetBSD as follows:
- *
- * A/UX mode (Linux, NetBSD, auxmode GPIO low)
- *
- *   Level 0:        Spurious: ignored
- *   Level 1:        Software
- *   Level 2:        VIA2 (except ethernet, sound)
- *   Level 3:        Ethernet
- *   Level 4:        Serial (SCC)
- *   Level 5:        Sound
- *   Level 6:        VIA1
- *   Level 7:        NMIs: parity errors, RESET button, YANCC error
- *
- * Classic mode (default: used by MacOS, A/UX 3.0.1, auxmode GPIO high)
- *
- *   Level 0:        Spurious: ignored
- *   Level 1:        VIA1 (clock, ADB)
- *   Level 2:        VIA2 (NuBus, SCSI)
- *   Level 3:
- *   Level 4:        Serial (SCC)
- *   Level 5:
- *   Level 6:
- *   Level 7:        Non-maskable: parity errors, RESET button
- *
- * Note that despite references to A/UX mode in Linux and NetBSD, at least
- * A/UX 3.0.1 still uses Classic mode.
- */
-
-static void GLUE_set_irq(void *opaque, int irq, int level)
-{
-    GLUEState *s = opaque;
-    int i;
-
-    if (s->auxmode) {
-        /* Classic mode */
-        switch (irq) {
-        case GLUE_IRQ_IN_VIA1:
-            irq = 0;
-            break;
-
-        case GLUE_IRQ_IN_VIA2:
-            irq = 1;
-            break;
-
-        case GLUE_IRQ_IN_SONIC:
-            /* Route to VIA2 instead */
-            qemu_set_irq(s->irqs[GLUE_IRQ_NUBUS_9], level);
-            return;
-
-        case GLUE_IRQ_IN_ESCC:
-            irq = 3;
-            break;
-
-        case GLUE_IRQ_IN_NMI:
-            irq = 6;
-            break;
-
-        default:
-            g_assert_not_reached();
-        }
-    } else {
-        /* A/UX mode */
-        switch (irq) {
-        case GLUE_IRQ_IN_VIA1:
-            irq = 5;
-            break;
-
-        case GLUE_IRQ_IN_VIA2:
-            irq = 1;
-            break;
-
-        case GLUE_IRQ_IN_SONIC:
-            irq = 2;
-            break;
-
-        case GLUE_IRQ_IN_ESCC:
-            irq = 3;
-            break;
-
-        case GLUE_IRQ_IN_NMI:
-            irq = 6;
-            break;
-
-        default:
-            g_assert_not_reached();
-        }
-    }
-
-    if (level) {
-        s->ipr |= 1 << irq;
-    } else {
-        s->ipr &= ~(1 << irq);
-    }
-
-    for (i = 7; i >= 0; i--) {
-        if ((s->ipr >> i) & 1) {
-            m68k_set_irq_level(s->cpu, i + 1, i + 25);
-            return;
-        }
-    }
-    m68k_set_irq_level(s->cpu, 0, 0);
-}
-
-static void glue_auxmode_set_irq(void *opaque, int irq, int level)
-{
-    GLUEState *s = GLUE(opaque);
-
-    s->auxmode = level;
-}
-
-static void glue_nmi(NMIState *n, int cpu_index, Error **errp)
-{
-    GLUEState *s = GLUE(n);
-
-    /* Hold NMI active for 100ms */
-    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 1);
-    timer_mod(s->nmi_release, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 100);
-}
-
-static void glue_nmi_release(void *opaque)
-{
-    GLUEState *s = GLUE(opaque);
-
-    GLUE_set_irq(s, GLUE_IRQ_IN_NMI, 0);
-}
-
-static void glue_reset(DeviceState *dev)
-{
-    GLUEState *s = GLUE(dev);
-
-    s->ipr = 0;
-    s->auxmode = 0;
-
-    timer_del(s->nmi_release);
-}
-
-static const VMStateDescription vmstate_glue = {
-    .name = "q800-glue",
-    .version_id = 0,
-    .minimum_version_id = 0,
-    .fields = (VMStateField[]) {
-        VMSTATE_UINT8(ipr, GLUEState),
-        VMSTATE_UINT8(auxmode, GLUEState),
-        VMSTATE_TIMER_PTR(nmi_release, GLUEState),
-        VMSTATE_END_OF_LIST(),
-    },
-};
-
-/*
- * If the m68k CPU implemented its inbound irq lines as GPIO lines
- * rather than via the m68k_set_irq_level() function we would not need
- * this cpu link property and could instead provide outbound IRQ lines
- * that the board could wire up to the CPU.
- */
-static Property glue_properties[] = {
-    DEFINE_PROP_LINK("cpu", GLUEState, cpu, TYPE_M68K_CPU, M68kCPU *),
-    DEFINE_PROP_END_OF_LIST(),
-};
-
-static void glue_finalize(Object *obj)
-{
-    GLUEState *s = GLUE(obj);
-
-    timer_free(s->nmi_release);
-}
-
-static void glue_init(Object *obj)
-{
-    DeviceState *dev = DEVICE(obj);
-    GLUEState *s = GLUE(dev);
-
-    qdev_init_gpio_in(dev, GLUE_set_irq, 8);
-    qdev_init_gpio_in_named(dev, glue_auxmode_set_irq, "auxmode", 1);
-
-    qdev_init_gpio_out(dev, s->irqs, 1);
-
-    /* NMI release timer */
-    s->nmi_release = timer_new_ms(QEMU_CLOCK_VIRTUAL, glue_nmi_release, s);
-}
-
-static void glue_class_init(ObjectClass *klass, void *data)
-{
-    DeviceClass *dc = DEVICE_CLASS(klass);
-    NMIClass *nc = NMI_CLASS(klass);
-
-    dc->vmsd = &vmstate_glue;
-    dc->reset = glue_reset;
-    device_class_set_props(dc, glue_properties);
-    nc->nmi_monitor_handler = glue_nmi;
-}
-
-static const TypeInfo glue_info = {
-    .name = TYPE_GLUE,
-    .parent = TYPE_SYS_BUS_DEVICE,
-    .instance_size = sizeof(GLUEState),
-    .instance_init = glue_init,
-    .instance_finalize = glue_finalize,
-    .class_init = glue_class_init,
-    .interfaces = (InterfaceInfo[]) {
-         { TYPE_NMI },
-         { }
-    },
-};
 
 static void main_cpu_reset(void *opaque)
 {
@@ -763,7 +528,6 @@ static const TypeInfo q800_machine_typeinfo = {
 static void q800_machine_register_types(void)
 {
     type_register_static(&q800_machine_typeinfo);
-    type_register_static(&glue_info);
 }
 
 type_init(q800_machine_register_types)
diff --git a/include/hw/m68k/q800-glue.h b/include/hw/m68k/q800-glue.h
new file mode 100644
index 0000000000..c1817b01a5
--- /dev/null
+++ b/include/hw/m68k/q800-glue.h
@@ -0,0 +1,50 @@
+/*
+ * QEMU q800 logic glue
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef HW_Q800_GLUE_H
+#define HW_Q800_GLUE_H
+
+#include "qemu/osdep.h"
+#include "hw/sysbus.h"
+
+#define TYPE_GLUE "q800-glue"
+OBJECT_DECLARE_SIMPLE_TYPE(GLUEState, GLUE)
+
+struct GLUEState {
+    SysBusDevice parent_obj;
+
+    M68kCPU *cpu;
+    uint8_t ipr;
+    uint8_t auxmode;
+    qemu_irq irqs[1];
+    QEMUTimer *nmi_release;
+};
+
+#define GLUE_IRQ_IN_VIA1       0
+#define GLUE_IRQ_IN_VIA2       1
+#define GLUE_IRQ_IN_SONIC      2
+#define GLUE_IRQ_IN_ESCC       3
+#define GLUE_IRQ_IN_NMI        4
+
+#define GLUE_IRQ_NUBUS_9       0
+
+#endif
-- 
2.30.2



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

* [PATCH v3 08/23] q800: move GLUE device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (6 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the GLUE device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 24 ++++++++++++++----------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index fa63e2aacb..7aa391a322 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -158,7 +158,6 @@ static void q800_machine_init(MachineState *machine)
     SysBusDevice *sysbus;
     BusState *adb_bus;
     NubusBus *nubus;
-    DeviceState *glue;
     DriveInfo *dinfo;
     uint8_t rng_seed[32];
 
@@ -194,10 +193,10 @@ static void q800_machine_init(MachineState *machine)
     }
 
     /* IRQ Glue */
-    glue = qdev_new(TYPE_GLUE);
-    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
+    object_initialize_child(OBJECT(machine), "glue", &m->glue, TYPE_GLUE);
+    object_property_set_link(OBJECT(&m->glue), "cpu", OBJECT(&m->cpu),
                              &error_abort);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
+    sysbus_realize(SYS_BUS_DEVICE(&m->glue), &error_fatal);
 
     /* VIA 1 */
     via1_dev = qdev_new(TYPE_MOS6522_Q800_VIA1);
@@ -208,10 +207,12 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(via1_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 1, VIA_BASE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_VIA1));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
     qdev_connect_gpio_out(via1_dev, 0,
-                          qdev_get_gpio_in_named(glue, "auxmode", 0));
+                          qdev_get_gpio_in_named(DEVICE(&m->glue),
+                                                 "auxmode", 0));
 
     adb_bus = qdev_get_child_bus(via1_dev, "adb.0");
     dev = qdev_new(TYPE_ADB_KEYBOARD);
@@ -224,7 +225,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(via2_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 1, VIA_BASE + VIA_SIZE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_VIA2));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA2));
 
     /* MACSONIC */
 
@@ -257,7 +259,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 0, SONIC_BASE);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(glue, GLUE_IRQ_IN_SONIC));
+    sysbus_connect_irq(sysbus, 0,
+                       qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_SONIC));
 
     memory_region_init_rom(dp8393x_prom, NULL, "dp8393x-q800.prom",
                            SONIC_PROM_SIZE, &error_fatal);
@@ -294,7 +297,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(escc_orgate, 0));
     sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(escc_orgate, 1));
     qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
-                          qdev_get_gpio_in(glue, GLUE_IRQ_IN_ESCC));
+                          qdev_get_gpio_in(DEVICE(&m->glue),
+                                           GLUE_IRQ_IN_ESCC));
     sysbus_mmio_map(sysbus, 0, SCC_BASE);
 
     /* SCSI */
@@ -349,7 +353,7 @@ static void q800_machine_init(MachineState *machine)
      * Since the framebuffer in slot 0x9 uses a separate IRQ, wire the unused
      * IRQ via GLUE for use by SONIC Ethernet in classic mode
      */
-    qdev_connect_gpio_out(glue, GLUE_IRQ_NUBUS_9,
+    qdev_connect_gpio_out(DEVICE(&m->glue), GLUE_IRQ_NUBUS_9,
                           qdev_get_gpio_in_named(via2_dev, "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index d1f1ae4b88..fda42e0a1c 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -27,6 +27,7 @@
 #include "qom/object.h"
 #include "target/m68k/cpu-qom.h"
 #include "exec/memory.h"
+#include "hw/m68k/q800-glue.h"
 
 /*
  * The main Q800 machine
@@ -37,6 +38,7 @@ struct Q800MachineState {
 
     M68kCPU cpu;
     MemoryRegion rom;
+    GLUEState glue;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



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

* [PATCH v3 09/23] q800: introduce mac-io container memory region
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (7 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-05 12:49   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
                   ` (13 subsequent siblings)
  22 siblings, 1 reply; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Move all devices from the IO region to within the container in preparation
for updating the IO aliasing mechanism.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 6 ++++++
 include/hw/m68k/q800.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 7aa391a322..6682c81ac8 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -177,6 +177,12 @@ static void q800_machine_init(MachineState *machine)
     /* RAM */
     memory_region_add_subregion(get_system_memory(), 0, machine->ram);
 
+    /*
+     * Create container for all IO devices
+     */
+    memory_region_init(&m->macio, OBJECT(machine), "mac-io", IO_SLICE);
+    memory_region_add_subregion(get_system_memory(), IO_BASE, &m->macio);
+
     /*
      * Memory from IO_BASE to IO_BASE + IO_SLICE is repeated
      * from IO_BASE + IO_SLICE to IO_BASE + IO_SIZE
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index fda42e0a1c..17067dfad7 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -39,6 +39,7 @@ struct Q800MachineState {
     M68kCPU cpu;
     MemoryRegion rom;
     GLUEState glue;
+    MemoryRegion macio;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



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

* [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (8 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-05 12:43   ` Philippe Mathieu-Daudé
  2023-06-05 12:48   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
                   ` (12 subsequent siblings)
  22 siblings, 2 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

The current use of aliased memory regions causes us 2 problems: firstly the
output of "info qom-tree" is absolutely huge and difficult to read, and
secondly we have already reached the internal limit for memory regions as
adding any new memory region into the mac-io region causes QEMU to assert
with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
failed".

Implement the mac-io region aliasing using a single IO memory region that
applies IO_SLICE_MASK representing the maximum size of the aliased region and
then forwarding the access to the existing mac-io memory region using the
address space API.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
 include/hw/m68k/q800.h |   1 +
 2 files changed, 82 insertions(+), 19 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 6682c81ac8..cb4fcdcfb8 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -59,6 +59,7 @@
 
 #define IO_BASE               0x50000000
 #define IO_SLICE              0x00040000
+#define IO_SLICE_MASK         (IO_SLICE - 1)
 #define IO_SIZE               0x04000000
 
 #define VIA_BASE              (IO_BASE + 0x00000)
@@ -127,6 +128,68 @@ static uint8_t fake_mac_rom[] = {
     0x60, 0xFE                          /* bras [self] */
 };
 
+static MemTxResult macio_alias_read(void *opaque, hwaddr addr, uint64_t *data,
+                                    unsigned size, MemTxAttrs attrs)
+{
+    MemTxResult r;
+    uint32_t val;
+
+    addr &= IO_SLICE_MASK;
+    addr |= IO_BASE;
+
+    switch (size) {
+    case 4:
+        val = address_space_ldl_be(&address_space_memory, addr, attrs, &r);
+        break;
+    case 2:
+        val = address_space_lduw_be(&address_space_memory, addr, attrs, &r);
+        break;
+    case 1:
+        val = address_space_ldub(&address_space_memory, addr, attrs, &r);
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    *data = val;
+    return r;
+}
+
+static MemTxResult macio_alias_write(void *opaque, hwaddr addr, uint64_t value,
+                                     unsigned size, MemTxAttrs attrs)
+{
+    MemTxResult r;
+
+    addr &= IO_SLICE_MASK;
+    addr |= IO_BASE;
+
+    switch (size) {
+    case 4:
+        address_space_stl_be(&address_space_memory, addr, value, attrs, &r);
+        break;
+    case 2:
+        address_space_stw_be(&address_space_memory, addr, value, attrs, &r);
+        break;
+    case 1:
+        address_space_stb(&address_space_memory, addr, value, attrs, &r);
+        break;
+    default:
+        g_assert_not_reached();
+    }
+
+    return r;
+}
+
+static const MemoryRegionOps macio_alias_ops = {
+    .read_with_attrs = macio_alias_read,
+    .write_with_attrs = macio_alias_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 1,
+        .max_access_size = 4,
+    },
+};
+
 static void q800_machine_init(MachineState *machine)
 {
     Q800MachineState *m = Q800_MACHINE(machine);
@@ -137,10 +200,8 @@ static void q800_machine_init(MachineState *machine)
     int bios_size;
     ram_addr_t initrd_base;
     int32_t initrd_size;
-    MemoryRegion *io;
     MemoryRegion *dp8393x_prom = g_new(MemoryRegion, 1);
     uint8_t *prom;
-    const int io_slice_nb = (IO_SIZE / IO_SLICE) - 1;
     int i, checksum;
     MacFbMode *macfb_mode;
     ram_addr_t ram_size = machine->ram_size;
@@ -187,16 +248,10 @@ static void q800_machine_init(MachineState *machine)
      * Memory from IO_BASE to IO_BASE + IO_SLICE is repeated
      * from IO_BASE + IO_SLICE to IO_BASE + IO_SIZE
      */
-    io = g_new(MemoryRegion, io_slice_nb);
-    for (i = 0; i < io_slice_nb; i++) {
-        char *name = g_strdup_printf("mac_m68k.io[%d]", i + 1);
-
-        memory_region_init_alias(&io[i], NULL, name, get_system_memory(),
-                                 IO_BASE, IO_SLICE);
-        memory_region_add_subregion(get_system_memory(),
-                                    IO_BASE + (i + 1) * IO_SLICE, &io[i]);
-        g_free(name);
-    }
+    memory_region_init_io(&m->macio_alias, OBJECT(machine), &macio_alias_ops,
+                          &m->macio, "mac-io.alias", IO_SIZE - IO_SLICE);
+    memory_region_add_subregion(get_system_memory(), IO_BASE + IO_SLICE,
+                                &m->macio_alias);
 
     /* IRQ Glue */
     object_initialize_child(OBJECT(machine), "glue", &m->glue, TYPE_GLUE);
@@ -212,7 +267,8 @@ static void q800_machine_init(MachineState *machine)
     }
     sysbus = SYS_BUS_DEVICE(via1_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 1, VIA_BASE);
+    memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
@@ -230,7 +286,8 @@ static void q800_machine_init(MachineState *machine)
     via2_dev = qdev_new(TYPE_MOS6522_Q800_VIA2);
     sysbus = SYS_BUS_DEVICE(via2_dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 1, VIA_BASE + VIA_SIZE);
+    memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE + VIA_SIZE,
+                                sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA2));
 
@@ -264,7 +321,8 @@ static void q800_machine_init(MachineState *machine)
                              OBJECT(get_system_memory()), &error_abort);
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
-    sysbus_mmio_map(sysbus, 0, SONIC_BASE);
+    memory_region_add_subregion(&m->macio, SONIC_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_SONIC));
 
@@ -305,7 +363,8 @@ static void q800_machine_init(MachineState *machine)
     qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
                           qdev_get_gpio_in(DEVICE(&m->glue),
                                            GLUE_IRQ_IN_ESCC));
-    sysbus_mmio_map(sysbus, 0, SCC_BASE);
+    memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
 
     /* SCSI */
 
@@ -325,8 +384,10 @@ static void q800_machine_init(MachineState *machine)
                                                   VIA2_IRQ_SCSI_BIT)));
     sysbus_connect_irq(sysbus, 1, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
                                                   VIA2_IRQ_SCSI_DATA_BIT)));
-    sysbus_mmio_map(sysbus, 0, ESP_BASE);
-    sysbus_mmio_map(sysbus, 1, ESP_PDMA);
+    memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 0));
+    memory_region_add_subregion(&m->macio, ESP_PDMA - IO_BASE,
+                                sysbus_mmio_get_region(sysbus, 1));
 
     scsi_bus_legacy_handle_cmdline(&esp->bus);
 
@@ -334,7 +395,8 @@ static void q800_machine_init(MachineState *machine)
 
     dev = qdev_new(TYPE_SWIM);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, SWIM_BASE);
+    memory_region_add_subregion(&m->macio, SWIM_BASE - IO_BASE,
+                                sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
 
     /* NuBus */
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 17067dfad7..1ed38bf0b1 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -40,6 +40,7 @@ struct Q800MachineState {
     MemoryRegion rom;
     GLUEState glue;
     MemoryRegion macio;
+    MemoryRegion macio_alias;
 };
 
 #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")
-- 
2.30.2



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

* [PATCH v3 11/23] q800: move VIA1 device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (9 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 12/23] q800: move VIA2 " Mark Cave-Ayland
                   ` (11 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the VIA1 device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 16 +++++++++-------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index cb4fcdcfb8..a0bc8bec9c 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,7 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *via1_dev, *via2_dev;
+    DeviceState *via2_dev;
     DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
@@ -260,23 +260,25 @@ static void q800_machine_init(MachineState *machine)
     sysbus_realize(SYS_BUS_DEVICE(&m->glue), &error_fatal);
 
     /* VIA 1 */
-    via1_dev = qdev_new(TYPE_MOS6522_Q800_VIA1);
+    object_initialize_child(OBJECT(machine), "via1", &m->via1,
+                            TYPE_MOS6522_Q800_VIA1);
     dinfo = drive_get(IF_MTD, 0, 0);
     if (dinfo) {
-        qdev_prop_set_drive(via1_dev, "drive", blk_by_legacy_dinfo(dinfo));
+        qdev_prop_set_drive(DEVICE(&m->via1), "drive",
+                            blk_by_legacy_dinfo(dinfo));
     }
-    sysbus = SYS_BUS_DEVICE(via1_dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus = SYS_BUS_DEVICE(&m->via1);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
                        qdev_get_gpio_in(DEVICE(&m->glue), GLUE_IRQ_IN_VIA1));
     /* A/UX mode */
-    qdev_connect_gpio_out(via1_dev, 0,
+    qdev_connect_gpio_out(DEVICE(&m->via1), 0,
                           qdev_get_gpio_in_named(DEVICE(&m->glue),
                                                  "auxmode", 0));
 
-    adb_bus = qdev_get_child_bus(via1_dev, "adb.0");
+    adb_bus = qdev_get_child_bus(DEVICE(&m->via1), "adb.0");
     dev = qdev_new(TYPE_ADB_KEYBOARD);
     qdev_realize_and_unref(dev, adb_bus, &error_fatal);
     dev = qdev_new(TYPE_ADB_MOUSE);
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 1ed38bf0b1..5cf66d08a0 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -28,6 +28,7 @@
 #include "target/m68k/cpu-qom.h"
 #include "exec/memory.h"
 #include "hw/m68k/q800-glue.h"
+#include "hw/misc/mac_via.h"
 
 /*
  * The main Q800 machine
@@ -39,6 +40,7 @@ struct Q800MachineState {
     M68kCPU cpu;
     MemoryRegion rom;
     GLUEState glue;
+    MOS6522Q800VIA1State via1;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 12/23] q800: move VIA2 device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (10 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
                   ` (10 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the VIA2 device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 27 ++++++++++++++++-----------
 include/hw/m68k/q800.h |  1 +
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index a0bc8bec9c..c2e937a929 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,6 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *via2_dev;
     DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
@@ -285,9 +284,10 @@ static void q800_machine_init(MachineState *machine)
     qdev_realize_and_unref(dev, adb_bus, &error_fatal);
 
     /* VIA 2 */
-    via2_dev = qdev_new(TYPE_MOS6522_Q800_VIA2);
-    sysbus = SYS_BUS_DEVICE(via2_dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    object_initialize_child(OBJECT(machine), "via2", &m->via2,
+                            TYPE_MOS6522_Q800_VIA2);
+    sysbus = SYS_BUS_DEVICE(&m->via2);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, VIA_BASE - IO_BASE + VIA_SIZE,
                                 sysbus_mmio_get_region(sysbus, 1));
     sysbus_connect_irq(sysbus, 0,
@@ -382,10 +382,14 @@ static void q800_machine_init(MachineState *machine)
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     /* SCSI and SCSI data IRQs are negative edge triggered */
-    sysbus_connect_irq(sysbus, 0, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
-                                                  VIA2_IRQ_SCSI_BIT)));
-    sysbus_connect_irq(sysbus, 1, qemu_irq_invert(qdev_get_gpio_in(via2_dev,
-                                                  VIA2_IRQ_SCSI_DATA_BIT)));
+    sysbus_connect_irq(sysbus, 0,
+                       qemu_irq_invert(
+                           qdev_get_gpio_in(DEVICE(&m->via2),
+                                                   VIA2_IRQ_SCSI_BIT)));
+    sysbus_connect_irq(sysbus, 1,
+                       qemu_irq_invert(
+                           qdev_get_gpio_in(DEVICE(&m->via2),
+                                                   VIA2_IRQ_SCSI_DATA_BIT)));
     memory_region_add_subregion(&m->macio, ESP_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 0));
     memory_region_add_subregion(&m->macio, ESP_PDMA - IO_BASE,
@@ -411,11 +415,12 @@ static void q800_machine_init(MachineState *machine)
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, NUBUS_SLOT_BASE +
                     MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE);
     qdev_connect_gpio_out(dev, 9,
-                          qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                          qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                           VIA2_NUBUS_IRQ_INTVIDEO));
     for (i = 1; i < VIA2_NUBUS_IRQ_NB; i++) {
         qdev_connect_gpio_out(dev, 9 + i,
-                              qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                              qdev_get_gpio_in_named(DEVICE(&m->via2),
+                                                     "nubus-irq",
                                                      VIA2_NUBUS_IRQ_9 + i));
     }
 
@@ -424,7 +429,7 @@ static void q800_machine_init(MachineState *machine)
      * IRQ via GLUE for use by SONIC Ethernet in classic mode
      */
     qdev_connect_gpio_out(DEVICE(&m->glue), GLUE_IRQ_NUBUS_9,
-                          qdev_get_gpio_in_named(via2_dev, "nubus-irq",
+                          qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
     nubus = &NUBUS_BRIDGE(dev)->bus;
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 5cf66d08a0..06c771635b 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -41,6 +41,7 @@ struct Q800MachineState {
     MemoryRegion rom;
     GLUEState glue;
     MOS6522Q800VIA1State via1;
+    MOS6522Q800VIA2State via2;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (11 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 12/23] q800: move VIA2 " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 16:17   ` Laurent Vivier
  2023-06-05 12:44   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
                   ` (9 subsequent siblings)
  22 siblings, 2 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

This is to enable them to be used outside of dp8393x.c.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: Jason Wang <jasowang@redhat.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/net/dp8393x.c         | 32 +--------------------
 include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 31 deletions(-)
 create mode 100644 include/hw/net/dp8393x.h

diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 45b954e46c..a596f7fbc6 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -20,6 +20,7 @@
 #include "qemu/osdep.h"
 #include "hw/irq.h"
 #include "hw/qdev-properties.h"
+#include "hw/net/dp8393x.h"
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "net/net.h"
@@ -85,7 +86,6 @@ static const char *reg_names[] = {
 #define SONIC_MPT    0x2e
 #define SONIC_MDT    0x2f
 #define SONIC_DCR2   0x3f
-#define SONIC_REG_COUNT  0x40
 
 #define SONIC_CR_HTX     0x0001
 #define SONIC_CR_TXP     0x0002
@@ -139,36 +139,6 @@ static const char *reg_names[] = {
 #define SONIC_DESC_EOL   0x0001
 #define SONIC_DESC_ADDR  0xFFFE
 
-#define TYPE_DP8393X "dp8393x"
-OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
-
-struct dp8393xState {
-    SysBusDevice parent_obj;
-
-    /* Hardware */
-    uint8_t it_shift;
-    bool big_endian;
-    bool last_rba_is_full;
-    qemu_irq irq;
-    int irq_level;
-    QEMUTimer *watchdog;
-    int64_t wt_last_update;
-    NICConf conf;
-    NICState *nic;
-    MemoryRegion mmio;
-
-    /* Registers */
-    uint16_t cam[16][3];
-    uint16_t regs[SONIC_REG_COUNT];
-
-    /* Temporaries */
-    uint8_t tx_buffer[0x10000];
-    int loopback_packet;
-
-    /* Memory access */
-    MemoryRegion *dma_mr;
-    AddressSpace as;
-};
 
 /*
  * Accessor functions for values which are formed by
diff --git a/include/hw/net/dp8393x.h b/include/hw/net/dp8393x.h
new file mode 100644
index 0000000000..4a3f7478be
--- /dev/null
+++ b/include/hw/net/dp8393x.h
@@ -0,0 +1,60 @@
+/*
+ * QEMU NS SONIC DP8393x netcard
+ *
+ * Copyright (c) 2008-2009 Herve Poussineau
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef HW_NET_DP8393X_H
+#define HW_NET_DP8393X_H
+
+#include "hw/sysbus.h"
+#include "net/net.h"
+#include "exec/memory.h"
+
+#define SONIC_REG_COUNT  0x40
+
+#define TYPE_DP8393X "dp8393x"
+OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
+
+struct dp8393xState {
+    SysBusDevice parent_obj;
+
+    /* Hardware */
+    uint8_t it_shift;
+    bool big_endian;
+    bool last_rba_is_full;
+    qemu_irq irq;
+    int irq_level;
+    QEMUTimer *watchdog;
+    int64_t wt_last_update;
+    NICConf conf;
+    NICState *nic;
+    MemoryRegion mmio;
+
+    /* Registers */
+    uint16_t cam[16][3];
+    uint16_t regs[SONIC_REG_COUNT];
+
+    /* Temporaries */
+    uint8_t tx_buffer[0x10000];
+    int loopback_packet;
+
+    /* Memory access */
+    MemoryRegion *dma_mr;
+    AddressSpace as;
+};
+
+#endif
-- 
2.30.2



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

* [PATCH v3 14/23] q800: move dp8393x device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (12 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 15/23] q800: move ESCC " Mark Cave-Ayland
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the dp8393x device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: Jason Wang <jasowang@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index c2e937a929..05194a06a0 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -315,14 +315,16 @@ static void q800_machine_init(MachineState *machine)
     nd_table[0].macaddr.a[1] = 0x00;
     nd_table[0].macaddr.a[2] = 0x07;
 
-    dev = qdev_new("dp8393x");
+    object_initialize_child(OBJECT(machine), "dp8393x", &m->dp8393x,
+                            TYPE_DP8393X);
+    dev = DEVICE(&m->dp8393x);
     qdev_set_nic_properties(dev, &nd_table[0]);
     qdev_prop_set_uint8(dev, "it_shift", 2);
     qdev_prop_set_bit(dev, "big_endian", true);
     object_property_set_link(OBJECT(dev), "dma_mr",
                              OBJECT(get_system_memory()), &error_abort);
     sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, SONIC_BASE - IO_BASE,
                                 sysbus_mmio_get_region(sysbus, 0));
     sysbus_connect_irq(sysbus, 0,
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 06c771635b..d11bc020ed 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -29,6 +29,7 @@
 #include "exec/memory.h"
 #include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
+#include "hw/net/dp8393x.h"
 
 /*
  * The main Q800 machine
@@ -42,6 +43,7 @@ struct Q800MachineState {
     GLUEState glue;
     MOS6522Q800VIA1State via1;
     MOS6522Q800VIA2State via2;
+    dp8393xState dp8393x;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 15/23] q800: move ESCC device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (13 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 16/23] q800: move escc_orgate " Mark Cave-Ayland
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the ESCC device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 05194a06a0..c5cec46d99 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -346,7 +346,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* SCC */
 
-    dev = qdev_new(TYPE_ESCC);
+    object_initialize_child(OBJECT(machine), "escc", &m->escc,
+                            TYPE_ESCC);
+    dev = DEVICE(&m->escc);
     qdev_prop_set_uint32(dev, "disabled", 0);
     qdev_prop_set_uint32(dev, "frequency", MAC_CLOCK);
     qdev_prop_set_uint32(dev, "it_shift", 1);
@@ -356,7 +358,7 @@ static void q800_machine_init(MachineState *machine)
     qdev_prop_set_uint32(dev, "chnBtype", 0);
     qdev_prop_set_uint32(dev, "chnAtype", 0);
     sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus_realize(sysbus, &error_fatal);
 
     /* Logically OR both its IRQs together */
     escc_orgate = DEVICE(object_new(TYPE_OR_IRQ));
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index d11bc020ed..9e76a3fe7c 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -30,6 +30,7 @@
 #include "hw/m68k/q800-glue.h"
 #include "hw/misc/mac_via.h"
 #include "hw/net/dp8393x.h"
+#include "hw/char/escc.h"
 
 /*
  * The main Q800 machine
@@ -44,6 +45,7 @@ struct Q800MachineState {
     MOS6522Q800VIA1State via1;
     MOS6522Q800VIA2State via2;
     dp8393xState dp8393x;
+    ESCCState escc;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 16/23] q800: move escc_orgate device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (14 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 15/23] q800: move ESCC " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 17/23] q800: move ESP " Mark Cave-Ayland
                   ` (6 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the escc_orgate device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 16 +++++++++-------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index c5cec46d99..0a415a7c6a 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -212,7 +212,6 @@ static void q800_machine_init(MachineState *machine)
     hwaddr parameters_base;
     CPUState *cs;
     DeviceState *dev;
-    DeviceState *escc_orgate;
     SysBusESPState *sysbus_esp;
     ESPState *esp;
     SysBusDevice *sysbus;
@@ -361,12 +360,15 @@ static void q800_machine_init(MachineState *machine)
     sysbus_realize(sysbus, &error_fatal);
 
     /* Logically OR both its IRQs together */
-    escc_orgate = DEVICE(object_new(TYPE_OR_IRQ));
-    object_property_set_int(OBJECT(escc_orgate), "num-lines", 2, &error_fatal);
-    qdev_realize_and_unref(escc_orgate, NULL, &error_fatal);
-    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(escc_orgate, 0));
-    sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(escc_orgate, 1));
-    qdev_connect_gpio_out(DEVICE(escc_orgate), 0,
+    object_initialize_child(OBJECT(machine), "escc_orgate", &m->escc_orgate,
+                            TYPE_OR_IRQ);
+    object_property_set_int(OBJECT(&m->escc_orgate), "num-lines", 2,
+                            &error_fatal);
+    dev = DEVICE(&m->escc_orgate);
+    qdev_realize(dev, NULL, &error_fatal);
+    sysbus_connect_irq(sysbus, 0, qdev_get_gpio_in(dev, 0));
+    sysbus_connect_irq(sysbus, 1, qdev_get_gpio_in(dev, 1));
+    qdev_connect_gpio_out(dev, 0,
                           qdev_get_gpio_in(DEVICE(&m->glue),
                                            GLUE_IRQ_IN_ESCC));
     memory_region_add_subregion(&m->macio, SCC_BASE - IO_BASE,
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 9e76a3fe7c..36e1bd8e4e 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -31,6 +31,7 @@
 #include "hw/misc/mac_via.h"
 #include "hw/net/dp8393x.h"
 #include "hw/char/escc.h"
+#include "hw/or-irq.h"
 
 /*
  * The main Q800 machine
@@ -46,6 +47,7 @@ struct Q800MachineState {
     MOS6522Q800VIA2State via2;
     dp8393xState dp8393x;
     ESCCState escc;
+    OrIRQState escc_orgate;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 17/23] q800: move ESP device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (15 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 16/23] q800: move escc_orgate " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 18/23] q800: move SWIM " Mark Cave-Ayland
                   ` (5 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the ESP device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 9 +++++----
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 0a415a7c6a..3ab4607134 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -376,8 +376,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* SCSI */
 
-    dev = qdev_new(TYPE_SYSBUS_ESP);
-    sysbus_esp = SYSBUS_ESP(dev);
+    object_initialize_child(OBJECT(machine), "esp", &m->esp,
+                            TYPE_SYSBUS_ESP);
+    sysbus_esp = SYSBUS_ESP(&m->esp);
     esp = &sysbus_esp->esp;
     esp->dma_memory_read = NULL;
     esp->dma_memory_write = NULL;
@@ -385,8 +386,8 @@ static void q800_machine_init(MachineState *machine)
     sysbus_esp->it_shift = 4;
     esp->dma_enabled = 1;
 
-    sysbus = SYS_BUS_DEVICE(dev);
-    sysbus_realize_and_unref(sysbus, &error_fatal);
+    sysbus = SYS_BUS_DEVICE(&m->esp);
+    sysbus_realize(sysbus, &error_fatal);
     /* SCSI and SCSI data IRQs are negative edge triggered */
     sysbus_connect_irq(sysbus, 0,
                        qemu_irq_invert(
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 36e1bd8e4e..8f23e0c4c6 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -32,6 +32,7 @@
 #include "hw/net/dp8393x.h"
 #include "hw/char/escc.h"
 #include "hw/or-irq.h"
+#include "hw/scsi/esp.h"
 
 /*
  * The main Q800 machine
@@ -48,6 +49,7 @@ struct Q800MachineState {
     dp8393xState dp8393x;
     ESCCState escc;
     OrIRQState escc_orgate;
+    SysBusESPState esp;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 18/23] q800: move SWIM device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (16 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 17/23] q800: move ESP " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
                   ` (4 subsequent siblings)
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the SWIM device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 8 +++++---
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 3ab4607134..d6e19ff18c 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -406,10 +406,12 @@ static void q800_machine_init(MachineState *machine)
 
     /* SWIM floppy controller */
 
-    dev = qdev_new(TYPE_SWIM);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
+    object_initialize_child(OBJECT(machine), "swim", &m->swim,
+                            TYPE_SWIM);
+    sysbus = SYS_BUS_DEVICE(&m->swim);
+    sysbus_realize(sysbus, &error_fatal);
     memory_region_add_subregion(&m->macio, SWIM_BASE - IO_BASE,
-                                sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
+                                sysbus_mmio_get_region(sysbus, 0));
 
     /* NuBus */
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 8f23e0c4c6..06e095ae29 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -33,6 +33,7 @@
 #include "hw/char/escc.h"
 #include "hw/or-irq.h"
 #include "hw/scsi/esp.h"
+#include "hw/block/swim.h"
 
 /*
  * The main Q800 machine
@@ -50,6 +51,7 @@ struct Q800MachineState {
     ESCCState escc;
     OrIRQState escc_orgate;
     SysBusESPState esp;
+    Swim swim;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (17 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 18/23] q800: move SWIM " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 16:29   ` Laurent Vivier
  2023-06-05 12:47   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
                   ` (3 subsequent siblings)
  22 siblings, 2 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the mac-nubus-bridge device to use
object_initialize_child() and map the Nubus address space using
memory_region_add_subregion() instead of sysbus_mmio_map().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/m68k/q800.c         | 21 ++++++++++++++-------
 include/hw/m68k/q800.h |  2 ++
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index d6e19ff18c..14879310ca 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -415,14 +415,21 @@ static void q800_machine_init(MachineState *machine)
 
     /* NuBus */
 
-    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
-    qdev_prop_set_uint32(dev, "slot-available-mask",
+    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
+                            &m->mac_nubus_bridge,
+                            TYPE_MAC_NUBUS_BRIDGE);
+    sysbus = SYS_BUS_DEVICE(&m->mac_nubus_bridge);
+    dev = DEVICE(&m->mac_nubus_bridge);
+    qdev_prop_set_uint32(DEVICE(&m->mac_nubus_bridge), "slot-available-mask",
                          Q800_NUBUS_SLOTS_AVAILABLE);
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
-                    MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE);
-    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, NUBUS_SLOT_BASE +
-                    MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE);
+    sysbus_realize(sysbus, &error_fatal);
+    memory_region_add_subregion(get_system_memory(),
+                                MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE,
+                                sysbus_mmio_get_region(sysbus, 0));
+    memory_region_add_subregion(get_system_memory(),
+                                NUBUS_SLOT_BASE +
+                                MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE,
+                                sysbus_mmio_get_region(sysbus, 1));
     qdev_connect_gpio_out(dev, 9,
                           qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                           VIA2_NUBUS_IRQ_INTVIDEO));
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 06e095ae29..8f2c572a81 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -34,6 +34,7 @@
 #include "hw/or-irq.h"
 #include "hw/scsi/esp.h"
 #include "hw/block/swim.h"
+#include "hw/nubus/mac-nubus-bridge.h"
 
 /*
  * The main Q800 machine
@@ -52,6 +53,7 @@ struct Q800MachineState {
     OrIRQState escc_orgate;
     SysBusESPState esp;
     Swim swim;
+    MacNubusBridge mac_nubus_bridge;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (18 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-05 12:46   ` Philippe Mathieu-Daudé
  2023-06-04 13:14 ` [PATCH v3 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
                   ` (2 subsequent siblings)
  22 siblings, 1 reply; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Instead use the qdev_get_child_bus() function which is intended for this exact
purpose.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 14879310ca..df2765dbd1 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -448,7 +448,7 @@ static void q800_machine_init(MachineState *machine)
                           qdev_get_gpio_in_named(DEVICE(&m->via2), "nubus-irq",
                                                  VIA2_NUBUS_IRQ_9));
 
-    nubus = &NUBUS_BRIDGE(dev)->bus;
+    nubus = NUBUS_BUS(qdev_get_child_bus(dev, "nubus-bus.0"));
 
     /* framebuffer in nubus slot #9 */
 
-- 
2.30.2



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

* [PATCH v3 21/23] q800: move macfb device to Q800MachineState
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (19 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Also change the instantiation of the macfb device to use object_initialize_child().

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/m68k/q800.c         | 6 ++++--
 include/hw/m68k/q800.h | 2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index df2765dbd1..d314ea40f1 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -452,7 +452,9 @@ static void q800_machine_init(MachineState *machine)
 
     /* framebuffer in nubus slot #9 */
 
-    dev = qdev_new(TYPE_NUBUS_MACFB);
+    object_initialize_child(OBJECT(machine), "macfb", &m->macfb,
+                            TYPE_NUBUS_MACFB);
+    dev = DEVICE(&m->macfb);
     qdev_prop_set_uint32(dev, "slot", 9);
     qdev_prop_set_uint32(dev, "width", graphic_width);
     qdev_prop_set_uint32(dev, "height", graphic_height);
@@ -462,7 +464,7 @@ static void q800_machine_init(MachineState *machine)
     } else {
         qdev_prop_set_uint8(dev, "display", MACFB_DISPLAY_VGA);
     }
-    qdev_realize_and_unref(dev, BUS(nubus), &error_fatal);
+    qdev_realize(dev, BUS(nubus), &error_fatal);
 
     macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
 
diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
index 8f2c572a81..b3d77f1cba 100644
--- a/include/hw/m68k/q800.h
+++ b/include/hw/m68k/q800.h
@@ -35,6 +35,7 @@
 #include "hw/scsi/esp.h"
 #include "hw/block/swim.h"
 #include "hw/nubus/mac-nubus-bridge.h"
+#include "hw/display/macfb.h"
 
 /*
  * The main Q800 machine
@@ -54,6 +55,7 @@ struct Q800MachineState {
     SysBusESPState esp;
     Swim swim;
     MacNubusBridge mac_nubus_bridge;
+    MacfbNubusState macfb;
     MemoryRegion macio;
     MemoryRegion macio_alias;
 };
-- 
2.30.2



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

* [PATCH v3 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (20 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  2023-06-04 13:14 ` [PATCH v3 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

A comparison between the rtc command table included in the comment and the code
itself shows that the decoding for PRAM addresses 0x0 to 0xf is being done on
the raw command, and not the shifted version held in value.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/misc/mac_via.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 076d18e5fd..85c2e65856 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -399,7 +399,7 @@ static int via1_rtc_compact_cmd(uint8_t value)
         } else if ((value & 0x1c) == 0x08) {
             /* RAM address 0x10 to 0x13 */
             return read | (REG_PRAM_ADDR + 0x10 + (value & 0x03));
-        } else if ((value & 0x43) == 0x41) {
+        } else if ((value & 0x10) == 0x10) {
             /* RAM address 0x00 to 0x0f */
             return read | (REG_PRAM_ADDR + (value & 0x0f));
         }
-- 
2.30.2



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

* [PATCH v3 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers
  2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
                   ` (21 preceding siblings ...)
  2023-06-04 13:14 ` [PATCH v3 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
@ 2023-06-04 13:14 ` Mark Cave-Ayland
  22 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-04 13:14 UTC (permalink / raw)
  To: laurent, qemu-devel

Analysis of the MacOS toolbox ROM code shows that on startup it attempts 2
separate reads of the seconds registers with commands 0x9d...0x91 followed by
0x8d..0x81 without resetting the command to its initial value. The PRAM seconds
value is only accepted when the values of the 2 separate reads match.

From this we conclude that bit 4 of the rtc command is not decoded or we don't
care about its value when reading the PRAM seconds registers. Implement this
decoding change so that both reads return successfully which allows the MacOS
toolbox ROM to correctly set the date/time.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
---
 hw/misc/mac_via.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 85c2e65856..0787a0268d 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -362,10 +362,10 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
  *
  * Command byte    Register addressed by the command
  *
- * z0000001        Seconds register 0 (lowest-order byte)
- * z0000101        Seconds register 1
- * z0001001        Seconds register 2
- * z0001101        Seconds register 3 (highest-order byte)
+ * z00x0001        Seconds register 0 (lowest-order byte)
+ * z00x0101        Seconds register 1
+ * z00x1001        Seconds register 2
+ * z00x1101        Seconds register 3 (highest-order byte)
  * 00110001        Test register (write-only)
  * 00110101        Write-Protect Register (write-only)
  * z010aa01        RAM address 100aa ($10-$13) (first 20 bytes only)
@@ -373,6 +373,7 @@ static void pram_update(MOS6522Q800VIA1State *v1s)
  * z0111aaa        Extended memory designator and sector number
  *
  * For a read request, z=1, for a write z=0
+ * The letter x indicates don't care
  * The letter a indicates bits whose value depend on what parameter
  * RAM byte you want to address
  */
@@ -389,7 +390,7 @@ static int via1_rtc_compact_cmd(uint8_t value)
     }
     if ((value & 0x03) == 0x01) {
         value >>= 2;
-        if ((value & 0x1c) == 0) {
+        if ((value & 0x18) == 0) {
             /* seconds registers */
             return read | (REG_0 + (value & 0x03));
         } else if ((value == 0x0c) && !read) {
-- 
2.30.2



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

* Re: [PATCH v3 05/23] q800: move CPU object into Q800MachineState
  2023-06-04 13:14 ` [PATCH v3 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
@ 2023-06-04 16:16   ` Laurent Vivier
  2023-06-05 12:33   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 40+ messages in thread
From: Laurent Vivier @ 2023-06-04 16:16 UTC (permalink / raw)
  To: Mark Cave-Ayland, qemu-devel

Le 04/06/2023 à 15:14, Mark Cave-Ayland a écrit :
> Also change the instantiation of the CPU to use object_initialize_child()
> followed by a separate realisation.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 18 +++++++++++++-----
>   include/hw/m68k/q800.h |  3 +++
>   2 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index 3730b30dd1..d0ceb64b70 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -364,7 +364,7 @@ static uint8_t fake_mac_rom[] = {
>   
>   static void q800_machine_init(MachineState *machine)
>   {
> -    M68kCPU *cpu = NULL;
> +    Q800MachineState *m = Q800_MACHINE(machine);
>       int linux_boot;
>       int32_t kernel_size;
>       uint64_t elf_entry;
> @@ -407,8 +407,9 @@ static void q800_machine_init(MachineState *machine)
>       }
>   
>       /* init CPUs */
> -    cpu = M68K_CPU(cpu_create(machine->cpu_type));
> -    qemu_register_reset(main_cpu_reset, cpu);
> +    object_initialize_child(OBJECT(machine), "cpu", &m->cpu, machine->cpu_type);
> +    object_property_set_bool(OBJECT(&m->cpu), "realized", true, &error_fatal);
> +    qemu_register_reset(main_cpu_reset, &m->cpu);
>   
>       /* RAM */
>       memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> @@ -430,7 +431,8 @@ static void q800_machine_init(MachineState *machine)
>   
>       /* IRQ Glue */
>       glue = qdev_new(TYPE_GLUE);
> -    object_property_set_link(OBJECT(glue), "cpu", OBJECT(cpu), &error_abort);
> +    object_property_set_link(OBJECT(glue), "cpu", OBJECT(&m->cpu),
> +                             &error_abort);
>       sysbus_realize_and_unref(SYS_BUS_DEVICE(glue), &error_fatal);
>   
>       /* VIA 1 */
> @@ -605,7 +607,7 @@ static void q800_machine_init(MachineState *machine)
>   
>       macfb_mode = (NUBUS_MACFB(dev)->macfb).mode;
>   
> -    cs = CPU(cpu);
> +    cs = CPU(&m->cpu);
>       if (linux_boot) {
>           uint64_t high;
>           void *param_blob, *param_ptr, *param_rng_seed;
> @@ -735,6 +737,11 @@ static GlobalProperty hw_compat_q800[] = {
>   };
>   static const size_t hw_compat_q800_len = G_N_ELEMENTS(hw_compat_q800);
>   
> +static const char *q800_machine_valid_cpu_types[] = {
> +    M68K_CPU_TYPE_NAME("m68040"),
> +    NULL
> +};
> +
>   static void q800_machine_class_init(ObjectClass *oc, void *data)
>   {
>       MachineClass *mc = MACHINE_CLASS(oc);
> @@ -742,6 +749,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
>       mc->desc = "Macintosh Quadra 800";
>       mc->init = q800_machine_init;
>       mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
> +    mc->valid_cpu_types = q800_machine_valid_cpu_types;
>       mc->max_cpus = 1;
>       mc->block_default_type = IF_SCSI;
>       mc->default_ram_id = "m68k_mac.ram";
> diff --git a/include/hw/m68k/q800.h b/include/hw/m68k/q800.h
> index f3bc17aa1b..4cb1a51dfe 100644
> --- a/include/hw/m68k/q800.h
> +++ b/include/hw/m68k/q800.h
> @@ -25,6 +25,7 @@
>   
>   #include "hw/boards.h"
>   #include "qom/object.h"
> +#include "target/m68k/cpu-qom.h"
>   
>   /*
>    * The main Q800 machine
> @@ -32,6 +33,8 @@
>   
>   struct Q800MachineState {
>       MachineState parent_obj;
> +
> +    M68kCPU cpu;
>   };
>   
>   #define TYPE_Q800_MACHINE MACHINE_TYPE_NAME("q800")

Reviewed-by: Laurent Vivier <laurent@vivier.eu>



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

* Re: [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-06-04 13:14 ` [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
@ 2023-06-04 16:17   ` Laurent Vivier
  2023-06-05  0:36     ` Jason Wang
  2023-06-05 12:44   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 40+ messages in thread
From: Laurent Vivier @ 2023-06-04 16:17 UTC (permalink / raw)
  To: Jason Wang; +Cc: Mark Cave-Ayland, qemu-devel

Jason,

if you agree with the changes I will merge them via the m68k branch.

Thanks,
Laurent

Le 04/06/2023 à 15:14, Mark Cave-Ayland a écrit :
> This is to enable them to be used outside of dp8393x.c.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> CC: Jason Wang <jasowang@redhat.com>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/net/dp8393x.c         | 32 +--------------------
>   include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 61 insertions(+), 31 deletions(-)
>   create mode 100644 include/hw/net/dp8393x.h
> 
> diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> index 45b954e46c..a596f7fbc6 100644
> --- a/hw/net/dp8393x.c
> +++ b/hw/net/dp8393x.c
> @@ -20,6 +20,7 @@
>   #include "qemu/osdep.h"
>   #include "hw/irq.h"
>   #include "hw/qdev-properties.h"
> +#include "hw/net/dp8393x.h"
>   #include "hw/sysbus.h"
>   #include "migration/vmstate.h"
>   #include "net/net.h"
> @@ -85,7 +86,6 @@ static const char *reg_names[] = {
>   #define SONIC_MPT    0x2e
>   #define SONIC_MDT    0x2f
>   #define SONIC_DCR2   0x3f
> -#define SONIC_REG_COUNT  0x40
>   
>   #define SONIC_CR_HTX     0x0001
>   #define SONIC_CR_TXP     0x0002
> @@ -139,36 +139,6 @@ static const char *reg_names[] = {
>   #define SONIC_DESC_EOL   0x0001
>   #define SONIC_DESC_ADDR  0xFFFE
>   
> -#define TYPE_DP8393X "dp8393x"
> -OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> -
> -struct dp8393xState {
> -    SysBusDevice parent_obj;
> -
> -    /* Hardware */
> -    uint8_t it_shift;
> -    bool big_endian;
> -    bool last_rba_is_full;
> -    qemu_irq irq;
> -    int irq_level;
> -    QEMUTimer *watchdog;
> -    int64_t wt_last_update;
> -    NICConf conf;
> -    NICState *nic;
> -    MemoryRegion mmio;
> -
> -    /* Registers */
> -    uint16_t cam[16][3];
> -    uint16_t regs[SONIC_REG_COUNT];
> -
> -    /* Temporaries */
> -    uint8_t tx_buffer[0x10000];
> -    int loopback_packet;
> -
> -    /* Memory access */
> -    MemoryRegion *dma_mr;
> -    AddressSpace as;
> -};
>   
>   /*
>    * Accessor functions for values which are formed by
> diff --git a/include/hw/net/dp8393x.h b/include/hw/net/dp8393x.h
> new file mode 100644
> index 0000000000..4a3f7478be
> --- /dev/null
> +++ b/include/hw/net/dp8393x.h
> @@ -0,0 +1,60 @@
> +/*
> + * QEMU NS SONIC DP8393x netcard
> + *
> + * Copyright (c) 2008-2009 Herve Poussineau
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef HW_NET_DP8393X_H
> +#define HW_NET_DP8393X_H
> +
> +#include "hw/sysbus.h"
> +#include "net/net.h"
> +#include "exec/memory.h"
> +
> +#define SONIC_REG_COUNT  0x40
> +
> +#define TYPE_DP8393X "dp8393x"
> +OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> +
> +struct dp8393xState {
> +    SysBusDevice parent_obj;
> +
> +    /* Hardware */
> +    uint8_t it_shift;
> +    bool big_endian;
> +    bool last_rba_is_full;
> +    qemu_irq irq;
> +    int irq_level;
> +    QEMUTimer *watchdog;
> +    int64_t wt_last_update;
> +    NICConf conf;
> +    NICState *nic;
> +    MemoryRegion mmio;
> +
> +    /* Registers */
> +    uint16_t cam[16][3];
> +    uint16_t regs[SONIC_REG_COUNT];
> +
> +    /* Temporaries */
> +    uint8_t tx_buffer[0x10000];
> +    int loopback_packet;
> +
> +    /* Memory access */
> +    MemoryRegion *dma_mr;
> +    AddressSpace as;
> +};
> +
> +#endif



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

* Re: [PATCH v3 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-06-04 13:14 ` [PATCH v3 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
@ 2023-06-04 16:29   ` Laurent Vivier
  2023-06-05  5:43     ` Mark Cave-Ayland
  2023-06-05 12:47   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 40+ messages in thread
From: Laurent Vivier @ 2023-06-04 16:29 UTC (permalink / raw)
  To: Mark Cave-Ayland, qemu-devel

Le 04/06/2023 à 15:14, Mark Cave-Ayland a écrit :
> Also change the instantiation of the mac-nubus-bridge device to use
> object_initialize_child() and map the Nubus address space using
> memory_region_add_subregion() instead of sysbus_mmio_map().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 21 ++++++++++++++-------
>   include/hw/m68k/q800.h |  2 ++
>   2 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
> index d6e19ff18c..14879310ca 100644
> --- a/hw/m68k/q800.c
> +++ b/hw/m68k/q800.c
> @@ -415,14 +415,21 @@ static void q800_machine_init(MachineState *machine)
>   
>       /* NuBus */
>   
> -    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
> -    qdev_prop_set_uint32(dev, "slot-available-mask",
> +    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
> +                            &m->mac_nubus_bridge,
> +                            TYPE_MAC_NUBUS_BRIDGE);
> +    sysbus = SYS_BUS_DEVICE(&m->mac_nubus_bridge);
> +    dev = DEVICE(&m->mac_nubus_bridge);
> +    qdev_prop_set_uint32(DEVICE(&m->mac_nubus_bridge), "slot-available-mask",
>                            Q800_NUBUS_SLOTS_AVAILABLE);
> -    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> -    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
> -                    MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE);
> -    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, NUBUS_SLOT_BASE +
> -                    MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE);
> +    sysbus_realize(sysbus, &error_fatal);
> +    memory_region_add_subregion(get_system_memory(),
> +                                MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE,
> +                                sysbus_mmio_get_region(sysbus, 0));
> +    memory_region_add_subregion(get_system_memory(),
> +                                NUBUS_SLOT_BASE +
> +                                MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE,
> +                                sysbus_mmio_get_region(sysbus, 1));

Why it's not done in PATCH 10?

Reviewed-by: Laurent Vivier <laurent@vivier.eu>


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

* Re: [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-06-04 16:17   ` Laurent Vivier
@ 2023-06-05  0:36     ` Jason Wang
  0 siblings, 0 replies; 40+ messages in thread
From: Jason Wang @ 2023-06-05  0:36 UTC (permalink / raw)
  To: Laurent Vivier; +Cc: Mark Cave-Ayland, qemu-devel

On Mon, Jun 5, 2023 at 12:18 AM Laurent Vivier <laurent@vivier.eu> wrote:
>
> Jason,
>
> if you agree with the changes I will merge them via the m68k branch.

Yes.

Acked-by: Jason Wang <jasowang@redhat.com>

Thanks

>
> Thanks,
> Laurent
>
> Le 04/06/2023 à 15:14, Mark Cave-Ayland a écrit :
> > This is to enable them to be used outside of dp8393x.c.
> >
> > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> > CC: Jason Wang <jasowang@redhat.com>
> > Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> > ---
> >   hw/net/dp8393x.c         | 32 +--------------------
> >   include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
> >   2 files changed, 61 insertions(+), 31 deletions(-)
> >   create mode 100644 include/hw/net/dp8393x.h
> >
> > diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
> > index 45b954e46c..a596f7fbc6 100644
> > --- a/hw/net/dp8393x.c
> > +++ b/hw/net/dp8393x.c
> > @@ -20,6 +20,7 @@
> >   #include "qemu/osdep.h"
> >   #include "hw/irq.h"
> >   #include "hw/qdev-properties.h"
> > +#include "hw/net/dp8393x.h"
> >   #include "hw/sysbus.h"
> >   #include "migration/vmstate.h"
> >   #include "net/net.h"
> > @@ -85,7 +86,6 @@ static const char *reg_names[] = {
> >   #define SONIC_MPT    0x2e
> >   #define SONIC_MDT    0x2f
> >   #define SONIC_DCR2   0x3f
> > -#define SONIC_REG_COUNT  0x40
> >
> >   #define SONIC_CR_HTX     0x0001
> >   #define SONIC_CR_TXP     0x0002
> > @@ -139,36 +139,6 @@ static const char *reg_names[] = {
> >   #define SONIC_DESC_EOL   0x0001
> >   #define SONIC_DESC_ADDR  0xFFFE
> >
> > -#define TYPE_DP8393X "dp8393x"
> > -OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> > -
> > -struct dp8393xState {
> > -    SysBusDevice parent_obj;
> > -
> > -    /* Hardware */
> > -    uint8_t it_shift;
> > -    bool big_endian;
> > -    bool last_rba_is_full;
> > -    qemu_irq irq;
> > -    int irq_level;
> > -    QEMUTimer *watchdog;
> > -    int64_t wt_last_update;
> > -    NICConf conf;
> > -    NICState *nic;
> > -    MemoryRegion mmio;
> > -
> > -    /* Registers */
> > -    uint16_t cam[16][3];
> > -    uint16_t regs[SONIC_REG_COUNT];
> > -
> > -    /* Temporaries */
> > -    uint8_t tx_buffer[0x10000];
> > -    int loopback_packet;
> > -
> > -    /* Memory access */
> > -    MemoryRegion *dma_mr;
> > -    AddressSpace as;
> > -};
> >
> >   /*
> >    * Accessor functions for values which are formed by
> > diff --git a/include/hw/net/dp8393x.h b/include/hw/net/dp8393x.h
> > new file mode 100644
> > index 0000000000..4a3f7478be
> > --- /dev/null
> > +++ b/include/hw/net/dp8393x.h
> > @@ -0,0 +1,60 @@
> > +/*
> > + * QEMU NS SONIC DP8393x netcard
> > + *
> > + * Copyright (c) 2008-2009 Herve Poussineau
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License along
> > + * with this program; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef HW_NET_DP8393X_H
> > +#define HW_NET_DP8393X_H
> > +
> > +#include "hw/sysbus.h"
> > +#include "net/net.h"
> > +#include "exec/memory.h"
> > +
> > +#define SONIC_REG_COUNT  0x40
> > +
> > +#define TYPE_DP8393X "dp8393x"
> > +OBJECT_DECLARE_SIMPLE_TYPE(dp8393xState, DP8393X)
> > +
> > +struct dp8393xState {
> > +    SysBusDevice parent_obj;
> > +
> > +    /* Hardware */
> > +    uint8_t it_shift;
> > +    bool big_endian;
> > +    bool last_rba_is_full;
> > +    qemu_irq irq;
> > +    int irq_level;
> > +    QEMUTimer *watchdog;
> > +    int64_t wt_last_update;
> > +    NICConf conf;
> > +    NICState *nic;
> > +    MemoryRegion mmio;
> > +
> > +    /* Registers */
> > +    uint16_t cam[16][3];
> > +    uint16_t regs[SONIC_REG_COUNT];
> > +
> > +    /* Temporaries */
> > +    uint8_t tx_buffer[0x10000];
> > +    int loopback_packet;
> > +
> > +    /* Memory access */
> > +    MemoryRegion *dma_mr;
> > +    AddressSpace as;
> > +};
> > +
> > +#endif
>
>



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

* Re: [PATCH v3 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-06-04 16:29   ` Laurent Vivier
@ 2023-06-05  5:43     ` Mark Cave-Ayland
  0 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-05  5:43 UTC (permalink / raw)
  To: Laurent Vivier, qemu-devel

On 04/06/2023 17:29, Laurent Vivier wrote:

> Le 04/06/2023 à 15:14, Mark Cave-Ayland a écrit :
>> Also change the instantiation of the mac-nubus-bridge device to use
>> object_initialize_child() and map the Nubus address space using
>> memory_region_add_subregion() instead of sysbus_mmio_map().
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/m68k/q800.c         | 21 ++++++++++++++-------
>>   include/hw/m68k/q800.h |  2 ++
>>   2 files changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
>> index d6e19ff18c..14879310ca 100644
>> --- a/hw/m68k/q800.c
>> +++ b/hw/m68k/q800.c
>> @@ -415,14 +415,21 @@ static void q800_machine_init(MachineState *machine)
>>       /* NuBus */
>> -    dev = qdev_new(TYPE_MAC_NUBUS_BRIDGE);
>> -    qdev_prop_set_uint32(dev, "slot-available-mask",
>> +    object_initialize_child(OBJECT(machine), "mac-nubus-bridge",
>> +                            &m->mac_nubus_bridge,
>> +                            TYPE_MAC_NUBUS_BRIDGE);
>> +    sysbus = SYS_BUS_DEVICE(&m->mac_nubus_bridge);
>> +    dev = DEVICE(&m->mac_nubus_bridge);
>> +    qdev_prop_set_uint32(DEVICE(&m->mac_nubus_bridge), "slot-available-mask",
>>                            Q800_NUBUS_SLOTS_AVAILABLE);
>> -    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
>> -    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
>> -                    MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE);
>> -    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, NUBUS_SLOT_BASE +
>> -                    MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE);
>> +    sysbus_realize(sysbus, &error_fatal);
>> +    memory_region_add_subregion(get_system_memory(),
>> +                                MAC_NUBUS_FIRST_SLOT * NUBUS_SUPER_SLOT_SIZE,
>> +                                sysbus_mmio_get_region(sysbus, 0));
>> +    memory_region_add_subregion(get_system_memory(),
>> +                                NUBUS_SLOT_BASE +
>> +                                MAC_NUBUS_FIRST_SLOT * NUBUS_SLOT_SIZE,
>> +                                sysbus_mmio_get_region(sysbus, 1));
> 
> Why it's not done in PATCH 10?

Patch 10 is concerned with devices mapped into the macio aliased memory space, 
whereas the mac-nubus-bridge device is mapped into the system memory address space 
(I'm not a fan of sysbus_mmio_map() because the "system memory space" isn't often 
well-defined: I much prefer to make the mapping explicit).

> Reviewed-by: Laurent Vivier <laurent@vivier.eu>

Thanks!


ATB,

Mark.



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

* Re: [PATCH v3 05/23] q800: move CPU object into Q800MachineState
  2023-06-04 13:14 ` [PATCH v3 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
  2023-06-04 16:16   ` Laurent Vivier
@ 2023-06-05 12:33   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:33 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> Also change the instantiation of the CPU to use object_initialize_child()
> followed by a separate realisation.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 18 +++++++++++++-----
>   include/hw/m68k/q800.h |  3 +++
>   2 files changed, 16 insertions(+), 5 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file
  2023-06-04 13:14 ` [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
@ 2023-06-05 12:41   ` Philippe Mathieu-Daudé
  2023-06-19 12:26     ` Mark Cave-Ayland
  0 siblings, 1 reply; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:41 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> This will allow the q800-glue.h header to be included separately so that the
> GLUE device can be referenced externally.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   MAINTAINERS                 |   2 +
>   hw/m68k/meson.build         |   2 +-
>   hw/m68k/q800-glue.c         | 252 ++++++++++++++++++++++++++++++++++++
>   hw/m68k/q800.c              | 238 +---------------------------------
>   include/hw/m68k/q800-glue.h |  50 +++++++
>   5 files changed, 306 insertions(+), 238 deletions(-)
>   create mode 100644 hw/m68k/q800-glue.c
>   create mode 100644 include/hw/m68k/q800-glue.h


> diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c
> new file mode 100644
> index 0000000000..793bdb110c
> --- /dev/null
> +++ b/hw/m68k/q800-glue.c
> @@ -0,0 +1,252 @@
> +/*
> + * QEMU q800 logic glue

Although mentioned later, could we describe as "GLUE (General
Logic Unit)" here?

> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.

Or simpler:

   * SPDX-License-Identifier: MIT

> + */
> +
> +#include "qemu/osdep.h"
> +#include "cpu.h"
> +#include "hw/m68k/q800-glue.h"
> +#include "hw/boards.h"
> +#include "hw/irq.h"
> +#include "hw/nmi.h"
> +#include "hw/qdev-properties.h"
> +#include "migration/vmstate.h"
> +
> +/*
> + * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
> + * that performs a variety of functions (RAM management, clock generation, ...).
> + * The GLUE chip receives interrupt requests from various devices,
> + * assign priority to each, and asserts one or more interrupt line to the
> + * CPU.
> + */


> +static const TypeInfo glue_info = {
> +    .name = TYPE_GLUE,
> +    .parent = TYPE_SYS_BUS_DEVICE,
> +    .instance_size = sizeof(GLUEState),
> +    .instance_init = glue_init,
> +    .instance_finalize = glue_finalize,
> +    .class_init = glue_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +         { TYPE_NMI },
> +         { }
> +    },
> +};
> +
> +static void glue_register_types(void)
> +{
> +    type_register_static(&glue_info);
> +}
 > +
 > +type_init(glue_register_types)

Soon DEFINE_TYPES() will be recommended over type_init().

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-06-04 13:14 ` [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
@ 2023-06-05 12:43   ` Philippe Mathieu-Daudé
  2023-06-06  6:33     ` Mark Cave-Ayland
  2023-06-05 12:48   ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:43 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> The current use of aliased memory regions causes us 2 problems: firstly the
> output of "info qom-tree" is absolutely huge and difficult to read, and
> secondly we have already reached the internal limit for memory regions as
> adding any new memory region into the mac-io region causes QEMU to assert
> with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
> failed".
> 
> Implement the mac-io region aliasing using a single IO memory region that
> applies IO_SLICE_MASK representing the maximum size of the aliased region and
> then forwarding the access to the existing mac-io memory region using the
> address space API.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
>   include/hw/m68k/q800.h |   1 +
>   2 files changed, 82 insertions(+), 19 deletions(-)

Out of curiosity, is mac-io an I/O bus, rather than a MMIO device?


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

* Re: [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h
  2023-06-04 13:14 ` [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
  2023-06-04 16:17   ` Laurent Vivier
@ 2023-06-05 12:44   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:44 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> This is to enable them to be used outside of dp8393x.c.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> CC: Jason Wang <jasowang@redhat.com>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/net/dp8393x.c         | 32 +--------------------
>   include/hw/net/dp8393x.h | 60 ++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 61 insertions(+), 31 deletions(-)
>   create mode 100644 include/hw/net/dp8393x.h

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device
  2023-06-04 13:14 ` [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
@ 2023-06-05 12:46   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:46 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> Instead use the qdev_get_child_bus() function which is intended for this exact
> purpose.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 19/23] q800: move mac-nubus-bridge device to Q800MachineState
  2023-06-04 13:14 ` [PATCH v3 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
  2023-06-04 16:29   ` Laurent Vivier
@ 2023-06-05 12:47   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:47 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> Also change the instantiation of the mac-nubus-bridge device to use
> object_initialize_child() and map the Nubus address space using
> memory_region_add_subregion() instead of sysbus_mmio_map().
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/m68k/q800.c         | 21 ++++++++++++++-------
>   include/hw/m68k/q800.h |  2 ++
>   2 files changed, 16 insertions(+), 7 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-06-04 13:14 ` [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
  2023-06-05 12:43   ` Philippe Mathieu-Daudé
@ 2023-06-05 12:48   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:48 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> The current use of aliased memory regions causes us 2 problems: firstly the
> output of "info qom-tree" is absolutely huge and difficult to read, and
> secondly we have already reached the internal limit for memory regions as
> adding any new memory region into the mac-io region causes QEMU to assert
> with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
> failed".
> 
> Implement the mac-io region aliasing using a single IO memory region that
> applies IO_SLICE_MASK representing the maximum size of the aliased region and
> then forwarding the access to the existing mac-io memory region using the
> address space API.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
>   include/hw/m68k/q800.h |   1 +
>   2 files changed, 82 insertions(+), 19 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 09/23] q800: introduce mac-io container memory region
  2023-06-04 13:14 ` [PATCH v3 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
@ 2023-06-05 12:49   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-05 12:49 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 4/6/23 15:14, Mark Cave-Ayland wrote:
> Move all devices from the IO region to within the container in preparation
> for updating the IO aliasing mechanism.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
>   hw/m68k/q800.c         | 6 ++++++
>   include/hw/m68k/q800.h | 1 +
>   2 files changed, 7 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-06-05 12:43   ` Philippe Mathieu-Daudé
@ 2023-06-06  6:33     ` Mark Cave-Ayland
  2023-06-06 12:40       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-06  6:33 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, laurent, qemu-devel

On 05/06/2023 13:43, Philippe Mathieu-Daudé wrote:

> On 4/6/23 15:14, Mark Cave-Ayland wrote:
>> The current use of aliased memory regions causes us 2 problems: firstly the
>> output of "info qom-tree" is absolutely huge and difficult to read, and
>> secondly we have already reached the internal limit for memory regions as
>> adding any new memory region into the mac-io region causes QEMU to assert
>> with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
>> failed".
>>
>> Implement the mac-io region aliasing using a single IO memory region that
>> applies IO_SLICE_MASK representing the maximum size of the aliased region and
>> then forwarding the access to the existing mac-io memory region using the
>> address space API.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
>> ---
>>   hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
>>   include/hw/m68k/q800.h |   1 +
>>   2 files changed, 82 insertions(+), 19 deletions(-)
> 
> Out of curiosity, is mac-io an I/O bus, rather than a MMIO device?

Well for PPC it is currently modelled as a bus, but having worked on the q800 machine 
which is the forerunner to the integrated PPC CUDA/PMU version my best guess now is 
that it is an MMIO device with partial address decoding.


ATB,

Mark.



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

* Re: [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO memory region
  2023-06-06  6:33     ` Mark Cave-Ayland
@ 2023-06-06 12:40       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 40+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-06 12:40 UTC (permalink / raw)
  To: Mark Cave-Ayland, laurent, qemu-devel

On 6/6/23 08:33, Mark Cave-Ayland wrote:
> On 05/06/2023 13:43, Philippe Mathieu-Daudé wrote:
> 
>> On 4/6/23 15:14, Mark Cave-Ayland wrote:
>>> The current use of aliased memory regions causes us 2 problems: 
>>> firstly the
>>> output of "info qom-tree" is absolutely huge and difficult to read, and
>>> secondly we have already reached the internal limit for memory 
>>> regions as
>>> adding any new memory region into the mac-io region causes QEMU to 
>>> assert
>>> with "phys_section_add: Assertion `map->sections_nb < TARGET_PAGE_SIZE'
>>> failed".
>>>
>>> Implement the mac-io region aliasing using a single IO memory region 
>>> that
>>> applies IO_SLICE_MASK representing the maximum size of the aliased 
>>> region and
>>> then forwarding the access to the existing mac-io memory region using 
>>> the
>>> address space API.
>>>
>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>>> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
>>> ---
>>>   hw/m68k/q800.c         | 100 +++++++++++++++++++++++++++++++++--------
>>>   include/hw/m68k/q800.h |   1 +
>>>   2 files changed, 82 insertions(+), 19 deletions(-)
>>
>> Out of curiosity, is mac-io an I/O bus, rather than a MMIO device?
> 
> Well for PPC it is currently modelled as a bus, but having worked on the 
> q800 machine which is the forerunner to the integrated PPC CUDA/PMU 
> version my best guess now is that it is an MMIO device with partial 
> address decoding.

Hmm OK... Cc me if you find more doc in future work, I am interested
to understand.

Thanks,

Phil.


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

* Re: [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file
  2023-06-05 12:41   ` Philippe Mathieu-Daudé
@ 2023-06-19 12:26     ` Mark Cave-Ayland
  0 siblings, 0 replies; 40+ messages in thread
From: Mark Cave-Ayland @ 2023-06-19 12:26 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, laurent, qemu-devel

On 05/06/2023 13:41, Philippe Mathieu-Daudé wrote:

> On 4/6/23 15:14, Mark Cave-Ayland wrote:
>> This will allow the q800-glue.h header to be included separately so that the
>> GLUE device can be referenced externally.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
>> ---
>>   MAINTAINERS                 |   2 +
>>   hw/m68k/meson.build         |   2 +-
>>   hw/m68k/q800-glue.c         | 252 ++++++++++++++++++++++++++++++++++++
>>   hw/m68k/q800.c              | 238 +---------------------------------
>>   include/hw/m68k/q800-glue.h |  50 +++++++
>>   5 files changed, 306 insertions(+), 238 deletions(-)
>>   create mode 100644 hw/m68k/q800-glue.c
>>   create mode 100644 include/hw/m68k/q800-glue.h
> 
> 
>> diff --git a/hw/m68k/q800-glue.c b/hw/m68k/q800-glue.c
>> new file mode 100644
>> index 0000000000..793bdb110c
>> --- /dev/null
>> +++ b/hw/m68k/q800-glue.c
>> @@ -0,0 +1,252 @@
>> +/*
>> + * QEMU q800 logic glue
> 
> Although mentioned later, could we describe as "GLUE (General
> Logic Unit)" here?

Sure, I can fix this in v4.

>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a copy
>> + * of this software and associated documentation files (the "Software"), to deal
>> + * in the Software without restriction, including without limitation the rights
>> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>> + * copies of the Software, and to permit persons to whom the Software is
>> + * furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
>> + * THE SOFTWARE.
> 
> Or simpler:
> 
>    * SPDX-License-Identifier: MIT

Thanks, I didn't realise that we could do this. In this particular case the header is 
simply a copy of the one from q800.c where the code originated from, so my thinking 
is that it makes sense to leave this for now and consider a wider update for the m68k 
machines as a follow-up.

>> + */
>> +
>> +#include "qemu/osdep.h"
>> +#include "cpu.h"
>> +#include "hw/m68k/q800-glue.h"
>> +#include "hw/boards.h"
>> +#include "hw/irq.h"
>> +#include "hw/nmi.h"
>> +#include "hw/qdev-properties.h"
>> +#include "migration/vmstate.h"
>> +
>> +/*
>> + * The GLUE (General Logic Unit) is an Apple custom integrated circuit chip
>> + * that performs a variety of functions (RAM management, clock generation, ...).
>> + * The GLUE chip receives interrupt requests from various devices,
>> + * assign priority to each, and asserts one or more interrupt line to the
>> + * CPU.
>> + */
> 
> 
>> +static const TypeInfo glue_info = {
>> +    .name = TYPE_GLUE,
>> +    .parent = TYPE_SYS_BUS_DEVICE,
>> +    .instance_size = sizeof(GLUEState),
>> +    .instance_init = glue_init,
>> +    .instance_finalize = glue_finalize,
>> +    .class_init = glue_class_init,
>> +    .interfaces = (InterfaceInfo[]) {
>> +         { TYPE_NMI },
>> +         { }
>> +    },
>> +};
>> +
>> +static void glue_register_types(void)
>> +{
>> +    type_register_static(&glue_info);
>> +}
>  > +
>  > +type_init(glue_register_types)
> 
> Soon DEFINE_TYPES() will be recommended over type_init().

I see, I'll add this as a separate patch in v4.

> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Thanks!


ATB,

Mark.



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

end of thread, other threads:[~2023-06-19 12:28 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-04 13:14 [PATCH v3 00/23] q800: add support for booting MacOS Classic - part 1 Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 01/23] q800: fix up minor spacing issues in hw_compat_q800 GlobalProperty array Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 02/23] q800: add missing space after parent object in GLUEState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 03/23] q800: introduce Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 04/23] q800: rename q800_init() to q800_machine_init() Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 05/23] q800: move CPU object into Q800MachineState Mark Cave-Ayland
2023-06-04 16:16   ` Laurent Vivier
2023-06-05 12:33   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 06/23] q800: move ROM memory region to Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 07/23] q800: move GLUE device into separate q800-glue.c file Mark Cave-Ayland
2023-06-05 12:41   ` Philippe Mathieu-Daudé
2023-06-19 12:26     ` Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 08/23] q800: move GLUE device to Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 09/23] q800: introduce mac-io container memory region Mark Cave-Ayland
2023-06-05 12:49   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 10/23] q800: reimplement mac-io region aliasing using IO " Mark Cave-Ayland
2023-06-05 12:43   ` Philippe Mathieu-Daudé
2023-06-06  6:33     ` Mark Cave-Ayland
2023-06-06 12:40       ` Philippe Mathieu-Daudé
2023-06-05 12:48   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 11/23] q800: move VIA1 device to Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 12/23] q800: move VIA2 " Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 13/23] hw/net/dp8393x.c: move TYPE_DP8393X and dp8393xState into dp8393x.h Mark Cave-Ayland
2023-06-04 16:17   ` Laurent Vivier
2023-06-05  0:36     ` Jason Wang
2023-06-05 12:44   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 14/23] q800: move dp8393x device to Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 15/23] q800: move ESCC " Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 16/23] q800: move escc_orgate " Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 17/23] q800: move ESP " Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 18/23] q800: move SWIM " Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 19/23] q800: move mac-nubus-bridge " Mark Cave-Ayland
2023-06-04 16:29   ` Laurent Vivier
2023-06-05  5:43     ` Mark Cave-Ayland
2023-06-05 12:47   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 20/23] q800: don't access Nubus bus directly from the mac-nubus-bridge device Mark Cave-Ayland
2023-06-05 12:46   ` Philippe Mathieu-Daudé
2023-06-04 13:14 ` [PATCH v3 21/23] q800: move macfb device to Q800MachineState Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 22/23] mac_via: fix rtc command decoding from PRAM addresses 0x0 to 0xf Mark Cave-Ayland
2023-06-04 13:14 ` [PATCH v3 23/23] mac_via: fix rtc command decoding for the PRAM seconds registers Mark Cave-Ayland

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.