Message ID | 20190709073222.26370-6-huth@tuxfamily.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | m68k: Add basic support for the NeXTcube machine | expand |
On 7/9/19 9:32 AM, Thomas Huth wrote: > The NeXTcube uses a normal 8530 serial controller, so we can simply use > our normal "escc" device here. > While we're at it, also add a boot-serial-test for the next-cube machine, > now that the serial output works. > > Signed-off-by: Thomas Huth <huth@tuxfamily.org> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > hw/m68k/Kconfig | 1 + > hw/m68k/next-cube.c | 37 ++++++++++++++++++++++++++++++++++++- > tests/boot-serial-test.c | 12 ++++++++++++ > 3 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig > index ec58a2eb06..a74fac5abd 100644 > --- a/hw/m68k/Kconfig > +++ b/hw/m68k/Kconfig > @@ -11,3 +11,4 @@ config MCF5208 > config NEXTCUBE > bool > select FRAMEBUFFER > + select ESCC > diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c > index 0737605417..b7f1e9106b 100644 > --- a/hw/m68k/next-cube.c > +++ b/hw/m68k/next-cube.c > @@ -846,6 +846,39 @@ void next_irq(void *opaque, int number, int level) > } > } > > +static void next_serial_irq(void *opaque, int n, int level) > +{ > + /* DPRINTF("SCC IRQ NUM %i\n",n); */ > + if (n) { > + next_irq(opaque, NEXT_SCC_DMA_I, level); > + } else { > + next_irq(opaque, NEXT_SCC_I, level); > + } > +} > + > +static void next_escc_init(M68kCPU *cpu) > +{ > + qemu_irq *ser_irq = qemu_allocate_irqs(next_serial_irq, cpu, 2); > + DeviceState *dev; > + SysBusDevice *s; > + > + dev = qdev_create(NULL, TYPE_ESCC); > + qdev_prop_set_uint32(dev, "disabled", 0); > + qdev_prop_set_uint32(dev, "frequency", 9600 * 384); > + qdev_prop_set_uint32(dev, "it_shift", 0); > + qdev_prop_set_bit(dev, "bit_swap", true); > + qdev_prop_set_chr(dev, "chrB", serial_hd(1)); > + qdev_prop_set_chr(dev, "chrA", serial_hd(0)); > + qdev_prop_set_uint32(dev, "chnBtype", escc_serial); > + qdev_prop_set_uint32(dev, "chnAtype", escc_serial); > + qdev_init_nofail(dev); > + > + s = SYS_BUS_DEVICE(dev); > + sysbus_connect_irq(s, 0, ser_irq[0]); > + sysbus_connect_irq(s, 1, ser_irq[1]); > + sysbus_mmio_map(s, 0, 0x2118000); > +} > + > static void next_cube_init(MachineState *machine) > { > M68kCPU *cpu; > @@ -937,8 +970,10 @@ static void next_cube_init(MachineState *machine) > } > } > > - /* TODO: */ > /* Serial */ > + next_escc_init(cpu); > + > + /* TODO: */ > /* Network */ > /* SCSI */ > > diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c > index 24852d4c7d..c8ded1195e 100644 > --- a/tests/boot-serial-test.c > +++ b/tests/boot-serial-test.c > @@ -24,6 +24,17 @@ static const uint8_t kernel_mcf5208[] = { > 0x60, 0xfa /* bra.s loop */ > }; > > +static const uint8_t bios_nextcube[] = { > + 0x06, 0x00, 0x00, 0x00, /* Initial SP */ > + 0x01, 0x00, 0x00, 0x08, /* Initial PC */ > + 0x41, 0xf9, 0x02, 0x11, 0x80, 0x00, /* lea 0x02118000,%a0 */ > + 0x10, 0x3c, 0x00, 0x54, /* move.b #'T',%d0 */ > + 0x11, 0x7c, 0x00, 0x05, 0x00, 0x01, /* move.b #5,1(%a0) Sel TXCTRL */ > + 0x11, 0x7c, 0x00, 0x68, 0x00, 0x01, /* move.b #0x68,1(%a0) Enable TX */ > + 0x11, 0x40, 0x00, 0x03, /* move.b %d0,3(%a0) Print 'T' */ > + 0x60, 0xfa /* bra.s loop */ > +}; > + > static const uint8_t kernel_pls3adsp1800[] = { > 0xb0, 0x00, 0x84, 0x00, /* imm 0x8400 */ > 0x30, 0x60, 0x00, 0x04, /* addik r3,r0,4 */ > @@ -116,6 +127,7 @@ static testdef_t tests[] = { > { "sparc64", "sun4u", "", "UltraSPARC" }, > { "s390x", "s390-ccw-virtio", "", "device" }, > { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 }, > + { "m68k", "next-cube", "", "TT", sizeof(bios_nextcube), 0, bios_nextcube }, > { "microblaze", "petalogix-s3adsp1800", "", "TT", > sizeof(kernel_pls3adsp1800), kernel_pls3adsp1800 }, > { "microblazeel", "petalogix-ml605", "", "TT", >
diff --git a/hw/m68k/Kconfig b/hw/m68k/Kconfig index ec58a2eb06..a74fac5abd 100644 --- a/hw/m68k/Kconfig +++ b/hw/m68k/Kconfig @@ -11,3 +11,4 @@ config MCF5208 config NEXTCUBE bool select FRAMEBUFFER + select ESCC diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c index 0737605417..b7f1e9106b 100644 --- a/hw/m68k/next-cube.c +++ b/hw/m68k/next-cube.c @@ -846,6 +846,39 @@ void next_irq(void *opaque, int number, int level) } } +static void next_serial_irq(void *opaque, int n, int level) +{ + /* DPRINTF("SCC IRQ NUM %i\n",n); */ + if (n) { + next_irq(opaque, NEXT_SCC_DMA_I, level); + } else { + next_irq(opaque, NEXT_SCC_I, level); + } +} + +static void next_escc_init(M68kCPU *cpu) +{ + qemu_irq *ser_irq = qemu_allocate_irqs(next_serial_irq, cpu, 2); + DeviceState *dev; + SysBusDevice *s; + + dev = qdev_create(NULL, TYPE_ESCC); + qdev_prop_set_uint32(dev, "disabled", 0); + qdev_prop_set_uint32(dev, "frequency", 9600 * 384); + qdev_prop_set_uint32(dev, "it_shift", 0); + qdev_prop_set_bit(dev, "bit_swap", true); + qdev_prop_set_chr(dev, "chrB", serial_hd(1)); + qdev_prop_set_chr(dev, "chrA", serial_hd(0)); + qdev_prop_set_uint32(dev, "chnBtype", escc_serial); + qdev_prop_set_uint32(dev, "chnAtype", escc_serial); + qdev_init_nofail(dev); + + s = SYS_BUS_DEVICE(dev); + sysbus_connect_irq(s, 0, ser_irq[0]); + sysbus_connect_irq(s, 1, ser_irq[1]); + sysbus_mmio_map(s, 0, 0x2118000); +} + static void next_cube_init(MachineState *machine) { M68kCPU *cpu; @@ -937,8 +970,10 @@ static void next_cube_init(MachineState *machine) } } - /* TODO: */ /* Serial */ + next_escc_init(cpu); + + /* TODO: */ /* Network */ /* SCSI */ diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c index 24852d4c7d..c8ded1195e 100644 --- a/tests/boot-serial-test.c +++ b/tests/boot-serial-test.c @@ -24,6 +24,17 @@ static const uint8_t kernel_mcf5208[] = { 0x60, 0xfa /* bra.s loop */ }; +static const uint8_t bios_nextcube[] = { + 0x06, 0x00, 0x00, 0x00, /* Initial SP */ + 0x01, 0x00, 0x00, 0x08, /* Initial PC */ + 0x41, 0xf9, 0x02, 0x11, 0x80, 0x00, /* lea 0x02118000,%a0 */ + 0x10, 0x3c, 0x00, 0x54, /* move.b #'T',%d0 */ + 0x11, 0x7c, 0x00, 0x05, 0x00, 0x01, /* move.b #5,1(%a0) Sel TXCTRL */ + 0x11, 0x7c, 0x00, 0x68, 0x00, 0x01, /* move.b #0x68,1(%a0) Enable TX */ + 0x11, 0x40, 0x00, 0x03, /* move.b %d0,3(%a0) Print 'T' */ + 0x60, 0xfa /* bra.s loop */ +}; + static const uint8_t kernel_pls3adsp1800[] = { 0xb0, 0x00, 0x84, 0x00, /* imm 0x8400 */ 0x30, 0x60, 0x00, 0x04, /* addik r3,r0,4 */ @@ -116,6 +127,7 @@ static testdef_t tests[] = { { "sparc64", "sun4u", "", "UltraSPARC" }, { "s390x", "s390-ccw-virtio", "", "device" }, { "m68k", "mcf5208evb", "", "TT", sizeof(kernel_mcf5208), kernel_mcf5208 }, + { "m68k", "next-cube", "", "TT", sizeof(bios_nextcube), 0, bios_nextcube }, { "microblaze", "petalogix-s3adsp1800", "", "TT", sizeof(kernel_pls3adsp1800), kernel_pls3adsp1800 }, { "microblazeel", "petalogix-ml605", "", "TT",
The NeXTcube uses a normal 8530 serial controller, so we can simply use our normal "escc" device here. While we're at it, also add a boot-serial-test for the next-cube machine, now that the serial output works. Signed-off-by: Thomas Huth <huth@tuxfamily.org> --- hw/m68k/Kconfig | 1 + hw/m68k/next-cube.c | 37 ++++++++++++++++++++++++++++++++++++- tests/boot-serial-test.c | 12 ++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-)