* [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface
@ 2012-08-03 10:51 Jan Kiszka
2012-08-03 10:52 ` [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier Jan Kiszka
2012-08-03 15:26 ` [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Alex Williamson
0 siblings, 2 replies; 8+ messages in thread
From: Jan Kiszka @ 2012-08-03 10:51 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm, Alex Williamson
From: Jan Kiszka <jan.kiszka@siemens.com>
Drop pci_map_irq/piix_get_irq in favor of upstream's new interface. This
should also properly model disabling of the line at PCI host controller
level.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/device-assignment.c | 29 +++++++++++++++++++----------
hw/pc.h | 4 ----
hw/pci.c | 4 ----
hw/pci.h | 2 --
hw/piix_pci.c | 7 -------
5 files changed, 19 insertions(+), 27 deletions(-)
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index cc39958..d14c327 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -115,7 +115,7 @@ typedef struct AssignedDevice {
AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
PCIDevRegions real_device;
int run;
- int girq;
+ PCIINTxRoute intx_route;
uint16_t h_segnr;
uint8_t h_busnr;
uint8_t h_devfn;
@@ -865,21 +865,24 @@ static int assign_device(AssignedDevice *dev)
static int assign_irq(AssignedDevice *dev)
{
struct kvm_assigned_irq assigned_irq_data;
- int irq, r = 0;
+ PCIINTxRoute intx_route;
+ int r = 0;
/* Interrupt PIN 0 means don't use INTx */
if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
return 0;
- irq = pci_map_irq(&dev->dev, dev->intpin);
- irq = piix_get_irq(irq);
+ intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
+ assert(intx_route.mode != PCI_INTX_INVERTED);
- if (dev->girq == irq)
+ if (dev->intx_route.mode == intx_route.mode &&
+ dev->intx_route.irq == intx_route.irq) {
return r;
+ }
memset(&assigned_irq_data, 0, sizeof(assigned_irq_data));
assigned_irq_data.assigned_dev_id = calc_assigned_dev_id(dev);
- assigned_irq_data.guest_irq = irq;
+ assigned_irq_data.guest_irq = intx_route.irq;
if (dev->irq_requested_type) {
assigned_irq_data.flags = dev->irq_requested_type;
r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
@@ -889,6 +892,11 @@ static int assign_irq(AssignedDevice *dev)
dev->irq_requested_type = 0;
}
+ if (intx_route.mode == PCI_INTX_DISABLED) {
+ dev->intx_route = intx_route;
+ return 0;
+ }
+
retry:
assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX;
if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK &&
@@ -917,7 +925,7 @@ retry:
return r;
}
- dev->girq = irq;
+ dev->intx_route = intx_route;
dev->irq_requested_type = assigned_irq_data.flags;
return r;
}
@@ -1029,7 +1037,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
perror("assigned_dev_enable_msi: assign irq");
}
- assigned_dev->girq = -1;
+ assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
assigned_dev->irq_requested_type = assigned_irq_data.flags;
} else {
assign_irq(assigned_dev);
@@ -1160,7 +1168,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
return;
}
}
- assigned_dev->girq = -1;
+ assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
assigned_dev->irq_requested_type = assigned_irq_data.flags;
} else {
assign_irq(assigned_dev);
@@ -1784,7 +1792,8 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
e_intx = dev->dev.config[0x3d] - 1;
dev->intpin = e_intx;
dev->run = 0;
- dev->girq = -1;
+ dev->intx_route.mode = PCI_INTX_DISABLED;
+ dev->intx_route.irq = -1;
dev->h_segnr = dev->host.domain;
dev->h_busnr = dev->host.bus;
dev->h_devfn = PCI_DEVFN(dev->host.slot, dev->host.function);
diff --git a/hw/pc.h b/hw/pc.h
index a662090..5b36eb5 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -171,10 +171,6 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
extern PCIDevice *piix4_dev;
int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
-int piix_get_irq(int pin);
-
-int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
-
/* vga.c */
enum vga_retrace_method {
VGA_RETRACE_DUMB,
diff --git a/hw/pci.c b/hw/pci.c
index 5ef3453..0b22913 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1089,10 +1089,6 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
pci_change_irq_level(pci_dev, irq_num, change);
}
-int pci_map_irq(PCIDevice *pci_dev, int pin)
-{
- return pci_dev->bus->map_irq(pci_dev, pin);
-}
/* 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/hw/pci.h b/hw/pci.h
index c69af01..4b6ab3d 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -274,8 +274,6 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
uint8_t attr, MemoryRegion *memory);
pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num);
-int pci_map_irq(PCIDevice *pci_dev, int pin);
-
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
uint8_t offset, uint8_t size);
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index a5090cb..355814f 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -435,13 +435,6 @@ static void piix3_write_config(PCIDevice *dev,
}
}
-int piix_get_irq(int pin)
-{
- if (piix3_dev)
- return piix3_dev->dev.config[0x60+pin];
- return 0;
-}
-
static void piix3_write_config_xen(PCIDevice *dev,
uint32_t address, uint32_t val, int len)
{
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier
2012-08-03 10:51 [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Jan Kiszka
@ 2012-08-03 10:52 ` Jan Kiszka
2012-08-03 15:35 ` Alex Williamson
2012-08-03 15:26 ` [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Alex Williamson
1 sibling, 1 reply; 8+ messages in thread
From: Jan Kiszka @ 2012-08-03 10:52 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: kvm, Alex Williamson
From: Jan Kiszka <jan.kiszka@siemens.com>
Replace the hack in pci_default_write_config with upstream's generic
callback mechanism to get informed about changes on the PCI INTx
routing.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/Makefile.objs | 3 +--
hw/device-assignment.c | 48 ++++++++++++++++--------------------------------
hw/device-assignment.h | 33 ---------------------------------
hw/pc.h | 3 ---
hw/pci.c | 11 -----------
hw/piix_pci.c | 3 ---
6 files changed, 17 insertions(+), 84 deletions(-)
delete mode 100644 hw/device-assignment.h
diff --git a/hw/Makefile.objs b/hw/Makefile.objs
index 30f9ba6..fa8bb08 100644
--- a/hw/Makefile.objs
+++ b/hw/Makefile.objs
@@ -3,7 +3,7 @@ hw-obj-y += loader.o
hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
hw-obj-y += fw_cfg.o
-hw-obj-$(CONFIG_PCI) += pci_bridge.o pci_bridge_dev.o
+hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o pci_bridge_dev.o
hw-obj-$(CONFIG_PCI) += msix.o msi.o
hw-obj-$(CONFIG_PCI) += shpc.o
hw-obj-$(CONFIG_PCI) += slotid_cap.o
@@ -164,7 +164,6 @@ obj-$(CONFIG_SOFTMMU) += vhost_net.o
obj-$(CONFIG_VHOST_NET) += vhost.o
obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/
obj-$(CONFIG_NO_PCI) += pci-stub.o
-obj-$(CONFIG_PCI) += pci.o
obj-$(CONFIG_VGA) += vga.o
obj-$(CONFIG_SOFTMMU) += device-hotplug.o
obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index d14c327..7a90027 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -36,7 +36,6 @@
#include "pc.h"
#include "qemu-error.h"
#include "console.h"
-#include "device-assignment.h"
#include "loader.h"
#include "monitor.h"
#include "range.h"
@@ -143,6 +142,8 @@ typedef struct AssignedDevice {
QLIST_ENTRY(AssignedDevice) next;
} AssignedDevice;
+static void assigned_dev_update_irq_routing(PCIDevice *dev);
+
static void assigned_dev_load_option_rom(AssignedDevice *dev);
static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev);
@@ -869,8 +870,13 @@ static int assign_irq(AssignedDevice *dev)
int r = 0;
/* Interrupt PIN 0 means don't use INTx */
- if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
+ if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) {
+ pci_device_set_intx_routing_notifier(&dev->dev, NULL);
return 0;
+ }
+
+ pci_device_set_intx_routing_notifier(&dev->dev,
+ assigned_dev_update_irq_routing);
intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
assert(intx_route.mode != PCI_INTX_INVERTED);
@@ -944,43 +950,19 @@ static void deassign_device(AssignedDevice *dev)
dev->dev.qdev.id, strerror(-r));
}
-#if 0
-AssignedDevInfo *get_assigned_device(int pcibus, int slot)
-{
- AssignedDevice *assigned_dev = NULL;
- AssignedDevInfo *adev = NULL;
-
- QLIST_FOREACH(adev, &adev_head, next) {
- assigned_dev = adev->assigned_dev;
- if (pci_bus_num(assigned_dev->dev.bus) == pcibus &&
- PCI_SLOT(assigned_dev->dev.devfn) == slot)
- return adev;
- }
-
- return NULL;
-}
-#endif
-
/* The pci config space got updated. Check if irq numbers have changed
* for our devices
*/
-void assigned_dev_update_irqs(void)
+static void assigned_dev_update_irq_routing(PCIDevice *dev)
{
- AssignedDevice *dev, *next;
+ AssignedDevice *assigned_dev = DO_UPCAST(AssignedDevice, dev, dev);
Error *err = NULL;
int r;
- dev = QLIST_FIRST(&devs);
- while (dev) {
- next = QLIST_NEXT(dev, next);
- if (dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) {
- r = assign_irq(dev);
- if (r < 0) {
- qdev_unplug(&dev->dev.qdev, &err);
- assert(!err);
- }
- }
- dev = next;
+ r = assign_irq(assigned_dev);
+ if (r < 0) {
+ qdev_unplug(&dev->qdev, &err);
+ assert(!err);
}
}
@@ -1009,6 +991,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
perror("assigned_dev_update_msi: deassign irq");
assigned_dev->irq_requested_type = 0;
+ pci_device_set_intx_routing_notifier(pci_dev, NULL);
}
if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
@@ -1151,6 +1134,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
perror("assigned_dev_update_msix: deassign irq");
assigned_dev->irq_requested_type = 0;
+ pci_device_set_intx_routing_notifier(pci_dev, NULL);
}
if (ctrl_word & PCI_MSIX_FLAGS_ENABLE) {
diff --git a/hw/device-assignment.h b/hw/device-assignment.h
deleted file mode 100644
index 3fcb804..0000000
--- a/hw/device-assignment.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2007, Neocleus Corporation.
- * Copyright (c) 2007, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA 02111-1307 USA.
- *
- * Data structures for storing PCI state
- *
- * Adapted to kvm by Qumranet
- *
- * Copyright (c) 2007, Neocleus, Alex Novik (alex@neocleus.com)
- * Copyright (c) 2007, Neocleus, Guy Zana (guy@neocleus.com)
- * Copyright (C) 2008, Qumranet, Amit Shah (amit.shah@qumranet.com)
- * Copyright (C) 2008, Red Hat, Amit Shah (amit.shah@redhat.com)
- */
-
-#ifndef __DEVICE_ASSIGNMENT_H__
-#define __DEVICE_ASSIGNMENT_H__
-
-void assigned_dev_update_irqs(void);
-
-#endif /* __DEVICE_ASSIGNMENT_H__ */
diff --git a/hw/pc.h b/hw/pc.h
index 5b36eb5..31ccb6f 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -149,9 +149,6 @@ void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
extern int no_hpet;
/* piix_pci.c */
-/* config space register for IRQ routing */
-#define PIIX_CONFIG_IRQ_ROUTE 0x60
-
struct PCII440FXState;
typedef struct PCII440FXState PCII440FXState;
diff --git a/hw/pci.c b/hw/pci.c
index 0b22913..4d95984 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -29,9 +29,6 @@
#include "net.h"
#include "sysemu.h"
#include "loader.h"
-#include "hw/pc.h"
-#include "kvm.h"
-#include "device-assignment.h"
#include "range.h"
#include "qmp-commands.h"
#include "msi.h"
@@ -1048,14 +1045,6 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
}
-
-#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
- if (kvm_enabled() && kvm_irqchip_in_kernel() &&
- addr >= PIIX_CONFIG_IRQ_ROUTE &&
- addr < PIIX_CONFIG_IRQ_ROUTE + 4)
- assigned_dev_update_irqs();
-#endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */
-
if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 355814f..c497a01 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -250,8 +250,6 @@ static int i440fx_initfn(PCIDevice *dev)
return 0;
}
-static PIIX3State *piix3_dev;
-
static PCIBus *i440fx_common_init(const char *device_name,
PCII440FXState **pi440fx_state,
int *piix3_devfn,
@@ -331,7 +329,6 @@ static PCIBus *i440fx_common_init(const char *device_name,
ram_size = 255;
(*pi440fx_state)->dev.config[0x57]=ram_size;
- piix3_dev = piix3;
i440fx_update_memory_mappings(f);
return b;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface
2012-08-03 10:51 [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Jan Kiszka
2012-08-03 10:52 ` [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier Jan Kiszka
@ 2012-08-03 15:26 ` Alex Williamson
2012-08-03 17:02 ` [PATCH v2 " Jan Kiszka
1 sibling, 1 reply; 8+ messages in thread
From: Alex Williamson @ 2012-08-03 15:26 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Avi Kivity, Marcelo Tosatti, kvm
On Fri, 2012-08-03 at 12:51 +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> Drop pci_map_irq/piix_get_irq in favor of upstream's new interface. This
> should also properly model disabling of the line at PCI host controller
> level.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> hw/device-assignment.c | 29 +++++++++++++++++++----------
> hw/pc.h | 4 ----
> hw/pci.c | 4 ----
> hw/pci.h | 2 --
> hw/piix_pci.c | 7 -------
> 5 files changed, 19 insertions(+), 27 deletions(-)
>
> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
> index cc39958..d14c327 100644
> --- a/hw/device-assignment.c
> +++ b/hw/device-assignment.c
> @@ -115,7 +115,7 @@ typedef struct AssignedDevice {
> AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
> PCIDevRegions real_device;
> int run;
> - int girq;
> + PCIINTxRoute intx_route;
> uint16_t h_segnr;
> uint8_t h_busnr;
> uint8_t h_devfn;
> @@ -865,21 +865,24 @@ static int assign_device(AssignedDevice *dev)
> static int assign_irq(AssignedDevice *dev)
> {
> struct kvm_assigned_irq assigned_irq_data;
> - int irq, r = 0;
> + PCIINTxRoute intx_route;
> + int r = 0;
>
> /* Interrupt PIN 0 means don't use INTx */
> if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
> return 0;
>
> - irq = pci_map_irq(&dev->dev, dev->intpin);
> - irq = piix_get_irq(irq);
> + intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
> + assert(intx_route.mode != PCI_INTX_INVERTED);
>
> - if (dev->girq == irq)
> + if (dev->intx_route.mode == intx_route.mode &&
> + dev->intx_route.irq == intx_route.irq) {
> return r;
> + }
>
> memset(&assigned_irq_data, 0, sizeof(assigned_irq_data));
> assigned_irq_data.assigned_dev_id = calc_assigned_dev_id(dev);
> - assigned_irq_data.guest_irq = irq;
> + assigned_irq_data.guest_irq = intx_route.irq;
> if (dev->irq_requested_type) {
> assigned_irq_data.flags = dev->irq_requested_type;
> r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
> @@ -889,6 +892,11 @@ static int assign_irq(AssignedDevice *dev)
> dev->irq_requested_type = 0;
> }
>
> + if (intx_route.mode == PCI_INTX_DISABLED) {
> + dev->intx_route = intx_route;
> + return 0;
> + }
> +
> retry:
> assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX;
> if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK &&
> @@ -917,7 +925,7 @@ retry:
> return r;
> }
>
> - dev->girq = irq;
> + dev->intx_route = intx_route;
> dev->irq_requested_type = assigned_irq_data.flags;
> return r;
> }
> @@ -1029,7 +1037,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
> perror("assigned_dev_enable_msi: assign irq");
> }
>
> - assigned_dev->girq = -1;
> + assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
> assigned_dev->irq_requested_type = assigned_irq_data.flags;
> } else {
> assign_irq(assigned_dev);
> @@ -1160,7 +1168,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
> return;
> }
> }
> - assigned_dev->girq = -1;
> + assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
Should both of these set assigned_dev->intx_route.irq = -1 as well? I
don't think it hurts anything this way but we test both mode & irq in
assign_irq() and we'll end up calling kvm_deassign_irq() again.
> assigned_dev->irq_requested_type = assigned_irq_data.flags;
> } else {
> assign_irq(assigned_dev);
> @@ -1784,7 +1792,8 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
> e_intx = dev->dev.config[0x3d] - 1;
> dev->intpin = e_intx;
> dev->run = 0;
> - dev->girq = -1;
> + dev->intx_route.mode = PCI_INTX_DISABLED;
> + dev->intx_route.irq = -1;
And here we set both, so it's a little inconsistent.
> dev->h_segnr = dev->host.domain;
> dev->h_busnr = dev->host.bus;
> dev->h_devfn = PCI_DEVFN(dev->host.slot, dev->host.function);
> diff --git a/hw/pc.h b/hw/pc.h
> index a662090..5b36eb5 100644
> --- a/hw/pc.h
> +++ b/hw/pc.h
> @@ -171,10 +171,6 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
> extern PCIDevice *piix4_dev;
> int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
>
> -int piix_get_irq(int pin);
> -
> -int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
> -
> /* vga.c */
> enum vga_retrace_method {
> VGA_RETRACE_DUMB,
> diff --git a/hw/pci.c b/hw/pci.c
> index 5ef3453..0b22913 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1089,10 +1089,6 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
> pci_change_irq_level(pci_dev, irq_num, change);
> }
>
> -int pci_map_irq(PCIDevice *pci_dev, int pin)
> -{
> - return pci_dev->bus->map_irq(pci_dev, pin);
> -}
> /* 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/hw/pci.h b/hw/pci.h
> index c69af01..4b6ab3d 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -274,8 +274,6 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
> uint8_t attr, MemoryRegion *memory);
> pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num);
>
> -int pci_map_irq(PCIDevice *pci_dev, int pin);
> -
> int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
> uint8_t offset, uint8_t size);
>
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index a5090cb..355814f 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -435,13 +435,6 @@ static void piix3_write_config(PCIDevice *dev,
> }
> }
>
> -int piix_get_irq(int pin)
> -{
> - if (piix3_dev)
> - return piix3_dev->dev.config[0x60+pin];
> - return 0;
> -}
> -
> static void piix3_write_config_xen(PCIDevice *dev,
> uint32_t address, uint32_t val, int len)
> {
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier
2012-08-03 10:52 ` [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier Jan Kiszka
@ 2012-08-03 15:35 ` Alex Williamson
2012-08-03 17:04 ` Jan Kiszka
0 siblings, 1 reply; 8+ messages in thread
From: Alex Williamson @ 2012-08-03 15:35 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Avi Kivity, Marcelo Tosatti, kvm
On Fri, 2012-08-03 at 12:52 +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> Replace the hack in pci_default_write_config with upstream's generic
> callback mechanism to get informed about changes on the PCI INTx
> routing.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> hw/Makefile.objs | 3 +--
> hw/device-assignment.c | 48 ++++++++++++++++--------------------------------
> hw/device-assignment.h | 33 ---------------------------------
> hw/pc.h | 3 ---
> hw/pci.c | 11 -----------
> hw/piix_pci.c | 3 ---
> 6 files changed, 17 insertions(+), 84 deletions(-)
> delete mode 100644 hw/device-assignment.h
>
> diff --git a/hw/Makefile.objs b/hw/Makefile.objs
> index 30f9ba6..fa8bb08 100644
> --- a/hw/Makefile.objs
> +++ b/hw/Makefile.objs
> @@ -3,7 +3,7 @@ hw-obj-y += loader.o
> hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
> hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
> hw-obj-y += fw_cfg.o
> -hw-obj-$(CONFIG_PCI) += pci_bridge.o pci_bridge_dev.o
> +hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o pci_bridge_dev.o
> hw-obj-$(CONFIG_PCI) += msix.o msi.o
> hw-obj-$(CONFIG_PCI) += shpc.o
> hw-obj-$(CONFIG_PCI) += slotid_cap.o
> @@ -164,7 +164,6 @@ obj-$(CONFIG_SOFTMMU) += vhost_net.o
> obj-$(CONFIG_VHOST_NET) += vhost.o
> obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/
> obj-$(CONFIG_NO_PCI) += pci-stub.o
> -obj-$(CONFIG_PCI) += pci.o
> obj-$(CONFIG_VGA) += vga.o
> obj-$(CONFIG_SOFTMMU) += device-hotplug.o
> obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
> index d14c327..7a90027 100644
> --- a/hw/device-assignment.c
> +++ b/hw/device-assignment.c
> @@ -36,7 +36,6 @@
> #include "pc.h"
> #include "qemu-error.h"
> #include "console.h"
> -#include "device-assignment.h"
> #include "loader.h"
> #include "monitor.h"
> #include "range.h"
> @@ -143,6 +142,8 @@ typedef struct AssignedDevice {
> QLIST_ENTRY(AssignedDevice) next;
> } AssignedDevice;
>
> +static void assigned_dev_update_irq_routing(PCIDevice *dev);
> +
> static void assigned_dev_load_option_rom(AssignedDevice *dev);
>
> static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev);
> @@ -869,8 +870,13 @@ static int assign_irq(AssignedDevice *dev)
> int r = 0;
>
> /* Interrupt PIN 0 means don't use INTx */
> - if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
> + if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) {
> + pci_device_set_intx_routing_notifier(&dev->dev, NULL);
> return 0;
> + }
> +
> + pci_device_set_intx_routing_notifier(&dev->dev,
> + assigned_dev_update_irq_routing);
>
> intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
> assert(intx_route.mode != PCI_INTX_INVERTED);
> @@ -944,43 +950,19 @@ static void deassign_device(AssignedDevice *dev)
> dev->dev.qdev.id, strerror(-r));
> }
>
> -#if 0
> -AssignedDevInfo *get_assigned_device(int pcibus, int slot)
> -{
> - AssignedDevice *assigned_dev = NULL;
> - AssignedDevInfo *adev = NULL;
> -
> - QLIST_FOREACH(adev, &adev_head, next) {
> - assigned_dev = adev->assigned_dev;
> - if (pci_bus_num(assigned_dev->dev.bus) == pcibus &&
> - PCI_SLOT(assigned_dev->dev.devfn) == slot)
> - return adev;
> - }
> -
> - return NULL;
> -}
> -#endif
> -
> /* The pci config space got updated. Check if irq numbers have changed
> * for our devices
> */
> -void assigned_dev_update_irqs(void)
> +static void assigned_dev_update_irq_routing(PCIDevice *dev)
> {
> - AssignedDevice *dev, *next;
> + AssignedDevice *assigned_dev = DO_UPCAST(AssignedDevice, dev, dev);
> Error *err = NULL;
> int r;
>
> - dev = QLIST_FIRST(&devs);
> - while (dev) {
> - next = QLIST_NEXT(dev, next);
> - if (dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) {
> - r = assign_irq(dev);
> - if (r < 0) {
> - qdev_unplug(&dev->dev.qdev, &err);
> - assert(!err);
> - }
> - }
> - dev = next;
> + r = assign_irq(assigned_dev);
> + if (r < 0) {
> + qdev_unplug(&dev->qdev, &err);
> + assert(!err);
> }
> }
>
> @@ -1009,6 +991,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
> perror("assigned_dev_update_msi: deassign irq");
>
> assigned_dev->irq_requested_type = 0;
> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
> }
>
> if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
> @@ -1151,6 +1134,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
> perror("assigned_dev_update_msix: deassign irq");
>
> assigned_dev->irq_requested_type = 0;
> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
> }
>
> if (ctrl_word & PCI_MSIX_FLAGS_ENABLE) {
> diff --git a/hw/device-assignment.h b/hw/device-assignment.h
> deleted file mode 100644
> index 3fcb804..0000000
> --- a/hw/device-assignment.h
> +++ /dev/null
> @@ -1,33 +0,0 @@
> -/*
> - * Copyright (c) 2007, Neocleus Corporation.
> - * Copyright (c) 2007, Intel Corporation.
> - *
> - * This program is free software; you can redistribute it and/or modify it
> - * under the terms and conditions of the GNU General Public License,
> - * version 2, as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope it will be useful, but WITHOUT
> - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
> - * more details.
> - *
> - * You should have received a copy of the GNU General Public License along with
> - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
> - * Place - Suite 330, Boston, MA 02111-1307 USA.
> - *
> - * Data structures for storing PCI state
> - *
> - * Adapted to kvm by Qumranet
> - *
> - * Copyright (c) 2007, Neocleus, Alex Novik (alex@neocleus.com)
> - * Copyright (c) 2007, Neocleus, Guy Zana (guy@neocleus.com)
> - * Copyright (C) 2008, Qumranet, Amit Shah (amit.shah@qumranet.com)
> - * Copyright (C) 2008, Red Hat, Amit Shah (amit.shah@redhat.com)
> - */
> -
> -#ifndef __DEVICE_ASSIGNMENT_H__
> -#define __DEVICE_ASSIGNMENT_H__
> -
> -void assigned_dev_update_irqs(void);
> -
> -#endif /* __DEVICE_ASSIGNMENT_H__ */
> diff --git a/hw/pc.h b/hw/pc.h
> index 5b36eb5..31ccb6f 100644
> --- a/hw/pc.h
> +++ b/hw/pc.h
> @@ -149,9 +149,6 @@ void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
> extern int no_hpet;
>
> /* piix_pci.c */
> -/* config space register for IRQ routing */
> -#define PIIX_CONFIG_IRQ_ROUTE 0x60
> -
> struct PCII440FXState;
> typedef struct PCII440FXState PCII440FXState;
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 0b22913..4d95984 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -29,9 +29,6 @@
> #include "net.h"
> #include "sysemu.h"
> #include "loader.h"
> -#include "hw/pc.h"
> -#include "kvm.h"
> -#include "device-assignment.h"
> #include "range.h"
> #include "qmp-commands.h"
> #include "msi.h"
> @@ -1048,14 +1045,6 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
> d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
> }
> -
> -#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
> - if (kvm_enabled() && kvm_irqchip_in_kernel() &&
> - addr >= PIIX_CONFIG_IRQ_ROUTE &&
> - addr < PIIX_CONFIG_IRQ_ROUTE + 4)
> - assigned_dev_update_irqs();
> -#endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */
> -
> if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
> ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
> ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index 355814f..c497a01 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -250,8 +250,6 @@ static int i440fx_initfn(PCIDevice *dev)
> return 0;
> }
>
> -static PIIX3State *piix3_dev;
> -
> static PCIBus *i440fx_common_init(const char *device_name,
> PCII440FXState **pi440fx_state,
> int *piix3_devfn,
> @@ -331,7 +329,6 @@ static PCIBus *i440fx_common_init(const char *device_name,
> ram_size = 255;
> (*pi440fx_state)->dev.config[0x57]=ram_size;
>
> - piix3_dev = piix3;
> i440fx_update_memory_mappings(f);
>
> return b;
For vfio I chose to leave the intx routing notifier in place for msi &
msix as we can easily ignore it when not using intx. I don't see much
advantage to one over the other though.
Acked-by: Alex Williamson <alex.williamson@redhat.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface
2012-08-03 15:26 ` [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Alex Williamson
@ 2012-08-03 17:02 ` Jan Kiszka
2012-08-03 17:12 ` Alex Williamson
2012-08-13 19:29 ` Marcelo Tosatti
0 siblings, 2 replies; 8+ messages in thread
From: Jan Kiszka @ 2012-08-03 17:02 UTC (permalink / raw)
To: Avi Kivity, Marcelo Tosatti; +Cc: Alex Williamson, kvm
From: Jan Kiszka <jan.kiszka@siemens.com>
Drop pci_map_irq/piix_get_irq in favor of upstream's new interface. This
should also properly model disabling of the line at PCI host controller
level.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
Changes in v2:
- always set intx_route.irq to -1 when disabling
hw/device-assignment.c | 31 +++++++++++++++++++++----------
hw/pc.h | 4 ----
hw/pci.c | 4 ----
hw/pci.h | 2 --
hw/piix_pci.c | 7 -------
5 files changed, 21 insertions(+), 27 deletions(-)
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index cc39958..35fc604 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -115,7 +115,7 @@ typedef struct AssignedDevice {
AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
PCIDevRegions real_device;
int run;
- int girq;
+ PCIINTxRoute intx_route;
uint16_t h_segnr;
uint8_t h_busnr;
uint8_t h_devfn;
@@ -865,21 +865,24 @@ static int assign_device(AssignedDevice *dev)
static int assign_irq(AssignedDevice *dev)
{
struct kvm_assigned_irq assigned_irq_data;
- int irq, r = 0;
+ PCIINTxRoute intx_route;
+ int r = 0;
/* Interrupt PIN 0 means don't use INTx */
if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
return 0;
- irq = pci_map_irq(&dev->dev, dev->intpin);
- irq = piix_get_irq(irq);
+ intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
+ assert(intx_route.mode != PCI_INTX_INVERTED);
- if (dev->girq == irq)
+ if (dev->intx_route.mode == intx_route.mode &&
+ dev->intx_route.irq == intx_route.irq) {
return r;
+ }
memset(&assigned_irq_data, 0, sizeof(assigned_irq_data));
assigned_irq_data.assigned_dev_id = calc_assigned_dev_id(dev);
- assigned_irq_data.guest_irq = irq;
+ assigned_irq_data.guest_irq = intx_route.irq;
if (dev->irq_requested_type) {
assigned_irq_data.flags = dev->irq_requested_type;
r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
@@ -889,6 +892,11 @@ static int assign_irq(AssignedDevice *dev)
dev->irq_requested_type = 0;
}
+ if (intx_route.mode == PCI_INTX_DISABLED) {
+ dev->intx_route = intx_route;
+ return 0;
+ }
+
retry:
assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX;
if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK &&
@@ -917,7 +925,7 @@ retry:
return r;
}
- dev->girq = irq;
+ dev->intx_route = intx_route;
dev->irq_requested_type = assigned_irq_data.flags;
return r;
}
@@ -1029,7 +1037,8 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
perror("assigned_dev_enable_msi: assign irq");
}
- assigned_dev->girq = -1;
+ assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
+ assigned_dev->intx_route.irq = -1;
assigned_dev->irq_requested_type = assigned_irq_data.flags;
} else {
assign_irq(assigned_dev);
@@ -1160,7 +1169,8 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
return;
}
}
- assigned_dev->girq = -1;
+ assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
+ assigned_dev->intx_route.irq = -1;
assigned_dev->irq_requested_type = assigned_irq_data.flags;
} else {
assign_irq(assigned_dev);
@@ -1784,7 +1794,8 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
e_intx = dev->dev.config[0x3d] - 1;
dev->intpin = e_intx;
dev->run = 0;
- dev->girq = -1;
+ dev->intx_route.mode = PCI_INTX_DISABLED;
+ dev->intx_route.irq = -1;
dev->h_segnr = dev->host.domain;
dev->h_busnr = dev->host.bus;
dev->h_devfn = PCI_DEVFN(dev->host.slot, dev->host.function);
diff --git a/hw/pc.h b/hw/pc.h
index a662090..5b36eb5 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -171,10 +171,6 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
extern PCIDevice *piix4_dev;
int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
-int piix_get_irq(int pin);
-
-int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
-
/* vga.c */
enum vga_retrace_method {
VGA_RETRACE_DUMB,
diff --git a/hw/pci.c b/hw/pci.c
index 5ef3453..0b22913 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1089,10 +1089,6 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
pci_change_irq_level(pci_dev, irq_num, change);
}
-int pci_map_irq(PCIDevice *pci_dev, int pin)
-{
- return pci_dev->bus->map_irq(pci_dev, pin);
-}
/* 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/hw/pci.h b/hw/pci.h
index c69af01..4b6ab3d 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -274,8 +274,6 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
uint8_t attr, MemoryRegion *memory);
pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num);
-int pci_map_irq(PCIDevice *pci_dev, int pin);
-
int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
uint8_t offset, uint8_t size);
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index a5090cb..355814f 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -435,13 +435,6 @@ static void piix3_write_config(PCIDevice *dev,
}
}
-int piix_get_irq(int pin)
-{
- if (piix3_dev)
- return piix3_dev->dev.config[0x60+pin];
- return 0;
-}
-
static void piix3_write_config_xen(PCIDevice *dev,
uint32_t address, uint32_t val, int len)
{
--
1.7.3.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier
2012-08-03 15:35 ` Alex Williamson
@ 2012-08-03 17:04 ` Jan Kiszka
0 siblings, 0 replies; 8+ messages in thread
From: Jan Kiszka @ 2012-08-03 17:04 UTC (permalink / raw)
To: Alex Williamson; +Cc: Avi Kivity, Marcelo Tosatti, kvm
[-- Attachment #1: Type: text/plain, Size: 9632 bytes --]
On 2012-08-03 17:35, Alex Williamson wrote:
> On Fri, 2012-08-03 at 12:52 +0200, Jan Kiszka wrote:
>> From: Jan Kiszka <jan.kiszka@siemens.com>
>>
>> Replace the hack in pci_default_write_config with upstream's generic
>> callback mechanism to get informed about changes on the PCI INTx
>> routing.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>> ---
>> hw/Makefile.objs | 3 +--
>> hw/device-assignment.c | 48 ++++++++++++++++--------------------------------
>> hw/device-assignment.h | 33 ---------------------------------
>> hw/pc.h | 3 ---
>> hw/pci.c | 11 -----------
>> hw/piix_pci.c | 3 ---
>> 6 files changed, 17 insertions(+), 84 deletions(-)
>> delete mode 100644 hw/device-assignment.h
>>
>> diff --git a/hw/Makefile.objs b/hw/Makefile.objs
>> index 30f9ba6..fa8bb08 100644
>> --- a/hw/Makefile.objs
>> +++ b/hw/Makefile.objs
>> @@ -3,7 +3,7 @@ hw-obj-y += loader.o
>> hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
>> hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
>> hw-obj-y += fw_cfg.o
>> -hw-obj-$(CONFIG_PCI) += pci_bridge.o pci_bridge_dev.o
>> +hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o pci_bridge_dev.o
>> hw-obj-$(CONFIG_PCI) += msix.o msi.o
>> hw-obj-$(CONFIG_PCI) += shpc.o
>> hw-obj-$(CONFIG_PCI) += slotid_cap.o
>> @@ -164,7 +164,6 @@ obj-$(CONFIG_SOFTMMU) += vhost_net.o
>> obj-$(CONFIG_VHOST_NET) += vhost.o
>> obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/
>> obj-$(CONFIG_NO_PCI) += pci-stub.o
>> -obj-$(CONFIG_PCI) += pci.o
>> obj-$(CONFIG_VGA) += vga.o
>> obj-$(CONFIG_SOFTMMU) += device-hotplug.o
>> obj-$(CONFIG_XEN) += xen_domainbuild.o xen_machine_pv.o
>> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
>> index d14c327..7a90027 100644
>> --- a/hw/device-assignment.c
>> +++ b/hw/device-assignment.c
>> @@ -36,7 +36,6 @@
>> #include "pc.h"
>> #include "qemu-error.h"
>> #include "console.h"
>> -#include "device-assignment.h"
>> #include "loader.h"
>> #include "monitor.h"
>> #include "range.h"
>> @@ -143,6 +142,8 @@ typedef struct AssignedDevice {
>> QLIST_ENTRY(AssignedDevice) next;
>> } AssignedDevice;
>>
>> +static void assigned_dev_update_irq_routing(PCIDevice *dev);
>> +
>> static void assigned_dev_load_option_rom(AssignedDevice *dev);
>>
>> static void assigned_dev_unregister_msix_mmio(AssignedDevice *dev);
>> @@ -869,8 +870,13 @@ static int assign_irq(AssignedDevice *dev)
>> int r = 0;
>>
>> /* Interrupt PIN 0 means don't use INTx */
>> - if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
>> + if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0) {
>> + pci_device_set_intx_routing_notifier(&dev->dev, NULL);
>> return 0;
>> + }
>> +
>> + pci_device_set_intx_routing_notifier(&dev->dev,
>> + assigned_dev_update_irq_routing);
>>
>> intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
>> assert(intx_route.mode != PCI_INTX_INVERTED);
>> @@ -944,43 +950,19 @@ static void deassign_device(AssignedDevice *dev)
>> dev->dev.qdev.id, strerror(-r));
>> }
>>
>> -#if 0
>> -AssignedDevInfo *get_assigned_device(int pcibus, int slot)
>> -{
>> - AssignedDevice *assigned_dev = NULL;
>> - AssignedDevInfo *adev = NULL;
>> -
>> - QLIST_FOREACH(adev, &adev_head, next) {
>> - assigned_dev = adev->assigned_dev;
>> - if (pci_bus_num(assigned_dev->dev.bus) == pcibus &&
>> - PCI_SLOT(assigned_dev->dev.devfn) == slot)
>> - return adev;
>> - }
>> -
>> - return NULL;
>> -}
>> -#endif
>> -
>> /* The pci config space got updated. Check if irq numbers have changed
>> * for our devices
>> */
>> -void assigned_dev_update_irqs(void)
>> +static void assigned_dev_update_irq_routing(PCIDevice *dev)
>> {
>> - AssignedDevice *dev, *next;
>> + AssignedDevice *assigned_dev = DO_UPCAST(AssignedDevice, dev, dev);
>> Error *err = NULL;
>> int r;
>>
>> - dev = QLIST_FIRST(&devs);
>> - while (dev) {
>> - next = QLIST_NEXT(dev, next);
>> - if (dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) {
>> - r = assign_irq(dev);
>> - if (r < 0) {
>> - qdev_unplug(&dev->dev.qdev, &err);
>> - assert(!err);
>> - }
>> - }
>> - dev = next;
>> + r = assign_irq(assigned_dev);
>> + if (r < 0) {
>> + qdev_unplug(&dev->qdev, &err);
>> + assert(!err);
>> }
>> }
>>
>> @@ -1009,6 +991,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
>> perror("assigned_dev_update_msi: deassign irq");
>>
>> assigned_dev->irq_requested_type = 0;
>> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
>> }
>>
>> if (ctrl_byte & PCI_MSI_FLAGS_ENABLE) {
>> @@ -1151,6 +1134,7 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
>> perror("assigned_dev_update_msix: deassign irq");
>>
>> assigned_dev->irq_requested_type = 0;
>> + pci_device_set_intx_routing_notifier(pci_dev, NULL);
>> }
>>
>> if (ctrl_word & PCI_MSIX_FLAGS_ENABLE) {
>> diff --git a/hw/device-assignment.h b/hw/device-assignment.h
>> deleted file mode 100644
>> index 3fcb804..0000000
>> --- a/hw/device-assignment.h
>> +++ /dev/null
>> @@ -1,33 +0,0 @@
>> -/*
>> - * Copyright (c) 2007, Neocleus Corporation.
>> - * Copyright (c) 2007, Intel Corporation.
>> - *
>> - * This program is free software; you can redistribute it and/or modify it
>> - * under the terms and conditions of the GNU General Public License,
>> - * version 2, as published by the Free Software Foundation.
>> - *
>> - * This program is distributed in the hope it will be useful, but WITHOUT
>> - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>> - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
>> - * more details.
>> - *
>> - * You should have received a copy of the GNU General Public License along with
>> - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
>> - * Place - Suite 330, Boston, MA 02111-1307 USA.
>> - *
>> - * Data structures for storing PCI state
>> - *
>> - * Adapted to kvm by Qumranet
>> - *
>> - * Copyright (c) 2007, Neocleus, Alex Novik (alex@neocleus.com)
>> - * Copyright (c) 2007, Neocleus, Guy Zana (guy@neocleus.com)
>> - * Copyright (C) 2008, Qumranet, Amit Shah (amit.shah@qumranet.com)
>> - * Copyright (C) 2008, Red Hat, Amit Shah (amit.shah@redhat.com)
>> - */
>> -
>> -#ifndef __DEVICE_ASSIGNMENT_H__
>> -#define __DEVICE_ASSIGNMENT_H__
>> -
>> -void assigned_dev_update_irqs(void);
>> -
>> -#endif /* __DEVICE_ASSIGNMENT_H__ */
>> diff --git a/hw/pc.h b/hw/pc.h
>> index 5b36eb5..31ccb6f 100644
>> --- a/hw/pc.h
>> +++ b/hw/pc.h
>> @@ -149,9 +149,6 @@ void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
>> extern int no_hpet;
>>
>> /* piix_pci.c */
>> -/* config space register for IRQ routing */
>> -#define PIIX_CONFIG_IRQ_ROUTE 0x60
>> -
>> struct PCII440FXState;
>> typedef struct PCII440FXState PCII440FXState;
>>
>> diff --git a/hw/pci.c b/hw/pci.c
>> index 0b22913..4d95984 100644
>> --- a/hw/pci.c
>> +++ b/hw/pci.c
>> @@ -29,9 +29,6 @@
>> #include "net.h"
>> #include "sysemu.h"
>> #include "loader.h"
>> -#include "hw/pc.h"
>> -#include "kvm.h"
>> -#include "device-assignment.h"
>> #include "range.h"
>> #include "qmp-commands.h"
>> #include "msi.h"
>> @@ -1048,14 +1045,6 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
>> d->config[addr + i] = (d->config[addr + i] & ~wmask) | (val & wmask);
>> d->config[addr + i] &= ~(val & w1cmask); /* W1C: Write 1 to Clear */
>> }
>> -
>> -#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
>> - if (kvm_enabled() && kvm_irqchip_in_kernel() &&
>> - addr >= PIIX_CONFIG_IRQ_ROUTE &&
>> - addr < PIIX_CONFIG_IRQ_ROUTE + 4)
>> - assigned_dev_update_irqs();
>> -#endif /* CONFIG_KVM_DEVICE_ASSIGNMENT */
>> -
>> if (ranges_overlap(addr, l, PCI_BASE_ADDRESS_0, 24) ||
>> ranges_overlap(addr, l, PCI_ROM_ADDRESS, 4) ||
>> ranges_overlap(addr, l, PCI_ROM_ADDRESS1, 4) ||
>> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
>> index 355814f..c497a01 100644
>> --- a/hw/piix_pci.c
>> +++ b/hw/piix_pci.c
>> @@ -250,8 +250,6 @@ static int i440fx_initfn(PCIDevice *dev)
>> return 0;
>> }
>>
>> -static PIIX3State *piix3_dev;
>> -
>> static PCIBus *i440fx_common_init(const char *device_name,
>> PCII440FXState **pi440fx_state,
>> int *piix3_devfn,
>> @@ -331,7 +329,6 @@ static PCIBus *i440fx_common_init(const char *device_name,
>> ram_size = 255;
>> (*pi440fx_state)->dev.config[0x57]=ram_size;
>>
>> - piix3_dev = piix3;
>> i440fx_update_memory_mappings(f);
>>
>> return b;
>
> For vfio I chose to leave the intx routing notifier in place for msi &
> msix as we can easily ignore it when not using intx. I don't see much
> advantage to one over the other though.
Probably. When you don't disable, then you have to check in the callback
if the IRQ is actually registered, but that's a nit as well.
>
> Acked-by: Alex Williamson <alex.williamson@redhat.com>
>
Thanks,
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface
2012-08-03 17:02 ` [PATCH v2 " Jan Kiszka
@ 2012-08-03 17:12 ` Alex Williamson
2012-08-13 19:29 ` Marcelo Tosatti
1 sibling, 0 replies; 8+ messages in thread
From: Alex Williamson @ 2012-08-03 17:12 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Avi Kivity, Marcelo Tosatti, kvm
On Fri, 2012-08-03 at 19:02 +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> Drop pci_map_irq/piix_get_irq in favor of upstream's new interface. This
> should also properly model disabling of the line at PCI host controller
> level.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>
> Changes in v2:
> - always set intx_route.irq to -1 when disabling
>
> hw/device-assignment.c | 31 +++++++++++++++++++++----------
> hw/pc.h | 4 ----
> hw/pci.c | 4 ----
> hw/pci.h | 2 --
> hw/piix_pci.c | 7 -------
> 5 files changed, 21 insertions(+), 27 deletions(-)
>
> diff --git a/hw/device-assignment.c b/hw/device-assignment.c
> index cc39958..35fc604 100644
> --- a/hw/device-assignment.c
> +++ b/hw/device-assignment.c
> @@ -115,7 +115,7 @@ typedef struct AssignedDevice {
> AssignedDevRegion v_addrs[PCI_NUM_REGIONS - 1];
> PCIDevRegions real_device;
> int run;
> - int girq;
> + PCIINTxRoute intx_route;
> uint16_t h_segnr;
> uint8_t h_busnr;
> uint8_t h_devfn;
> @@ -865,21 +865,24 @@ static int assign_device(AssignedDevice *dev)
> static int assign_irq(AssignedDevice *dev)
> {
> struct kvm_assigned_irq assigned_irq_data;
> - int irq, r = 0;
> + PCIINTxRoute intx_route;
> + int r = 0;
>
> /* Interrupt PIN 0 means don't use INTx */
> if (assigned_dev_pci_read_byte(&dev->dev, PCI_INTERRUPT_PIN) == 0)
> return 0;
>
> - irq = pci_map_irq(&dev->dev, dev->intpin);
> - irq = piix_get_irq(irq);
> + intx_route = pci_device_route_intx_to_irq(&dev->dev, 0);
> + assert(intx_route.mode != PCI_INTX_INVERTED);
>
> - if (dev->girq == irq)
> + if (dev->intx_route.mode == intx_route.mode &&
> + dev->intx_route.irq == intx_route.irq) {
> return r;
> + }
>
> memset(&assigned_irq_data, 0, sizeof(assigned_irq_data));
> assigned_irq_data.assigned_dev_id = calc_assigned_dev_id(dev);
> - assigned_irq_data.guest_irq = irq;
> + assigned_irq_data.guest_irq = intx_route.irq;
> if (dev->irq_requested_type) {
> assigned_irq_data.flags = dev->irq_requested_type;
> r = kvm_deassign_irq(kvm_state, &assigned_irq_data);
> @@ -889,6 +892,11 @@ static int assign_irq(AssignedDevice *dev)
> dev->irq_requested_type = 0;
> }
>
> + if (intx_route.mode == PCI_INTX_DISABLED) {
> + dev->intx_route = intx_route;
> + return 0;
> + }
> +
> retry:
> assigned_irq_data.flags = KVM_DEV_IRQ_GUEST_INTX;
> if (dev->features & ASSIGNED_DEVICE_PREFER_MSI_MASK &&
> @@ -917,7 +925,7 @@ retry:
> return r;
> }
>
> - dev->girq = irq;
> + dev->intx_route = intx_route;
> dev->irq_requested_type = assigned_irq_data.flags;
> return r;
> }
> @@ -1029,7 +1037,8 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
> perror("assigned_dev_enable_msi: assign irq");
> }
>
> - assigned_dev->girq = -1;
> + assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
> + assigned_dev->intx_route.irq = -1;
> assigned_dev->irq_requested_type = assigned_irq_data.flags;
> } else {
> assign_irq(assigned_dev);
> @@ -1160,7 +1169,8 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
> return;
> }
> }
> - assigned_dev->girq = -1;
> + assigned_dev->intx_route.mode = PCI_INTX_DISABLED;
> + assigned_dev->intx_route.irq = -1;
> assigned_dev->irq_requested_type = assigned_irq_data.flags;
> } else {
> assign_irq(assigned_dev);
> @@ -1784,7 +1794,8 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
> e_intx = dev->dev.config[0x3d] - 1;
> dev->intpin = e_intx;
> dev->run = 0;
> - dev->girq = -1;
> + dev->intx_route.mode = PCI_INTX_DISABLED;
> + dev->intx_route.irq = -1;
> dev->h_segnr = dev->host.domain;
> dev->h_busnr = dev->host.bus;
> dev->h_devfn = PCI_DEVFN(dev->host.slot, dev->host.function);
> diff --git a/hw/pc.h b/hw/pc.h
> index a662090..5b36eb5 100644
> --- a/hw/pc.h
> +++ b/hw/pc.h
> @@ -171,10 +171,6 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
> extern PCIDevice *piix4_dev;
> int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
>
> -int piix_get_irq(int pin);
> -
> -int ipf_map_irq(PCIDevice *pci_dev, int irq_num);
> -
> /* vga.c */
> enum vga_retrace_method {
> VGA_RETRACE_DUMB,
> diff --git a/hw/pci.c b/hw/pci.c
> index 5ef3453..0b22913 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1089,10 +1089,6 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
> pci_change_irq_level(pci_dev, irq_num, change);
> }
>
> -int pci_map_irq(PCIDevice *pci_dev, int pin)
> -{
> - return pci_dev->bus->map_irq(pci_dev, pin);
> -}
> /* 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/hw/pci.h b/hw/pci.h
> index c69af01..4b6ab3d 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -274,8 +274,6 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
> uint8_t attr, MemoryRegion *memory);
> pcibus_t pci_get_bar_addr(PCIDevice *pci_dev, int region_num);
>
> -int pci_map_irq(PCIDevice *pci_dev, int pin);
> -
> int pci_add_capability(PCIDevice *pdev, uint8_t cap_id,
> uint8_t offset, uint8_t size);
>
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index a5090cb..355814f 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -435,13 +435,6 @@ static void piix3_write_config(PCIDevice *dev,
> }
> }
>
> -int piix_get_irq(int pin)
> -{
> - if (piix3_dev)
> - return piix3_dev->dev.config[0x60+pin];
> - return 0;
> -}
> -
> static void piix3_write_config_xen(PCIDevice *dev,
> uint32_t address, uint32_t val, int len)
> {
Acked-by: Alex Williamson <alex.williamson@redhat.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface
2012-08-03 17:02 ` [PATCH v2 " Jan Kiszka
2012-08-03 17:12 ` Alex Williamson
@ 2012-08-13 19:29 ` Marcelo Tosatti
1 sibling, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2012-08-13 19:29 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Avi Kivity, Alex Williamson, kvm
On Fri, Aug 03, 2012 at 07:02:40PM +0200, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> Drop pci_map_irq/piix_get_irq in favor of upstream's new interface. This
> should also properly model disabling of the line at PCI host controller
> level.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>
> Changes in v2:
> - always set intx_route.irq to -1 when disabling
Applied, thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2012-08-13 19:29 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-03 10:51 [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Jan Kiszka
2012-08-03 10:52 ` [PATCH 2/2] pci-assign: Use pci_device_set_intx_routing_notifier Jan Kiszka
2012-08-03 15:35 ` Alex Williamson
2012-08-03 17:04 ` Jan Kiszka
2012-08-03 15:26 ` [PATCH 1/2] pci-assign: Switch to pci_device_route_intx_to_irq interface Alex Williamson
2012-08-03 17:02 ` [PATCH v2 " Jan Kiszka
2012-08-03 17:12 ` Alex Williamson
2012-08-13 19:29 ` Marcelo Tosatti
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).