hw/m68k/next-cube: Move register/interrupt functionality into a device
Currently the next-cube board code open-codes a lot of handling of interrupts and some miscellaneous registers. Move this into a proper QOM device. In the real hardware this functionality seems to be the responsibility of the Peripheral Controller (PC) chip, so name the device that. There are several different things that will need to be moved into this device: * the mmio_iops register set * the scr_ops register set * the next_irq IRQ handling To ease review, we structure the change as a sequence of commits: in this first commit we create the skeleton of the NeXTPC device with no content, but with a backdoor pointer to the NeXTState machine's state struct so we can move parts of the code and still have refactored and non-refactored code using the same struct data fields. Further commits will move functionality into the new device piece by piece. At the end we will be able to remove the backdoor pointer because all the data fields will be in the NeXTPC struct and not the NeXTState struct. We'll add the VMState for the new device at the end of all that; this is in theory a migration compatibility break but this machine does not currently support migration at all anyway. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20210115201206.17347-3-peter.maydell@linaro.org> [huth: Add a comment in front of struct NeXTPC] Signed-off-by: Thomas Huth <huth@tuxfamily.org>
This commit is contained in:
parent
c8abcc87b1
commit
660bef3390
@ -90,6 +90,17 @@ struct NeXTState {
|
|||||||
NextRtc rtc;
|
NextRtc rtc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define TYPE_NEXT_PC "next-pc"
|
||||||
|
OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC, NEXT_PC)
|
||||||
|
|
||||||
|
/* NeXT Peripheral Controller */
|
||||||
|
struct NeXTPC {
|
||||||
|
SysBusDevice parent_obj;
|
||||||
|
|
||||||
|
/* Temporary until all functionality has been moved into this device */
|
||||||
|
NeXTState *ns;
|
||||||
|
};
|
||||||
|
|
||||||
/* Thanks to NeXT forums for this */
|
/* Thanks to NeXT forums for this */
|
||||||
/*
|
/*
|
||||||
static const uint8_t rtc_ram3[32] = {
|
static const uint8_t rtc_ram3[32] = {
|
||||||
@ -857,6 +868,31 @@ static void next_escc_init(M68kCPU *cpu)
|
|||||||
sysbus_mmio_map(s, 0, 0x2118000);
|
sysbus_mmio_map(s, 0, 0x2118000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void next_pc_reset(DeviceState *dev)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void next_pc_realize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void next_pc_class_init(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
|
||||||
|
dc->desc = "NeXT Peripheral Controller";
|
||||||
|
dc->realize = next_pc_realize;
|
||||||
|
dc->reset = next_pc_reset;
|
||||||
|
/* We will add the VMState in a later commit */
|
||||||
|
}
|
||||||
|
|
||||||
|
static const TypeInfo next_pc_info = {
|
||||||
|
.name = TYPE_NEXT_PC,
|
||||||
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
|
.instance_size = sizeof(NeXTPC),
|
||||||
|
.class_init = next_pc_class_init,
|
||||||
|
};
|
||||||
|
|
||||||
static void next_cube_init(MachineState *machine)
|
static void next_cube_init(MachineState *machine)
|
||||||
{
|
{
|
||||||
M68kCPU *cpu;
|
M68kCPU *cpu;
|
||||||
@ -871,6 +907,7 @@ static void next_cube_init(MachineState *machine)
|
|||||||
const char *bios_name = machine->firmware ?: ROM_FILE;
|
const char *bios_name = machine->firmware ?: ROM_FILE;
|
||||||
NeXTState *ns = NEXT_MACHINE(machine);
|
NeXTState *ns = NEXT_MACHINE(machine);
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
|
DeviceState *pcdev;
|
||||||
|
|
||||||
/* Initialize the cpu core */
|
/* Initialize the cpu core */
|
||||||
cpu = M68K_CPU(cpu_create(machine->cpu_type));
|
cpu = M68K_CPU(cpu_create(machine->cpu_type));
|
||||||
@ -884,6 +921,12 @@ static void next_cube_init(MachineState *machine)
|
|||||||
env->vbr = 0;
|
env->vbr = 0;
|
||||||
env->sr = 0x2700;
|
env->sr = 0x2700;
|
||||||
|
|
||||||
|
/* Peripheral Controller */
|
||||||
|
pcdev = qdev_new(TYPE_NEXT_PC);
|
||||||
|
sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
|
||||||
|
/* Temporary while we refactor this code */
|
||||||
|
NEXT_PC(pcdev)->ns = ns;
|
||||||
|
|
||||||
/* Set internal registers to initial values */
|
/* Set internal registers to initial values */
|
||||||
/* 0x0000XX00 << vital bits */
|
/* 0x0000XX00 << vital bits */
|
||||||
ns->scr1 = 0x00011102;
|
ns->scr1 = 0x00011102;
|
||||||
@ -978,6 +1021,7 @@ static const TypeInfo next_typeinfo = {
|
|||||||
static void next_register_type(void)
|
static void next_register_type(void)
|
||||||
{
|
{
|
||||||
type_register_static(&next_typeinfo);
|
type_register_static(&next_typeinfo);
|
||||||
|
type_register_static(&next_pc_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(next_register_type)
|
type_init(next_register_type)
|
||||||
|
Loading…
Reference in New Issue
Block a user