svn commit: r211812 - head/sys/mips/rmi

Jayachandran C. jchandra at FreeBSD.org
Wed Aug 25 12:10:21 UTC 2010


Author: jchandra
Date: Wed Aug 25 12:10:20 2010
New Revision: 211812
URL: http://svn.freebsd.org/changeset/base/211812

Log:
  XLR PIC code update.
  - Fix a bug in xlr_pic_init (use irq in PIC_IRQ_IS_EDGE_TRIGGERED)
  - use new macro PIC_INTR_TO_IRQ() and PIC_IRT_x() in xlr_pic_init

Modified:
  head/sys/mips/rmi/pic.h
  head/sys/mips/rmi/xlr_machdep.c

Modified: head/sys/mips/rmi/pic.h
==============================================================================
--- head/sys/mips/rmi/pic.h	Wed Aug 25 11:49:48 2010	(r211811)
+++ head/sys/mips/rmi/pic.h	Wed Aug 25 12:10:20 2010	(r211812)
@@ -93,7 +93,6 @@
 #define	PIC_TIMER_COUNT_0_BASE		0x120
 #define	PIC_TIMER_COUNT_1_BASE		0x130
 
-
 #define	PIC_IRT_0(picintr)	(PIC_IRT_0_BASE + (picintr))
 #define	PIC_IRT_1(picintr)	(PIC_IRT_1_BASE + (picintr))
 
@@ -102,7 +101,14 @@
 #define	PIC_TIMER_COUNT_0(i)	(PIC_TIMER_COUNT_0_BASE + (i))
 #define	PIC_TIMER_COUNT_1(i)	(PIC_TIMER_COUNT_0_BASE + (i))
 
+/*
+ * We use a simple mapping form PIC interrupts to CPU IRQs.
+ * The PIC interrupts 0-31 are mapped to CPU irq's 8-39.
+ * this leaves the lower 0-7 for the cpu interrupts (like 
+ * count/compare, msgrng) and 40-63 for IPIs
+ */
 #define	PIC_IRQ_BASE		8
+#define	PIC_INTR_TO_IRQ(i)	(PIC_IRQ_BASE + (i))
 #define	PIC_IRT_FIRST_IRQ	PIC_IRQ_BASE
 
 #define	PIC_WD_IRQ		(PIC_IRQ_BASE + PIC_IRT_WD_INDEX)

Modified: head/sys/mips/rmi/xlr_machdep.c
==============================================================================
--- head/sys/mips/rmi/xlr_machdep.c	Wed Aug 25 11:49:48 2010	(r211811)
+++ head/sys/mips/rmi/xlr_machdep.c	Wed Aug 25 12:10:20 2010	(r211812)
@@ -282,22 +282,23 @@ static void 
 xlr_pic_init(void)
 {
 	xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET);
-	int i, level;
+	int i, level, irq;
 
 	mtx_init(&xlr_pic_lock, "pic", NULL, MTX_SPIN);
 	xlr_write_reg(mmio, PIC_CTRL, 0);
 	for (i = 0; i < PIC_NUM_IRTS; i++) {
-		level = PIC_IRQ_IS_EDGE_TRIGGERED(i);
+		irq = PIC_INTR_TO_IRQ(i);
+		level = PIC_IRQ_IS_EDGE_TRIGGERED(irq);
 
 		/* Bind all PIC irqs to cpu 0 */
-		xlr_write_reg(mmio, PIC_IRT_0_BASE + i, 0x01);
+		xlr_write_reg(mmio, PIC_IRT_0(i), 0x01);
 
 		/*
 		 * Use local scheduling and high polarity for all IRTs
 		 * Invalidate all IRTs, by default
 		 */
-		xlr_write_reg(mmio, PIC_IRT_1_BASE + i, (level << 30) | (1 << 6) |
-		    (PIC_IRQ_BASE + i));
+		xlr_write_reg(mmio, PIC_IRT_1(i), (level << 30) | (1 << 6) |
+		    irq);
 	}
 }
 


More information about the svn-src-head mailing list