From owner-svn-src-head@freebsd.org Thu May 30 01:21:09 2019 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BA6F915B2EA2; Thu, 30 May 2019 01:21:09 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 60DEF8FA7D; Thu, 30 May 2019 01:21:09 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3BD459E07; Thu, 30 May 2019 01:21:09 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x4U1L9x2083035; Thu, 30 May 2019 01:21:09 GMT (envelope-from jchandra@FreeBSD.org) Received: (from jchandra@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x4U1L8eJ083032; Thu, 30 May 2019 01:21:08 GMT (envelope-from jchandra@FreeBSD.org) Message-Id: <201905300121.x4U1L8eJ083032@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jchandra set sender to jchandra@FreeBSD.org using -f From: "Jayachandran C." Date: Thu, 30 May 2019 01:21:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r348377 - head/sys/arm64/arm64 X-SVN-Group: head X-SVN-Commit-Author: jchandra X-SVN-Commit-Paths: head/sys/arm64/arm64 X-SVN-Commit-Revision: 348377 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 60DEF8FA7D X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.97 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_SHORT(-0.97)[-0.971,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 May 2019 01:21:10 -0000 Author: jchandra Date: Thu May 30 01:21:08 2019 New Revision: 348377 URL: https://svnweb.freebsd.org/changeset/base/348377 Log: gic_v3: consolidate per-cpu redistributor information Update 'struct gic_redists' to consolidate all per-cpu redistributor information into a new 'struct redist_pcpu'. Provide a new interface (GICV3_IVAR_REDIST) for the GIC driver, which can be used to retrieve the per-cpu data. This per-cpu redistributor struct will be later used to improve the GIC ITS setup. While there, remove some unused fields in gic_v3_var.h interface. No functional changes. Reviewed by: andrew Differential Revision: https://reviews.freebsd.org/D19842 Modified: head/sys/arm64/arm64/gic_v3.c head/sys/arm64/arm64/gic_v3_var.h head/sys/arm64/arm64/gicv3_its.c Modified: head/sys/arm64/arm64/gic_v3.c ============================================================================== --- head/sys/arm64/arm64/gic_v3.c Wed May 29 23:50:31 2019 (r348376) +++ head/sys/arm64/arm64/gic_v3.c Thu May 30 01:21:08 2019 (r348377) @@ -183,36 +183,44 @@ uint32_t gic_r_read_4(device_t dev, bus_size_t offset) { struct gic_v3_softc *sc; + struct resource *rdist; sc = device_get_softc(dev); - return (bus_read_4(sc->gic_redists.pcpu[PCPU_GET(cpuid)], offset)); + rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res; + return (bus_read_4(rdist, offset)); } uint64_t gic_r_read_8(device_t dev, bus_size_t offset) { struct gic_v3_softc *sc; + struct resource *rdist; sc = device_get_softc(dev); - return (bus_read_8(sc->gic_redists.pcpu[PCPU_GET(cpuid)], offset)); + rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res; + return (bus_read_8(rdist, offset)); } void gic_r_write_4(device_t dev, bus_size_t offset, uint32_t val) { struct gic_v3_softc *sc; + struct resource *rdist; sc = device_get_softc(dev); - bus_write_4(sc->gic_redists.pcpu[PCPU_GET(cpuid)], offset, val); + rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res; + bus_write_4(rdist, offset, val); } void gic_r_write_8(device_t dev, bus_size_t offset, uint64_t val) { struct gic_v3_softc *sc; + struct resource *rdist; sc = device_get_softc(dev); - bus_write_8(sc->gic_redists.pcpu[PCPU_GET(cpuid)], offset, val); + rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res; + bus_write_8(rdist, offset, val); } /* @@ -384,8 +392,11 @@ gic_v3_read_ivar(device_t dev, device_t child, int whi return (0); case GICV3_IVAR_REDIST_VADDR: *result = (uintptr_t)rman_get_virtual( - sc->gic_redists.pcpu[PCPU_GET(cpuid)]); + &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res); return (0); + case GICV3_IVAR_REDIST: + *result = (uintptr_t)sc->gic_redists.pcpu[PCPU_GET(cpuid)]; + return (0); case GIC_IVAR_HW_REV: KASSERT( GICR_PIDR2_ARCH(sc->gic_pidr2) == GICR_PIDR2_ARCH_GICv3 || @@ -979,7 +990,7 @@ gic_v3_wait_for_rwp(struct gic_v3_softc *sc, enum gic_ res = sc->gic_dist; break; case REDIST: - res = sc->gic_redists.pcpu[cpuid]; + res = &sc->gic_redists.pcpu[cpuid]->res; break; default: KASSERT(0, ("%s: Attempt to wait for unknown RWP", __func__)); @@ -1173,7 +1184,7 @@ gic_v3_redist_find(struct gic_v3_softc *sc) KASSERT(sc->gic_redists.pcpu[cpuid] != NULL, ("Invalid pointer to per-CPU redistributor")); /* Copy res contents to its final destination */ - *sc->gic_redists.pcpu[cpuid] = r_res; + sc->gic_redists.pcpu[cpuid]->res = r_res; if (bootverbose) { device_printf(sc->dev, "CPU%u Re-Distributor has been found\n", Modified: head/sys/arm64/arm64/gic_v3_var.h ============================================================================== --- head/sys/arm64/arm64/gic_v3_var.h Wed May 29 23:50:31 2019 (r348376) +++ head/sys/arm64/arm64/gic_v3_var.h Thu May 30 01:21:08 2019 (r348377) @@ -40,10 +40,9 @@ DECLARE_CLASS(gic_v3_driver); struct gic_v3_irqsrc; -struct redist_lpis { - vm_offset_t conf_base; - vm_offset_t pend_base[MAXCPU]; - uint64_t flags; +struct redist_pcpu { + struct resource res; + vm_offset_t pend_base; }; struct gic_redists { @@ -55,10 +54,8 @@ struct gic_redists { struct resource ** regions; /* Number of Re-Distributor regions */ u_int nregions; - /* Per-CPU Re-Distributor handler */ - struct resource * pcpu[MAXCPU]; - /* LPIs data */ - struct redist_lpis lpis; + /* Per-CPU Re-Distributor data */ + struct redist_pcpu *pcpu[MAXCPU]; }; struct gic_v3_softc { @@ -97,9 +94,11 @@ MALLOC_DECLARE(M_GIC_V3); /* ivars */ #define GICV3_IVAR_NIRQS 1000 #define GICV3_IVAR_REDIST_VADDR 1001 +#define GICV3_IVAR_REDIST 1002 __BUS_ACCESSOR(gicv3, nirqs, GICV3, NIRQS, u_int); __BUS_ACCESSOR(gicv3, redist_vaddr, GICV3, REDIST_VADDR, void *); +__BUS_ACCESSOR(gicv3, redist, GICV3, REDIST, void *); /* Device methods */ int gic_v3_attach(device_t dev); @@ -131,7 +130,7 @@ void gic_r_write_8(device_t, bus_size_t, uint64_t var) u_int cpu = PCPU_GET(cpuid); \ \ bus_read_##len( \ - sc->gic_redists.pcpu[cpu], \ + &sc->gic_redists.pcpu[cpu]->res, \ reg); \ }) @@ -140,7 +139,7 @@ void gic_r_write_8(device_t, bus_size_t, uint64_t var) u_int cpu = PCPU_GET(cpuid); \ \ bus_write_##len( \ - sc->gic_redists.pcpu[cpu], \ + &sc->gic_redists.pcpu[cpu]->res, \ reg, val); \ }) Modified: head/sys/arm64/arm64/gicv3_its.c ============================================================================== --- head/sys/arm64/arm64/gicv3_its.c Wed May 29 23:50:31 2019 (r348376) +++ head/sys/arm64/arm64/gicv3_its.c Thu May 30 01:21:08 2019 (r348377) @@ -577,6 +577,7 @@ gicv3_its_pendtables_init(struct gicv3_its_softc *sc) static int its_init_cpu(device_t dev, struct gicv3_its_softc *sc) { + struct redist_pcpu *rpcpu; device_t gicv3; vm_paddr_t target; uint64_t xbaser, tmp; @@ -664,7 +665,8 @@ its_init_cpu(device_t dev, struct gicv3_its_softc *sc) if ((gic_its_read_8(sc, GITS_TYPER) & GITS_TYPER_PTA) != 0) { /* This ITS wants the redistributor physical address */ - target = vtophys(gicv3_get_redist_vaddr(dev)); + rpcpu = gicv3_get_redist(dev); + target = vtophys(rman_get_virtual(&rpcpu->res)); } else { /* This ITS wants the unique processor number */ target = GICR_TYPER_CPUNUM(gic_r_read_8(gicv3, GICR_TYPER));