diff options
Diffstat (limited to 'src/dev/arm/smmu_v3_transl.cc')
-rw-r--r-- | src/dev/arm/smmu_v3_transl.cc | 13 |
1 files changed, 10 insertions, 3 deletions
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; |