From da7d75267995ebfffb26ccbf9c598d613b2cd189 Mon Sep 17 00:00:00 2001 From: Yu-hsin Wang Date: Tue, 30 Mar 2021 14:15:52 +0800 Subject: [PATCH] fastmodel: add amba_to_tlm_bridge hooks before going to gem5 To handle atomic transaction, we need to convert amba far atomic extension into gem5 atomic extension before going to gem5 world. This cl prepares hooks that enables us to do the conversion. Change-Id: I1b5a99c38f619689bd318253356928091a4fdb02 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/44645 Reviewed-by: Gabe Black Maintainer: Gabe Black Tested-by: kokoro --- src/arch/arm/fastmodel/amba_to_tlm_bridge.cc | 43 ++++++++++++++++++-- src/arch/arm/fastmodel/amba_to_tlm_bridge.hh | 13 +++++- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc index a011e355db..82f84d80cb 100644 --- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc +++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.cc @@ -32,11 +32,21 @@ namespace FastModel { -AmbaToTlmBridge64::AmbaToTlmBridge64(const char *name) : +AmbaToTlmBridge64::AmbaToTlmBridge64(const sc_core::sc_module_name& name) : amba_pv::amba_pv_to_tlm_bridge<64>(name), - tlmWrapper(tlm_m, std::string(name) + ".tlm", -1), + targetProxy("target_proxy"), + initiatorProxy("initiator_proxy"), + tlmWrapper(initiatorProxy, std::string(name) + ".tlm", -1), ambaWrapper(amba_pv_s, std::string(name) + ".amba", -1) -{} +{ + targetProxy.register_b_transport(this, &AmbaToTlmBridge64::bTransport); + targetProxy.register_get_direct_mem_ptr( + this, &AmbaToTlmBridge64::getDirectMemPtr); + targetProxy.register_transport_dbg(this, &AmbaToTlmBridge64::transportDbg); + initiatorProxy.register_invalidate_direct_mem_ptr( + this, &AmbaToTlmBridge64::invalidateDirectMemPtr); + tlm_m(targetProxy); +} Port & AmbaToTlmBridge64::gem5_getPort(const std::string &if_name, int idx) @@ -49,6 +59,33 @@ AmbaToTlmBridge64::gem5_getPort(const std::string &if_name, int idx) return amba_pv::amba_pv_to_tlm_bridge<64>::gem5_getPort(if_name, idx); } +void +AmbaToTlmBridge64::bTransport(amba_pv::amba_pv_transaction &trans, + sc_core::sc_time &t) +{ + return initiatorProxy->b_transport(trans, t); +} + +bool +AmbaToTlmBridge64::getDirectMemPtr(amba_pv::amba_pv_transaction &trans, + tlm::tlm_dmi &dmi_data) +{ + return initiatorProxy->get_direct_mem_ptr(trans, dmi_data); +} + +unsigned int +AmbaToTlmBridge64::transportDbg(amba_pv::amba_pv_transaction &trans) +{ + return initiatorProxy->transport_dbg(trans); +} + +void +AmbaToTlmBridge64::invalidateDirectMemPtr(sc_dt::uint64 start_range, + sc_dt::uint64 end_range) +{ + targetProxy->invalidate_direct_mem_ptr(start_range, end_range); +} + } // 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 8baee6ad93..d0e52d00cd 100644 --- a/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh +++ b/src/arch/arm/fastmodel/amba_to_tlm_bridge.hh @@ -43,11 +43,22 @@ namespace FastModel class AmbaToTlmBridge64 : public amba_pv::amba_pv_to_tlm_bridge<64> { public: - AmbaToTlmBridge64(const char *name); + AmbaToTlmBridge64(const sc_core::sc_module_name &name); ::Port &gem5_getPort(const std::string &if_name, int idx=-1) override; private: + void bTransport(amba_pv::amba_pv_transaction &trans, sc_core::sc_time &t); + bool getDirectMemPtr(amba_pv::amba_pv_transaction &trans, + tlm::tlm_dmi &dmi_data); + unsigned int transportDbg(amba_pv::amba_pv_transaction &trans); + void invalidateDirectMemPtr(sc_dt::uint64 start_range, + sc_dt::uint64 end_range); + + tlm_utils::simple_target_socket< + AmbaToTlmBridge64, 64, tlm::tlm_base_protocol_types> targetProxy; + tlm_utils::simple_initiator_socket< + AmbaToTlmBridge64, 64, tlm::tlm_base_protocol_types> initiatorProxy; sc_gem5::TlmInitiatorWrapper<64> tlmWrapper; AmbaTarget ambaWrapper; };