diff options
-rw-r--r-- | src/dev/arm/smmu_v3_slaveifc.cc | 1 | ||||
-rw-r--r-- | src/dev/arm/smmu_v3_slaveifc.hh | 1 | ||||
-rw-r--r-- | src/dev/arm/smmu_v3_transl.cc | 13 |
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; |