summaryrefslogtreecommitdiff
path: root/src/dev/arm/smmu_v3_caches.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/arm/smmu_v3_caches.cc')
-rw-r--r--src/dev/arm/smmu_v3_caches.cc34
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)