[Qemu-devel] [RFC 09/13] hw/m68k: define Macintosh Quadra 800
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
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