Yu-hsin Wang has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/44646 )
Change subject: fastmodel: handling amba far atomic transaction
......................................................................
fastmodel: handling amba far atomic transaction
Change-Id: I360c2a2bd415524b2a76434a13920f94360afa0f
---
M src/arch/arm/fastmodel/SConscript
M src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
M src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
3 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/src/arch/arm/fastmodel/SConscript
b/src/arch/arm/fastmodel/SConscript
index c659434..f4c1bbf 100644
--- a/src/arch/arm/fastmodel/SConscript
+++ b/src/arch/arm/fastmodel/SConscript
@@ -107,6 +107,8 @@
pvlib_home.Dir('include/fmruntime'),
pvlib_home.Dir('include/fmruntime/eslapi'),
pvlib_home.Dir('Iris/include'),
+ pvlib_home.Dir('include'),
+ pvlib_home.Dir('examples/SystemCExport/Common/include'),
systemc_home.Dir('include'),
diff --git a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
index c306c12..6a40d5a 100644
--- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
+++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc
@@ -27,7 +27,31 @@
#include "arch/arm/fastmodel/amba_to_tlm_bridge.hh"
+#include "base/amo.hh"
#include "params/AmbaToTlmBridge64.hh"
+#include "pv/FarAtomicService.h"
+#include "pv_userpayload_extension.h"
+#include "systemc/tlm_bridge/sc_ext.hh"
+
+namespace {
+
+uint8_t dummy_buffer[64] = {};
+
+struct FarAtomicOpFunctor : public AtomicOpFunctor {
+ FarAtomicOpFunctor(far_atomic::FarAtomic *_fa) : fa(_fa) {}
+ void operator()(uint8_t *p) override {
+ fa->serviceWasFound();
+ fa->doAtomicOperation(p);
+ }
+
+ AtomicOpFunctor* clone() override {
+ return new FarAtomicOpFunctor(*this);
+ };
+
+ far_atomic::FarAtomic *fa;
+};
+
+}
namespace FastModel
{
@@ -65,6 +89,7 @@
AmbaToTlmBridge64::proxy_b_transport(amba_pv::amba_pv_transaction &trans,
sc_core::sc_time &t)
{
+ maybeSetupAtomicExtension(trans);
return proxy_tlm_m->b_transport(trans, t);
}
@@ -88,6 +113,41 @@
proxy_tlm_s->invalidate_direct_mem_ptr(start_range, end_range);
}
+void
+AmbaToTlmBridge64::maybeSetupAtomicExtension(
+ amba_pv::amba_pv_transaction &trans)
+{
+ Gem5SystemC::AtomicExtension *atomic_ex = nullptr;
+ trans.get_extension(atomic_ex);
+ if (atomic_ex) return;
+
+ pv_userpayload_extension *user_ex = nullptr;
+ trans.get_extension(user_ex);
+ if (!user_ex) return;
+
+ pv::UserPayloadBase *upb = user_ex->get_user_payload();
+ uint32_t appid = upb->get_appID();
+ if (appid != pv::UserPayloadBase::SERVICE_REQUEST) return;
+
+ std::pair<void *, std::size_t> u_data = user_ex->get_user_data();
+ far_atomic::FarAtomic *fa = static_cast<far_atomic::FarAtomic *>(
+ u_data.first);
+
+ // Correct the request size manually and give it a dummy buffer
preventing
+ // from segmentation fault.
+ trans.set_data_length(fa->getDataValueSizeInBytes());
+ trans.set_data_ptr(dummy_buffer);
+
+ // The return value would store in the extension. We don't need to
specify
+ // need_return here.
+ atomic_ex = new Gem5SystemC::AtomicExtension(
+ std::make_shared<FarAtomicOpFunctor>(fa), false);
+ if (trans.has_mm())
+ trans.set_auto_extension(atomic_ex);
+ else
+ trans.set_extension(atomic_ex);
+}
+
} // namespace FastModel
FastModel::AmbaToTlmBridge64 *
diff --git a/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
b/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
index ec8bed4..d13525a 100644
--- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
+++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh
@@ -55,6 +55,7 @@
unsigned int proxy_transport_dbg(amba_pv::amba_pv_transaction &trans);
void proxy_invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
sc_dt::uint64 end_range);
+ void maybeSetupAtomicExtension(amba_pv::amba_pv_transaction &trans);
tlm_utils::simple_target_socket<
AmbaToTlmBridge64, 64, tlm::tlm_base_protocol_types> proxy_tlm_s;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/44646
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: I360c2a2bd415524b2a76434a13920f94360afa0f
Gerrit-Change-Number: 44646
Gerrit-PatchSet: 1
Gerrit-Owner: Yu-hsin Wang <yuhsi...@google.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