Module Name: src Committed By: jmcneill Date: Sun Jun 30 10:10:20 UTC 2019
Modified Files: src/sys/arch/arm/cortex: gicv3_its.c Log Message: Enable caching of ITS tables when possible To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sys/arch/arm/cortex/gicv3_its.c 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/cortex/gicv3_its.c diff -u src/sys/arch/arm/cortex/gicv3_its.c:1.19 src/sys/arch/arm/cortex/gicv3_its.c:1.20 --- src/sys/arch/arm/cortex/gicv3_its.c:1.19 Sat Jun 29 16:48:07 2019 +++ src/sys/arch/arm/cortex/gicv3_its.c Sun Jun 30 10:10:19 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gicv3_its.c,v 1.19 2019/06/29 16:48:07 jmcneill Exp $ */ +/* $NetBSD: gicv3_its.c,v 1.20 2019/06/30 10:10:19 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gicv3_its.c,v 1.19 2019/06/29 16:48:07 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gicv3_its.c,v 1.20 2019/06/30 10:10:19 jmcneill Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -627,7 +627,8 @@ gicv3_its_table_init(struct gicv3_softc /* devbits and innercache defaults */ u_int devbits = __SHIFTOUT(typer, GITS_TYPER_Devbits) + 1; - u_int innercache = GITS_Cache_NORMAL_NC; + u_int innercache = GITS_Cache_NORMAL_WA_WB; + u_int share = GITS_Shareability_IS; uint32_t iidr = gits_read_4(its, GITS_IIDR); const uint32_t ctx = @@ -697,10 +698,18 @@ gicv3_its_table_init(struct gicv3_softc baser &= ~GITS_BASER_InnerCache; baser |= __SHIFTIN(innercache, GITS_BASER_InnerCache); baser &= ~GITS_BASER_Shareability; - baser |= __SHIFTIN(GITS_Shareability_NS, GITS_BASER_Shareability); + baser |= __SHIFTIN(share, GITS_BASER_Shareability); baser |= GITS_BASER_Valid; gits_write_8(its, GITS_BASERn(tab), baser); + + baser = gits_read_8(its, GITS_BASERn(tab)); + if (__SHIFTOUT(baser, GITS_BASER_Shareability) == GITS_Shareability_NS) { + baser &= ~GITS_BASER_InnerCache; + baser |= __SHIFTIN(GITS_Cache_NORMAL_NC, GITS_BASER_InnerCache); + + gits_write_8(its, GITS_BASERn(tab), baser); + } } }