summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hw/nubus/nubus-bridge.c2
-rw-r--r--hw/nubus/nubus-device.c8
-rw-r--r--include/hw/nubus/nubus.h6
3 files changed, 16 insertions, 0 deletions
diff --git a/hw/nubus/nubus-bridge.c b/hw/nubus/nubus-bridge.c
index 7b51722f66..c517a8a704 100644
--- a/hw/nubus/nubus-bridge.c
+++ b/hw/nubus/nubus-bridge.c
@@ -19,6 +19,8 @@ static void nubus_bridge_init(Object *obj)
NubusBus *bus = &s->bus;
qbus_create_inplace(bus, sizeof(s->bus), TYPE_NUBUS_BUS, DEVICE(s), NULL);
+
+ qdev_init_gpio_out(DEVICE(s), bus->irqs, NUBUS_IRQS);
}
static Property nubus_bridge_properties[] = {
diff --git a/hw/nubus/nubus-device.c b/hw/nubus/nubus-device.c
index 280f40e88a..0f1852f671 100644
--- a/hw/nubus/nubus-device.c
+++ b/hw/nubus/nubus-device.c
@@ -10,12 +10,20 @@
#include "qemu/osdep.h"
#include "qemu/datadir.h"
+#include "hw/irq.h"
#include "hw/loader.h"
#include "hw/nubus/nubus.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
+void nubus_set_irq(NubusDevice *nd, int level)
+{
+ NubusBus *nubus = NUBUS_BUS(qdev_get_parent_bus(DEVICE(nd)));
+
+ qemu_set_irq(nubus->irqs[nd->slot], level);
+}
+
static void nubus_device_realize(DeviceState *dev, Error **errp)
{
NubusBus *nubus = NUBUS_BUS(qdev_get_parent_bus(dev));
diff --git a/include/hw/nubus/nubus.h b/include/hw/nubus/nubus.h
index 63c69a7586..b3b4d2eadb 100644
--- a/include/hw/nubus/nubus.h
+++ b/include/hw/nubus/nubus.h
@@ -26,6 +26,8 @@
#define NUBUS_LAST_SLOT 0xf
#define NUBUS_SLOT_NB (NUBUS_LAST_SLOT - NUBUS_FIRST_SLOT + 1)
+#define NUBUS_IRQS 16
+
#define TYPE_NUBUS_DEVICE "nubus-device"
OBJECT_DECLARE_SIMPLE_TYPE(NubusDevice, NUBUS_DEVICE)
@@ -45,6 +47,8 @@ struct NubusBus {
MemoryRegion slot_io;
uint16_t slot_available_mask;
+
+ qemu_irq irqs[NUBUS_IRQS];
};
#define NUBUS_DECL_ROM_MAX_SIZE (128 * KiB)
@@ -60,6 +64,8 @@ struct NubusDevice {
MemoryRegion decl_rom;
};
+void nubus_set_irq(NubusDevice *nd, int level);
+
struct NubusBridge {
SysBusDevice parent_obj;