From owner-svn-src-projects@FreeBSD.ORG Fri Dec 26 14:22:40 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A14804E5; Fri, 26 Dec 2014 14:22:40 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8CB85240B; Fri, 26 Dec 2014 14:22:40 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sBQEMeku032469; Fri, 26 Dec 2014 14:22:40 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sBQEMe0X032468; Fri, 26 Dec 2014 14:22:40 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201412261422.sBQEMe0X032468@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Fri, 26 Dec 2014 14:22:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r276246 - projects/arm_intrng/sys/arm/arm X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 26 Dec 2014 14:22:40 -0000 Author: andrew Date: Fri Dec 26 14:22:39 2014 New Revision: 276246 URL: https://svnweb.freebsd.org/changeset/base/276246 Log: Allow the gic driver to be build with or without support for intrng Modified: projects/arm_intrng/sys/arm/arm/gic.c Modified: projects/arm_intrng/sys/arm/arm/gic.c ============================================================================== --- projects/arm_intrng/sys/arm/arm/gic.c Fri Dec 26 13:44:41 2014 (r276245) +++ projects/arm_intrng/sys/arm/arm/gic.c Fri Dec 26 14:22:39 2014 (r276246) @@ -145,6 +145,12 @@ static void arm_gic_ipi_clear(device_t, #define gic_d_write_4(_sc, _reg, _val) \ bus_space_write_4((_sc)->gic_d_bst, (_sc)->gic_d_bsh, (_reg), (_val)) +#ifndef ARM_INTRNG +static int gic_config_irq(int irq, enum intr_trigger trig, + enum intr_polarity pol); +static void gic_post_filter(void *); +#endif + static struct ofw_compat_data compat_data[] = { {"arm,gic", true}, /* Non-standard, used in FreeBSD dts. */ {"arm,gic-400", true}, @@ -297,6 +303,12 @@ arm_gic_attach(device_t dev) sc->nirqs = gic_d_read_4(sc, GICD_TYPER); sc->nirqs = 32 * ((sc->nirqs & 0x1f) + 1); +#ifndef ARM_INTRNG + /* Set up function pointers */ + arm_post_filter = gic_post_filter; + arm_config_irq = gic_config_irq; +#endif + icciidr = gic_c_read_4(sc, GICC_IIDR); device_printf(dev,"pn 0x%x, arch 0x%x, rev 0x%x, implementer 0x%x irqs %u\n", icciidr>>20, (icciidr>>16) & 0xF, (icciidr>>12) & 0xf, @@ -336,10 +348,9 @@ arm_gic_attach(device_t dev) } static int -arm_gic_intr(void *arg) +arm_gic_next_irq(struct arm_gic_softc *sc, int last_irq) { - struct arm_gic_softc *sc = (struct arm_gic_softc *)arg; - uint32_t active_irq, last_irq = 0; + uint32_t active_irq; active_irq = gic_c_read_4(sc, GICC_IAR); @@ -355,14 +366,27 @@ arm_gic_intr(void *arg) if (active_irq == 0x3FF) { if (last_irq == -1) printf("Spurious interrupt detected\n"); - return (FILTER_HANDLED); + return -1; } + + return active_irq; +} + +#ifdef ARM_INTRNG +static int +arm_gic_intr(void *arg) +{ + struct arm_gic_softc *sc = (struct arm_gic_softc *)arg; + int active_irq; + + active_irq = arm_gic_next_irq(sc, 0); //gic_c_write_4(sc, GICC_EOIR, active_irq); arm_dispatch_irq(sc->gic_dev, NULL, active_irq); return (FILTER_HANDLED); } +#endif static int arm_gic_config(device_t dev, int irq, enum intr_trigger trig, @@ -417,6 +441,7 @@ invalid_args: return (EINVAL); } +#ifdef ARM_INTRNG static void arm_gic_eoi(device_t dev, int irq) { @@ -427,6 +452,7 @@ arm_gic_eoi(device_t dev, int irq) gic_c_write_4(sc, GICC_EOIR, irq); } +#endif static void @@ -486,6 +512,23 @@ arm_gic_ipi_clear(device_t dev, int ipi) } #ifndef ARM_INTRNG +static void +gic_post_filter(void *arg) +{ + struct arm_gic_softc *sc = arm_gic_sc; + uintptr_t irq = (uintptr_t) arg; + + if (irq > GIC_LAST_IPI) + arm_irq_memory_barrier(irq); + gic_c_write_4(sc, GICC_EOIR, irq); +} + +static int +gic_config_irq(int irq, enum intr_trigger trig, enum intr_polarity pol) +{ + + return (arm_gic_config(arm_gic_sc->gic_dev, irq, trig, pol)); +} void arm_mask_irq(uintptr_t nb) @@ -501,6 +544,13 @@ arm_unmask_irq(uintptr_t nb) arm_gic_unmask(arm_gic_sc->gic_dev, nb); } +int +arm_get_next_irq(int last_irq) +{ + + return (arm_gic_next_irq(arm_gic_sc, last_irq)); +} + void gic_init_secondary(void) {