* [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin
@ 2013-10-02 12:41 Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ Marcel Apfelbaum
` (9 more replies)
0 siblings, 10 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
Note: Added RFC because not all affected devices were
checked yet.
Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
register during device initialization. Devices should not call
directly qemu_set_irq and specify the INTx pin.
Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
qemu_irq_lower and qemu_irq_pulse, setting the irq
based on PCI_INTERRUPT_PIN.
Added interface to allocate and free single irq.
Added pci_allocate_irq wrapper to be used by devices that
still need PCIDevice infrastructure to assert irqs.
Removed irq field from PCIDevice, not needed anymore.
Special cases of replacements were done in separate patches,
all others in one patch "hw: set interrupts using pci irq wrappers"
Changes from v1:
- Addressed Michael S. Tsirkin's comments:
- pci_set_irq directly calls pci_irq handler
- removed irq field from PCIDevice
- Added qemu interface to allocate single irq
- Added pci wrappers to allocate and free pci irq
- Added pci irq wrappers for all qemu methods
setting irq and not only qemu_set_irq
- Replace all qemu irq setters with pci
wrappers
Marcel Apfelbaum (9):
hw/core: Add interface to allocate and free a single IRQ
hw/pci: add pci wrappers for allocating and asserting irqs
hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init
hw/vmxnet3: set interrupts using pci irq wrappers
hw/vfio: set interrupts using pci irq wrappers
hw/xhci: set interrupts using pci irq wrappers
hw: set interrupts using pci irq wrappers
hw/pcie: AER and hot-plug events must use device's interrupt
hw/pci: removed irq field from PCIDevice
hw/audio/ac97.c | 4 ++--
hw/audio/es1370.c | 4 ++--
hw/audio/intel-hda.c | 2 +-
hw/block/nvme.c | 2 +-
hw/char/serial-pci.c | 5 +++--
hw/char/tpci200.c | 8 ++++----
hw/core/irq.c | 16 ++++++++++++++++
hw/display/qxl.c | 2 +-
hw/ide/cmd646.c | 2 +-
hw/ide/ich.c | 3 ++-
hw/isa/vt82c686.c | 2 +-
hw/misc/ivshmem.c | 2 +-
hw/misc/vfio.c | 11 ++++++-----
hw/net/e1000.c | 2 +-
hw/net/eepro100.c | 4 ++--
hw/net/ne2000.c | 3 ++-
hw/net/pcnet-pci.c | 3 ++-
hw/net/rtl8139.c | 2 +-
hw/net/vmxnet3.c | 13 +++++++++++--
hw/pci-bridge/pci_bridge_dev.c | 2 +-
hw/pci/pci.c | 26 +++++++++++++++++++++-----
hw/pci/pcie.c | 4 ++--
hw/pci/pcie_aer.c | 4 ++--
hw/pci/shpc.c | 2 +-
hw/scsi/esp-pci.c | 3 ++-
hw/scsi/lsi53c895a.c | 2 +-
hw/scsi/megasas.c | 6 +++---
hw/scsi/vmw_pvscsi.c | 2 +-
hw/usb/hcd-ehci-pci.c | 2 +-
hw/usb/hcd-ohci.c | 2 +-
hw/usb/hcd-uhci.c | 2 +-
hw/usb/hcd-xhci.c | 7 ++-----
hw/virtio/virtio-pci.c | 4 ++--
include/hw/irq.h | 7 +++++++
include/hw/pci/pci.h | 22 +++++++++++++++++++---
include/hw/pci/pcie.h | 18 ------------------
36 files changed, 127 insertions(+), 78 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:50 ` Michael S. Tsirkin
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs Marcel Apfelbaum
` (8 subsequent siblings)
9 siblings, 1 reply; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
qemu_allocate_irq returns a single qemu_irq.
The interface allows to specify an interrupt number.
qemu_free_irq frees it.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/core/irq.c | 16 ++++++++++++++++
include/hw/irq.h | 7 +++++++
2 files changed, 23 insertions(+)
diff --git a/hw/core/irq.c b/hw/core/irq.c
index 2078542..03c8cb3 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -68,6 +68,17 @@ qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n)
return qemu_extend_irqs(NULL, 0, handler, opaque, n);
}
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n)
+{
+ struct IRQState *irq;
+
+ irq = g_new(struct IRQState, 1);
+ irq->handler = handler;
+ irq->opaque = opaque;
+ irq->n = n;
+
+ return irq;
+}
void qemu_free_irqs(qemu_irq *s)
{
@@ -75,6 +86,11 @@ void qemu_free_irqs(qemu_irq *s)
g_free(s);
}
+void qemu_free_irq(qemu_irq irq)
+{
+ g_free(irq);
+}
+
static void qemu_notirq(void *opaque, int line, int level)
{
struct IRQState *irq = opaque;
diff --git a/include/hw/irq.h b/include/hw/irq.h
index 610e6b7..f560dea 100644
--- a/include/hw/irq.h
+++ b/include/hw/irq.h
@@ -30,6 +30,12 @@ static inline void qemu_irq_pulse(qemu_irq irq)
*/
qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
+/*
+ * Allocates a single IRQ. The irq is assigned with a handler, an opaque
+ * data and the interrupt number
+ */
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
+
/* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
* preserved. New IRQs are assigned the argument handler and opaque data.
*/
@@ -37,6 +43,7 @@ qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
void *opaque, int n);
void qemu_free_irqs(qemu_irq *s);
+void qemu_free_irq(qemu_irq irq);
/* Returns a new IRQ with opposite polarity. */
qemu_irq qemu_irq_invert(qemu_irq irq);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:54 ` Michael S. Tsirkin
2013-10-02 15:21 ` Paolo Bonzini
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 3/9] hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init Marcel Apfelbaum
` (7 subsequent siblings)
9 siblings, 2 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
register during device initialization. Devices should not call
directly qemu_set_irq and specify the INTx pin on each call.
Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
qemu_irq_lower and qemu_irq_pulse, setting the irq
based on PCI_INTERRUPT_PIN.
Added pci_allocate_irq wrapper to be used by devices that
still need PCIDevice infrastructure to assert irqs.
Renamed a static method which was named already pci_set_irq.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
Changes from v1:
- Added pci irq wrappers for all qemu methods
setting irq and not only qemu_set_irq
- Added pci wrappers to allocate and pci irq
hw/pci/pci.c | 26 ++++++++++++++++++++++----
include/hw/pci/pci.h | 19 +++++++++++++++++++
2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 00554a0..fbfd8f7 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -83,7 +83,7 @@ static const TypeInfo pcie_bus_info = {
static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
static void pci_update_mappings(PCIDevice *d);
-static void pci_set_irq(void *opaque, int irq_num, int level);
+static void pci_irq_handler(void *opaque, int irq_num, int level);
static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
static void pci_del_option_rom(PCIDevice *pdev);
@@ -161,7 +161,7 @@ void pci_device_deassert_intx(PCIDevice *dev)
{
int i;
for (i = 0; i < PCI_NUM_PINS; ++i) {
- qemu_set_irq(dev->irq[i], 0);
+ pci_irq_handler(dev, i, 0);
}
}
@@ -863,7 +863,7 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
pci_dev->config_read = config_read;
pci_dev->config_write = config_write;
bus->devices[devfn] = pci_dev;
- pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, PCI_NUM_PINS);
+ pci_dev->irq = qemu_allocate_irqs(pci_irq_handler, pci_dev, PCI_NUM_PINS);
pci_dev->version_id = 2; /* Current pci device vmstate version */
return pci_dev;
}
@@ -1175,7 +1175,7 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
/* generic PCI irq support */
/* 0 <= irq_num <= 3. level must be 0 or 1 */
-static void pci_set_irq(void *opaque, int irq_num, int level)
+static void pci_irq_handler(void *opaque, int irq_num, int level)
{
PCIDevice *pci_dev = opaque;
int change;
@@ -1191,6 +1191,24 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
pci_change_irq_level(pci_dev, irq_num, change);
}
+static inline int pci_intx(PCIDevice *pci_dev)
+{
+ return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
+}
+
+qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
+{
+ int intx = pci_intx(pci_dev);
+
+ return qemu_allocate_irq(pci_irq_handler, pci_dev, intx);
+}
+
+void pci_set_irq(PCIDevice *pci_dev, int level)
+{
+ int intx = pci_intx(pci_dev);
+ pci_irq_handler(pci_dev, intx, level);
+}
+
/* Special hooks used by device assignment */
void pci_bus_set_route_irq_fn(PCIBus *bus, pci_route_irq_fn route_intx_to_irq)
{
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 4b90e5d..df7d316 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -632,6 +632,25 @@ PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name);
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
+qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
+void pci_set_irq(PCIDevice *pci_dev, int level);
+
+static inline void pci_irq_raise(PCIDevice *pci_dev)
+{
+ pci_set_irq(pci_dev, 1);
+}
+
+static inline void pci_irq_lower(PCIDevice *pci_dev)
+{
+ pci_set_irq(pci_dev, 0);
+}
+
+static inline void pci_irq_pulse(PCIDevice *pci_dev)
+{
+ pci_irq_lower(pci_dev);
+ pci_irq_raise(pci_dev);
+}
+
static inline int pci_is_express(const PCIDevice *d)
{
return d->cap_present & QEMU_PCI_CAP_EXPRESS;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 3/9] hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 4/9] hw/vmxnet3: set interrupts using pci irq wrappers Marcel Apfelbaum
` (6 subsequent siblings)
9 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
The PCI_INTERRUPT_PIN will be used by shpc init, so
was moved before the call to shpc_init.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/pci-bridge/pci_bridge_dev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
index a9392c7..440e187 100644
--- a/hw/pci-bridge/pci_bridge_dev.c
+++ b/hw/pci-bridge/pci_bridge_dev.c
@@ -53,6 +53,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
if (err) {
goto bridge_error;
}
+ dev->config[PCI_INTERRUPT_PIN] = 0x1;
memory_region_init(&bridge_dev->bar, OBJECT(dev), "shpc-bar", shpc_bar_size(dev));
err = shpc_init(dev, &br->sec_bus, &bridge_dev->bar, 0);
if (err) {
@@ -73,7 +74,6 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
* Check whether that works well. */
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
PCI_BASE_ADDRESS_MEM_TYPE_64, &bridge_dev->bar);
- dev->config[PCI_INTERRUPT_PIN] = 0x1;
return 0;
msi_error:
slotid_cap_cleanup(dev);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 4/9] hw/vmxnet3: set interrupts using pci irq wrappers
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (2 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 3/9] hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: " Marcel Apfelbaum
` (5 subsequent siblings)
9 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
pci_set_irq uses PCI_INTERRUPT_PIN config register
to compute device INTx pin to set.
An assert is used to ensure that intx received
from the quest OS corresponds to PCI_INTERRUPT_PIN.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/net/vmxnet3.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 49c2466..674ee7a 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -336,7 +336,7 @@ static bool _vmxnet3_assert_interrupt_line(VMXNET3State *s, uint32_t int_idx)
}
VMW_IRPRN("Asserting line for interrupt %u", int_idx);
- qemu_set_irq(d->irq[int_idx], 1);
+ pci_set_irq(d, 1);
return true;
}
@@ -356,7 +356,7 @@ static void _vmxnet3_deassert_interrupt_line(VMXNET3State *s, int lidx)
assert(!s->msi_used || !msi_enabled(d));
VMW_IRPRN("Deasserting line for interrupt %u", lidx);
- qemu_set_irq(d->irq[lidx], 0);
+ pci_set_irq(d, 1);
}
static void vmxnet3_update_interrupt_line_state(VMXNET3State *s, int lidx)
@@ -1299,6 +1299,12 @@ static void vmxnet3_update_features(VMXNET3State *s)
}
}
+static bool vmxnet3_verify_intx(VMXNET3State *s, int intx)
+{
+ return s->msix_used || s->msi_used || (intx ==
+ (pci_get_byte(s->parent_obj.config + PCI_INTERRUPT_PIN) - 1));
+}
+
static void vmxnet3_activate_device(VMXNET3State *s)
{
int i;
@@ -1332,6 +1338,7 @@ static void vmxnet3_activate_device(VMXNET3State *s)
s->event_int_idx =
VMXNET3_READ_DRV_SHARED8(s->drv_shmem, devRead.intrConf.eventIntrIdx);
+ assert(vmxnet3_verify_intx(s, s->event_int_idx));
VMW_CFPRN("Events interrupt line is %u", s->event_int_idx);
s->auto_int_masking =
@@ -1364,6 +1371,7 @@ static void vmxnet3_activate_device(VMXNET3State *s)
/* Read interrupt number for this TX queue */
s->txq_descr[i].intr_idx =
VMXNET3_READ_TX_QUEUE_DESCR8(qdescr_pa, conf.intrIdx);
+ assert(vmxnet3_verify_intx(s, s->txq_descr[i].intr_idx));
VMW_CFPRN("TX Queue %d interrupt: %d", i, s->txq_descr[i].intr_idx);
@@ -1411,6 +1419,7 @@ static void vmxnet3_activate_device(VMXNET3State *s)
/* Read interrupt number for this RX queue */
s->rxq_descr[i].intr_idx =
VMXNET3_READ_TX_QUEUE_DESCR8(qd_pa, conf.intrIdx);
+ assert(vmxnet3_verify_intx(s, s->rxq_descr[i].intr_idx));
VMW_CFPRN("RX Queue %d interrupt: %d", i, s->rxq_descr[i].intr_idx);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: set interrupts using pci irq wrappers
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (3 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 4/9] hw/vmxnet3: set interrupts using pci irq wrappers Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 15:58 ` Alex Williamson
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 6/9] hw/xhci: " Marcel Apfelbaum
` (4 subsequent siblings)
9 siblings, 1 reply; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
pci_set_irq and the other pci irq wrappers use
PCI_INTERRUPT_PIN config register to compute device
INTx pin to assert/deassert.
Save INTx pin into the config register before calling
pci_set_irq
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/misc/vfio.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index a1c08fb..3d7297c 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -297,7 +297,7 @@ static void vfio_intx_interrupt(void *opaque)
'A' + vdev->intx.pin);
vdev->intx.pending = true;
- qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 1);
+ pci_set_irq(&vdev->pdev, 1);
vfio_mmap_set_enabled(vdev, false);
if (vdev->intx.mmap_timeout) {
timer_mod(vdev->intx.mmap_timer,
@@ -315,7 +315,7 @@ static void vfio_eoi(VFIODevice *vdev)
vdev->host.bus, vdev->host.slot, vdev->host.function);
vdev->intx.pending = false;
- qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
+ pci_set_irq(&vdev->pdev, 0);
vfio_unmask_intx(vdev);
}
@@ -341,7 +341,7 @@ static void vfio_enable_intx_kvm(VFIODevice *vdev)
qemu_set_fd_handler(irqfd.fd, NULL, NULL, vdev);
vfio_mask_intx(vdev);
vdev->intx.pending = false;
- qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
+ pci_set_irq(&vdev->pdev, 0);
/* Get an eventfd for resample/unmask */
if (event_notifier_init(&vdev->intx.unmask, 0)) {
@@ -417,7 +417,7 @@ static void vfio_disable_intx_kvm(VFIODevice *vdev)
*/
vfio_mask_intx(vdev);
vdev->intx.pending = false;
- qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
+ pci_set_irq(&vdev->pdev, 0);
/* Tell KVM to stop listening for an INTx irqfd */
if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, &irqfd)) {
@@ -488,6 +488,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
vfio_disable_interrupts(vdev);
vdev->intx.pin = pin - 1; /* Pin A (1) -> irq[0] */
+ pci_config_set_interrupt_pin(vdev->pdev.config, pin);
#ifdef CONFIG_KVM
/*
@@ -547,7 +548,7 @@ static void vfio_disable_intx(VFIODevice *vdev)
vfio_disable_intx_kvm(vdev);
vfio_disable_irqindex(vdev, VFIO_PCI_INTX_IRQ_INDEX);
vdev->intx.pending = false;
- qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
+ pci_set_irq(&vdev->pdev, 0);
vfio_mmap_set_enabled(vdev, true);
fd = event_notifier_get_fd(&vdev->intx.interrupt);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 6/9] hw/xhci: set interrupts using pci irq wrappers
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (4 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: " Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 7/9] hw: " Marcel Apfelbaum
` (3 subsequent siblings)
9 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
pci_set_irq uses PCI_INTERRUPT_PIN config register
to compute device INTx pin to assert/deassert.
Removed irq field from xhci state.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/usb/hcd-xhci.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index 469c24d..54d6842 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -449,7 +449,6 @@ struct XHCIState {
/*< public >*/
USBBus bus;
- qemu_irq irq;
MemoryRegion mem;
MemoryRegion mem_cap;
MemoryRegion mem_oper;
@@ -739,7 +738,7 @@ static void xhci_intx_update(XHCIState *xhci)
}
trace_usb_xhci_irq_intx(level);
- qemu_set_irq(xhci->irq, level);
+ pci_set_irq(pci_dev, level);
}
static void xhci_msix_update(XHCIState *xhci, int v)
@@ -797,7 +796,7 @@ static void xhci_intr_raise(XHCIState *xhci, int v)
if (v == 0) {
trace_usb_xhci_irq_intx(1);
- qemu_set_irq(xhci->irq, 1);
+ pci_set_irq(pci_dev, 1);
}
}
@@ -3433,8 +3432,6 @@ static int usb_xhci_initfn(struct PCIDevice *dev)
xhci->mfwrap_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, xhci_mfwrap_timer, xhci);
- xhci->irq = dev->irq[0];
-
memory_region_init(&xhci->mem, OBJECT(xhci), "xhci", LEN_REGS);
memory_region_init_io(&xhci->mem_cap, OBJECT(xhci), &xhci_cap_ops, xhci,
"capabilities", LEN_CAP);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 7/9] hw: set interrupts using pci irq wrappers
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (5 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 6/9] hw/xhci: " Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-07 7:02 ` Gerd Hoffmann
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 8/9] hw/pcie: AER and hot-plug events must use device's interrupt Marcel Apfelbaum
` (2 subsequent siblings)
9 siblings, 1 reply; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
pci_set_irq and the other pci irq wrappers use
PCI_INTERRUPT_PIN config register to compute device
INTx pin to assert/deassert.
An irq is allocated using pci_allocate_irq wrapper
only if is needed by non pci devices.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/audio/ac97.c | 4 ++--
hw/audio/es1370.c | 4 ++--
hw/audio/intel-hda.c | 2 +-
hw/block/nvme.c | 2 +-
hw/char/serial-pci.c | 5 +++--
hw/char/tpci200.c | 8 ++++----
hw/display/qxl.c | 2 +-
hw/ide/cmd646.c | 2 +-
hw/ide/ich.c | 3 ++-
hw/isa/vt82c686.c | 2 +-
hw/misc/ivshmem.c | 2 +-
hw/net/e1000.c | 2 +-
hw/net/eepro100.c | 4 ++--
hw/net/ne2000.c | 3 ++-
hw/net/pcnet-pci.c | 3 ++-
hw/net/rtl8139.c | 2 +-
hw/pci/shpc.c | 2 +-
hw/scsi/esp-pci.c | 3 ++-
hw/scsi/lsi53c895a.c | 2 +-
hw/scsi/megasas.c | 6 +++---
hw/scsi/vmw_pvscsi.c | 2 +-
hw/usb/hcd-ehci-pci.c | 2 +-
hw/usb/hcd-ohci.c | 2 +-
hw/usb/hcd-uhci.c | 2 +-
hw/virtio/virtio-pci.c | 4 ++--
25 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
index 01b4dfb..1f94b19 100644
--- a/hw/audio/ac97.c
+++ b/hw/audio/ac97.c
@@ -280,12 +280,12 @@ static void update_sr (AC97LinkState *s, AC97BusMasterRegs *r, uint32_t new_sr)
if (level) {
s->glob_sta |= masks[r - s->bm_regs];
dolog ("set irq level=1\n");
- qemu_set_irq (s->dev.irq[0], 1);
+ pci_set_irq(&s->dev, 1);
}
else {
s->glob_sta &= ~masks[r - s->bm_regs];
dolog ("set irq level=0\n");
- qemu_set_irq (s->dev.irq[0], 0);
+ pci_set_irq(&s->dev, 0);
}
}
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
index adb66ce..3dbd12b 100644
--- a/hw/audio/es1370.c
+++ b/hw/audio/es1370.c
@@ -323,7 +323,7 @@ static void es1370_update_status (ES1370State *s, uint32_t new_status)
else {
s->status = new_status & ~STAT_INTR;
}
- qemu_set_irq (s->dev.irq[0], !!level);
+ pci_set_irq(&s->dev, !!level);
}
static void es1370_reset (ES1370State *s)
@@ -349,7 +349,7 @@ static void es1370_reset (ES1370State *s)
s->dac_voice[i] = NULL;
}
}
- qemu_irq_lower (s->dev.irq[0]);
+ pci_irq_lower(&s->dev);
}
static void es1370_maybe_lower_irq (ES1370State *s, uint32_t sctl)
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index a6666c6..4327264 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -269,7 +269,7 @@ static void intel_hda_update_irq(IntelHDAState *d)
msi_notify(&d->pci, 0);
}
} else {
- qemu_set_irq(d->pci.irq[0], level);
+ pci_set_irq(&d->pci, level);
}
}
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 5dee229..2882ffe 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -69,7 +69,7 @@ static void nvme_isr_notify(NvmeCtrl *n, NvmeCQueue *cq)
if (msix_enabled(&(n->parent_obj))) {
msix_notify(&(n->parent_obj), cq->vector);
} else {
- qemu_irq_pulse(n->parent_obj.irq[0]);
+ pci_irq_pulse(&n->parent_obj);
}
}
}
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index aec6705..991c99f 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -61,7 +61,7 @@ static int serial_pci_init(PCIDevice *dev)
}
pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
- s->irq = pci->dev.irq[0];
+ s->irq = pci_allocate_irq(&pci->dev);
memory_region_init_io(&s->io, OBJECT(pci), &serial_io_ops, s, "serial", 8);
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
@@ -79,7 +79,7 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
pending = 1;
}
}
- qemu_set_irq(pci->dev.irq[0], pending);
+ pci_set_irq(&pci->dev, pending);
}
static int multi_serial_pci_init(PCIDevice *dev)
@@ -132,6 +132,7 @@ static void serial_pci_exit(PCIDevice *dev)
serial_exit_core(s);
memory_region_destroy(&s->io);
+ qemu_free_irq(s->irq);
}
static void multi_serial_pci_exit(PCIDevice *dev)
diff --git a/hw/char/tpci200.c b/hw/char/tpci200.c
index e04ff26..84831c1 100644
--- a/hw/char/tpci200.c
+++ b/hw/char/tpci200.c
@@ -134,8 +134,8 @@ static void tpci200_set_irq(void *opaque, int intno, int level)
/* Check if the interrupt is edge sensitive */
if (dev->ctrl[ip_n] & CTRL_INT_EDGE(intno)) {
if (level) {
- qemu_set_irq(dev->dev.irq[0], !dev->int_set);
- qemu_set_irq(dev->dev.irq[0], dev->int_set);
+ pci_set_irq(&dev->dev, !dev->int_set);
+ pci_set_irq(&dev->dev, dev->int_set);
}
} else {
unsigned i, j;
@@ -153,10 +153,10 @@ static void tpci200_set_irq(void *opaque, int intno, int level)
}
if (level_status && !dev->int_set) {
- qemu_irq_raise(dev->dev.irq[0]);
+ pci_irq_raise(&dev->dev);
dev->int_set = 1;
} else if (!level_status && dev->int_set) {
- qemu_irq_lower(dev->dev.irq[0]);
+ pci_irq_lower(&dev->dev);
dev->int_set = 0;
}
}
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
index ee2db0d..678ad38 100644
--- a/hw/display/qxl.c
+++ b/hw/display/qxl.c
@@ -1101,7 +1101,7 @@ static void qxl_update_irq(PCIQXLDevice *d)
uint32_t pending = le32_to_cpu(d->ram->int_pending);
uint32_t mask = le32_to_cpu(d->ram->int_mask);
int level = !!(pending & mask);
- qemu_set_irq(d->pci.irq[0], level);
+ pci_set_irq(&d->pci, level);
qxl_ring_set_dirty(d);
}
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index 0500a7a..a8e35fe 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -230,7 +230,7 @@ static void cmd646_update_irq(PCIIDEState *d)
!(pd->config[MRDMODE] & MRDMODE_BLK_CH0)) ||
((pd->config[MRDMODE] & MRDMODE_INTR_CH1) &&
!(pd->config[MRDMODE] & MRDMODE_BLK_CH1));
- qemu_set_irq(pd->irq[0], pci_level);
+ pci_set_irq(pd, pci_level);
}
/* the PCI irq level is the logical OR of the two channels */
diff --git a/hw/ide/ich.c b/hw/ide/ich.c
index bff952b..1c7c058 100644
--- a/hw/ide/ich.c
+++ b/hw/ide/ich.c
@@ -116,7 +116,7 @@ static int pci_ich9_ahci_init(PCIDevice *dev)
dev->config[0x90] = 1 << 6; /* Address Map Register - AHCI mode */
msi_init(dev, 0x50, 1, true, false);
- d->ahci.irq = dev->irq[0];
+ d->ahci.irq = pci_allocate_irq(dev);
pci_register_bar(dev, ICH9_IDP_BAR, PCI_BASE_ADDRESS_SPACE_IO,
&d->ahci.idp);
@@ -145,6 +145,7 @@ static void pci_ich9_uninit(PCIDevice *dev)
msi_uninit(dev);
ahci_uninit(&d->ahci);
+ qemu_free_irq(d->ahci.irq);
}
static void ich_ahci_class_init(ObjectClass *klass, void *data)
diff --git a/hw/isa/vt82c686.c b/hw/isa/vt82c686.c
index 8fe4fcb..5fb8086 100644
--- a/hw/isa/vt82c686.c
+++ b/hw/isa/vt82c686.c
@@ -185,7 +185,7 @@ static void pm_update_sci(VT686PMState *s)
ACPI_BITMASK_POWER_BUTTON_ENABLE |
ACPI_BITMASK_GLOBAL_LOCK_ENABLE |
ACPI_BITMASK_TIMER_ENABLE)) != 0);
- qemu_set_irq(s->dev.irq[0], sci_level);
+ pci_set_irq(&s->dev, sci_level);
/* schedule a timer interruption if needed */
acpi_pm_tmr_update(&s->ar, (s->ar.pm1.evt.en & ACPI_BITMASK_TIMER_ENABLE) &&
!(pmsts & ACPI_BITMASK_TIMER_STATUS));
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 2838866..8d144ba 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -133,7 +133,7 @@ static void ivshmem_update_irq(IVShmemState *s, int val)
isr ? 1 : 0, s->intrstatus, s->intrmask);
}
- qemu_set_irq(d->irq[0], (isr != 0));
+ pci_set_irq(d, (isr != 0));
}
static void ivshmem_IntrMask_write(IVShmemState *s, uint32_t val)
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 151d25e..c497bad 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -328,7 +328,7 @@ set_interrupt_cause(E1000State *s, int index, uint32_t val)
}
s->mit_irq_level = (pending_ints != 0);
- qemu_set_irq(d->irq[0], s->mit_irq_level);
+ pci_set_irq(d, s->mit_irq_level);
}
static void
diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
index ffa60d5..0eb3f62 100644
--- a/hw/net/eepro100.c
+++ b/hw/net/eepro100.c
@@ -409,7 +409,7 @@ static void disable_interrupt(EEPRO100State * s)
{
if (s->int_stat) {
TRACE(INT, logout("interrupt disabled\n"));
- qemu_irq_lower(s->dev.irq[0]);
+ pci_irq_lower(&s->dev);
s->int_stat = 0;
}
}
@@ -418,7 +418,7 @@ static void enable_interrupt(EEPRO100State * s)
{
if (!s->int_stat) {
TRACE(INT, logout("interrupt enabled\n"));
- qemu_irq_raise(s->dev.irq[0]);
+ pci_irq_raise(&s->dev);
s->int_stat = 1;
}
}
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c
index c961258..a94cf74 100644
--- a/hw/net/ne2000.c
+++ b/hw/net/ne2000.c
@@ -731,7 +731,7 @@ static int pci_ne2000_init(PCIDevice *pci_dev)
s = &d->ne2000;
ne2000_setup_io(s, DEVICE(pci_dev), 0x100);
pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
- s->irq = d->dev.irq[0];
+ s->irq = pci_allocate_irq(&d->dev);
qemu_macaddr_default_if_unset(&s->c.macaddr);
ne2000_reset(s);
@@ -752,6 +752,7 @@ static void pci_ne2000_exit(PCIDevice *pci_dev)
memory_region_destroy(&s->io);
qemu_del_nic(s->nic);
+ qemu_free_irq(s->irq);
}
static Property ne2000_properties[] = {
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
index 865f2f0..6a5d806 100644
--- a/hw/net/pcnet-pci.c
+++ b/hw/net/pcnet-pci.c
@@ -282,6 +282,7 @@ static void pci_pcnet_uninit(PCIDevice *dev)
{
PCIPCNetState *d = PCI_PCNET(dev);
+ qemu_free_irq(d->state.irq);
memory_region_destroy(&d->state.mmio);
memory_region_destroy(&d->io_bar);
timer_del(d->state.poll_timer);
@@ -331,7 +332,7 @@ static int pci_pcnet_init(PCIDevice *pci_dev)
pci_register_bar(pci_dev, 1, 0, &s->mmio);
- s->irq = pci_dev->irq[0];
+ s->irq = pci_allocate_irq(pci_dev);
s->phys_mem_read = pci_physical_memory_read;
s->phys_mem_write = pci_physical_memory_write;
s->dma_opaque = pci_dev;
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index c31199f..7d72b21 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -716,7 +716,7 @@ static void rtl8139_update_irq(RTL8139State *s)
DPRINTF("Set IRQ to %d (%04x %04x)\n", isr ? 1 : 0, s->IntrStatus,
s->IntrMask);
- qemu_set_irq(d->irq[0], (isr != 0));
+ pci_set_irq(d, (isr != 0));
}
static int rtl8139_RxWrap(RTL8139State *s)
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
index eb092fd..0bbd36e 100644
--- a/hw/pci/shpc.c
+++ b/hw/pci/shpc.c
@@ -172,7 +172,7 @@ static void shpc_interrupt_update(PCIDevice *d)
if (msi_enabled(d) && shpc->msi_requested != level)
msi_notify(d, 0);
else
- qemu_set_irq(d->irq[0], level);
+ pci_set_irq(d, level);
shpc->msi_requested = level;
}
diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c
index 99bf8ec..48c8b82 100644
--- a/hw/scsi/esp-pci.c
+++ b/hw/scsi/esp-pci.c
@@ -361,7 +361,7 @@ static int esp_pci_scsi_init(PCIDevice *dev)
"esp-io", 0x80);
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &pci->io);
- s->irq = dev->irq[0];
+ s->irq = pci_allocate_irq(dev);
scsi_bus_new(&s->bus, sizeof(s->bus), d, &esp_pci_scsi_info, NULL);
if (!d->hotplugged) {
@@ -378,6 +378,7 @@ static void esp_pci_scsi_uninit(PCIDevice *d)
{
PCIESPState *pci = PCI_ESP(d);
+ qemu_free_irq(pci->esp.irq);
memory_region_destroy(&pci->io);
}
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 36e5f50..cb30414 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -437,7 +437,7 @@ static void lsi_update_irq(LSIState *s)
level, s->dstat, s->sist1, s->sist0);
last_level = level;
}
- qemu_set_irq(d->irq[0], level);
+ pci_set_irq(d, level);
if (!level && lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON)) {
DPRINTF("Handled IRQs & disconnected, looking for pending "
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 09b51b3..699ca53 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -535,7 +535,7 @@ static void megasas_complete_frame(MegasasState *s, uint64_t context)
msix_notify(pci_dev, 0);
} else {
trace_megasas_irq_raise();
- qemu_irq_raise(pci_dev->irq[0]);
+ pci_irq_raise(pci_dev);
}
}
} else {
@@ -1936,7 +1936,7 @@ static void megasas_mmio_write(void *opaque, hwaddr addr,
s->intr_mask = val;
if (!megasas_intr_enabled(s) && !msix_enabled(pci_dev)) {
trace_megasas_irq_lower();
- qemu_irq_lower(pci_dev->irq[0]);
+ pci_irq_lower(pci_dev);
}
if (megasas_intr_enabled(s)) {
trace_megasas_intr_enabled();
@@ -1952,7 +1952,7 @@ static void megasas_mmio_write(void *opaque, hwaddr addr,
stl_le_phys(s->producer_pa, s->reply_queue_head);
if (!msix_enabled(pci_dev)) {
trace_megasas_irq_lower();
- qemu_irq_lower(pci_dev->irq[0]);
+ pci_irq_lower(pci_dev);
}
}
break;
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 819d671..94b328f 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -330,7 +330,7 @@ pvscsi_update_irq_status(PVSCSIState *s)
return;
}
- qemu_set_irq(d->irq[0], !!should_raise);
+ pci_set_irq(d, !!should_raise);
}
static void
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 4d21a0b..0c98594 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -60,7 +60,7 @@ static int usb_ehci_pci_initfn(PCIDevice *dev)
pci_conf[0x6e] = 0x00;
pci_conf[0x6f] = 0xc0; /* USBLEFCTLSTS */
- s->irq = dev->irq[3];
+ s->irq = pci_allocate_irq(dev);
s->as = pci_get_address_space(dev);
usb_ehci_realize(s, DEVICE(dev), NULL);
diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 35f0878..2b36ee5 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1944,7 +1944,7 @@ static int usb_ohci_initfn_pci(PCIDevice *dev)
pci_get_address_space(dev)) != 0) {
return -1;
}
- ohci->state.irq = dev->irq[0];
+ ohci->state.irq = pci_allocate_irq(dev);
pci_register_bar(dev, 0, 0, &ohci->state.mem);
return 0;
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index becc7fa..075046e 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -381,7 +381,7 @@ static void uhci_update_irq(UHCIState *s)
} else {
level = 0;
}
- qemu_set_irq(s->dev.irq[s->irq_pin], level);
+ pci_set_irq(&s->dev, level);
}
static void uhci_reset(void *opaque)
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 4825802..6b84c4a 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -116,7 +116,7 @@ static void virtio_pci_notify(DeviceState *d, uint16_t vector)
if (msix_enabled(&proxy->pci_dev))
msix_notify(&proxy->pci_dev, vector);
else
- qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
+ pci_set_irq(&proxy->pci_dev, proxy->vdev->isr & 1);
}
static void virtio_pci_save_config(DeviceState *d, QEMUFile *f)
@@ -362,7 +362,7 @@ static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
/* reading from the ISR also clears it. */
ret = vdev->isr;
vdev->isr = 0;
- qemu_set_irq(proxy->pci_dev.irq[0], 0);
+ pci_set_irq(&proxy->pci_dev, 0);
break;
case VIRTIO_MSI_CONFIG_VECTOR:
ret = vdev->config_vector;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 8/9] hw/pcie: AER and hot-plug events must use device's interrupt
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (6 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 7/9] hw: " Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 9/9] hw/pci: removed irq field from PCIDevice Marcel Apfelbaum
2013-10-02 12:58 ` [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Michael S. Tsirkin
9 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
The fields hpev_intx and aer_intx were removed because
both AER and hot-plug events must use device's interrupt.
Assert/deassert interrupts using pci_set_irq wrapper instead.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/pci/pcie.c | 4 ++--
hw/pci/pcie_aer.c | 4 ++--
include/hw/pci/pcie.h | 18 ------------------
3 files changed, 4 insertions(+), 22 deletions(-)
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 50af3c1..d4dd005 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -187,7 +187,7 @@ static void hotplug_event_notify(PCIDevice *dev)
} else if (msi_enabled(dev)) {
msi_notify(dev, pcie_cap_flags_get_vector(dev));
} else {
- qemu_set_irq(dev->irq[dev->exp.hpev_intx], dev->exp.hpev_notified);
+ pci_set_irq(dev, dev->exp.hpev_notified);
}
}
@@ -195,7 +195,7 @@ static void hotplug_event_clear(PCIDevice *dev)
{
hotplug_event_update_event_status(dev);
if (!msix_enabled(dev) && !msi_enabled(dev) && !dev->exp.hpev_notified) {
- qemu_set_irq(dev->irq[dev->exp.hpev_intx], 0);
+ pci_set_irq(dev, 0);
}
}
diff --git a/hw/pci/pcie_aer.c b/hw/pci/pcie_aer.c
index ca762ab..03b1e1f 100644
--- a/hw/pci/pcie_aer.c
+++ b/hw/pci/pcie_aer.c
@@ -285,7 +285,7 @@ static void pcie_aer_root_notify(PCIDevice *dev)
} else if (msi_enabled(dev)) {
msi_notify(dev, pcie_aer_root_get_vector(dev));
} else {
- qemu_set_irq(dev->irq[dev->exp.aer_intx], 1);
+ pci_set_irq(dev, 1);
}
}
@@ -768,7 +768,7 @@ void pcie_aer_root_write_config(PCIDevice *dev,
uint32_t root_cmd = pci_get_long(aer_cap + PCI_ERR_ROOT_COMMAND);
/* 6.2.4.1.2 Interrupt Generation */
if (!msix_enabled(dev) && !msi_enabled(dev)) {
- qemu_set_irq(dev->irq[dev->exp.aer_intx], !!(root_cmd & enabled_cmd));
+ pci_set_irq(dev, !!(root_cmd & enabled_cmd));
return;
}
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
index c010007..1966169 100644
--- a/include/hw/pci/pcie.h
+++ b/include/hw/pci/pcie.h
@@ -64,15 +64,6 @@ struct PCIExpressDevice {
uint8_t exp_cap;
/* SLOT */
- unsigned int hpev_intx; /* INTx for hot plug event (0-3:INT[A-D]#)
- * default is 0 = INTA#
- * If the chip wants to use other interrupt
- * line, initialize this member with the
- * desired number.
- * If the chip dynamically changes this member,
- * also initialize it when loaded as
- * appropreately.
- */
bool hpev_notified; /* Logical AND of conditions for hot plug event.
Following 6.7.3.4:
Software Notification of Hot-Plug Events, an interrupt
@@ -82,15 +73,6 @@ struct PCIExpressDevice {
/* AER */
uint16_t aer_cap;
PCIEAERLog aer_log;
- unsigned int aer_intx; /* INTx for error reporting
- * default is 0 = INTA#
- * If the chip wants to use other interrupt
- * line, initialize this member with the
- * desired number.
- * If the chip dynamically changes this member,
- * also initialize it when loaded as
- * appropreately.
- */
};
/* PCI express capability helper functions */
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [Qemu-devel] [PATCH RFC v2 9/9] hw/pci: removed irq field from PCIDevice
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (7 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 8/9] hw/pcie: AER and hot-plug events must use device's interrupt Marcel Apfelbaum
@ 2013-10-02 12:41 ` Marcel Apfelbaum
2013-10-02 12:58 ` [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Michael S. Tsirkin
9 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:41 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
Instead of exposing the the irq field,
pci wrappers to qemu_set_irq or qemu_irq_*
can be used.
Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
---
hw/pci/pci.c | 2 --
include/hw/pci/pci.h | 3 ---
2 files changed, 5 deletions(-)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index fbfd8f7..f8d0b81 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -863,14 +863,12 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
pci_dev->config_read = config_read;
pci_dev->config_write = config_write;
bus->devices[devfn] = pci_dev;
- pci_dev->irq = qemu_allocate_irqs(pci_irq_handler, pci_dev, PCI_NUM_PINS);
pci_dev->version_id = 2; /* Current pci device vmstate version */
return pci_dev;
}
static void do_pci_unregister_device(PCIDevice *pci_dev)
{
- qemu_free_irqs(pci_dev->irq);
pci_dev->bus->devices[pci_dev->devfn] = NULL;
pci_config_free(pci_dev);
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index df7d316..e9346bd 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -247,9 +247,6 @@ struct PCIDevice {
PCIConfigReadFunc *config_read;
PCIConfigWriteFunc *config_write;
- /* IRQ objects for the INTA-INTD pins. */
- qemu_irq *irq;
-
/* Legacy PCI VGA regions */
MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];
bool has_vga;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ Marcel Apfelbaum
@ 2013-10-02 12:50 ` Michael S. Tsirkin
0 siblings, 0 replies; 22+ messages in thread
From: Michael S. Tsirkin @ 2013-10-02 12:50 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, sw, jasowang,
qemu-devel, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, Oct 02, 2013 at 03:41:26PM +0300, Marcel Apfelbaum wrote:
> qemu_allocate_irq returns a single qemu_irq.
> The interface allows to specify an interrupt number.
>
> qemu_free_irq frees it.
>
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> ---
> hw/core/irq.c | 16 ++++++++++++++++
> include/hw/irq.h | 7 +++++++
> 2 files changed, 23 insertions(+)
>
> diff --git a/hw/core/irq.c b/hw/core/irq.c
> index 2078542..03c8cb3 100644
> --- a/hw/core/irq.c
> +++ b/hw/core/irq.c
> @@ -68,6 +68,17 @@ qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n)
> return qemu_extend_irqs(NULL, 0, handler, opaque, n);
> }
>
> +qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n)
> +{
> + struct IRQState *irq;
> +
> + irq = g_new(struct IRQState, 1);
> + irq->handler = handler;
> + irq->opaque = opaque;
> + irq->n = n;
> +
> + return irq;
> +}
>
> void qemu_free_irqs(qemu_irq *s)
> {
> @@ -75,6 +86,11 @@ void qemu_free_irqs(qemu_irq *s)
> g_free(s);
> }
>
> +void qemu_free_irq(qemu_irq irq)
> +{
> + g_free(irq);
> +}
> +
> static void qemu_notirq(void *opaque, int line, int level)
> {
> struct IRQState *irq = opaque;
> diff --git a/include/hw/irq.h b/include/hw/irq.h
> index 610e6b7..f560dea 100644
> --- a/include/hw/irq.h
> +++ b/include/hw/irq.h
> @@ -30,6 +30,12 @@ static inline void qemu_irq_pulse(qemu_irq irq)
> */
> qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
>
> +/*
> + * Allocates a single IRQ. The irq is assigned with a handler, an opaque
> + * data and the interrupt number
Add period at end of line :)
no need to repost for this.
> + */
> +qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n);
> +
> /* Extends an Array of IRQs. Old IRQs have their handlers and opaque data
> * preserved. New IRQs are assigned the argument handler and opaque data.
> */
> @@ -37,6 +43,7 @@ qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
> void *opaque, int n);
>
> void qemu_free_irqs(qemu_irq *s);
> +void qemu_free_irq(qemu_irq irq);
>
> /* Returns a new IRQ with opposite polarity. */
> qemu_irq qemu_irq_invert(qemu_irq irq);
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs Marcel Apfelbaum
@ 2013-10-02 12:54 ` Michael S. Tsirkin
2013-10-02 12:56 ` Marcel Apfelbaum
2013-10-02 15:21 ` Paolo Bonzini
1 sibling, 1 reply; 22+ messages in thread
From: Michael S. Tsirkin @ 2013-10-02 12:54 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, sw, jasowang,
qemu-devel, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, Oct 02, 2013 at 03:41:27PM +0300, Marcel Apfelbaum wrote:
> Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
> register during device initialization. Devices should not call
> directly qemu_set_irq and specify the INTx pin on each call.
>
> Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
> qemu_irq_lower and qemu_irq_pulse, setting the irq
> based on PCI_INTERRUPT_PIN.
>
> Added pci_allocate_irq wrapper to be used by devices that
> still need PCIDevice infrastructure to assert irqs.
>
> Renamed a static method which was named already pci_set_irq.
>
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> ---
> Changes from v1:
> - Added pci irq wrappers for all qemu methods
> setting irq and not only qemu_set_irq
> - Added pci wrappers to allocate and pci irq
>
> hw/pci/pci.c | 26 ++++++++++++++++++++++----
> include/hw/pci/pci.h | 19 +++++++++++++++++++
> 2 files changed, 41 insertions(+), 4 deletions(-)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index 00554a0..fbfd8f7 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -83,7 +83,7 @@ static const TypeInfo pcie_bus_info = {
>
> static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
> static void pci_update_mappings(PCIDevice *d);
> -static void pci_set_irq(void *opaque, int irq_num, int level);
> +static void pci_irq_handler(void *opaque, int irq_num, int level);
> static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
> static void pci_del_option_rom(PCIDevice *pdev);
>
> @@ -161,7 +161,7 @@ void pci_device_deassert_intx(PCIDevice *dev)
> {
> int i;
> for (i = 0; i < PCI_NUM_PINS; ++i) {
> - qemu_set_irq(dev->irq[i], 0);
> + pci_irq_handler(dev, i, 0);
> }
> }
>
> @@ -863,7 +863,7 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
> pci_dev->config_read = config_read;
> pci_dev->config_write = config_write;
> bus->devices[devfn] = pci_dev;
> - pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, PCI_NUM_PINS);
> + pci_dev->irq = qemu_allocate_irqs(pci_irq_handler, pci_dev, PCI_NUM_PINS);
> pci_dev->version_id = 2; /* Current pci device vmstate version */
> return pci_dev;
> }
> @@ -1175,7 +1175,7 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> /* generic PCI irq support */
>
> /* 0 <= irq_num <= 3. level must be 0 or 1 */
> -static void pci_set_irq(void *opaque, int irq_num, int level)
> +static void pci_irq_handler(void *opaque, int irq_num, int level)
> {
> PCIDevice *pci_dev = opaque;
> int change;
> @@ -1191,6 +1191,24 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
> pci_change_irq_level(pci_dev, irq_num, change);
> }
>
> +static inline int pci_intx(PCIDevice *pci_dev)
> +{
> + return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
> +}
> +
> +qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
> +{
> + int intx = pci_intx(pci_dev);
> +
> + return qemu_allocate_irq(pci_irq_handler, pci_dev, intx);
> +}
> +
> +void pci_set_irq(PCIDevice *pci_dev, int level)
> +{
> + int intx = pci_intx(pci_dev);
> + pci_irq_handler(pci_dev, intx, level);
> +}
> +
> /* Special hooks used by device assignment */
> void pci_bus_set_route_irq_fn(PCIBus *bus, pci_route_irq_fn route_intx_to_irq)
> {
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index 4b90e5d..df7d316 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -632,6 +632,25 @@ PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
> PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name);
> PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
>
> +qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
> +void pci_set_irq(PCIDevice *pci_dev, int level);
> +
> +static inline void pci_irq_raise(PCIDevice *pci_dev)
> +{
> + pci_set_irq(pci_dev, 1);
> +}
> +
> +static inline void pci_irq_lower(PCIDevice *pci_dev)
> +{
> + pci_set_irq(pci_dev, 0);
> +}
> +
I'd like to add that any users of pci_irq_pulse
are immediately suspect. PCI does not work this way.
If you resend this, maybe add a comment that all users
of this should be fixed.
> +static inline void pci_irq_pulse(PCIDevice *pci_dev)
> +{
> + pci_irq_lower(pci_dev);
> + pci_irq_raise(pci_dev);
> +}
> +
> static inline int pci_is_express(const PCIDevice *d)
> {
> return d->cap_present & QEMU_PCI_CAP_EXPRESS;
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs
2013-10-02 12:54 ` Michael S. Tsirkin
@ 2013-10-02 12:56 ` Marcel Apfelbaum
0 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 12:56 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, sw, jasowang,
qemu-devel, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, 2013-10-02 at 15:54 +0300, Michael S. Tsirkin wrote:
> On Wed, Oct 02, 2013 at 03:41:27PM +0300, Marcel Apfelbaum wrote:
> > Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
> > register during device initialization. Devices should not call
> > directly qemu_set_irq and specify the INTx pin on each call.
> >
> > Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
> > qemu_irq_lower and qemu_irq_pulse, setting the irq
> > based on PCI_INTERRUPT_PIN.
> >
> > Added pci_allocate_irq wrapper to be used by devices that
> > still need PCIDevice infrastructure to assert irqs.
> >
> > Renamed a static method which was named already pci_set_irq.
> >
> > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > ---
> > Changes from v1:
> > - Added pci irq wrappers for all qemu methods
> > setting irq and not only qemu_set_irq
> > - Added pci wrappers to allocate and pci irq
> >
> > hw/pci/pci.c | 26 ++++++++++++++++++++++----
> > include/hw/pci/pci.h | 19 +++++++++++++++++++
> > 2 files changed, 41 insertions(+), 4 deletions(-)
> >
> > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > index 00554a0..fbfd8f7 100644
> > --- a/hw/pci/pci.c
> > +++ b/hw/pci/pci.c
> > @@ -83,7 +83,7 @@ static const TypeInfo pcie_bus_info = {
> >
> > static PCIBus *pci_find_bus_nr(PCIBus *bus, int bus_num);
> > static void pci_update_mappings(PCIDevice *d);
> > -static void pci_set_irq(void *opaque, int irq_num, int level);
> > +static void pci_irq_handler(void *opaque, int irq_num, int level);
> > static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
> > static void pci_del_option_rom(PCIDevice *pdev);
> >
> > @@ -161,7 +161,7 @@ void pci_device_deassert_intx(PCIDevice *dev)
> > {
> > int i;
> > for (i = 0; i < PCI_NUM_PINS; ++i) {
> > - qemu_set_irq(dev->irq[i], 0);
> > + pci_irq_handler(dev, i, 0);
> > }
> > }
> >
> > @@ -863,7 +863,7 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
> > pci_dev->config_read = config_read;
> > pci_dev->config_write = config_write;
> > bus->devices[devfn] = pci_dev;
> > - pci_dev->irq = qemu_allocate_irqs(pci_set_irq, pci_dev, PCI_NUM_PINS);
> > + pci_dev->irq = qemu_allocate_irqs(pci_irq_handler, pci_dev, PCI_NUM_PINS);
> > pci_dev->version_id = 2; /* Current pci device vmstate version */
> > return pci_dev;
> > }
> > @@ -1175,7 +1175,7 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> > /* generic PCI irq support */
> >
> > /* 0 <= irq_num <= 3. level must be 0 or 1 */
> > -static void pci_set_irq(void *opaque, int irq_num, int level)
> > +static void pci_irq_handler(void *opaque, int irq_num, int level)
> > {
> > PCIDevice *pci_dev = opaque;
> > int change;
> > @@ -1191,6 +1191,24 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
> > pci_change_irq_level(pci_dev, irq_num, change);
> > }
> >
> > +static inline int pci_intx(PCIDevice *pci_dev)
> > +{
> > + return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1;
> > +}
> > +
> > +qemu_irq pci_allocate_irq(PCIDevice *pci_dev)
> > +{
> > + int intx = pci_intx(pci_dev);
> > +
> > + return qemu_allocate_irq(pci_irq_handler, pci_dev, intx);
> > +}
> > +
> > +void pci_set_irq(PCIDevice *pci_dev, int level)
> > +{
> > + int intx = pci_intx(pci_dev);
> > + pci_irq_handler(pci_dev, intx, level);
> > +}
> > +
> > /* Special hooks used by device assignment */
> > void pci_bus_set_route_irq_fn(PCIBus *bus, pci_route_irq_fn route_intx_to_irq)
> > {
> > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> > index 4b90e5d..df7d316 100644
> > --- a/include/hw/pci/pci.h
> > +++ b/include/hw/pci/pci.h
> > @@ -632,6 +632,25 @@ PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
> > PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name);
> > PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
> >
> > +qemu_irq pci_allocate_irq(PCIDevice *pci_dev);
> > +void pci_set_irq(PCIDevice *pci_dev, int level);
> > +
> > +static inline void pci_irq_raise(PCIDevice *pci_dev)
> > +{
> > + pci_set_irq(pci_dev, 1);
> > +}
> > +
> > +static inline void pci_irq_lower(PCIDevice *pci_dev)
> > +{
> > + pci_set_irq(pci_dev, 0);
> > +}
> > +
>
> I'd like to add that any users of pci_irq_pulse
> are immediately suspect. PCI does not work this way.
> If you resend this, maybe add a comment that all users
> of this should be fixed.
Sure, thanks!
Marcel
>
> > +static inline void pci_irq_pulse(PCIDevice *pci_dev)
> > +{
> > + pci_irq_lower(pci_dev);
> > + pci_irq_raise(pci_dev);
> > +}
> > +
> > static inline int pci_is_express(const PCIDevice *d)
> > {
> > return d->cap_present & QEMU_PCI_CAP_EXPRESS;
> > --
> > 1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
` (8 preceding siblings ...)
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 9/9] hw/pci: removed irq field from PCIDevice Marcel Apfelbaum
@ 2013-10-02 12:58 ` Michael S. Tsirkin
2013-10-02 13:05 ` Marcel Apfelbaum
9 siblings, 1 reply; 22+ messages in thread
From: Michael S. Tsirkin @ 2013-10-02 12:58 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, sw, jasowang,
qemu-devel, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, Oct 02, 2013 at 03:41:25PM +0300, Marcel Apfelbaum wrote:
> Note: Added RFC because not all affected devices were
> checked yet.
What do you have in mind exactly?
> Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
> register during device initialization. Devices should not call
> directly qemu_set_irq and specify the INTx pin.
>
> Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
> qemu_irq_lower and qemu_irq_pulse, setting the irq
> based on PCI_INTERRUPT_PIN.
>
> Added interface to allocate and free single irq.
> Added pci_allocate_irq wrapper to be used by devices that
> still need PCIDevice infrastructure to assert irqs.
>
> Removed irq field from PCIDevice, not needed anymore.
>
> Special cases of replacements were done in separate patches,
> all others in one patch "hw: set interrupts using pci irq wrappers"
Looks good to me overall.
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> Changes from v1:
> - Addressed Michael S. Tsirkin's comments:
> - pci_set_irq directly calls pci_irq handler
> - removed irq field from PCIDevice
> - Added qemu interface to allocate single irq
> - Added pci wrappers to allocate and free pci irq
> - Added pci irq wrappers for all qemu methods
> setting irq and not only qemu_set_irq
> - Replace all qemu irq setters with pci
> wrappers
>
> Marcel Apfelbaum (9):
> hw/core: Add interface to allocate and free a single IRQ
> hw/pci: add pci wrappers for allocating and asserting irqs
> hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init
> hw/vmxnet3: set interrupts using pci irq wrappers
> hw/vfio: set interrupts using pci irq wrappers
> hw/xhci: set interrupts using pci irq wrappers
> hw: set interrupts using pci irq wrappers
> hw/pcie: AER and hot-plug events must use device's interrupt
> hw/pci: removed irq field from PCIDevice
>
> hw/audio/ac97.c | 4 ++--
> hw/audio/es1370.c | 4 ++--
> hw/audio/intel-hda.c | 2 +-
> hw/block/nvme.c | 2 +-
> hw/char/serial-pci.c | 5 +++--
> hw/char/tpci200.c | 8 ++++----
> hw/core/irq.c | 16 ++++++++++++++++
> hw/display/qxl.c | 2 +-
> hw/ide/cmd646.c | 2 +-
> hw/ide/ich.c | 3 ++-
> hw/isa/vt82c686.c | 2 +-
> hw/misc/ivshmem.c | 2 +-
> hw/misc/vfio.c | 11 ++++++-----
> hw/net/e1000.c | 2 +-
> hw/net/eepro100.c | 4 ++--
> hw/net/ne2000.c | 3 ++-
> hw/net/pcnet-pci.c | 3 ++-
> hw/net/rtl8139.c | 2 +-
> hw/net/vmxnet3.c | 13 +++++++++++--
> hw/pci-bridge/pci_bridge_dev.c | 2 +-
> hw/pci/pci.c | 26 +++++++++++++++++++++-----
> hw/pci/pcie.c | 4 ++--
> hw/pci/pcie_aer.c | 4 ++--
> hw/pci/shpc.c | 2 +-
> hw/scsi/esp-pci.c | 3 ++-
> hw/scsi/lsi53c895a.c | 2 +-
> hw/scsi/megasas.c | 6 +++---
> hw/scsi/vmw_pvscsi.c | 2 +-
> hw/usb/hcd-ehci-pci.c | 2 +-
> hw/usb/hcd-ohci.c | 2 +-
> hw/usb/hcd-uhci.c | 2 +-
> hw/usb/hcd-xhci.c | 7 ++-----
> hw/virtio/virtio-pci.c | 4 ++--
> include/hw/irq.h | 7 +++++++
> include/hw/pci/pci.h | 22 +++++++++++++++++++---
> include/hw/pci/pcie.h | 18 ------------------
> 36 files changed, 127 insertions(+), 78 deletions(-)
>
> --
> 1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin
2013-10-02 12:58 ` [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Michael S. Tsirkin
@ 2013-10-02 13:05 ` Marcel Apfelbaum
2013-10-02 16:03 ` Alex Williamson
0 siblings, 1 reply; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 13:05 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, sw, jasowang,
qemu-devel, dkoch, keith.busch, alex.williamson, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, 2013-10-02 at 15:58 +0300, Michael S. Tsirkin wrote:
> On Wed, Oct 02, 2013 at 03:41:25PM +0300, Marcel Apfelbaum wrote:
> > Note: Added RFC because not all affected devices were
> > checked yet.
>
> What do you have in mind exactly?
Sanity test for *all* modified devices.
Any other thoughts?
>From self code review, I can say that besides 2 devices
(vmxnet3 and vfio), the code is re-factored with
no side effects.
vmxnet3: I reviewed linux driver code and when using legacy interrupts
only INTx 0 is used.
vfio: Also here only INTx 0 is used, so the interface selecting
the interrupt line seems to be unnecessary at least for
legacy interrupts.
>
> > Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
> > register during device initialization. Devices should not call
> > directly qemu_set_irq and specify the INTx pin.
> >
> > Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
> > qemu_irq_lower and qemu_irq_pulse, setting the irq
> > based on PCI_INTERRUPT_PIN.
> >
> > Added interface to allocate and free single irq.
> > Added pci_allocate_irq wrapper to be used by devices that
> > still need PCIDevice infrastructure to assert irqs.
> >
> > Removed irq field from PCIDevice, not needed anymore.
> >
> > Special cases of replacements were done in separate patches,
> > all others in one patch "hw: set interrupts using pci irq wrappers"
>
> Looks good to me overall.
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
>
>
> > Changes from v1:
> > - Addressed Michael S. Tsirkin's comments:
> > - pci_set_irq directly calls pci_irq handler
> > - removed irq field from PCIDevice
> > - Added qemu interface to allocate single irq
> > - Added pci wrappers to allocate and free pci irq
> > - Added pci irq wrappers for all qemu methods
> > setting irq and not only qemu_set_irq
> > - Replace all qemu irq setters with pci
> > wrappers
> >
> > Marcel Apfelbaum (9):
> > hw/core: Add interface to allocate and free a single IRQ
> > hw/pci: add pci wrappers for allocating and asserting irqs
> > hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init
> > hw/vmxnet3: set interrupts using pci irq wrappers
> > hw/vfio: set interrupts using pci irq wrappers
> > hw/xhci: set interrupts using pci irq wrappers
> > hw: set interrupts using pci irq wrappers
> > hw/pcie: AER and hot-plug events must use device's interrupt
> > hw/pci: removed irq field from PCIDevice
> >
> > hw/audio/ac97.c | 4 ++--
> > hw/audio/es1370.c | 4 ++--
> > hw/audio/intel-hda.c | 2 +-
> > hw/block/nvme.c | 2 +-
> > hw/char/serial-pci.c | 5 +++--
> > hw/char/tpci200.c | 8 ++++----
> > hw/core/irq.c | 16 ++++++++++++++++
> > hw/display/qxl.c | 2 +-
> > hw/ide/cmd646.c | 2 +-
> > hw/ide/ich.c | 3 ++-
> > hw/isa/vt82c686.c | 2 +-
> > hw/misc/ivshmem.c | 2 +-
> > hw/misc/vfio.c | 11 ++++++-----
> > hw/net/e1000.c | 2 +-
> > hw/net/eepro100.c | 4 ++--
> > hw/net/ne2000.c | 3 ++-
> > hw/net/pcnet-pci.c | 3 ++-
> > hw/net/rtl8139.c | 2 +-
> > hw/net/vmxnet3.c | 13 +++++++++++--
> > hw/pci-bridge/pci_bridge_dev.c | 2 +-
> > hw/pci/pci.c | 26 +++++++++++++++++++++-----
> > hw/pci/pcie.c | 4 ++--
> > hw/pci/pcie_aer.c | 4 ++--
> > hw/pci/shpc.c | 2 +-
> > hw/scsi/esp-pci.c | 3 ++-
> > hw/scsi/lsi53c895a.c | 2 +-
> > hw/scsi/megasas.c | 6 +++---
> > hw/scsi/vmw_pvscsi.c | 2 +-
> > hw/usb/hcd-ehci-pci.c | 2 +-
> > hw/usb/hcd-ohci.c | 2 +-
> > hw/usb/hcd-uhci.c | 2 +-
> > hw/usb/hcd-xhci.c | 7 ++-----
> > hw/virtio/virtio-pci.c | 4 ++--
> > include/hw/irq.h | 7 +++++++
> > include/hw/pci/pci.h | 22 +++++++++++++++++++---
> > include/hw/pci/pcie.h | 18 ------------------
> > 36 files changed, 127 insertions(+), 78 deletions(-)
> >
> > --
> > 1.8.3.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs Marcel Apfelbaum
2013-10-02 12:54 ` Michael S. Tsirkin
@ 2013-10-02 15:21 ` Paolo Bonzini
2013-10-02 22:03 ` Marcel Apfelbaum
1 sibling, 1 reply; 22+ messages in thread
From: Paolo Bonzini @ 2013-10-02 15:21 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, alex.williamson, kraxel,
stefanha, dmitry, afaerber, ehabkost
Il 02/10/2013 14:41, Marcel Apfelbaum ha scritto:
> +static inline void pci_irq_pulse(PCIDevice *pci_dev)
> +{
> + pci_irq_lower(pci_dev);
> + pci_irq_raise(pci_dev);
> +}
> +
Why is this in the opposite order, compared to qemu_irq_pulse?
Paolo
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: set interrupts using pci irq wrappers
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: " Marcel Apfelbaum
@ 2013-10-02 15:58 ` Alex Williamson
2013-10-02 22:16 ` Marcel Apfelbaum
0 siblings, 1 reply; 22+ messages in thread
From: Alex Williamson @ 2013-10-02 15:58 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, 2013-10-02 at 15:41 +0300, Marcel Apfelbaum wrote:
> pci_set_irq and the other pci irq wrappers use
> PCI_INTERRUPT_PIN config register to compute device
> INTx pin to assert/deassert.
>
> Save INTx pin into the config register before calling
> pci_set_irq
>
> Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> ---
> hw/misc/vfio.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
Seems ok, but why not take advantage of the pci_irq_raise/lower()
wrappers? BTW, with PCI being active low, should those be
assert/deassert to avoid confusion confusion with the actual signal
level? Thanks,
Alex
>
> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> index a1c08fb..3d7297c 100644
> --- a/hw/misc/vfio.c
> +++ b/hw/misc/vfio.c
> @@ -297,7 +297,7 @@ static void vfio_intx_interrupt(void *opaque)
> 'A' + vdev->intx.pin);
>
> vdev->intx.pending = true;
> - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 1);
> + pci_set_irq(&vdev->pdev, 1);
> vfio_mmap_set_enabled(vdev, false);
> if (vdev->intx.mmap_timeout) {
> timer_mod(vdev->intx.mmap_timer,
> @@ -315,7 +315,7 @@ static void vfio_eoi(VFIODevice *vdev)
> vdev->host.bus, vdev->host.slot, vdev->host.function);
>
> vdev->intx.pending = false;
> - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> + pci_set_irq(&vdev->pdev, 0);
> vfio_unmask_intx(vdev);
> }
>
> @@ -341,7 +341,7 @@ static void vfio_enable_intx_kvm(VFIODevice *vdev)
> qemu_set_fd_handler(irqfd.fd, NULL, NULL, vdev);
> vfio_mask_intx(vdev);
> vdev->intx.pending = false;
> - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> + pci_set_irq(&vdev->pdev, 0);
>
> /* Get an eventfd for resample/unmask */
> if (event_notifier_init(&vdev->intx.unmask, 0)) {
> @@ -417,7 +417,7 @@ static void vfio_disable_intx_kvm(VFIODevice *vdev)
> */
> vfio_mask_intx(vdev);
> vdev->intx.pending = false;
> - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> + pci_set_irq(&vdev->pdev, 0);
>
> /* Tell KVM to stop listening for an INTx irqfd */
> if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, &irqfd)) {
> @@ -488,6 +488,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
> vfio_disable_interrupts(vdev);
>
> vdev->intx.pin = pin - 1; /* Pin A (1) -> irq[0] */
> + pci_config_set_interrupt_pin(vdev->pdev.config, pin);
>
> #ifdef CONFIG_KVM
> /*
> @@ -547,7 +548,7 @@ static void vfio_disable_intx(VFIODevice *vdev)
> vfio_disable_intx_kvm(vdev);
> vfio_disable_irqindex(vdev, VFIO_PCI_INTX_IRQ_INDEX);
> vdev->intx.pending = false;
> - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> + pci_set_irq(&vdev->pdev, 0);
> vfio_mmap_set_enabled(vdev, true);
>
> fd = event_notifier_get_fd(&vdev->intx.interrupt);
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin
2013-10-02 13:05 ` Marcel Apfelbaum
@ 2013-10-02 16:03 ` Alex Williamson
0 siblings, 0 replies; 22+ messages in thread
From: Alex Williamson @ 2013-10-02 16:03 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony,
Michael S. Tsirkin, sw, jasowang, qemu-devel, dkoch, keith.busch,
kraxel, stefanha, dmitry, pbonzini, afaerber, ehabkost
On Wed, 2013-10-02 at 16:05 +0300, Marcel Apfelbaum wrote:
> On Wed, 2013-10-02 at 15:58 +0300, Michael S. Tsirkin wrote:
> > On Wed, Oct 02, 2013 at 03:41:25PM +0300, Marcel Apfelbaum wrote:
> > > Note: Added RFC because not all affected devices were
> > > checked yet.
> >
> > What do you have in mind exactly?
> Sanity test for *all* modified devices.
> Any other thoughts?
>
> From self code review, I can say that besides 2 devices
> (vmxnet3 and vfio), the code is re-factored with
> no side effects.
>
> vmxnet3: I reviewed linux driver code and when using legacy interrupts
> only INTx 0 is used.
> vfio: Also here only INTx 0 is used, so the interface selecting
> the interrupt line seems to be unnecessary at least for
> legacy interrupts.
vfio uses the same pin as the physical device, so you can't guarantee
that's always INTA. Thanks,
Alex
> >
> > > Interrupt pin is selected and saved into PCI_INTERRUPT_PIN
> > > register during device initialization. Devices should not call
> > > directly qemu_set_irq and specify the INTx pin.
> > >
> > > Added pci_* wrappers to replace qemu_set_irq, qemu_irq_raise,
> > > qemu_irq_lower and qemu_irq_pulse, setting the irq
> > > based on PCI_INTERRUPT_PIN.
> > >
> > > Added interface to allocate and free single irq.
> > > Added pci_allocate_irq wrapper to be used by devices that
> > > still need PCIDevice infrastructure to assert irqs.
> > >
> > > Removed irq field from PCIDevice, not needed anymore.
> > >
> > > Special cases of replacements were done in separate patches,
> > > all others in one patch "hw: set interrupts using pci irq wrappers"
> >
> > Looks good to me overall.
> > Acked-by: Michael S. Tsirkin <mst@redhat.com>
> >
> >
> > > Changes from v1:
> > > - Addressed Michael S. Tsirkin's comments:
> > > - pci_set_irq directly calls pci_irq handler
> > > - removed irq field from PCIDevice
> > > - Added qemu interface to allocate single irq
> > > - Added pci wrappers to allocate and free pci irq
> > > - Added pci irq wrappers for all qemu methods
> > > setting irq and not only qemu_set_irq
> > > - Replace all qemu irq setters with pci
> > > wrappers
> > >
> > > Marcel Apfelbaum (9):
> > > hw/core: Add interface to allocate and free a single IRQ
> > > hw/pci: add pci wrappers for allocating and asserting irqs
> > > hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init
> > > hw/vmxnet3: set interrupts using pci irq wrappers
> > > hw/vfio: set interrupts using pci irq wrappers
> > > hw/xhci: set interrupts using pci irq wrappers
> > > hw: set interrupts using pci irq wrappers
> > > hw/pcie: AER and hot-plug events must use device's interrupt
> > > hw/pci: removed irq field from PCIDevice
> > >
> > > hw/audio/ac97.c | 4 ++--
> > > hw/audio/es1370.c | 4 ++--
> > > hw/audio/intel-hda.c | 2 +-
> > > hw/block/nvme.c | 2 +-
> > > hw/char/serial-pci.c | 5 +++--
> > > hw/char/tpci200.c | 8 ++++----
> > > hw/core/irq.c | 16 ++++++++++++++++
> > > hw/display/qxl.c | 2 +-
> > > hw/ide/cmd646.c | 2 +-
> > > hw/ide/ich.c | 3 ++-
> > > hw/isa/vt82c686.c | 2 +-
> > > hw/misc/ivshmem.c | 2 +-
> > > hw/misc/vfio.c | 11 ++++++-----
> > > hw/net/e1000.c | 2 +-
> > > hw/net/eepro100.c | 4 ++--
> > > hw/net/ne2000.c | 3 ++-
> > > hw/net/pcnet-pci.c | 3 ++-
> > > hw/net/rtl8139.c | 2 +-
> > > hw/net/vmxnet3.c | 13 +++++++++++--
> > > hw/pci-bridge/pci_bridge_dev.c | 2 +-
> > > hw/pci/pci.c | 26 +++++++++++++++++++++-----
> > > hw/pci/pcie.c | 4 ++--
> > > hw/pci/pcie_aer.c | 4 ++--
> > > hw/pci/shpc.c | 2 +-
> > > hw/scsi/esp-pci.c | 3 ++-
> > > hw/scsi/lsi53c895a.c | 2 +-
> > > hw/scsi/megasas.c | 6 +++---
> > > hw/scsi/vmw_pvscsi.c | 2 +-
> > > hw/usb/hcd-ehci-pci.c | 2 +-
> > > hw/usb/hcd-ohci.c | 2 +-
> > > hw/usb/hcd-uhci.c | 2 +-
> > > hw/usb/hcd-xhci.c | 7 ++-----
> > > hw/virtio/virtio-pci.c | 4 ++--
> > > include/hw/irq.h | 7 +++++++
> > > include/hw/pci/pci.h | 22 +++++++++++++++++++---
> > > include/hw/pci/pcie.h | 18 ------------------
> > > 36 files changed, 127 insertions(+), 78 deletions(-)
> > >
> > > --
> > > 1.8.3.1
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs
2013-10-02 15:21 ` Paolo Bonzini
@ 2013-10-02 22:03 ` Marcel Apfelbaum
0 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 22:03 UTC (permalink / raw)
To: Paolo Bonzini
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, alex.williamson, kraxel,
stefanha, dmitry, afaerber, ehabkost
On Wed, 2013-10-02 at 17:21 +0200, Paolo Bonzini wrote:
> Il 02/10/2013 14:41, Marcel Apfelbaum ha scritto:
> > +static inline void pci_irq_pulse(PCIDevice *pci_dev)
> > +{
> > + pci_irq_lower(pci_dev);
> > + pci_irq_raise(pci_dev);
> > +}
> > +
>
> Why is this in the opposite order, compared to qemu_irq_pulse?
It is a bug, thank you for catching it!
Marcel
>
> Paolo
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: set interrupts using pci irq wrappers
2013-10-02 15:58 ` Alex Williamson
@ 2013-10-02 22:16 ` Marcel Apfelbaum
0 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-02 22:16 UTC (permalink / raw)
To: Alex Williamson
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, kraxel, stefanha,
dmitry, pbonzini, afaerber, ehabkost
On Wed, 2013-10-02 at 09:58 -0600, Alex Williamson wrote:
> On Wed, 2013-10-02 at 15:41 +0300, Marcel Apfelbaum wrote:
> > pci_set_irq and the other pci irq wrappers use
> > PCI_INTERRUPT_PIN config register to compute device
> > INTx pin to assert/deassert.
> >
> > Save INTx pin into the config register before calling
> > pci_set_irq
> >
> > Signed-off-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > ---
> > hw/misc/vfio.c | 11 ++++++-----
> > 1 file changed, 6 insertions(+), 5 deletions(-)
>
> Seems ok, but why not take advantage of the pci_irq_raise/lower()
> wrappers? BTW, with PCI being active low, should those be
> assert/deassert to avoid confusion confusion with the actual signal
> level? Thanks,
Thanks for the review!
I can use pci_irq_raise/lower(), but I wanted to preserve
the current form, re-factoring:
qemu_set_irq -> pci_set_irq,
qemu_irq_lower -> pci_irq_lower
...
If you think is worth it, I'll change it. (in all the places)
About assert/deassert instead of lower/raise, I am afraid
it will confuse users having two different set of naming
for interrupts usage.
Is easier to understand that pci_irq_lower behaves the same
as qemu_pci_lower, then pci_irq_deassert.
What do you think?
Thanks,
Marcel
>
> Alex
>
> >
> > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> > index a1c08fb..3d7297c 100644
> > --- a/hw/misc/vfio.c
> > +++ b/hw/misc/vfio.c
> > @@ -297,7 +297,7 @@ static void vfio_intx_interrupt(void *opaque)
> > 'A' + vdev->intx.pin);
> >
> > vdev->intx.pending = true;
> > - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 1);
> > + pci_set_irq(&vdev->pdev, 1);
> > vfio_mmap_set_enabled(vdev, false);
> > if (vdev->intx.mmap_timeout) {
> > timer_mod(vdev->intx.mmap_timer,
> > @@ -315,7 +315,7 @@ static void vfio_eoi(VFIODevice *vdev)
> > vdev->host.bus, vdev->host.slot, vdev->host.function);
> >
> > vdev->intx.pending = false;
> > - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> > + pci_set_irq(&vdev->pdev, 0);
> > vfio_unmask_intx(vdev);
> > }
> >
> > @@ -341,7 +341,7 @@ static void vfio_enable_intx_kvm(VFIODevice *vdev)
> > qemu_set_fd_handler(irqfd.fd, NULL, NULL, vdev);
> > vfio_mask_intx(vdev);
> > vdev->intx.pending = false;
> > - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> > + pci_set_irq(&vdev->pdev, 0);
> >
> > /* Get an eventfd for resample/unmask */
> > if (event_notifier_init(&vdev->intx.unmask, 0)) {
> > @@ -417,7 +417,7 @@ static void vfio_disable_intx_kvm(VFIODevice *vdev)
> > */
> > vfio_mask_intx(vdev);
> > vdev->intx.pending = false;
> > - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> > + pci_set_irq(&vdev->pdev, 0);
> >
> > /* Tell KVM to stop listening for an INTx irqfd */
> > if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, &irqfd)) {
> > @@ -488,6 +488,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
> > vfio_disable_interrupts(vdev);
> >
> > vdev->intx.pin = pin - 1; /* Pin A (1) -> irq[0] */
> > + pci_config_set_interrupt_pin(vdev->pdev.config, pin);
> >
> > #ifdef CONFIG_KVM
> > /*
> > @@ -547,7 +548,7 @@ static void vfio_disable_intx(VFIODevice *vdev)
> > vfio_disable_intx_kvm(vdev);
> > vfio_disable_irqindex(vdev, VFIO_PCI_INTX_IRQ_INDEX);
> > vdev->intx.pending = false;
> > - qemu_set_irq(vdev->pdev.irq[vdev->intx.pin], 0);
> > + pci_set_irq(&vdev->pdev, 0);
> > vfio_mmap_set_enabled(vdev, true);
> >
> > fd = event_notifier_get_fd(&vdev->intx.interrupt);
>
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 7/9] hw: set interrupts using pci irq wrappers
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 7/9] hw: " Marcel Apfelbaum
@ 2013-10-07 7:02 ` Gerd Hoffmann
2013-10-07 7:13 ` Marcel Apfelbaum
0 siblings, 1 reply; 22+ messages in thread
From: Gerd Hoffmann @ 2013-10-07 7:02 UTC (permalink / raw)
To: Marcel Apfelbaum
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, alex.williamson,
stefanha, dmitry, pbonzini, afaerber, ehabkost
On Mi, 2013-10-02 at 15:41 +0300, Marcel Apfelbaum wrote:
> --- a/hw/usb/hcd-uhci.c
> +++ b/hw/usb/hcd-uhci.c
> @@ -381,7 +381,7 @@ static void uhci_update_irq(UHCIState *s)
> } else {
> level = 0;
> }
> - qemu_set_irq(s->dev.irq[s->irq_pin], level);
> + pci_set_irq(&s->dev, level);
> }
>
> static void uhci_reset(void *opaque)
That renders s->irq_pin unused. You can drop the struct member and the
initialization code for it.
cheers,
Gerd
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [Qemu-devel] [PATCH RFC v2 7/9] hw: set interrupts using pci irq wrappers
2013-10-07 7:02 ` Gerd Hoffmann
@ 2013-10-07 7:13 ` Marcel Apfelbaum
0 siblings, 0 replies; 22+ messages in thread
From: Marcel Apfelbaum @ 2013-10-07 7:13 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: kwolf, peter.maydell, peter.crosthwaite, anthony, mst, sw,
jasowang, qemu-devel, dkoch, keith.busch, alex.williamson,
stefanha, dmitry, pbonzini, afaerber, ehabkost
On Mon, 2013-10-07 at 09:02 +0200, Gerd Hoffmann wrote:
> On Mi, 2013-10-02 at 15:41 +0300, Marcel Apfelbaum wrote:
> > --- a/hw/usb/hcd-uhci.c
> > +++ b/hw/usb/hcd-uhci.c
> > @@ -381,7 +381,7 @@ static void uhci_update_irq(UHCIState *s)
> > } else {
> > level = 0;
> > }
> > - qemu_set_irq(s->dev.irq[s->irq_pin], level);
> > + pci_set_irq(&s->dev, level);
> > }
> >
> > static void uhci_reset(void *opaque)
>
> That renders s->irq_pin unused. You can drop the struct member and the
> initialization code for it.
Got it, thanks!
Marcel
>
> cheers,
> Gerd
>
>
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2013-10-07 7:13 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-02 12:41 [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 1/9] hw/core: Add interface to allocate and free a single IRQ Marcel Apfelbaum
2013-10-02 12:50 ` Michael S. Tsirkin
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 2/9] hw/pci: add pci wrappers for allocating and asserting irqs Marcel Apfelbaum
2013-10-02 12:54 ` Michael S. Tsirkin
2013-10-02 12:56 ` Marcel Apfelbaum
2013-10-02 15:21 ` Paolo Bonzini
2013-10-02 22:03 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 3/9] hw/pci-bridge: set PCI_INTERRUPT_PIN register before shpc init Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 4/9] hw/vmxnet3: set interrupts using pci irq wrappers Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 5/9] hw/vfio: " Marcel Apfelbaum
2013-10-02 15:58 ` Alex Williamson
2013-10-02 22:16 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 6/9] hw/xhci: " Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 7/9] hw: " Marcel Apfelbaum
2013-10-07 7:02 ` Gerd Hoffmann
2013-10-07 7:13 ` Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 8/9] hw/pcie: AER and hot-plug events must use device's interrupt Marcel Apfelbaum
2013-10-02 12:41 ` [Qemu-devel] [PATCH RFC v2 9/9] hw/pci: removed irq field from PCIDevice Marcel Apfelbaum
2013-10-02 12:58 ` [Qemu-devel] [PATCH RFC v2 0/9] hw/pci: set irq without selecting INTx pin Michael S. Tsirkin
2013-10-02 13:05 ` Marcel Apfelbaum
2013-10-02 16:03 ` Alex Williamson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).