|
Justin M. Forbes |
45e84a |
From 0b23c5d40ea933cfece3b4f69427f79c8a23256d Mon Sep 17 00:00:00 2001
|
|
Justin M. Forbes |
45e84a |
From: Stefan Weil <sw@weilnetz.de>
|
|
Justin M. Forbes |
45e84a |
Date: Tue, 29 Nov 2011 06:34:48 +0100
|
|
Justin M. Forbes |
45e84a |
Subject: [PATCH 01/25] malta: Fix regression (i8259 interrupts did not work)
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
Commit 5632ae46d5bda798e971dae48ebb318ac2c3686a passes the address
|
|
Justin M. Forbes |
45e84a |
of i8259 to qemu_irq_proxy. i8259 is an auto variable with undefined
|
|
Justin M. Forbes |
45e84a |
value outside of mips_malta_init.
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
This made the interrupt proxy unusable: either QEMU crashes, or
|
|
Justin M. Forbes |
45e84a |
the interrupt handler was not called.
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
Ethernet for example no longer worked with MIPS Malta.
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
v2:
|
|
Justin M. Forbes |
45e84a |
While v1 used a static variable for i8259, this patch introduces
|
|
Justin M. Forbes |
45e84a |
a qdev for the malta machine. i8259 is now part of the device status.
|
|
Justin M. Forbes |
45e84a |
This is a minimal qdev implementation to keep the patch small.
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
Signed-off-by: Stefan Weil <sw@weilnetz.de>
|
|
Justin M. Forbes |
45e84a |
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
|
|
Justin M. Forbes |
45e84a |
(cherry picked from commit e9b40fd34ceb23461083d505a444a389c094455b)
|
|
Justin M. Forbes |
45e84a |
---
|
|
Justin M. Forbes |
45e84a |
hw/mips_malta.c | 39 +++++++++++++++++++++++++++++++++++----
|
|
Justin M. Forbes |
45e84a |
1 files changed, 35 insertions(+), 4 deletions(-)
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
|
|
Justin M. Forbes |
45e84a |
index bb49749..941b9bd 100644
|
|
Justin M. Forbes |
45e84a |
--- a/hw/mips_malta.c
|
|
Justin M. Forbes |
45e84a |
+++ b/hw/mips_malta.c
|
|
Justin M. Forbes |
45e84a |
@@ -47,6 +47,7 @@
|
|
Justin M. Forbes |
45e84a |
#include "mc146818rtc.h"
|
|
Justin M. Forbes |
45e84a |
#include "blockdev.h"
|
|
Justin M. Forbes |
45e84a |
#include "exec-memory.h"
|
|
Justin M. Forbes |
45e84a |
+#include "sysbus.h" /* SysBusDevice */
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
//#define DEBUG_BOARD_INIT
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
@@ -72,6 +73,11 @@ typedef struct {
|
|
Justin M. Forbes |
45e84a |
SerialState *uart;
|
|
Justin M. Forbes |
45e84a |
} MaltaFPGAState;
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
+typedef struct {
|
|
Justin M. Forbes |
45e84a |
+ SysBusDevice busdev;
|
|
Justin M. Forbes |
45e84a |
+ qemu_irq *i8259;
|
|
Justin M. Forbes |
45e84a |
+} MaltaState;
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
static ISADevice *pit;
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
static struct _loaderparams {
|
|
Justin M. Forbes |
45e84a |
@@ -775,7 +781,7 @@ void mips_malta_init (ram_addr_t ram_size,
|
|
Justin M. Forbes |
45e84a |
int64_t kernel_entry;
|
|
Justin M. Forbes |
45e84a |
PCIBus *pci_bus;
|
|
Justin M. Forbes |
45e84a |
CPUState *env;
|
|
Justin M. Forbes |
45e84a |
- qemu_irq *i8259 = NULL, *isa_irq;
|
|
Justin M. Forbes |
45e84a |
+ qemu_irq *isa_irq;
|
|
Justin M. Forbes |
45e84a |
qemu_irq *cpu_exit_irq;
|
|
Justin M. Forbes |
45e84a |
int piix4_devfn;
|
|
Justin M. Forbes |
45e84a |
i2c_bus *smbus;
|
|
Justin M. Forbes |
45e84a |
@@ -787,6 +793,11 @@ void mips_malta_init (ram_addr_t ram_size,
|
|
Justin M. Forbes |
45e84a |
int fl_sectors = 0;
|
|
Justin M. Forbes |
45e84a |
int be;
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
+ DeviceState *dev = qdev_create(NULL, "mips-malta");
|
|
Justin M. Forbes |
45e84a |
+ MaltaState *s = DO_UPCAST(MaltaState, busdev.qdev, dev);
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
+ qdev_init_nofail(dev);
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
/* Make sure the first 3 serial ports are associated with a device. */
|
|
Justin M. Forbes |
45e84a |
for(i = 0; i < 3; i++) {
|
|
Justin M. Forbes |
45e84a |
if (!serial_hds[i]) {
|
|
Justin M. Forbes |
45e84a |
@@ -932,7 +943,7 @@ void mips_malta_init (ram_addr_t ram_size,
|
|
Justin M. Forbes |
45e84a |
* qemu_irq_proxy() adds an extra bit of indirection, allowing us
|
|
Justin M. Forbes |
45e84a |
* to resolve the isa_irq -> i8259 dependency after i8259 is initialized.
|
|
Justin M. Forbes |
45e84a |
*/
|
|
Justin M. Forbes |
45e84a |
- isa_irq = qemu_irq_proxy(&i8259, 16);
|
|
Justin M. Forbes |
45e84a |
+ isa_irq = qemu_irq_proxy(&s->i8259, 16);
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
/* Northbridge */
|
|
Justin M. Forbes |
45e84a |
pci_bus = gt64120_register(isa_irq);
|
|
Justin M. Forbes |
45e84a |
@@ -944,9 +955,9 @@ void mips_malta_init (ram_addr_t ram_size,
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
/* Interrupt controller */
|
|
Justin M. Forbes |
45e84a |
/* The 8259 is attached to the MIPS CPU INT0 pin, ie interrupt 2 */
|
|
Justin M. Forbes |
45e84a |
- i8259 = i8259_init(env->irq[2]);
|
|
Justin M. Forbes |
45e84a |
+ s->i8259 = i8259_init(env->irq[2]);
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
- isa_bus_irqs(i8259);
|
|
Justin M. Forbes |
45e84a |
+ isa_bus_irqs(s->i8259);
|
|
Justin M. Forbes |
45e84a |
pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
|
|
Justin M. Forbes |
45e84a |
usb_uhci_piix4_init(pci_bus, piix4_devfn + 2);
|
|
Justin M. Forbes |
45e84a |
smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, isa_get_irq(9),
|
|
Justin M. Forbes |
45e84a |
@@ -990,6 +1001,20 @@ void mips_malta_init (ram_addr_t ram_size,
|
|
Justin M. Forbes |
45e84a |
}
|
|
Justin M. Forbes |
45e84a |
}
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
+static int mips_malta_sysbus_device_init(SysBusDevice *sysbusdev)
|
|
Justin M. Forbes |
45e84a |
+{
|
|
Justin M. Forbes |
45e84a |
+ return 0;
|
|
Justin M. Forbes |
45e84a |
+}
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
+static SysBusDeviceInfo mips_malta_device = {
|
|
Justin M. Forbes |
45e84a |
+ .init = mips_malta_sysbus_device_init,
|
|
Justin M. Forbes |
45e84a |
+ .qdev.name = "mips-malta",
|
|
Justin M. Forbes |
45e84a |
+ .qdev.size = sizeof(MaltaState),
|
|
Justin M. Forbes |
45e84a |
+ .qdev.props = (Property[]) {
|
|
Justin M. Forbes |
45e84a |
+ DEFINE_PROP_END_OF_LIST(),
|
|
Justin M. Forbes |
45e84a |
+ }
|
|
Justin M. Forbes |
45e84a |
+};
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
static QEMUMachine mips_malta_machine = {
|
|
Justin M. Forbes |
45e84a |
.name = "malta",
|
|
Justin M. Forbes |
45e84a |
.desc = "MIPS Malta Core LV",
|
|
Justin M. Forbes |
45e84a |
@@ -998,9 +1023,15 @@ static QEMUMachine mips_malta_machine = {
|
|
Justin M. Forbes |
45e84a |
.is_default = 1,
|
|
Justin M. Forbes |
45e84a |
};
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
+static void mips_malta_device_init(void)
|
|
Justin M. Forbes |
45e84a |
+{
|
|
Justin M. Forbes |
45e84a |
+ sysbus_register_withprop(&mips_malta_device);
|
|
Justin M. Forbes |
45e84a |
+}
|
|
Justin M. Forbes |
45e84a |
+
|
|
Justin M. Forbes |
45e84a |
static void mips_malta_machine_init(void)
|
|
Justin M. Forbes |
45e84a |
{
|
|
Justin M. Forbes |
45e84a |
qemu_register_machine(&mips_malta_machine);
|
|
Justin M. Forbes |
45e84a |
}
|
|
Justin M. Forbes |
45e84a |
|
|
Justin M. Forbes |
45e84a |
+device_init(mips_malta_device_init);
|
|
Justin M. Forbes |
45e84a |
machine_init(mips_malta_machine_init);
|
|
Justin M. Forbes |
45e84a |
--
|
|
Justin M. Forbes |
45e84a |
1.7.7.5
|
|
Justin M. Forbes |
45e84a |
|