[Qemu-devel] [RFC 09/13] hw/m68k: define Macintosh Quadra 800

2018-06-08 Thread Laurent Vivier
From: Laurent Vivier 

Signed-off-by: Laurent Vivier 
---
 default-configs/m68k-softmmu.mak |  12 ++
 hw/display/macfb.c   |  31 ++--
 hw/m68k/Makefile.objs|   6 +-
 hw/m68k/bootinfo.h   |  99 ++
 hw/m68k/mac.c| 384 +++
 hw/nubus/nubus-device.c  |  13 --
 tests/qom-test.c |   5 +
 tests/test-hmp.c |   3 +-
 8 files changed, 519 insertions(+), 34 deletions(-)
 create mode 100644 hw/m68k/bootinfo.h
 create mode 100644 hw/m68k/mac.c

diff --git a/default-configs/m68k-softmmu.mak b/default-configs/m68k-softmmu.mak
index 60f7cdfbf2..1b568be166 100644
--- a/default-configs/m68k-softmmu.mak
+++ b/default-configs/m68k-softmmu.mak
@@ -2,3 +2,15 @@
 
 CONFIG_COLDFIRE=y
 CONFIG_PTIMER=y
+CONFIG_ESCC=y
+CONFIG_FRAMEBUFFER=y
+CONFIG_ADB=y
+CONFIG_MAC_VIA=y
+CONFIG_MAC=y
+CONFIG_SCSI=y
+CONFIG_ESP=y
+CONFIG_ASC=y
+CONFIG_MACFB=y
+CONFIG_NUBUS=y
+CONFIG_DP8393X=y
+CONFIG_SWIM=y
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index 295fd0fc8a..a3204ab150 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -240,31 +240,28 @@ typedef struct {
 MacfbState macfb;
 } MacfbNubusState;
 
-static int macfb_sysbus_init(SysBusDevice *dev)
+static void macfb_sysbus_realize(DeviceState *dev, Error **errp)
 {
 MacfbState *s =  &MACFB(dev)->macfb;
 
-macfb_init(DEVICE(dev), s);
-sysbus_init_mmio(dev, &s->mem_ctrl);
-sysbus_init_mmio(dev, &s->mem_vram);
-
-return 0;
+macfb_init(dev, s);
+sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mem_ctrl);
+sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mem_vram);
 }
 
 const uint8_t macfb_rom[] = {
 255, 0, 0, 0,
 };
 
-static int macfb_nubus_init(NubusDevice *dev)
+static void macfb_nubus_realize(DeviceState *dev, Error **errp)
 {
-MacfbState *s = &DO_UPCAST(MacfbNubusState, busdev, dev)->macfb;
+NubusDevice *nubus = NUBUS_DEVICE(dev);
+MacfbState *s = &DO_UPCAST(MacfbNubusState, busdev, nubus)->macfb;
 
-macfb_init(DEVICE(dev), s);
-nubus_add_slot_mmio(dev, DAFB_BASE, &s->mem_ctrl);
-nubus_add_slot_mmio(dev, VIDEO_BASE, &s->mem_vram);
-nubus_register_rom(dev, macfb_rom, sizeof(macfb_rom), 1, 9, 0xf);
-
-return 0;
+macfb_init(dev, s);
+nubus_add_slot_mmio(nubus, DAFB_BASE, &s->mem_ctrl);
+nubus_add_slot_mmio(nubus, VIDEO_BASE, &s->mem_vram);
+nubus_register_rom(nubus, macfb_rom, sizeof(macfb_rom), 1, 9, 0xf);
 }
 
 static void macfb_sysbus_reset(DeviceState *d)
@@ -296,9 +293,8 @@ static Property macfb_nubus_properties[] = {
 static void macfb_sysbus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
 
-k->init = macfb_sysbus_init;
+dc->realize = macfb_sysbus_realize;
 dc->desc = "SysBus Macintosh framebuffer";
 dc->reset = macfb_sysbus_reset;
 dc->vmsd = &vmstate_macfb;
@@ -308,9 +304,8 @@ static void macfb_sysbus_class_init(ObjectClass *klass, 
void *data)
 static void macfb_nubus_class_init(ObjectClass *klass, void *data)
 {
 DeviceClass *dc = DEVICE_CLASS(klass);
-NubusDeviceClass *k = NUBUS_DEVICE_CLASS(klass);
 
-k->init = macfb_nubus_init;
+dc->realize = macfb_nubus_realize;
 dc->desc = "Nubus Macintosh framebuffer";
 dc->reset = macfb_nubus_reset;
 dc->vmsd = &vmstate_macfb;
diff --git a/hw/m68k/Makefile.objs b/hw/m68k/Makefile.objs
index d1f089c08a..ff739617b2 100644
--- a/hw/m68k/Makefile.objs
+++ b/hw/m68k/Makefile.objs
@@ -1,2 +1,4 @@
-obj-y += an5206.o mcf5208.o
-obj-y += mcf5206.o mcf_intc.o
+obj-$(CONFIG_COLDFIRE) += an5206.o mcf5208.o
+obj-$(CONFIG_MAC) += mac.o
+
+obj-$(CONFIG_COLDFIRE) += mcf5206.o mcf_intc.o
diff --git a/hw/m68k/bootinfo.h b/hw/m68k/bootinfo.h
new file mode 100644
index 00..b04153ce1e
--- /dev/null
+++ b/hw/m68k/bootinfo.h
@@ -0,0 +1,99 @@
+struct bi_record {
+uint16_t tag;/* tag ID */
+uint16_t size;   /* size of record */
+uint32_t data[0];/* data */
+};
+
+/* machine independent tags */
+
+#define BI_LAST 0x /* last record */
+#define BI_MACHTYPE 0x0001 /* machine type (u_long) */
+#define BI_CPUTYPE  0x0002 /* cpu type (u_long) */
+#define BI_FPUTYPE  0x0003 /* fpu type (u_long) */
+#define BI_MMUTYPE  0x0004 /* mmu type (u_long) */
+#define BI_MEMCHUNK 0x0005 /* memory chunk address and size */
+   /* (struct mem_info) */
+#define BI_RAMDISK  0x0006 /* ramdisk address and size */
+   /* (struct mem_info) */
+#define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */
+   /* (string) */
+
+/*  Macintosh-specific tags (all u_long) */
+
+#define BI_MAC_MODEL0x8000  /* Mac Gestalt ID (model type) */
+#define BI_MAC_VADDR0x8001  /* Mac video base address */
+#define BI_MAC_VDEPTH   0x8002  /* Mac video depth */
+#define BI_MAC_V

Re: [Qemu-devel] [RFC 09/13] hw/m68k: define Macintosh Quadra 800

2018-06-09 Thread Mark Cave-Ayland

On 08/06/18 21:05, Laurent Vivier wrote:


From: Laurent Vivier 

Signed-off-by: Laurent Vivier 
---
  default-configs/m68k-softmmu.mak |  12 ++
  hw/display/macfb.c   |  31 ++--
  hw/m68k/Makefile.objs|   6 +-
  hw/m68k/bootinfo.h   |  99 ++
  hw/m68k/mac.c| 384 +++
  hw/nubus/nubus-device.c  |  13 --
  tests/qom-test.c |   5 +
  tests/test-hmp.c |   3 +-
  8 files changed, 519 insertions(+), 34 deletions(-)
  create mode 100644 hw/m68k/bootinfo.h
  create mode 100644 hw/m68k/mac.c

diff --git a/default-configs/m68k-softmmu.mak b/default-configs/m68k-softmmu.mak
index 60f7cdfbf2..1b568be166 100644
--- a/default-configs/m68k-softmmu.mak
+++ b/default-configs/m68k-softmmu.mak
@@ -2,3 +2,15 @@
  
  CONFIG_COLDFIRE=y

  CONFIG_PTIMER=y
+CONFIG_ESCC=y
+CONFIG_FRAMEBUFFER=y
+CONFIG_ADB=y
+CONFIG_MAC_VIA=y
+CONFIG_MAC=y
+CONFIG_SCSI=y
+CONFIG_ESP=y
+CONFIG_ASC=y
+CONFIG_MACFB=y
+CONFIG_NUBUS=y
+CONFIG_DP8393X=y
+CONFIG_SWIM=y
diff --git a/hw/display/macfb.c b/hw/display/macfb.c
index 295fd0fc8a..a3204ab150 100644
--- a/hw/display/macfb.c
+++ b/hw/display/macfb.c
@@ -240,31 +240,28 @@ typedef struct {
  MacfbState macfb;
  } MacfbNubusState;
  
-static int macfb_sysbus_init(SysBusDevice *dev)

+static void macfb_sysbus_realize(DeviceState *dev, Error **errp)
  {
  MacfbState *s =  &MACFB(dev)->macfb;
  
-macfb_init(DEVICE(dev), s);

-sysbus_init_mmio(dev, &s->mem_ctrl);
-sysbus_init_mmio(dev, &s->mem_vram);
-
-return 0;
+macfb_init(dev, s);
+sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mem_ctrl);
+sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mem_vram);
  }
  
  const uint8_t macfb_rom[] = {

  255, 0, 0, 0,
  };
  
-static int macfb_nubus_init(NubusDevice *dev)

+static void macfb_nubus_realize(DeviceState *dev, Error **errp)
  {
-MacfbState *s = &DO_UPCAST(MacfbNubusState, busdev, dev)->macfb;


DO_UPCAST() - wow that's a blast from the past! Obviously these should 
be handled via proper QOM objects and casts.



+NubusDevice *nubus = NUBUS_DEVICE(dev);
+MacfbState *s = &DO_UPCAST(MacfbNubusState, busdev, nubus)->macfb;
  
-macfb_init(DEVICE(dev), s);

-nubus_add_slot_mmio(dev, DAFB_BASE, &s->mem_ctrl);
-nubus_add_slot_mmio(dev, VIDEO_BASE, &s->mem_vram);
-nubus_register_rom(dev, macfb_rom, sizeof(macfb_rom), 1, 9, 0xf);
-
-return 0;
+macfb_init(dev, s);
+nubus_add_slot_mmio(nubus, DAFB_BASE, &s->mem_ctrl);
+nubus_add_slot_mmio(nubus, VIDEO_BASE, &s->mem_vram);
+nubus_register_rom(nubus, macfb_rom, sizeof(macfb_rom), 1, 9, 0xf);
  }
  
  static void macfb_sysbus_reset(DeviceState *d)

@@ -296,9 +293,8 @@ static Property macfb_nubus_properties[] = {
  static void macfb_sysbus_class_init(ObjectClass *klass, void *data)
  {
  DeviceClass *dc = DEVICE_CLASS(klass);
-SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  
-k->init = macfb_sysbus_init;

+dc->realize = macfb_sysbus_realize;
  dc->desc = "SysBus Macintosh framebuffer";
  dc->reset = macfb_sysbus_reset;
  dc->vmsd = &vmstate_macfb;
@@ -308,9 +304,8 @@ static void macfb_sysbus_class_init(ObjectClass *klass, 
void *data)
  static void macfb_nubus_class_init(ObjectClass *klass, void *data)
  {
  DeviceClass *dc = DEVICE_CLASS(klass);
-NubusDeviceClass *k = NUBUS_DEVICE_CLASS(klass);
  
-k->init = macfb_nubus_init;

+dc->realize = macfb_nubus_realize;
  dc->desc = "Nubus Macintosh framebuffer";
  dc->reset = macfb_nubus_reset;
  dc->vmsd = &vmstate_macfb;
diff --git a/hw/m68k/Makefile.objs b/hw/m68k/Makefile.objs
index d1f089c08a..ff739617b2 100644
--- a/hw/m68k/Makefile.objs
+++ b/hw/m68k/Makefile.objs
@@ -1,2 +1,4 @@
-obj-y += an5206.o mcf5208.o
-obj-y += mcf5206.o mcf_intc.o
+obj-$(CONFIG_COLDFIRE) += an5206.o mcf5208.o
+obj-$(CONFIG_MAC) += mac.o
+
+obj-$(CONFIG_COLDFIRE) += mcf5206.o mcf_intc.o
diff --git a/hw/m68k/bootinfo.h b/hw/m68k/bootinfo.h
new file mode 100644
index 00..b04153ce1e
--- /dev/null
+++ b/hw/m68k/bootinfo.h
@@ -0,0 +1,99 @@
+struct bi_record {
+uint16_t tag;/* tag ID */
+uint16_t size;   /* size of record */
+uint32_t data[0];/* data */
+};
+
+/* machine independent tags */
+
+#define BI_LAST 0x /* last record */
+#define BI_MACHTYPE 0x0001 /* machine type (u_long) */
+#define BI_CPUTYPE  0x0002 /* cpu type (u_long) */
+#define BI_FPUTYPE  0x0003 /* fpu type (u_long) */
+#define BI_MMUTYPE  0x0004 /* mmu type (u_long) */
+#define BI_MEMCHUNK 0x0005 /* memory chunk address and size */
+   /* (struct mem_info) */
+#define BI_RAMDISK  0x0006 /* ramdisk address and size */
+   /* (struct mem_info) */
+#define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */
+   /* (string) */
+
+/*  Macintosh-specific tags