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