Module Name:    src
Committed By:   kiyohara
Date:           Wed Nov 20 12:16:47 UTC 2013

Modified Files:
        src/sys/arch/arm/marvell: armadaxp.c mvsoc_intr.c mvsoc_intr.h
        src/sys/arch/arm/pic: files.pic
Removed Files:
        src/sys/arch/arm/pic: armadaxp_splfuncs.c

Log Message:
Support __HAVE_PIC_SET_PRIORITY for Armada XP.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/marvell/armadaxp.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/marvell/mvsoc_intr.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/marvell/mvsoc_intr.h
cvs rdiff -u -r1.3 -r0 src/sys/arch/arm/pic/armadaxp_splfuncs.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/pic/files.pic

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/marvell/armadaxp.c
diff -u src/sys/arch/arm/marvell/armadaxp.c:1.3 src/sys/arch/arm/marvell/armadaxp.c:1.4
--- src/sys/arch/arm/marvell/armadaxp.c:1.3	Mon Sep 30 13:03:25 2013
+++ src/sys/arch/arm/marvell/armadaxp.c	Wed Nov 20 12:16:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: armadaxp.c,v 1.3 2013/09/30 13:03:25 kiyohara Exp $	*/
+/*	$NetBSD: armadaxp.c,v 1.4 2013/11/20 12:16:47 kiyohara Exp $	*/
 /*******************************************************************************
 Copyright (C) Marvell International Ltd. and its affiliates
 
@@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
 *******************************************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.3 2013/09/30 13:03:25 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.4 2013/11/20 12:16:47 kiyohara Exp $");
 
 #define _INTR_PRIVATE
 
@@ -91,8 +91,10 @@ static void armadaxp_intr_init(void);
 static void armadaxp_pic_unblock_irqs(struct pic_softc *, size_t, uint32_t);
 static void armadaxp_pic_block_irqs(struct pic_softc *, size_t, uint32_t);
 static void armadaxp_pic_establish_irq(struct pic_softc *, struct intrsource *);
+static void armadaxp_pic_set_priority(struct pic_softc *, int);
 
-void armadaxp_handle_irq(void *);
+static int armadaxp_find_pending_irqs(void);
+static void armadaxp_pic_block_irq(struct pic_softc *, size_t);
 void armadaxp_io_coherency_init(void);
 int armadaxp_l2_init(bus_addr_t);
 
@@ -137,6 +139,7 @@ static struct pic_ops armadaxp_picops = 
 	.pic_unblock_irqs = armadaxp_pic_unblock_irqs,
 	.pic_block_irqs = armadaxp_pic_block_irqs,
 	.pic_establish_irq = armadaxp_pic_establish_irq,
+	.pic_set_priority = armadaxp_pic_set_priority,
 };
 
 static struct pic_softc armadaxp_pic = {
@@ -188,7 +191,8 @@ armadaxp_intr_init(void)
 	/* Enable IRQ prioritization */
 	ctrl |= (1 << 0);
 	MPIC_WRITE(ARMADAXP_MLMB_MPIC_CTRL, ctrl);
-	MPIC_CPU_WRITE(ARMADAXP_MLMB_MPIC_CTP, curcpl() << MPIC_CTP_SHIFT);
+
+	find_pending_irqs = armadaxp_find_pending_irqs;
 }
 
 static void
@@ -236,30 +240,47 @@ armadaxp_pic_establish_irq(struct pic_so
 	    tmp | (is->is_ipl << MPIC_ISCR_SHIFT));
 }
 
-void
-armadaxp_handle_irq(void *frame)
+static void
+armadaxp_pic_set_priority(struct pic_softc *pic, int ipl)
+{
+	int ctp;
+
+	ctp = MPIC_CPU_READ(ARMADAXP_MLMB_MPIC_CTP);
+	ctp &= ~(0xf << MPIC_CTP_SHIFT);
+	ctp |= (ipl << MPIC_CTP_SHIFT);
+	MPIC_CPU_WRITE(ARMADAXP_MLMB_MPIC_CTP, ctp);
+}
+
+static int
+armadaxp_find_pending_irqs(void)
 {
 	struct intrsource *is;
 	int irq;
-	u_int irqstate;
 
 	irq = MPIC_CPU_READ(ARMADAXP_MLMB_MPIC_IIACK) & 0x3ff;
 
 	/* Is it a spurious interrupt ?*/
 	if (irq == 0x3ff)
-		return;
-
+		return 0;
 	is = armadaxp_pic.pic_sources[irq];
-	if (is != NULL)  {
-		KASSERT(is->is_ipl > curcpu()->ci_cpl);
-		/* Dispatch irq */
-		irqstate = disable_interrupts(I32_bit);
-		pic_dispatch(is, frame);
-		restore_interrupts(irqstate);
+	if (is == NULL) {
+		printf("stray interrupt: %d\n", irq);
+		return 0;
 	}
-#ifdef __HAVE_FAST_SOFTINTS
-	cpu_dosoftints();
-#endif
+
+	armadaxp_pic_block_irq(&armadaxp_pic, irq);
+	pic_mark_pending(&armadaxp_pic, irq);
+
+	return is->is_ipl;
+}
+
+static void
+armadaxp_pic_block_irq(struct pic_softc *pic, size_t irq)
+{
+
+	KASSERT(pic->pic_maxsources >= irq);
+	MPIC_WRITE(ARMADAXP_MLMB_MPIC_ICE, irq);
+	MPIC_CPU_WRITE(ARMADAXP_MLMB_MPIC_ISM, irq);
 }
 
 /*

Index: src/sys/arch/arm/marvell/mvsoc_intr.c
diff -u src/sys/arch/arm/marvell/mvsoc_intr.c:1.7 src/sys/arch/arm/marvell/mvsoc_intr.c:1.8
--- src/sys/arch/arm/marvell/mvsoc_intr.c:1.7	Mon Sep 30 13:22:22 2013
+++ src/sys/arch/arm/marvell/mvsoc_intr.c	Wed Nov 20 12:16:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsoc_intr.c,v 1.7 2013/09/30 13:22:22 kiyohara Exp $	*/
+/*	$NetBSD: mvsoc_intr.c,v 1.8 2013/11/20 12:16:47 kiyohara Exp $	*/
 /*
  * Copyright (c) 2010 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsoc_intr.c,v 1.7 2013/09/30 13:22:22 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsoc_intr.c,v 1.8 2013/11/20 12:16:47 kiyohara Exp $");
 
 #include "opt_mvsoc.h"
 
@@ -42,9 +42,6 @@ __KERNEL_RCSID(0, "$NetBSD: mvsoc_intr.c
 #include <arm/marvell/mvsocreg.h>
 #include <arm/marvell/mvsocvar.h>
 
-#if defined(ARMADAXP)
-extern void armadaxp_handle_irq(void *);
-#endif
 
 int (*find_pending_irqs)(void);
 
@@ -80,10 +77,6 @@ void
 mvsoc_irq_handler(void *frame)
 {
 	struct cpu_info * const ci = curcpu();
-#if defined(ARMADAXP)
-	ci->ci_data.cpu_nintr++;
-	armadaxp_handle_irq(frame);
-#else
 	const int oldipl = ci->ci_cpl;
 	const uint32_t oldipl_mask = __BIT(oldipl);
 	int ipl_mask = 0;
@@ -97,7 +90,6 @@ mvsoc_irq_handler(void *frame)
 	 */
 	if ((ipl_mask & ~oldipl_mask) > oldipl_mask)
 		pic_do_pending_ints(I32_bit, oldipl, frame);
-#endif
 }
 
 /*

Index: src/sys/arch/arm/marvell/mvsoc_intr.h
diff -u src/sys/arch/arm/marvell/mvsoc_intr.h:1.2 src/sys/arch/arm/marvell/mvsoc_intr.h:1.3
--- src/sys/arch/arm/marvell/mvsoc_intr.h:1.2	Sun Jul 29 00:07:10 2012
+++ src/sys/arch/arm/marvell/mvsoc_intr.h	Wed Nov 20 12:16:47 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvsoc_intr.h,v 1.2 2012/07/29 00:07:10 matt Exp $	*/
+/*	$NetBSD: mvsoc_intr.h,v 1.3 2013/11/20 12:16:47 kiyohara Exp $	*/
 /*
  * Copyright (c) 2010 KIYOHARA Takashi
  * All rights reserved.
@@ -28,6 +28,12 @@
 #ifndef _MVSOC_INTR_H_
 #define _MVSOC_INTR_H_
 
+#include "opt_mvsoc.h"
+
+#if defined(ARMADAXP)
+#define __HAVE_PIC_SET_PRIORITY
+#endif
+
 #define ARM_IRQ_HANDLER	_C_LABEL(mvsoc_irq_handler)
 
 #ifndef _LOCORE

Index: src/sys/arch/arm/pic/files.pic
diff -u src/sys/arch/arm/pic/files.pic:1.5 src/sys/arch/arm/pic/files.pic:1.6
--- src/sys/arch/arm/pic/files.pic:1.5	Wed May 29 22:35:34 2013
+++ src/sys/arch/arm/pic/files.pic	Wed Nov 20 12:16:47 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: files.pic,v 1.5 2013/05/29 22:35:34 rkujawa Exp $
+#	$NetBSD: files.pic,v 1.6 2013/11/20 12:16:47 kiyohara Exp $
 #
 # Configuration info for the common PIC code.
 #
@@ -8,5 +8,4 @@ defflag opt_arm_intr_impl.h		__HAVE_PIC_
 defflag opt_arm_intr_impl.h		__HAVE_PIC_SOFTINT
 
 file	arch/arm/pic/pic.c			pic
-file	arch/arm/pic/pic_splfuncs.c		pic & pic_splfuncs & !armadaxp
-file	arch/arm/pic/armadaxp_splfuncs.c	pic & pic_splfuncs & armadaxp
+file	arch/arm/pic/pic_splfuncs.c		pic & pic_splfuncs

Reply via email to