Giacomo Travaglini has submitted this change and it was merged. (
https://gem5-review.googlesource.com/c/public/gem5/+/18597 )
Change subject: dev-arm: Get a Gicv3Redistributor ptr from phys address
......................................................................
dev-arm: Get a Gicv3Redistributor ptr from phys address
The patch is adding the following method to Gicv3:
* Gicv3::getRedistributorByAddr
This will be needed by the ITS when trying to select the target
redistributor after decoding the collection table entry (RDBase).
Change-Id: I40e2c155f2fdc8ca6d3c20ff7a27702e02499f20
Signed-off-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandb...@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/18597
Maintainer: Andreas Sandberg <andreas.sandb...@arm.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/dev/arm/gic_v3.cc
M src/dev/arm/gic_v3.hh
2 files changed, 33 insertions(+), 20 deletions(-)
Approvals:
Andreas Sandberg: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/dev/arm/gic_v3.cc b/src/dev/arm/gic_v3.cc
index 2832d33..9004f65 100644
--- a/src/dev/arm/gic_v3.cc
+++ b/src/dev/arm/gic_v3.cc
@@ -110,19 +110,15 @@
"size %d is_secure_access %d (value %#x)\n",
pkt->req->contextId(), daddr, size, is_secure_access,
resp);
} else if (redistRange.contains(addr)) {
- Addr daddr = addr - redistRange.start();
- uint32_t redistributor_id =
- daddr / redistSize;
- daddr = daddr % redistSize;
- panic_if(redistributor_id >= redistributors.size(),
- "Invalid redistributor_id!");
- panic_if(!redistributors[redistributor_id], "Redistributor is
null!");
- resp = redistributors[redistributor_id]->read(daddr, size,
- is_secure_access);
+ Addr daddr = (addr - redistRange.start()) % redistSize;
+
+ Gicv3Redistributor *redist = getRedistributorByAddr(addr);
+ resp = redist->read(daddr, size, is_secure_access);
+
delay = params()->redist_pio_delay;
DPRINTF(GIC, "Gicv3::read(): (redistributor %d) context_id %d "
"register %#x size %d is_secure_access %d (value %#x)\n",
- redistributor_id, pkt->req->contextId(), daddr, size,
+ redist->processorNumber(), pkt->req->contextId(), daddr,
size,
is_secure_access, resp);
} else {
panic("Gicv3::read(): unknown address %#x\n", addr);
@@ -151,19 +147,16 @@
distributor->write(daddr, data, size, is_secure_access);
delay = params()->dist_pio_delay;
} else if (redistRange.contains(addr)) {
- Addr daddr = addr - redistRange.start();
- uint32_t redistributor_id =
- daddr / redistSize;
- daddr = daddr % redistSize;
- panic_if(redistributor_id >= redistributors.size(),
- "Invalid redistributor_id!");
- panic_if(!redistributors[redistributor_id], "Redistributor is
null!");
+ Addr daddr = (addr - redistRange.start()) % redistSize;
+
+ Gicv3Redistributor *redist = getRedistributorByAddr(addr);
DPRINTF(GIC, "Gicv3::write(): (redistributor %d) context_id %d "
"register %#x size %d is_secure_access %d value %#x\n",
- redistributor_id, pkt->req->contextId(), daddr, size,
+ redist->processorNumber(), pkt->req->contextId(), daddr,
size,
is_secure_access, data);
- redistributors[redistributor_id]->write(daddr, data, size,
- is_secure_access);
+
+ redist->write(daddr, data, size, is_secure_access);
+
delay = params()->redist_pio_delay;
} else {
panic("Gicv3::write(): unknown address %#x\n", addr);
@@ -228,6 +221,22 @@
return nullptr;
}
+Gicv3Redistributor *
+Gicv3::getRedistributorByAddr(Addr addr) const
+{
+ panic_if(!redistRange.contains(addr),
+ "Address not pointing to a valid redistributor\n");
+
+ const Addr daddr = addr - redistRange.start();
+ const uint32_t redistributor_id = daddr / redistSize;
+
+ panic_if(redistributor_id >= redistributors.size(),
+ "Invalid redistributor_id!");
+ panic_if(!redistributors[redistributor_id], "Redistributor is null!");
+
+ return redistributors[redistributor_id];
+}
+
void
Gicv3::serialize(CheckpointOut & cp) const
{
diff --git a/src/dev/arm/gic_v3.hh b/src/dev/arm/gic_v3.hh
index 48cc520..5a13a74 100644
--- a/src/dev/arm/gic_v3.hh
+++ b/src/dev/arm/gic_v3.hh
@@ -141,6 +141,10 @@
Gicv3Redistributor *
getRedistributorByAffinity(uint32_t affinity) const;
+
+ Gicv3Redistributor *
+ getRedistributorByAddr(Addr address) const;
+
void postInt(uint32_t cpu, ArmISA::InterruptTypes int_type);
};
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/18597
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I40e2c155f2fdc8ca6d3c20ff7a27702e02499f20
Gerrit-Change-Number: 18597
Gerrit-PatchSet: 3
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev