]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
arm64: Start to implement the new event channel API
authorJulien Grall <julien.grall@citrix.com>
Wed, 21 Oct 2015 17:02:40 +0000 (18:02 +0100)
committerJulien Grall <julien.grall@citrix.com>
Mon, 2 Nov 2015 11:53:19 +0000 (11:53 +0000)
sys/arm64/include/xen/arch-intr.h
sys/arm64/xen/xen_arch_intr.c [new file with mode: 0644]
sys/conf/files.arm64

index 0e4c17efadca2391fd97af529c4290a31e2e4d7d..06bacc561d7392983bfe24190395808b78ec185d 100644 (file)
@@ -3,6 +3,7 @@
 
 struct xen_arch_isrc
 {
+       struct intr_event *xai_event;
 };
 
 typedef struct xen_arch_isrc xen_arch_isrc_t;
diff --git a/sys/arm64/xen/xen_arch_intr.c b/sys/arm64/xen/xen_arch_intr.c
new file mode 100644 (file)
index 0000000..fcbe8c5
--- /dev/null
@@ -0,0 +1,103 @@
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/interrupt.h>
+#include <sys/pcpu.h>
+#include <sys/smp.h>
+#include <sys/syslog.h>
+
+#include <xen/xen-os.h>
+#include <xen/arch-intr.h>
+
+void
+xen_arch_intr_init(void)
+{
+       /* Nothing to do */
+}
+
+int
+xen_arch_intr_setup(struct xenisrc *isrc)
+{
+
+       /* We don't support pirq on ARM */
+       if (isrc->xi_type == EVTCHN_TYPE_PIRQ)
+               return ENOTSUP;
+
+       /* XXX: Make the name of the evetn more accurate */
+       return (intr_event_create(&isrc->xi_intsrc.xai_event, 0,
+           isrc->xi_vector /* IRQ */,
+           xen_intr_disable_intr /* mask */,
+           xen_intr_enable_intr /* unmask */,
+           xen_intr_eoi_source /* EOI */,
+           xen_intr_assign_cpu /* cpu assign */,
+           "xen%d", isrc->xi_vector));
+}
+
+struct xenisrc *
+xen_arch_intr_lookup_source(int vector)
+{
+
+       /* TODO: Implement it */
+       printf("%s: XXX: Not implemented\n", __FUNCTION__);
+
+       return NULL;
+}
+
+bool
+xen_arch_intr_has_handlers(struct xenisrc *isrc)
+{
+
+       return (!TAILQ_EMPTY(&isrc->xi_intsrc.xai_event->ie_handlers));
+}
+
+void
+xen_arch_intr_execute_handlers(struct xenisrc *isrc, struct trapframe *frame)
+{
+       int error;
+
+       error = intr_event_handle(isrc->xi_intsrc.xai_event, frame);
+       if (error)
+               log(LOG_ERR, "Stray evchn%d: %d\n",
+                   isrc->xi_port, error);
+}
+
+#if 0
+int
+xen_arch_intr_add_handler(device_t dev, driver_filter_t filter,
+    driver_intr_t handler, void *arg, enum intr_type flags,
+    struct xenisrc *isrc)
+{
+
+       return (intr_add_handler(device_get_nameunit(dev), isrc->xi_vector,
+           filter, handler, arg, flags, &isrc->xi_cookie));
+}
+
+int
+xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
+{
+
+       return (intr_describe(isrc->xi_vector, isrc->xi_cookie, descr));
+}
+
+int
+xen_arch_intr_remove_handler(struct xenisrc *isrc)
+{
+
+       return (intr_remove_handler(isrc->xi_cookie));
+}
+
+int
+xen_arch_intr_event_bind(struct xenisrc *isrc, u_int cpu)
+{
+
+       return (intr_event_bind(isrc->xi_intsrc.is_event, cpu));
+}
+#endif
index 1e41cdfd8ea344a7420847f0bb79e843cee45e84..7eeb0c4caf89a2c09c7339fd98efb15e482f4ff5 100644 (file)
@@ -55,6 +55,7 @@ arm64/cavium/thunder_pcie_pem.c       optional        soc_cavm_thunderx pci
 arm64/cavium/thunder_pcie_common.c     optional soc_cavm_thunderx pci
 arm64/cloudabi64/cloudabi64_sysvec.c   optional compat_cloudabi64
 arm64/xen/hypercall.S          optional        xenhvm
+arm64/xen/xen_arch_intr.c      optional        xenhvm
 arm64/xen/xen-dt.c             optional        xenhvm
 arm64/xen/xen-pmap.c           optional        xenhvm
 crypto/blowfish/bf_enc.c       optional        crypto | ipsec