Skip to content

Commit

Permalink
xen/arm: receive Xen events on ARM
Browse files Browse the repository at this point in the history
Compile events.c on ARM.
Parse, map and enable the IRQ to get event notifications from the device
tree (node "/xen").

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  • Loading branch information
Stefano Stabellini committed Sep 14, 2012
1 parent b3b52fd commit 0ec53ec
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 4 deletions.
18 changes: 18 additions & 0 deletions arch/arm/include/asm/xen/events.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef _ASM_ARM_XEN_EVENTS_H
#define _ASM_ARM_XEN_EVENTS_H

#include <asm/ptrace.h>

enum ipi_vector {
XEN_PLACEHOLDER_VECTOR,

/* Xen IPIs go here */
XEN_NR_IPIS,
};

static inline int xen_irqs_disabled(struct pt_regs *regs)
{
return raw_irqs_disabled_flags(regs->ARM_cpsr);
}

#endif /* _ASM_ARM_XEN_EVENTS_H */
33 changes: 33 additions & 0 deletions arch/arm/xen/enlighten.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <xen/xen.h>
#include <xen/events.h>
#include <xen/grant_table.h>
#include <xen/hvm.h>
#include <xen/interface/xen.h>
Expand All @@ -9,6 +10,8 @@
#include <xen/xenbus.h>
#include <asm/xen/hypervisor.h>
#include <asm/xen/hypercall.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
Expand All @@ -33,6 +36,8 @@ EXPORT_SYMBOL_GPL(xen_have_vector_callback);
int xen_platform_pci_unplug = XEN_UNPLUG_ALL;
EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);

static __read_mostly int xen_events_irq = -1;

int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
unsigned long addr,
unsigned long mfn, int nr,
Expand Down Expand Up @@ -74,6 +79,9 @@ static int __init xen_guest_init(void)
if (of_address_to_resource(node, GRANT_TABLE_PHYSADDR, &res))
return 0;
xen_hvm_resume_frames = res.start >> PAGE_SHIFT;
xen_events_irq = irq_of_parse_and_map(node, 0);
pr_info("Xen %s support found, events_irq=%d gnttab_frame_pfn=%lx\n",
version, xen_events_irq, xen_hvm_resume_frames);
xen_domain_type = XEN_HVM_DOMAIN;

xen_setup_features();
Expand Down Expand Up @@ -115,3 +123,28 @@ static int __init xen_guest_init(void)
return 0;
}
core_initcall(xen_guest_init);

static irqreturn_t xen_arm_callback(int irq, void *arg)
{
xen_hvm_evtchn_do_upcall();
return IRQ_HANDLED;
}

static int __init xen_init_events(void)
{
if (!xen_domain() || xen_events_irq < 0)
return -ENODEV;

xen_init_IRQ();

if (request_percpu_irq(xen_events_irq, xen_arm_callback,
"events", xen_vcpu)) {
pr_err("Error requesting IRQ %d\n", xen_events_irq);
return -EINVAL;
}

enable_percpu_irq(xen_events_irq, 0);

return 0;
}
postcore_initcall(xen_init_events);
1 change: 1 addition & 0 deletions arch/x86/xen/enlighten.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <linux/memblock.h>

#include <xen/xen.h>
#include <xen/events.h>
#include <xen/interface/xen.h>
#include <xen/interface/version.h>
#include <xen/interface/physdev.h>
Expand Down
1 change: 1 addition & 0 deletions arch/x86/xen/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <xen/interface/xen.h>
#include <xen/interface/sched.h>
#include <xen/interface/vcpu.h>
#include <xen/events.h>

#include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h>
Expand Down
1 change: 0 additions & 1 deletion arch/x86/xen/xen-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ void xen_set_pat(u64);

char * __init xen_memory_setup(void);
void __init xen_arch_setup(void);
void __init xen_init_IRQ(void);
void xen_enable_sysenter(void);
void xen_enable_syscall(void);
void xen_vcpu_restore(void);
Expand Down
17 changes: 14 additions & 3 deletions drivers/xen/events.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,16 @@
#include <linux/irqnr.h>
#include <linux/pci.h>

#ifdef CONFIG_X86
#include <asm/desc.h>
#include <asm/ptrace.h>
#include <asm/irq.h>
#include <asm/idle.h>
#include <asm/io_apic.h>
#include <asm/sync_bitops.h>
#include <asm/xen/page.h>
#include <asm/xen/pci.h>
#endif
#include <asm/sync_bitops.h>
#include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h>

Expand All @@ -50,6 +52,9 @@
#include <xen/interface/event_channel.h>
#include <xen/interface/hvm/hvm_op.h>
#include <xen/interface/hvm/params.h>
#include <xen/interface/physdev.h>
#include <xen/interface/sched.h>
#include <asm/hw_irq.h>

/*
* This lock protects updates to the following mapping and reference-count
Expand Down Expand Up @@ -1386,7 +1391,9 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);

#ifdef CONFIG_X86
exit_idle();
#endif
irq_enter();

__xen_evtchn_do_upcall();
Expand Down Expand Up @@ -1795,9 +1802,9 @@ void xen_callback_vector(void)
void xen_callback_vector(void) {}
#endif

void __init xen_init_IRQ(void)
void xen_init_IRQ(void)
{
int i, rc;
int i;

evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq),
GFP_KERNEL);
Expand All @@ -1813,13 +1820,15 @@ void __init xen_init_IRQ(void)

pirq_needs_eoi = pirq_needs_eoi_flag;

#ifdef CONFIG_X86
if (xen_hvm_domain()) {
xen_callback_vector();
native_init_IRQ();
/* pci_xen_hvm_init must be called after native_init_IRQ so that
* __acpi_register_gsi can point at the right function */
pci_xen_hvm_init();
} else {
int rc;
struct physdev_pirq_eoi_gmfn eoi_gmfn;

irq_ctx_init(smp_processor_id());
Expand All @@ -1835,4 +1844,6 @@ void __init xen_init_IRQ(void)
} else
pirq_needs_eoi = pirq_check_eoi_map;
}
#endif
}
EXPORT_SYMBOL_GPL(xen_init_IRQ);
2 changes: 2 additions & 0 deletions include/xen/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,6 @@ int xen_irq_from_gsi(unsigned gsi);
/* Determine whether to ignore this IRQ if it is passed to a guest. */
int xen_test_irq_shared(int irq);

/* initialize Xen IRQ subsystem */
void xen_init_IRQ(void);
#endif /* _XEN_EVENTS_H */

0 comments on commit 0ec53ec

Please sign in to comment.