diff options
Diffstat (limited to 'src/dev/arm/smmu_v3_caches.cc')
-rw-r--r-- | src/dev/arm/smmu_v3_caches.cc | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/dev/arm/smmu_v3_caches.cc b/src/dev/arm/smmu_v3_caches.cc index 6dcaec6b6..63f0b052b 100644 --- a/src/dev/arm/smmu_v3_caches.cc +++ b/src/dev/arm/smmu_v3_caches.cc @@ -258,6 +258,34 @@ SMMUTLB::store(const Entry &incoming, AllocPolicy alloc) } void +SMMUTLB::invalidateSSID(uint32_t sid, uint32_t ssid) +{ + Set &set = sets[pickSetIdx(sid, ssid)]; + + for (size_t i = 0; i < set.size(); i++) { + Entry &e = set[i]; + + if (e.sid == sid && e.ssid == ssid) + e.valid = false; + } +} + +void +SMMUTLB::invalidateSID(uint32_t sid) +{ + for (size_t s = 0; s < sets.size(); s++) { + Set &set = sets[s]; + + for (size_t i = 0; i < set.size(); i++) { + Entry &e = set[i]; + + if (e.sid == sid) + e.valid = false; + } + } +} + +void SMMUTLB::invalidateVA(Addr va, uint16_t asid, uint16_t vmid) { Set &set = sets[pickSetIdx(va)]; @@ -334,6 +362,12 @@ SMMUTLB::pickSetIdx(Addr va) const } size_t +SMMUTLB::pickSetIdx(uint32_t sid, uint32_t ssid) const +{ + return (sid^ssid) % sets.size(); +} + +size_t SMMUTLB::pickEntryIdxToReplace(const Set &set, AllocPolicy alloc) { if (alloc == ALLOC_LAST_WAY) |