From: Jan Kiszka <jan.kiszka@siemens.com>
To: "Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel <qemu-devel@nongnu.org>
Cc: Alex Williamson <alex.williamson@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
Avi Kivity <avi@redhat.com>
Subject: [Qemu-devel] [PATCH 2/2] pci: Add INTx routing notifier
Date: Mon, 21 May 2012 10:15:15 -0300 [thread overview]
Message-ID: <4FBA3FE3.4050206@siemens.com> (raw)
In-Reply-To: <4FBA3F8B.9060103@siemens.com>
This per-device notifier shall be triggered by any interrupt router
along the path of a device's legacy interrupt signal on routing changes.
For simplicity reasons and as this is a slow path anyway, no further
details on the routing changes are provided. Instead, the callback is
expected to use pci_device_get_host_irq to check the effect of the
change.
Will be used by KVM PCI device assignment.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/pci.c | 19 +++++++++++++++++++
hw/pci.h | 7 +++++++
hw/pci_bridge.c | 8 ++++++++
hw/piix_pci.c | 2 ++
4 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/hw/pci.c b/hw/pci.c
index df4d93e..27ecc37 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1084,6 +1084,25 @@ int pci_device_get_host_irq(PCIDevice *pci_dev, int irq_num)
return bus->map_host_irq(bus->irq_opaque, irq_num);
}
+void pci_bus_fire_intx_routing_notifier(PCIBus *bus)
+{
+ PCIDevice *dev;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
+ dev = bus->devices[i];
+ if (dev && dev->intx_routing_notifier) {
+ dev->intx_routing_notifier(dev);
+ }
+ }
+}
+
+void pci_device_set_intx_routing_notifier(PCIDevice *pci_dev,
+ INTxRoutingNotifier notifier)
+{
+ pci_dev->intx_routing_notifier = notifier;
+}
+
/***********************************************************/
/* monitor info on PCI */
diff --git a/hw/pci.h b/hw/pci.h
index 29bc8bf..eaf7695 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -173,6 +173,7 @@ typedef struct PCIDeviceClass {
const char *romfile;
} PCIDeviceClass;
+typedef void (*INTxRoutingNotifier)(PCIDevice *dev);
typedef int (*MSIVectorUseNotifier)(PCIDevice *dev, unsigned int vector,
MSIMessage msg);
typedef void (*MSIVectorReleaseNotifier)(PCIDevice *dev, unsigned int vector);
@@ -248,6 +249,9 @@ struct PCIDevice {
MemoryRegion rom;
uint32_t rom_bar;
+ /* INTx routing notifier */
+ INTxRoutingNotifier intx_routing_notifier;
+
/* MSI-X notifiers */
MSIVectorUseNotifier msix_vector_use_notifier;
MSIVectorReleaseNotifier msix_vector_release_notifier;
@@ -307,6 +311,9 @@ PCIBus *pci_register_bus(DeviceState *parent, const char *name,
MemoryRegion *address_space_io,
uint8_t devfn_min, int nirq);
int pci_device_get_host_irq(PCIDevice *pci_dev, int irq_num);
+void pci_bus_fire_intx_routing_notifier(PCIBus *bus);
+void pci_device_set_intx_routing_notifier(PCIDevice *pci_dev,
+ INTxRoutingNotifier notifier);
void pci_device_reset(PCIDevice *dev);
void pci_bus_reset(PCIBus *bus);
diff --git a/hw/pci_bridge.c b/hw/pci_bridge.c
index e0832b4..2490b2f 100644
--- a/hw/pci_bridge.c
+++ b/hw/pci_bridge.c
@@ -292,6 +292,13 @@ void pci_bridge_reset(DeviceState *qdev)
pci_set_word(conf + PCI_BRIDGE_CONTROL, 0);
}
+static void pci_bridge_intx_routing_update(PCIDevice *dev)
+{
+ PCIBridge *br = DO_UPCAST(PCIBridge, dev, dev);
+
+ pci_bus_fire_intx_routing_notifier(&br->sec_bus);
+}
+
/* default qdev initialization function for PCI-to-PCI bridge */
int pci_bridge_initfn(PCIDevice *dev)
{
@@ -327,6 +334,7 @@ int pci_bridge_initfn(PCIDevice *dev)
sec_bus->address_space_io = &br->address_space_io;
memory_region_init(&br->address_space_io, "pci_bridge_io", 65536);
pci_bridge_region_init(br);
+ pci_device_set_intx_routing_notifier(dev, pci_bridge_intx_routing_update);
QLIST_INIT(&sec_bus->child);
QLIST_INSERT_HEAD(&parent->child, sec_bus, sibling);
return 0;
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index cfea97c..b0d1325 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -414,6 +414,8 @@ static void piix3_write_config(PCIDevice *dev,
if (ranges_overlap(address, len, PIIX_PIRQC, 4)) {
PIIX3State *piix3 = DO_UPCAST(PIIX3State, dev, dev);
int pic_irq;
+
+ pci_bus_fire_intx_routing_notifier(piix3->dev.bus);
piix3_update_irq_levels(piix3);
for (pic_irq = 0; pic_irq < PIIX_NUM_PIC_IRQS; pic_irq++) {
piix3_set_irq_pic(piix3, pic_irq);
--
1.7.3.4
next prev parent reply other threads:[~2012-05-21 13:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-21 13:13 [Qemu-devel] [PATCH 1/2] pci: Add pci_device_get_host_irq Jan Kiszka
2012-05-21 13:15 ` Jan Kiszka [this message]
2012-05-21 14:13 ` [Qemu-devel] [PATCH 2/2] pci: Add INTx routing notifier Alex Williamson
2012-05-21 14:10 ` [Qemu-devel] [PATCH 1/2] pci: Add pci_device_get_host_irq Alex Williamson
2012-05-21 14:36 ` Avi Kivity
2012-05-21 14:47 ` Jan Kiszka
2012-05-21 17:34 ` Michael S. Tsirkin
2012-05-21 18:58 ` Jan Kiszka
2012-05-21 21:04 ` Michael S. Tsirkin
2012-05-21 19:05 ` Michael S. Tsirkin
2012-05-21 20:35 ` Jan Kiszka
2012-05-21 21:03 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FBA3FE3.4050206@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=mst@redhat.com \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.