svn commit: r257419 - head/sys/arm/arm
Ian Lepore
ian at FreeBSD.org
Thu Oct 31 03:23:25 UTC 2013
Author: ian
Date: Thu Oct 31 03:23:25 2013
New Revision: 257419
URL: http://svnweb.freebsd.org/changeset/base/257419
Log:
Do not EOI an interrupt until the point after the filter handlers / before
threaded handlers.
It's not easy to see from the diffs of this change exactly how it
accomplishes the above. The arm_mask_irq() and arm_unmask_irq() functions
are, respectively, the pre_thread and post_thread hooks. Not seen in
these diffs, the arm_post_filter() routine also EOIs. The post_filter
routine runs after filter handlers if there will be no threaded handlers,
so it just EOIs. The pre_thread routine masks the interrupt (at the
controller, not the source) and EOIs. So one way or another, the EOI
happens at the point where filter handlers are done.
Modified:
head/sys/arm/arm/gic.c
Modified: head/sys/arm/arm/gic.c
==============================================================================
--- head/sys/arm/arm/gic.c Thu Oct 31 03:12:48 2013 (r257418)
+++ head/sys/arm/arm/gic.c Thu Oct 31 03:23:25 2013 (r257419)
@@ -271,7 +271,6 @@ arm_get_next_irq(int last_irq)
printf("Spurious interrupt detected [0x%08x]\n", active_irq);
return -1;
}
- gic_c_write_4(GICC_EOIR, active_irq);
return active_irq;
}
@@ -279,14 +278,15 @@ arm_get_next_irq(int last_irq)
void
arm_mask_irq(uintptr_t nb)
{
+
gic_d_write_4(GICD_ICENABLER(nb >> 5), (1UL << (nb & 0x1F)));
+ gic_c_write_4(GICC_EOIR, nb);
}
void
arm_unmask_irq(uintptr_t nb)
{
- gic_c_write_4(GICC_EOIR, nb);
gic_d_write_4(GICD_ISENABLER(nb >> 5), (1UL << (nb & 0x1F)));
}
More information about the svn-src-all
mailing list