-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hw/nubus: add nubus-virtio-mmio device
The nubus-virtio-mmio device is a Nubus card that contains a set of 32 virtio-mmio devices and a goldfish PIC similar to the m68k virt machine that can be plugged into the m68k q800 machine. There are currently a number of drivers under development that can be used in conjunction with this device to provide accelerated and/or additional hypervisor services to 68k Classic MacOS. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-ID: <20240111102954.449462-4-mark.cave-ayland@ilande.co.uk> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
- Loading branch information
Showing
3 changed files
with
139 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
/* | ||
* QEMU Macintosh Nubus Virtio MMIO card | ||
* | ||
* Copyright (c) 2024 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
* | ||
* SPDX-License-Identifier: GPL-2.0-or-later | ||
*/ | ||
|
||
#include "qemu/osdep.h" | ||
#include "hw/nubus/nubus-virtio-mmio.h" | ||
|
||
|
||
#define NUBUS_VIRTIO_MMIO_PIC_OFFSET 0 | ||
#define NUBUS_VIRTIO_MMIO_DEV_OFFSET 0x200 | ||
|
||
|
||
static void nubus_virtio_mmio_set_input_irq(void *opaque, int n, int level) | ||
{ | ||
NubusDevice *nd = NUBUS_DEVICE(opaque); | ||
|
||
nubus_set_irq(nd, level); | ||
} | ||
|
||
static void nubus_virtio_mmio_realize(DeviceState *dev, Error **errp) | ||
{ | ||
NubusVirtioMMIODeviceClass *nvmdc = NUBUS_VIRTIO_MMIO_GET_CLASS(dev); | ||
NubusVirtioMMIO *s = NUBUS_VIRTIO_MMIO(dev); | ||
NubusDevice *nd = NUBUS_DEVICE(dev); | ||
SysBusDevice *sbd; | ||
int i, offset; | ||
|
||
nvmdc->parent_realize(dev, errp); | ||
if (*errp) { | ||
return; | ||
} | ||
|
||
/* Goldfish PIC */ | ||
sbd = SYS_BUS_DEVICE(&s->pic); | ||
if (!sysbus_realize(sbd, errp)) { | ||
return; | ||
} | ||
memory_region_add_subregion(&nd->slot_mem, NUBUS_VIRTIO_MMIO_PIC_OFFSET, | ||
sysbus_mmio_get_region(sbd, 0)); | ||
sysbus_connect_irq(sbd, 0, | ||
qdev_get_gpio_in_named(dev, "pic-input-irq", 0)); | ||
|
||
/* virtio-mmio devices */ | ||
offset = NUBUS_VIRTIO_MMIO_DEV_OFFSET; | ||
for (i = 0; i < NUBUS_VIRTIO_MMIO_NUM_DEVICES; i++) { | ||
sbd = SYS_BUS_DEVICE(&s->virtio_mmio[i]); | ||
qdev_prop_set_bit(DEVICE(sbd), "force-legacy", false); | ||
if (!sysbus_realize_and_unref(sbd, errp)) { | ||
return; | ||
} | ||
|
||
memory_region_add_subregion(&nd->slot_mem, offset, | ||
sysbus_mmio_get_region(sbd, 0)); | ||
offset += 0x200; | ||
|
||
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(DEVICE(&s->pic), i)); | ||
} | ||
} | ||
|
||
static void nubus_virtio_mmio_init(Object *obj) | ||
{ | ||
NubusVirtioMMIO *s = NUBUS_VIRTIO_MMIO(obj); | ||
int i; | ||
|
||
object_initialize_child(obj, "pic", &s->pic, TYPE_GOLDFISH_PIC); | ||
for (i = 0; i < NUBUS_VIRTIO_MMIO_NUM_DEVICES; i++) { | ||
char *name = g_strdup_printf("virtio-mmio[%d]", i); | ||
object_initialize_child(obj, name, &s->virtio_mmio[i], | ||
TYPE_VIRTIO_MMIO); | ||
g_free(name); | ||
} | ||
|
||
/* Input from goldfish PIC */ | ||
qdev_init_gpio_in_named(DEVICE(obj), nubus_virtio_mmio_set_input_irq, | ||
"pic-input-irq", 1); | ||
} | ||
|
||
static void nubus_virtio_mmio_class_init(ObjectClass *oc, void *data) | ||
{ | ||
DeviceClass *dc = DEVICE_CLASS(oc); | ||
NubusVirtioMMIODeviceClass *nvmdc = NUBUS_VIRTIO_MMIO_CLASS(oc); | ||
|
||
device_class_set_parent_realize(dc, nubus_virtio_mmio_realize, | ||
&nvmdc->parent_realize); | ||
} | ||
|
||
static const TypeInfo nubus_virtio_mmio_types[] = { | ||
{ | ||
.name = TYPE_NUBUS_VIRTIO_MMIO, | ||
.parent = TYPE_NUBUS_DEVICE, | ||
.instance_init = nubus_virtio_mmio_init, | ||
.instance_size = sizeof(NubusVirtioMMIO), | ||
.class_init = nubus_virtio_mmio_class_init, | ||
.class_size = sizeof(NubusVirtioMMIODeviceClass), | ||
}, | ||
}; | ||
|
||
DEFINE_TYPES(nubus_virtio_mmio_types) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* QEMU Macintosh Nubus Virtio MMIO card | ||
* | ||
* Copyright (c) 2023 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
* | ||
* SPDX-License-Identifier: GPL-2.0-or-later | ||
*/ | ||
|
||
#ifndef HW_NUBUS_VIRTIO_MMIO_H | ||
#define HW_NUBUS_VIRTIO_MMIO_H | ||
|
||
#include "hw/nubus/nubus.h" | ||
#include "qom/object.h" | ||
#include "hw/intc/goldfish_pic.h" | ||
#include "hw/virtio/virtio-mmio.h" | ||
|
||
#define TYPE_NUBUS_VIRTIO_MMIO "nubus-virtio-mmio" | ||
OBJECT_DECLARE_TYPE(NubusVirtioMMIO, NubusVirtioMMIODeviceClass, | ||
NUBUS_VIRTIO_MMIO) | ||
|
||
struct NubusVirtioMMIODeviceClass { | ||
DeviceClass parent_class; | ||
|
||
DeviceRealize parent_realize; | ||
}; | ||
|
||
#define NUBUS_VIRTIO_MMIO_NUM_DEVICES 32 | ||
|
||
struct NubusVirtioMMIO { | ||
NubusDevice parent_obj; | ||
|
||
GoldfishPICState pic; | ||
VirtIOMMIOProxy virtio_mmio[NUBUS_VIRTIO_MMIO_NUM_DEVICES]; | ||
}; | ||
|
||
#endif |