summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dev/arm/smmu_v3_slaveifc.cc1
-rw-r--r--src/dev/arm/smmu_v3_slaveifc.hh1
-rw-r--r--src/dev/arm/smmu_v3_transl.cc13
3 files changed, 12 insertions, 3 deletions
diff --git a/src/dev/arm/smmu_v3_slaveifc.cc b/src/dev/arm/smmu_v3_slaveifc.cc
index fec480da2..0ed6c4d48 100644
--- a/src/dev/arm/smmu_v3_slaveifc.cc
+++ b/src/dev/arm/smmu_v3_slaveifc.cc
@@ -67,6 +67,7 @@ SMMUv3SlaveInterface::SMMUv3SlaveInterface(
portWidth(p->port_width),
wrBufSlotsRemaining(p->wrbuf_slots),
xlateSlotsRemaining(p->xlate_slots),
+ pendingMemAccesses(0),
prefetchEnable(p->prefetch_enable),
prefetchReserveLastWay(
p->prefetch_reserve_last_way),
diff --git a/src/dev/arm/smmu_v3_slaveifc.hh b/src/dev/arm/smmu_v3_slaveifc.hh
index 5759a8ffb..3e03ae49a 100644
--- a/src/dev/arm/smmu_v3_slaveifc.hh
+++ b/src/dev/arm/smmu_v3_slaveifc.hh
@@ -83,6 +83,7 @@ class SMMUv3SlaveInterface : public MemObject
unsigned wrBufSlotsRemaining;
unsigned xlateSlotsRemaining;
+ unsigned pendingMemAccesses;
const bool prefetchEnable;
const bool prefetchReserveLastWay;
diff --git a/src/dev/arm/smmu_v3_transl.cc b/src/dev/arm/smmu_v3_transl.cc
index d7d576883..429cc2b44 100644
--- a/src/dev/arm/smmu_v3_transl.cc
+++ b/src/dev/arm/smmu_v3_transl.cc
@@ -87,16 +87,20 @@ SMMUTranslationProcess::SMMUTranslationProcess(const std::string &name,
// Decrease number of pending translation slots on the slave interface
assert(ifc.xlateSlotsRemaining > 0);
ifc.xlateSlotsRemaining--;
+
+ ifc.pendingMemAccesses++;
reinit();
}
SMMUTranslationProcess::~SMMUTranslationProcess()
{
// Increase number of pending translation slots on the slave interface
- ifc.xlateSlotsRemaining++;
- // If no more SMMU translations are pending (all slots available),
+ assert(ifc.pendingMemAccesses > 0);
+ ifc.pendingMemAccesses--;
+
+ // If no more SMMU memory accesses are pending,
// signal SMMU Slave Interface as drained
- if (ifc.xlateSlotsRemaining == ifc.params()->xlate_slots) {
+ if (ifc.pendingMemAccesses == 0) {
ifc.signalDrainDone();
}
}
@@ -1232,6 +1236,7 @@ SMMUTranslationProcess::completeTransaction(Yield &yield,
smmu.translationTimeDist.sample(curTick() - recvTick);
+ ifc.xlateSlotsRemaining++;
if (!request.isAtsRequest && request.isWrite)
ifc.wrBufSlotsRemaining +=
(request.size + (ifc.portWidth-1)) / ifc.portWidth;
@@ -1279,6 +1284,8 @@ SMMUTranslationProcess::completeTransaction(Yield &yield,
void
SMMUTranslationProcess::completePrefetch(Yield &yield)
{
+ ifc.xlateSlotsRemaining++;
+
SMMUAction a;
a.type = ACTION_TERMINATE;
a.pkt = NULL;