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