]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
arm64: Basic implementation done dev-evtchn
authorJulien Grall <julien.grall@citrix.com>
Mon, 2 Nov 2015 14:40:59 +0000 (14:40 +0000)
committerJulien Grall <julien.grall@citrix.com>
Mon, 2 Nov 2015 14:40:59 +0000 (14:40 +0000)
sys/arm64/xen/xen_arch_intr.c

index 9e5277074ed800e7eaf0d615aca0817b006f5213..92c32d841215cc34ab48950dce1e3f738cc96458 100644 (file)
@@ -73,9 +73,7 @@ xen_arch_intr_setup(struct xenisrc *isrc)
            xen_intr_arch_enable_source /* unmask */,
            xen_intr_arch_eoi_source /* EOI */,
            xen_intr_arch_assign_cpu /* cpu assign */,
-           "xen%d", isrc->xi_vector));
-
-       return 0;
+           "xen%d", isrc->xi_port));
 }
 
 struct xenisrc *
@@ -85,13 +83,12 @@ xen_arch_intr_lookup_source(int vector)
        /* TODO: Implement it */
        printf("%s: XXX: Not implemented\n", __FUNCTION__);
 
-       return NULL;
+       return (NULL);
 }
 
 bool
 xen_arch_intr_has_handlers(struct xenisrc *isrc)
 {
-
        return (!TAILQ_EMPTY(&isrc->xi_intsrc.xai_event->ie_handlers));
 }
 
@@ -101,40 +98,63 @@ 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)
+       if (error != 0) {
+               xen_intr_disable_source(isrc, true);
                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)
 {
+       int error;
+
+       KASSERT(!xen_arch_intr_has_handlers(isrc),
+           ("Only one handler is allowed per event channel"));
 
-       return (intr_add_handler(device_get_nameunit(dev), isrc->xi_vector,
-           filter, handler, arg, flags, &isrc->xi_cookie));
+       error = intr_event_add_handler(isrc->xi_intsrc.xai_event,
+           device_get_nameunit(dev), filter, handler,
+           arg, intr_priority(flags), flags, &isrc->xi_cookie);
+       if (error != 0)
+               return (error);
+
+       /* Enable the event channel */
+       xen_intr_enable_intr(isrc);
+       xen_intr_enable_source(isrc);
+
+       return (0);
 }
 
 int
-xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
+xen_arch_intr_remove_handler(struct xenisrc *isrc)
 {
+       int error;
 
-       return (intr_describe(isrc->xi_vector, isrc->xi_cookie, descr));
+       error = intr_event_remove_handler(isrc->xi_cookie);
+       if (error != 0)
+               return (error);
+
+       /* Disable the event channel */
+       xen_intr_disable_source(isrc, true);
+       xen_intr_disable_intr(isrc);
+
+       return (0);
 }
 
 int
-xen_arch_intr_remove_handler(struct xenisrc *isrc)
+xen_arch_intr_describe(struct xenisrc *isrc, const char *descr)
 {
 
-       return (intr_remove_handler(isrc->xi_cookie));
+       return (intr_event_describe_handler(isrc->xi_intsrc.xai_event,
+           isrc->xi_cookie, descr));
 }
 
 int
 xen_arch_intr_event_bind(struct xenisrc *isrc, u_int cpu)
 {
 
-       return (intr_event_bind(isrc->xi_intsrc.is_event, cpu));
+       return (intr_event_bind(isrc->xi_intsrc.xai_event, cpu));
 }
-#endif