Giacomo Travaglini has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/57294 )
Change subject: mem-ruby: Support for unaddressed mem requests in the
Sequencer
......................................................................
mem-ruby: Support for unaddressed mem requests in the Sequencer
JIRA: https://gem5.atlassian.net/browse/GEM5-1097
Change-Id: I66f7779f447d56e72e1b1f1ca2b84f1b50057542
---
M src/mem/ruby/system/Sequencer.cc
M src/mem/ruby/system/Sequencer.hh
2 files changed, 146 insertions(+), 1 deletion(-)
diff --git a/src/mem/ruby/system/Sequencer.cc
b/src/mem/ruby/system/Sequencer.cc
index ac52c5f..304adcd 100644
--- a/src/mem/ruby/system/Sequencer.cc
+++ b/src/mem/ruby/system/Sequencer.cc
@@ -79,6 +79,8 @@
assert(m_max_outstanding_requests > 0);
assert(m_deadlock_threshold > 0);
+ m_unaddressedTransactionCnt = 0;
+
m_runningGarnetStandalone = p.garnet_standalone;
@@ -308,6 +310,42 @@
schedule(deadlockCheckEvent, clockEdge(m_deadlock_threshold));
}
+ if (isTlbiCmdRequest(primary_type)) {
+ assert(primary_type == secondary_type);
+
+ switch (primary_type) {
+ case RubyRequestType_TLBI_EXT_SYNC_COMP:
+ // Don't have to store any data on this
+ break;
+ case RubyRequestType_TLBI:
+ case RubyRequestType_TLBI_SYNC:
+ {
+ m_unaddressedTransactionCnt++;
+
+ // returns pair<inserted element, was inserted>
+ auto insert_data = m_UnaddressedRequestTable.emplace(
+ getCurrentUnaddressedTransactionID(),
+ SequencerRequest(
+ pkt, primary_type, secondary_type, curCycle()
+ )
+ );
+ // if insert_data.second is false, wasn't inserted
+ assert(insert_data.second &&
+ "Another TLBI request with the same ID exists");
+
+ DPRINTF(RubySequencer, "Inserting TLBI request %016x\n",
+ getCurrentUnaddressedTransactionID());
+
+ break;
+ }
+
+ default:
+ panic("Unexpected TLBI RubyRequestType");
+ }
+
+ return RequestStatus_Ready;
+ }
+
Addr line_addr = makeLineAddress(pkt->getAddr());
// Check if there is any outstanding request for the same cache line.
auto &seq_req_list = m_RequestTable[line_addr];
@@ -656,10 +694,61 @@
}
}
+void
+Sequencer::unaddressedCallback(Addr unaddressedReqId,
+ RubyRequestType reqType,
+ const MachineType mach,
+ const Cycles initialRequestTime,
+ const Cycles forwardRequestTime,
+ const Cycles firstResponseTime)
+{
+ DPRINTF(RubySequencer, "unaddressedCallback ID:%08x type:%d\n",
+ unaddressedReqId, reqType);
+
+ switch (reqType) {
+ case RubyRequestType_TLBI_EXT_SYNC:
+ {
+ // This should trigger the CPU to wait for stale translations
+ // and send an EXT_SYNC_COMP once complete.
+
+ // Don't look for the ID in our requestTable.
+ // It won't be there because we didn't request this Sync
+ ruby_stale_translation_callback(unaddressedReqId);
+ break;
+ }
+ case RubyRequestType_TLBI:
+ case RubyRequestType_TLBI_SYNC:
+ {
+ // These signal that a TLBI operation that this core initiated
+ // of the respective type (TLBI or Sync) has finished.
+
+ assert(m_UnaddressedRequestTable.find(unaddressedReqId)
+ != m_UnaddressedRequestTable.end());
+
+ {
+ SequencerRequest &seq_req =
+ m_UnaddressedRequestTable.at(unaddressedReqId);
+ assert(seq_req.m_type == reqType);
+
+ PacketPtr pkt = seq_req.pkt;
+
+ ruby_unaddressed_callback(pkt);
+ testDrainComplete();
+ }
+
+ m_UnaddressedRequestTable.erase(unaddressedReqId);
+ break;
+ }
+ default:
+ panic("Unexpected TLBI RubyRequestType");
+ }
+}
+
bool
Sequencer::empty() const
{
- return m_RequestTable.empty();
+ return m_RequestTable.empty() &&
+ m_UnaddressedRequestTable.empty();
}
RequestStatus
@@ -716,6 +805,9 @@
primary_type = RubyRequestType_Locked_RMW_Read;
}
secondary_type = RubyRequestType_ST;
+ } else if (pkt->req->isTlbiCmd()) {
+ primary_type = secondary_type = tlbiCmdToRubyRequestType(pkt);
+ DPRINTF(RubySequencer, "Issuing TLBI\n");
} else {
//
// To support SwapReq, we need to check isWrite() first: a SwapReq
@@ -807,6 +899,23 @@
msg->m_htmTransactionUid = pkt->getHtmTransactionUid();
}
+ if (isTlbiCmdRequest(secondary_type)) {
+ msg->m_isTlbi = true;
+ switch (secondary_type) {
+ case RubyRequestType_TLBI_EXT_SYNC_COMP:
+ msg->m_tlbiTransactionUid = pkt->req->getExtraData();
+ break;
+ case RubyRequestType_TLBI:
+ case RubyRequestType_TLBI_SYNC:
+ msg->m_tlbiTransactionUid =
getCurrentUnaddressedTransactionID();
+ break;
+ default:
+ panic("Unexpected TLBI RubyRequestType");
+ }
+ DPRINTF(RubySequencer, "Issuing TLBI %016x\n",
+ msg->m_tlbiTransactionUid);
+ }
+
Tick latency = cyclesToTicks(
m_controller->mandatoryQueueLatency(secondary_type));
assert(latency > 0);
@@ -852,5 +961,12 @@
ruby_eviction_callback(address);
}
+uint64_t
+Sequencer::getCurrentUnaddressedTransactionID() const
+{
+ return (uint64_t(m_version & 0xFFFFFFFF) << 32) |
+ m_unaddressedTransactionCnt;
+}
+
} // namespace ruby
} // namespace gem5
diff --git a/src/mem/ruby/system/Sequencer.hh
b/src/mem/ruby/system/Sequencer.hh
index 9812f0c..1c93211 100644
--- a/src/mem/ruby/system/Sequencer.hh
+++ b/src/mem/ruby/system/Sequencer.hh
@@ -126,6 +126,13 @@
const Cycles forwardRequestTime = Cycles(0),
const Cycles firstResponseTime = Cycles(0));
+ void unaddressedCallback(Addr unaddressedReqId,
+ RubyRequestType requestType,
+ const MachineType mach = MachineType_NUM,
+ const Cycles initialRequestTime = Cycles(0),
+ const Cycles forwardRequestTime = Cycles(0),
+ const Cycles firstResponseTime = Cycles(0));
+
RequestStatus makeRequest(PacketPtr pkt) override;
virtual bool empty() const;
int outstandingCount() const override { return m_outstanding_count; }
@@ -215,6 +222,9 @@
protected:
// RequestTable contains both read and write requests, handles aliasing
std::unordered_map<Addr, std::list<SequencerRequest>> m_RequestTable;
+ // UnadressedRequestTable contains "unaddressed" requests,
+ // guaranteed not to alias each other
+ std::unordered_map<uint64_t, SequencerRequest>
m_UnaddressedRequestTable;
Cycles m_deadlock_threshold;
@@ -240,6 +250,8 @@
int m_coreId;
+ uint32_t m_unaddressedTransactionCnt;
+
bool m_runningGarnetStandalone;
//! Histogram for number of outstanding requests per cycle.
@@ -303,6 +315,12 @@
*/
bool llscStoreConditional(const Addr);
+ /**
+ * Generate the current unaddressed transaction ID based on the counter
+ * and the Sequencer object's version id.
+ */
+ uint64_t getCurrentUnaddressedTransactionID() const;
+
public:
/**
* Searches for cache line address in the global monitor
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/57294
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I66f7779f447d56e72e1b1f1ca2b84f1b50057542
Gerrit-Change-Number: 57294
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s