svn commit: r348377 - head/sys/arm64/arm64
Jayachandran C.
jchandra at FreeBSD.org
Thu May 30 01:21:10 UTC 2019
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));
More information about the svn-src-all
mailing list