hw/i386/pc_q35: Wire ICH9 LPC function's interrupts before its realize()
When the board assigns the ISA IRQs after the device's realize(), internal devices such as the RTC can't be wired in ich9_lpc_realize() since the qemu_irqs are still NULL. Fix that by assigning the ISA interrupts before realize(). This change is necessary for PIIX consolidation because PIIX4 wires the RTC interrupts in its realize() method, so PIIX3 needs to do so as well. Since the PC and Q35 boards share RTC code, and since PIIX3 needs the change, ICH9 needs to be adapted as well. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Message-Id: <20231007123843.127151-9-shentey@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
40f7062387
commit
295385127e
@ -242,11 +242,18 @@ static void pc_q35_init(MachineState *machine)
|
||||
host_bus = PCI_BUS(qdev_get_child_bus(DEVICE(phb), "pcie.0"));
|
||||
pcms->bus = host_bus;
|
||||
|
||||
/* irq lines */
|
||||
gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
|
||||
|
||||
/* create ISA bus */
|
||||
lpc = pci_new_multifunction(PCI_DEVFN(ICH9_LPC_DEV, ICH9_LPC_FUNC),
|
||||
TYPE_ICH9_LPC_DEVICE);
|
||||
qdev_prop_set_bit(DEVICE(lpc), "smm-enabled",
|
||||
x86_machine_is_smm_enabled(x86ms));
|
||||
lpc_dev = DEVICE(lpc);
|
||||
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
|
||||
qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, x86ms->gsi[i]);
|
||||
}
|
||||
pci_realize_and_unref(lpc, host_bus, &error_fatal);
|
||||
|
||||
rtc_state = ISA_DEVICE(object_resolve_path_component(OBJECT(lpc), "rtc"));
|
||||
@ -273,13 +280,6 @@ static void pc_q35_init(MachineState *machine)
|
||||
"true", true);
|
||||
}
|
||||
|
||||
/* irq lines */
|
||||
gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
|
||||
|
||||
lpc_dev = DEVICE(lpc);
|
||||
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
|
||||
qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, x86ms->gsi[i]);
|
||||
}
|
||||
isa_bus = ISA_BUS(qdev_get_child_bus(lpc_dev, "isa.0"));
|
||||
|
||||
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
|
||||
|
@ -675,6 +675,9 @@ static void ich9_lpc_initfn(Object *obj)
|
||||
|
||||
object_initialize_child(obj, "rtc", &lpc->rtc, TYPE_MC146818_RTC);
|
||||
|
||||
qdev_init_gpio_out_named(DEVICE(lpc), lpc->gsi, ICH9_GPIO_GSI,
|
||||
IOAPIC_NUM_PINS);
|
||||
|
||||
object_property_add_uint8_ptr(obj, ACPI_PM_PROP_SCI_INT,
|
||||
&lpc->sci_gsi, OBJ_PROP_FLAG_READ);
|
||||
object_property_add_uint8_ptr(OBJECT(lpc), ACPI_PM_PROP_ACPI_ENABLE_CMD,
|
||||
@ -691,7 +694,6 @@ static void ich9_lpc_initfn(Object *obj)
|
||||
static void ich9_lpc_realize(PCIDevice *d, Error **errp)
|
||||
{
|
||||
ICH9LPCState *lpc = ICH9_LPC_DEVICE(d);
|
||||
DeviceState *dev = DEVICE(d);
|
||||
PCIBus *pci_bus = pci_get_bus(d);
|
||||
ISABus *isa_bus;
|
||||
|
||||
@ -734,8 +736,6 @@ static void ich9_lpc_realize(PCIDevice *d, Error **errp)
|
||||
ICH9_RST_CNT_IOPORT, &lpc->rst_cnt_mem,
|
||||
1);
|
||||
|
||||
qdev_init_gpio_out_named(dev, lpc->gsi, ICH9_GPIO_GSI, IOAPIC_NUM_PINS);
|
||||
|
||||
isa_bus_register_input_irqs(isa_bus, lpc->gsi);
|
||||
|
||||
i8257_dma_init(isa_bus, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user