Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151214577
D40263.id122648.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D40263.id122648.diff
View Options
diff --git a/sys/arm64/arm64/gic_v3.c b/sys/arm64/arm64/gic_v3.c
--- a/sys/arm64/arm64/gic_v3.c
+++ b/sys/arm64/arm64/gic_v3.c
@@ -226,7 +226,8 @@
struct resource *rdist;
sc = device_get_softc(dev);
- rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ rdist = sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ offset += sc->gic_redists.pcpu[PCPU_GET(cpuid)]->offset;
return (bus_read_4(rdist, offset));
}
@@ -237,7 +238,8 @@
struct resource *rdist;
sc = device_get_softc(dev);
- rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ rdist = sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ offset += sc->gic_redists.pcpu[PCPU_GET(cpuid)]->offset;
return (bus_read_8(rdist, offset));
}
@@ -248,7 +250,8 @@
struct resource *rdist;
sc = device_get_softc(dev);
- rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ rdist = sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ offset += sc->gic_redists.pcpu[PCPU_GET(cpuid)]->offset;
bus_write_4(rdist, offset, val);
}
@@ -259,7 +262,8 @@
struct resource *rdist;
sc = device_get_softc(dev);
- rdist = &sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ rdist = sc->gic_redists.pcpu[PCPU_GET(cpuid)]->res;
+ offset += sc->gic_redists.pcpu[PCPU_GET(cpuid)]->offset;
bus_write_8(rdist, offset, val);
}
@@ -1215,6 +1219,7 @@
gic_v3_wait_for_rwp(struct gic_v3_softc *sc, enum gic_v3_xdist xdist)
{
struct resource *res;
+ bus_size_t offset;
u_int cpuid;
size_t us_left = 1000000;
@@ -1223,16 +1228,18 @@
switch (xdist) {
case DIST:
res = sc->gic_dist;
+ offset = 0;
break;
case REDIST:
- res = &sc->gic_redists.pcpu[cpuid]->res;
+ res = sc->gic_redists.pcpu[cpuid]->res;
+ offset = sc->gic_redists.pcpu[PCPU_GET(cpuid)]->offset;
break;
default:
KASSERT(0, ("%s: Attempt to wait for unknown RWP", __func__));
return;
}
- while ((bus_read_4(res, GICD_CTLR) & GICD_CTLR_RWP) != 0) {
+ while ((bus_read_4(res, offset + GICD_CTLR) & GICD_CTLR_RWP) != 0) {
DELAY(1);
if (us_left-- == 0)
panic("GICD Register write pending for too long");
@@ -1377,8 +1384,8 @@
static int
gic_v3_redist_find(struct gic_v3_softc *sc)
{
- struct resource r_res;
- bus_space_handle_t r_bsh;
+ struct resource *r_res;
+ bus_size_t offset;
uint64_t aff;
uint64_t typer;
uint32_t pidr2;
@@ -1399,10 +1406,9 @@
/* Iterate through Re-Distributor regions */
for (i = 0; i < sc->gic_redists.nregions; i++) {
/* Take a copy of the region's resource */
- r_res = *sc->gic_redists.regions[i];
- r_bsh = rman_get_bushandle(&r_res);
+ r_res = sc->gic_redists.regions[i];
- pidr2 = bus_read_4(&r_res, GICR_PIDR2);
+ pidr2 = bus_read_4(r_res, GICR_PIDR2);
switch (GICR_PIDR2_ARCH(pidr2)) {
case GICR_PIDR2_ARCH_GICv3: /* fall through */
case GICR_PIDR2_ARCH_GICv4:
@@ -1413,13 +1419,15 @@
return (ENODEV);
}
+ offset = 0;
do {
- typer = bus_read_8(&r_res, GICR_TYPER);
+ typer = bus_read_8(r_res, offset + GICR_TYPER);
if ((typer >> GICR_TYPER_AFF_SHIFT) == aff) {
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]->res = r_res;
+ sc->gic_redists.pcpu[cpuid]->offset = offset;
sc->gic_redists.pcpu[cpuid]->lpi_enabled = false;
if (bootverbose) {
device_printf(sc->dev,
@@ -1429,14 +1437,13 @@
return (0);
}
- r_bsh += (GICR_RD_BASE_SIZE + GICR_SGI_BASE_SIZE);
+ offset += (GICR_RD_BASE_SIZE + GICR_SGI_BASE_SIZE);
if ((typer & GICR_TYPER_VLPIS) != 0) {
- r_bsh +=
+ offset +=
(GICR_VLPI_BASE_SIZE + GICR_RESERVED_SIZE);
}
-
- rman_set_bushandle(&r_res, r_bsh);
- } while ((typer & GICR_TYPER_LAST) == 0);
+ } while (offset < rman_get_size(r_res) &&
+ (typer & GICR_TYPER_LAST) == 0);
}
device_printf(sc->dev, "No Re-Distributor found for CPU%u\n", cpuid);
diff --git a/sys/arm64/arm64/gic_v3_var.h b/sys/arm64/arm64/gic_v3_var.h
--- a/sys/arm64/arm64/gic_v3_var.h
+++ b/sys/arm64/arm64/gic_v3_var.h
@@ -40,8 +40,9 @@
struct gic_v3_irqsrc;
struct redist_pcpu {
- struct resource res; /* mem resource for redist */
+ struct resource *res; /* mem resource for redist */
vm_offset_t pend_base;
+ bus_size_t offset;
bool lpi_enabled; /* redist LPI configured? */
};
@@ -137,8 +138,8 @@
u_int cpu = PCPU_GET(cpuid); \
\
bus_read_##len( \
- &(sc)->gic_redists.pcpu[cpu]->res, \
- (reg)); \
+ (sc)->gic_redists.pcpu[cpu]->res, \
+ (sc)->gic_redists.pcpu[cpu]->offset + (reg)); \
})
#define gic_r_write(sc, len, reg, val) \
@@ -146,8 +147,9 @@
u_int cpu = PCPU_GET(cpuid); \
\
bus_write_##len( \
- &(sc)->gic_redists.pcpu[cpu]->res, \
- (reg), (val)); \
+ (sc)->gic_redists.pcpu[cpu]->res, \
+ (sc)->gic_redists.pcpu[cpu]->offset + (reg), \
+ (val)); \
})
#endif /* _GIC_V3_VAR_H_ */
diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c
--- a/sys/arm64/arm64/gicv3_its.c
+++ b/sys/arm64/arm64/gicv3_its.c
@@ -723,7 +723,8 @@
if ((gic_its_read_8(sc, GITS_TYPER) & GITS_TYPER_PTA) != 0) {
/* This ITS wants the redistributor physical address */
- target = vtophys(rman_get_virtual(&rpcpu->res));
+ target = vtophys((vm_offset_t)rman_get_virtual(rpcpu->res) +
+ rpcpu->offset);
} else {
/* This ITS wants the unique processor number */
target = GICR_TYPER_CPUNUM(gic_r_read_8(gicv3, GICR_TYPER)) <<
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 7, 9:44 PM (10 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31050782
Default Alt Text
D40263.id122648.diff (5 KB)
Attached To
Mode
D40263: gicv3: Use an offset to find the redist registers
Attached
Detach File
Event Timeline
Log In to Comment