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

Reply via email to