Commit f4d0635b authored by Ian Campbell's avatar Ian Campbell Committed by Konrad Rzeszutek Wilk

xen: events: refactor GSI pirq bindings functions

Following the example set by xen_allocate_pirq_msi and
xen_bind_pirq_msi_to_irq:

xen_allocate_pirq becomes xen_allocate_pirq_gsi and now only allocates
a pirq number and does not bind it.

xen_map_pirq_gsi becomes xen_bind_pirq_gsi_to_irq and binds an
existing pirq.
Signed-off-by: default avatarIan Campbell <ian.campbell@citrix.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 0a85226f
...@@ -50,7 +50,7 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi, ...@@ -50,7 +50,7 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi,
name = "ioapic-level"; name = "ioapic-level";
} }
irq = xen_map_pirq_gsi(map_irq.pirq, gsi, shareable, name); irq = xen_bind_pirq_gsi_to_irq(gsi, map_irq.pirq, shareable, name);
printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq); printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq);
...@@ -237,6 +237,7 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev) ...@@ -237,6 +237,7 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
{ {
int rc; int rc;
int share = 1; int share = 1;
int pirq;
u8 gsi; u8 gsi;
rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi); rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
...@@ -246,13 +247,21 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev) ...@@ -246,13 +247,21 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
return rc; return rc;
} }
rc = xen_allocate_pirq_gsi(gsi);
if (rc < 0) {
dev_warn(&dev->dev, "Xen PCI: failed to allocate a PIRQ for GSI%d: %d\n",
gsi, rc);
return rc;
}
pirq = rc;
if (gsi < NR_IRQS_LEGACY) if (gsi < NR_IRQS_LEGACY)
share = 0; share = 0;
rc = xen_allocate_pirq(gsi, share, "pcifront"); rc = xen_bind_pirq_gsi_to_irq(gsi, pirq, share, "pcifront");
if (rc < 0) { if (rc < 0) {
dev_warn(&dev->dev, "Xen PCI: failed to register GSI%d: %d\n", dev_warn(&dev->dev, "Xen PCI: failed to bind GSI%d (PIRQ%d) to IRQ: %d\n",
gsi, rc); gsi, pirq, rc);
return rc; return rc;
} }
...@@ -309,7 +318,7 @@ int __init pci_xen_hvm_init(void) ...@@ -309,7 +318,7 @@ int __init pci_xen_hvm_init(void)
#ifdef CONFIG_XEN_DOM0 #ifdef CONFIG_XEN_DOM0
static int xen_register_pirq(u32 gsi, int triggering) static int xen_register_pirq(u32 gsi, int triggering)
{ {
int rc, irq; int rc, pirq, irq = -1;
struct physdev_map_pirq map_irq; struct physdev_map_pirq map_irq;
int shareable = 0; int shareable = 0;
char *name; char *name;
...@@ -325,17 +334,20 @@ static int xen_register_pirq(u32 gsi, int triggering) ...@@ -325,17 +334,20 @@ static int xen_register_pirq(u32 gsi, int triggering)
name = "ioapic-level"; name = "ioapic-level";
} }
irq = xen_allocate_pirq(gsi, shareable, name); pirq = xen_allocate_pirq_gsi(gsi);
if (pirq < 0)
printk(KERN_DEBUG "xen: --> irq=%d\n", irq); goto out;
irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
if (irq < 0) if (irq < 0)
goto out; goto out;
printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq);
map_irq.domid = DOMID_SELF; map_irq.domid = DOMID_SELF;
map_irq.type = MAP_PIRQ_TYPE_GSI; map_irq.type = MAP_PIRQ_TYPE_GSI;
map_irq.index = gsi; map_irq.index = gsi;
map_irq.pirq = irq; map_irq.pirq = pirq;
rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);
if (rc) { if (rc) {
...@@ -422,13 +434,18 @@ static int __init pci_xen_initial_domain(void) ...@@ -422,13 +434,18 @@ static int __init pci_xen_initial_domain(void)
void __init xen_setup_pirqs(void) void __init xen_setup_pirqs(void)
{ {
int irq; int pirq, irq;
pci_xen_initial_domain(); pci_xen_initial_domain();
if (0 == nr_ioapics) { if (0 == nr_ioapics) {
for (irq = 0; irq < NR_IRQS_LEGACY; irq++) for (irq = 0; irq < NR_IRQS_LEGACY; irq++) {
xen_allocate_pirq(irq, 0, "xt-pic"); pirq = xen_allocate_pirq_gsi(irq);
if (WARN(pirq < 0,
"Could not allocate PIRQ for legacy interrupt\n"))
break;
irq = xen_bind_pirq_gsi_to_irq(irq, pirq, 0, "xt-pic");
}
return; return;
} }
......
...@@ -568,9 +568,9 @@ static int find_irq_by_gsi(unsigned gsi) ...@@ -568,9 +568,9 @@ static int find_irq_by_gsi(unsigned gsi)
return -1; return -1;
} }
int xen_allocate_pirq(unsigned gsi, int shareable, char *name) int xen_allocate_pirq_gsi(unsigned gsi)
{ {
return xen_map_pirq_gsi(gsi, gsi, shareable, name); return gsi;
} }
/* /*
...@@ -580,7 +580,8 @@ int xen_allocate_pirq(unsigned gsi, int shareable, char *name) ...@@ -580,7 +580,8 @@ int xen_allocate_pirq(unsigned gsi, int shareable, char *name)
* Note: We don't assign an event channel until the irq actually started * Note: We don't assign an event channel until the irq actually started
* up. Return an existing irq if we've already got one for the gsi. * up. Return an existing irq if we've already got one for the gsi.
*/ */
int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name) int xen_bind_pirq_gsi_to_irq(unsigned gsi,
unsigned pirq, int shareable, char *name)
{ {
int irq = -1; int irq = -1;
struct physdev_irq irq_op; struct physdev_irq irq_op;
......
...@@ -68,12 +68,16 @@ int xen_set_callback_via(uint64_t via); ...@@ -68,12 +68,16 @@ int xen_set_callback_via(uint64_t via);
void xen_evtchn_do_upcall(struct pt_regs *regs); void xen_evtchn_do_upcall(struct pt_regs *regs);
void xen_hvm_evtchn_do_upcall(void); void xen_hvm_evtchn_do_upcall(void);
/* Allocate an irq for a physical interrupt, given a gsi. */ /* Allocate a pirq for a physical interrupt, given a gsi. */
int xen_allocate_pirq(unsigned gsi, int shareable, char *name); int xen_allocate_pirq_gsi(unsigned gsi);
int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name); /* Bind a pirq for a physical interrupt to an irq. */
int xen_bind_pirq_gsi_to_irq(unsigned gsi,
unsigned pirq, int shareable, char *name);
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
/* Allocate a pirq for a MSI style physical interrupt. */
int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc); int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc);
/* Bind an PSI pirq to an irq. */
int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc, int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc,
int pirq, int vector, const char *name); int pirq, int vector, const char *name);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment