gic.c and interrupt priority mask register (GICC_PMR)
Thomas Skibo
ThomasSkibo at sbcglobal.net
Fri Apr 19 22:34:50 UTC 2013
Hello.
I mentioned this as an aside in another email but I'd like to revisit it.
My Zynq port doesn't work unless I initialize the GIC interrupt priority
mask register (GICC_PMR) which I do in a hack in zy7_machdep.c. The
GICC_PMR register is never touched in gic.c and I wonder how other ARM
ports work without having it initialized. I figure either they use a
different interrupt controller, their GIC implementation has a different
reset value for the PMR, or a boot-loader sets up the register before
the kernel is entered.
The ARM Generic Interrupt Controller Architecture Specification (version
2.0) states that the reset value of GICC_PMR is 0 which masks all
interrupts. So shouldn't gic.c initialize it to 0xff if the PMR
functionality isn't used?
--Thomas
Something like this?
Index: sys/arm/arm/gic.c
===================================================================
--- sys/arm/arm/gic.c (revision 249650)
+++ sys/arm/arm/gic.c (working copy)
@@ -134,6 +134,9 @@
/* Enable CPU interface */
gic_c_write_4(GICC_CTLR, 1);
+ /* Set priority mask register. */
+ gic_c_write_4(GICC_PMR, 0xff);
+
/* Enable interrupt distribution */
gic_d_write_4(GICD_CTLR, 0x01);
@@ -199,6 +202,9 @@
/* Enable CPU interface */
gic_c_write_4(GICC_CTLR, 1);
+ /* Set priority mask register. */
+ gic_c_write_4(GICC_PMR, 0xff);
+
/* Enable interrupt distribution */
gic_d_write_4(GICD_CTLR, 0x01);
--
--------
Thomas Skibo
ThomasSkibo at sbcglobal.net
More information about the freebsd-arm
mailing list