mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
xen: implement xen_hvm_register_pirq
xen_hvm_register_pirq allows the kernel to map a GSI into a Xen pirq and receive the interrupt as an event channel from that point on. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
01557baff6
commit
42a1de56f3
3 changed files with 71 additions and 1 deletions
|
@ -17,6 +17,44 @@
|
||||||
#include <xen/events.h>
|
#include <xen/events.h>
|
||||||
#include <asm/xen/pci.h>
|
#include <asm/xen/pci.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI
|
||||||
|
static int xen_hvm_register_pirq(u32 gsi, int triggering)
|
||||||
|
{
|
||||||
|
int rc, irq;
|
||||||
|
struct physdev_map_pirq map_irq;
|
||||||
|
int shareable = 0;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
if (!xen_hvm_domain())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
map_irq.domid = DOMID_SELF;
|
||||||
|
map_irq.type = MAP_PIRQ_TYPE_GSI;
|
||||||
|
map_irq.index = gsi;
|
||||||
|
map_irq.pirq = -1;
|
||||||
|
|
||||||
|
rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);
|
||||||
|
if (rc) {
|
||||||
|
printk(KERN_WARNING "xen map irq failed %d\n", rc);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggering == ACPI_EDGE_SENSITIVE) {
|
||||||
|
shareable = 0;
|
||||||
|
name = "ioapic-edge";
|
||||||
|
} else {
|
||||||
|
shareable = 1;
|
||||||
|
name = "ioapic-level";
|
||||||
|
}
|
||||||
|
|
||||||
|
irq = xen_map_pirq_gsi(map_irq.pirq, gsi, shareable, name);
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq);
|
||||||
|
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_PCI_MSI)
|
#if defined(CONFIG_PCI_MSI)
|
||||||
#include <linux/msi.h>
|
#include <linux/msi.h>
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <asm/idle.h>
|
#include <asm/idle.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
#include <asm/sync_bitops.h>
|
#include <asm/sync_bitops.h>
|
||||||
|
#include <asm/xen/pci.h>
|
||||||
#include <asm/xen/hypercall.h>
|
#include <asm/xen/hypercall.h>
|
||||||
#include <asm/xen/hypervisor.h>
|
#include <asm/xen/hypervisor.h>
|
||||||
|
|
||||||
|
@ -75,7 +76,8 @@ enum xen_irq_type {
|
||||||
* event channel - irq->event channel mapping
|
* event channel - irq->event channel mapping
|
||||||
* cpu - cpu this event channel is bound to
|
* cpu - cpu this event channel is bound to
|
||||||
* index - type-specific information:
|
* index - type-specific information:
|
||||||
* PIRQ - vector, with MSB being "needs EIO"
|
* PIRQ - vector, with MSB being "needs EIO", or physical IRQ of the HVM
|
||||||
|
* guest, or GSI (real passthrough IRQ) of the device.
|
||||||
* VIRQ - virq number
|
* VIRQ - virq number
|
||||||
* IPI - IPI vector
|
* IPI - IPI vector
|
||||||
* EVTCHN -
|
* EVTCHN -
|
||||||
|
|
|
@ -106,6 +106,36 @@ struct physdev_irq {
|
||||||
uint32_t vector;
|
uint32_t vector;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MAP_PIRQ_TYPE_MSI 0x0
|
||||||
|
#define MAP_PIRQ_TYPE_GSI 0x1
|
||||||
|
#define MAP_PIRQ_TYPE_UNKNOWN 0x2
|
||||||
|
|
||||||
|
#define PHYSDEVOP_map_pirq 13
|
||||||
|
struct physdev_map_pirq {
|
||||||
|
domid_t domid;
|
||||||
|
/* IN */
|
||||||
|
int type;
|
||||||
|
/* IN */
|
||||||
|
int index;
|
||||||
|
/* IN or OUT */
|
||||||
|
int pirq;
|
||||||
|
/* IN */
|
||||||
|
int bus;
|
||||||
|
/* IN */
|
||||||
|
int devfn;
|
||||||
|
/* IN */
|
||||||
|
int entry_nr;
|
||||||
|
/* IN */
|
||||||
|
uint64_t table_base;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PHYSDEVOP_unmap_pirq 14
|
||||||
|
struct physdev_unmap_pirq {
|
||||||
|
domid_t domid;
|
||||||
|
/* IN */
|
||||||
|
int pirq;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
|
* Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
|
||||||
* hypercall since 0x00030202.
|
* hypercall since 0x00030202.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue