[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 12/32] hw/isa/piix3: Create Proxy PIC in host device
From: |
Bernhard Beschow |
Subject: |
[PATCH 12/32] hw/isa/piix3: Create Proxy PIC in host device |
Date: |
Sun, 4 Dec 2022 20:05:33 +0100 |
Use the newly introduced TYPE_PROXY_PIC which allows for wiring
up devices in the southbridge where the virtualization technology used
(KVM, TCG, Xen) is not yet known.
Signed-off-by: Bernhard Beschow <shentey@gmail.com>
Message-Id: <20221022150508.26830-16-shentey@gmail.com>
---
hw/i386/Kconfig | 1 +
hw/i386/pc_piix.c | 15 +++++++++------
hw/isa/Kconfig | 1 +
hw/isa/piix3.c | 10 +++++++++-
include/hw/southbridge/piix.h | 4 ++--
5 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
index d22ac4a4b9..79f5925dbe 100644
--- a/hw/i386/Kconfig
+++ b/hw/i386/Kconfig
@@ -72,6 +72,7 @@ config I440FX
select PC_PCI
select PC_ACPI
select ACPI_SMBUS
+ select I8259
select PCI_I440FX
select PIIX3
select IDE_PIIX
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index c96d989636..f81e91220f 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -207,10 +207,11 @@ static void pc_init1(MachineState *machine,
gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
if (pcmc->pci_enabled) {
- PIIX3State *piix3;
+ DeviceState *dev;
PCIDevice *pci_dev;
const char *type = xen_enabled() ? TYPE_PIIX3_XEN_DEVICE
: TYPE_PIIX3_DEVICE;
+ int i;
pci_bus = i440fx_init(pci_type,
i440fx_host,
@@ -231,10 +232,12 @@ static void pc_init1(MachineState *machine,
x86_machine_is_smm_enabled(x86ms),
&error_abort);
pci_realize_and_unref(pci_dev, pci_bus, &error_fatal);
- piix3 = PIIX3_PCI_DEVICE(pci_dev);
- piix3->pic = x86ms->gsi;
- piix3_devfn = piix3->dev.devfn;
- isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0"));
+ dev = DEVICE(object_resolve_path_component(OBJECT(pci_dev), "pic"));
+ for (i = 0; i < ISA_NUM_IRQS; i++) {
+ qdev_connect_gpio_out(dev, i, x86ms->gsi[i]);
+ }
+ piix3_devfn = pci_dev->devfn;
+ isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(pci_dev), "isa.0"));
rtc_state = ISA_DEVICE(object_resolve_path_component(OBJECT(pci_dev),
"rtc"));
piix4_pm = object_resolve_path_component(OBJECT(pci_dev), "pm");
@@ -243,6 +246,7 @@ static void pc_init1(MachineState *machine,
piix4_pm = NULL;
isa_bus = isa_bus_new(NULL, get_system_memory(), system_io,
&error_abort);
+ isa_bus_irqs(isa_bus, x86ms->gsi);
rtc_state = isa_new(TYPE_MC146818_RTC);
qdev_prop_set_int32(DEVICE(rtc_state), "base_year", 2000);
@@ -251,7 +255,6 @@ static void pc_init1(MachineState *machine,
i8257_dma_init(isa_bus, 0);
pcms->hpet_enabled = false;
}
- isa_bus_irqs(isa_bus, x86ms->gsi);
if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
pc_i8259_create(isa_bus, gsi_state->i8259_irq);
diff --git a/hw/isa/Kconfig b/hw/isa/Kconfig
index 6c154d88c7..b4ad1fb66e 100644
--- a/hw/isa/Kconfig
+++ b/hw/isa/Kconfig
@@ -37,6 +37,7 @@ config PIIX3
select I8257
select ISA_BUS
select MC146818RTC
+ select PROXY_PIC
select USB_UHCI
config PIIX4
diff --git a/hw/isa/piix3.c b/hw/isa/piix3.c
index cb2d9285ae..199cbf1e14 100644
--- a/hw/isa/piix3.c
+++ b/hw/isa/piix3.c
@@ -39,7 +39,7 @@
static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq)
{
- qemu_set_irq(piix3->pic[pic_irq],
+ qemu_set_irq(piix3->pic.in_irqs[pic_irq],
!!(piix3->pic_levels &
(((1ULL << PIIX_NUM_PIRQS) - 1) <<
(pic_irq * PIIX_NUM_PIRQS))));
@@ -308,6 +308,13 @@ static void pci_piix3_realize(PCIDevice *dev, Error **errp)
return;
}
+ /* PIC */
+ if (!qdev_realize(DEVICE(&d->pic), NULL, errp)) {
+ return;
+ }
+
+ isa_bus_irqs(isa_bus, d->pic.in_irqs);
+
memory_region_init_io(&d->rcr_mem, OBJECT(dev), &rcr_ops, d,
"piix3-reset-control", 1);
memory_region_add_subregion_overlap(pci_address_space_io(dev),
@@ -371,6 +378,7 @@ static void pci_piix3_init(Object *obj)
{
PIIX3State *d = PIIX3_PCI_DEVICE(obj);
+ object_initialize_child(obj, "pic", &d->pic, TYPE_PROXY_PIC);
object_initialize_child(obj, "rtc", &d->rtc, TYPE_MC146818_RTC);
}
diff --git a/include/hw/southbridge/piix.h b/include/hw/southbridge/piix.h
index 1c291cc954..7b1b4625a3 100644
--- a/include/hw/southbridge/piix.h
+++ b/include/hw/southbridge/piix.h
@@ -15,6 +15,7 @@
#include "hw/pci/pci.h"
#include "qom/object.h"
#include "hw/acpi/piix4.h"
+#include "hw/core/proxy-pic.h"
#include "hw/rtc/mc146818rtc.h"
#include "hw/usb/hcd-uhci.h"
@@ -50,11 +51,10 @@ struct PIIXState {
#endif
uint64_t pic_levels;
- qemu_irq *pic;
-
/* This member isn't used. Just for save/load compatibility */
int32_t pci_irq_levels_vmstate[PIIX_NUM_PIRQS];
+ ProxyPICState pic;
RTCState rtc;
UHCIState uhci;
PIIX4PMState pm;
--
2.38.1
- [PATCH 08/32] hw/i386/pc: No need for rtc_state to be an out-parameter, (continued)
- [PATCH 08/32] hw/i386/pc: No need for rtc_state to be an out-parameter, Bernhard Beschow, 2022/12/04
- [PATCH 09/32] hw/isa/piix3: Create USB controller in host device, Bernhard Beschow, 2022/12/04
- [PATCH 10/32] hw/isa/piix3: Create power management controller in host device, Bernhard Beschow, 2022/12/04
- [PATCH 11/32] hw/core: Introduce proxy-pic, Bernhard Beschow, 2022/12/04
- [PATCH 13/32] hw/isa/piix3: Create IDE controller in host device, Bernhard Beschow, 2022/12/04
- [PATCH 14/32] hw/isa/piix3: Wire up ACPI interrupt internally, Bernhard Beschow, 2022/12/04
- [PATCH 15/32] hw/isa/piix3: Resolve redundant PIIX_NUM_PIC_IRQS, Bernhard Beschow, 2022/12/04
- [PATCH 16/32] hw/isa/piix3: Rename pci_piix3_props for sharing with PIIX4, Bernhard Beschow, 2022/12/04
- [PATCH 17/32] hw/isa/piix3: Rename piix3_reset() for sharing with PIIX4, Bernhard Beschow, 2022/12/04
- [PATCH 18/32] hw/isa/piix3: Prefix pci_slot_get_pirq() with "piix3_", Bernhard Beschow, 2022/12/04
- [PATCH 12/32] hw/isa/piix3: Create Proxy PIC in host device,
Bernhard Beschow <=
- [PATCH 21/32] hw/isa/piix4: Remove unused code, Bernhard Beschow, 2022/12/04
- [PATCH 20/32] hw/isa/piix4: Make PIIX4's ACPI and USB functions optional, Bernhard Beschow, 2022/12/04
- [PATCH 22/32] hw/isa/piix4: Use Proxy PIC device, Bernhard Beschow, 2022/12/04
- [PATCH 19/32] hw/isa/piix3: Rename typedef PIIX3State to PIIXState, Bernhard Beschow, 2022/12/04
- [PATCH 23/32] hw/isa/piix4: Reuse struct PIIXState from PIIX3, Bernhard Beschow, 2022/12/04
- [PATCH 24/32] hw/isa/piix4: Rename reset control operations to match PIIX3, Bernhard Beschow, 2022/12/04
- [PATCH 25/32] hw/isa/piix4: Prefix pci_slot_get_pirq() with "piix4_", Bernhard Beschow, 2022/12/04
- [PATCH 26/32] hw/isa/piix3: Merge hw/isa/piix4.c, Bernhard Beschow, 2022/12/04
- [PATCH 27/32] hw/isa/piix: Harmonize names of reset control memory regions, Bernhard Beschow, 2022/12/04
- [PATCH 28/32] hw/isa/piix: Reuse PIIX3 base class' realize method in PIIX4, Bernhard Beschow, 2022/12/04