15#ifndef SIMICS_SYSTEMC_COMPOSITE_PCIE_MAPPING_INTERCONNECT_H
16#define SIMICS_SYSTEMC_COMPOSITE_PCIE_MAPPING_INTERCONNECT_H
20#include <tlm_utils/multi_socket_bases.h>
21#include <tlm_utils/simple_initiator_socket.h>
22#include <tlm_utils/simple_target_socket.h>
24#include <simics/cc-api.h>
41const char *
const PCIE_MAPPING_INTERCONNECT_TAG = \
42 "intel/PcieMappingInterconnect";
64std::string pcieDeviceIdStr(uint16_t device_id) {
65 std::ostringstream os;
66 os <<
"device id 0x" << std::hex << device_id
67 <<
" (" << std::dec << (device_id >> 8)
68 <<
":" << ((device_id >> 3) & 0x1f)
69 <<
"." << (device_id & 7) <<
")";
80template<
typename TSocket>
105template <
unsigned int BUSWIDTH,
typename TYPES>
108 typedef tlm_utils::simple_target_socket<
110 typedef tlm_utils::simple_initiator_socket<
113 tlm::tlm_target_socket<BUSWIDTH, TYPES> *tlm;
114 tlm_utils::multi_target_base<BUSWIDTH, TYPES> *multi;
115 } supported_target_socket_t;
122 sc_core::sc_module_name =
"PcieMappingInterconnect")
126 initiator_sockets_(
"initiator_socket"),
127 config_target_socket_(),
128 msg_target_socket_(),
129 pcie_map_target_socket_(
"pcie_map_target_socket") {
131 this, &PcieMappingInterconnect::transaction_b_transport);
133 this, &PcieMappingInterconnect::transaction_transport_dbg);
135 this, &PcieMappingInterconnect::pcie_map_invalidate_direct_mem_ptr);
136 pcie_map_target_socket_.register_b_transport(
137 this, &PcieMappingInterconnect::pcie_map_b_transport);
138 pcie_map_target_socket_.register_transport_dbg(
139 this, &PcieMappingInterconnect::pcie_map_transport_dbg);
140 pcie_map_target_socket_.register_get_direct_mem_ptr(
141 this, &PcieMappingInterconnect::pcie_map_get_direct_mem_ptr);
144 pcie_map_extension_.
init(&sender_);
149 SC_METHOD(warmReset);
153 config_target_socket_.tlm =
nullptr;
154 config_target_socket_.multi =
nullptr;
155 msg_target_socket_.tlm =
nullptr;
156 msg_target_socket_.multi =
nullptr;
219 void addFunction(uint16_t device_id);
222 void delFunction(uint16_t device_id);
225 void castToTarget(sc_core::sc_object *
object,
226 supported_target_socket_t *target);
233 void updateMappings(
int function_id = -1,
int bar_id = -1);
243 void updateCommand(uint16_t function_id, uint16_t old_command);
251 void retrieveFunctionData(
size_t socket_id,
int bar_id);
254 void interceptCfgHeaderAccess(
size_t socket_id,
255 tlm::tlm_generic_payload &trans);
260 tlm::tlm_generic_payload &trans)
const;
263 conf_object_t *getCfgMapHelper(uint16_t device_id);
267 size_t validateTransaction(tlm::tlm_generic_payload &trans);
274 void transaction_b_transport(tlm::tlm_generic_payload &trans,
275 sc_core::sc_time &t);
276 unsigned int transaction_transport_dbg(
277 tlm::tlm_generic_payload &trans);
279 void pcie_map_invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
280 sc_dt::uint64 end_range);
281 void pcie_map_b_transport(
282 tlm::tlm_generic_payload &trans,
283 sc_core::sc_time &t);
284 unsigned int pcie_map_transport_dbg(
285 tlm::tlm_generic_payload &trans);
286 bool pcie_map_get_direct_mem_ptr(
287 tlm::tlm_generic_payload &trans,
288 tlm::tlm_dmi &dmi_data);
292 sc_core::sc_vector<initiator_socket_t> initiator_sockets_;
293 supported_target_socket_t config_target_socket_;
294 supported_target_socket_t msg_target_socket_;
296 target_socket_t pcie_map_target_socket_;
298 struct cfg_header_t {
300 uint32_t base_address[7];
303 std::map<uint16_t, cfg_header_t> function_data_;
304 std::vector<iface::PcieBaseAddressRegisterQueryInterface::PCIeBar>
308 PcieMappingInterconnectExtensionSender<initiator_socket_t> sender_;
315 std::map<std::pair<size_t, size_t>,
size_t> address_id_mem_map_;
317 std::map<std::pair<size_t, size_t>,
size_t> address_id_io_map_;
319 std::map<std::pair<size_t, size_t>,
size_t> fn_bar_id_map_;
321 ConfObjectRef simulation_obj_ {
nullptr};
325 ConfObjectRef gasket_obj_ {
nullptr};
330 bool function_number_has_8bits_ {
false};
333template <
unsigned int BUSWIDTH,
typename TYPES>
341 initiator_sockets_.init(function_data_.size() + bar_info_.size() + 1);
343 size_t socket_id = 0;
345 for (; socket_id < function_data_.size(); ++socket_id) {
346 if (config_target_socket_.tlm) {
347 initiator_sockets_[socket_id].bind(*config_target_socket_.tlm);
349 initiator_sockets_[socket_id].bind(*config_target_socket_.multi);
353 for (
auto &bar : bar_info_) {
354 supported_target_socket_t target = {};
355 castToTarget(bar.target_socket, &target);
357 initiator_sockets_[socket_id].bind(*target.tlm);
358 }
else if (target.multi) {
359 initiator_sockets_[socket_id].bind(*target.multi);
362 PCIE_MAPPING_INTERCONNECT_TAG,
363 "BAR target_socket type is not supported");
365 fn_bar_id_map_[std::make_pair(bar.function, bar.offset)] = socket_id;
369 if (msg_target_socket_.tlm) {
370 initiator_sockets_[socket_id].bind(*msg_target_socket_.tlm);
372 initiator_sockets_[socket_id].bind(*msg_target_socket_.multi);
376template <
unsigned int BUSWIDTH,
typename TYPES>
381 pcie_map_extension_.get_device_id(gasket_obj_);
388 size_t socket_id = 0;
389 for (
const auto &fd : function_data_) {
390 delFunction(device_id | fd.first);
391 addFunction(device_id | fd.first);
395template <
unsigned int BUSWIDTH,
typename TYPES>
398 for (
auto &fd : function_data_) {
399 delFunction(device_id | fd.first);
401 fd.second.command = 0;
402 updateMappings(fd.first);
406template <
unsigned int BUSWIDTH,
typename TYPES>
410 for (
auto &fd : function_data_) {
412 fd.second.command = 0;
413 updateMappings(fd.first);
418template <
unsigned int BUSWIDTH,
typename TYPES>
422 for (
auto &fd : function_data_) {
424 fd.second.command = 0;
425 updateMappings(fd.first);
430template <
unsigned int BUSWIDTH,
typename TYPES>
431void PcieMappingInterconnect<BUSWIDTH, TYPES>::
432addFunction(uint16_t device_id) {
433 std::ostringstream os;
434 os <<
"Adding function for device_id: "
436 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
437 auto *map_helper = getCfgMapHelper(device_id);
438 if (map_helper ==
nullptr) {
439 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
440 "Failure to get map helper");
443 pcie_map_extension_.add_function(map_helper, device_id);
444 if (sender_.failed_transaction_.payload()) {
445 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
446 "Failure to add function");
451template <
unsigned int BUSWIDTH,
typename TYPES>
452void PcieMappingInterconnect<BUSWIDTH, TYPES>::
453delFunction(uint16_t device_id) {
454 std::ostringstream os;
455 os <<
"Deleting function for device_id: "
457 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
458 auto *map_helper = getCfgMapHelper(device_id);
459 if (map_helper ==
nullptr) {
460 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
461 "Failure to get map helper");
464 pcie_map_extension_.del_function(map_helper, device_id);
465 if (sender_.failed_transaction_.payload()) {
466 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
467 "Failure to delete function");
472template <
unsigned int BUSWIDTH,
typename TYPES>
477 if (pci ==
nullptr) {
480 "PcieDeviceQueryInterface not implemented on the device");
484 if (bar ==
nullptr) {
487 "PcieBaseAddressRegisterQueryInterface not implemented on"
492 if (reset ==
nullptr) {
494 "PcieResetInterface not implemented on the device");
511 std::set<int> functions {0};
512 for (
const auto &it : bar_info_) {
513 if (functions.find(it.function) == functions.end()) {
514 function_data_[it.function];
515 functions.insert(it.function);
516 if (it.function > 7) {
517 function_number_has_8bits_ =
true;
523 auto *initiator =
dynamic_cast<
524 tlm::tlm_initiator_socket<BUSWIDTH, TYPES> *
>(
527 pcie_map_target_socket_.bind(*initiator);
530 "object returned by getPcieMapInitiatorSocket was not"
531 " a tlm::tlm_initiator_socket.");
535 createCfgMapHelper();
538template <
unsigned int BUSWIDTH,
typename TYPES>
539std::map<std::pair<size_t, size_t>,
size_t>
541 return address_id_mem_map_;
544template <
unsigned int BUSWIDTH,
typename TYPES>
545std::map<std::pair<size_t, size_t>,
size_t>
547 return address_id_io_map_;
550template <
unsigned int BUSWIDTH,
typename TYPES>
553 if (initiator_sockets_.size() <= socket_id) {
554 std::ostringstream os;
555 os <<
"Invalid socket_id: " << socket_id;
556 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
560 tlm::tlm_generic_payload trans;
564 trans.set_data_ptr(
reinterpret_cast<unsigned char *
>(&value));
565 trans.set_data_length(4);
566 trans.set_streaming_width(4);
568 trans.set_command(tlm::TLM_READ_COMMAND);
569 trans.set_address(0x4);
571 auto ret = initiator_sockets_[socket_id]->transport_dbg(trans);
579 auto fd = function_data_.begin();
580 std::advance(fd, socket_id);
581 fd->second.command = value;
585 for (
const auto &bar : bar_info_) {
589 if (bar.function != fd->first) {
593 int expected_bar_id = bar.offset == 0x30 ? 6 : (bar.offset - 0x10) / 4;
595 if (bar_id != -1 && bar_id != expected_bar_id) {
599 trans.set_address(bar.offset);
600 initiator_sockets_[socket_id]->transport_dbg(trans);
601 fd->second.base_address[expected_bar_id] = value;
603 if (expected_bar_id == 6) {
605 PCIE_MAPPING_INTERCONNECT_TAG,
606 "Expansion ROM BAR can't support 64-bit address");
609 trans.set_address(bar.offset + 4);
610 initiator_sockets_[socket_id]->transport_dbg(trans);
611 fd->second.base_address[expected_bar_id + 1] = value;
617template <
unsigned int BUSWIDTH,
typename TYPES>
618void PcieMappingInterconnect<BUSWIDTH, TYPES>::
620 std::ostringstream os;
621 os <<
"Adding mapping of type: "
622 << pcieTypeName(type);
623 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
624 pcie_map_extension_.add_map(info, type);
625 if (sender_.failed_transaction_.payload()) {
626 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
"Failure to add map");
631template <
unsigned int BUSWIDTH,
typename TYPES>
632void PcieMappingInterconnect<BUSWIDTH, TYPES>::
636 auto it = std::find_if(
637 address_id_mem_map_.begin(),
638 address_id_mem_map_.end(),
640 const std::pair<std::pair<size_t, size_t>,
size_t> &entry) {
641 return entry.second == socket_id;
644 if (it != address_id_mem_map_.end()) {
645 base = it->first.first;
646 address_id_mem_map_.erase(it);
649 auto it = std::find_if(
650 address_id_io_map_.begin(),
651 address_id_io_map_.end(),
653 const std::pair<std::pair<size_t, size_t>,
size_t> &entry) {
654 return entry.second == socket_id;
657 if (it != address_id_io_map_.end()) {
658 base = it->first.first;
659 address_id_io_map_.erase(it);
663 if (base != 0xffffffffffffffff) {
664 std::ostringstream os;
665 os <<
"Deleting mapping of type: "
666 << pcieTypeName(type) <<
", base: 0x" << std::hex << base;
667 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
669 pcie_map_extension_.del_map(base, type);
670 if (sender_.failed_transaction_.payload()) {
671 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
"Failure to del map");
677template <
unsigned int BUSWIDTH,
typename TYPES>
678void PcieMappingInterconnect<BUSWIDTH, TYPES>::
679updateMappings(
int function_id,
int bar_id) {
680 for (
const auto &bi : bar_info_) {
681 if (function_id != -1 && bi.function != function_id) {
685 auto header = function_data_.at(bi.function);
687 int expected_bar_id = bi.offset == 0x30 ? 6 : (bi.offset - 0x10) / 4;
688 if (bar_id != -1 && bar_id != expected_bar_id) {
692 uint64_t base_address = header.base_address[expected_bar_id];
694 if (expected_bar_id == 6) {
696 PCIE_MAPPING_INTERCONNECT_TAG,
697 "Expansion ROM BAR can't support 64-bit address");
699 base_address |=
static_cast<uint64_t
>(
700 header.base_address[expected_bar_id + 1]) << 32;
704 bool enable = header.command & 1;
708 if (bi.offset == 0x30) {
709 enable = base_address & 1;
711 enable = (header.command >> 1) & 1;
714 base_address &= ~((1ULL << bi.size_bits) - 1);
715 size_t socket_id = fn_bar_id_map_.at(
716 std::make_pair(bi.function, bi.offset));
717 delMap(socket_id, type);
722 types::map_info_t info(base_address, base_address,
723 1ULL << bi.size_bits, function_id);
724 auto address_range = std::make_pair(info.base,
725 info.base + info.length);
728 address_id_mem_map_[address_range] = socket_id;
729 std::ostringstream os;
730 os <<
"Memory address for function " << bi.function
731 <<
" and bar ID " << expected_bar_id
732 <<
" in range of [0x" << std::hex << info.base
733 <<
"-0x" << info.base + info.length <<
"] maps to socket ID "
735 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
737 address_id_io_map_[address_range] = socket_id;
738 std::ostringstream os;
739 os <<
"IO address for function " << bi.function
740 <<
" and bar ID " << expected_bar_id
741 <<
" in range of [0x" << std::hex << info.base
742 <<
"-0x" << info.base + info.length <<
"] maps to socket ID "
744 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
751template <
unsigned int BUSWIDTH,
typename TYPES>
752void PcieMappingInterconnect<BUSWIDTH, TYPES>::
753updateCommand(uint16_t function_id, uint16_t old_command) {
754 if (function_data_[function_id].command != old_command) {
755 updateMappings(function_id);
759template <
unsigned int BUSWIDTH,
typename TYPES>
760void PcieMappingInterconnect<BUSWIDTH, TYPES>::
761interceptCfgHeaderAccess(
size_t socket_id,
762 tlm::tlm_generic_payload &trans) {
763 unsigned int size = trans.get_data_length();
765 if (trans.get_byte_enable_ptr() || trans.get_streaming_width() != size) {
770 if (!trans.is_write()) {
775 uint64_t *data =
reinterpret_cast<uint64_t *
>(trans.get_data_ptr());
777 auto it = function_data_.begin();
778 std::advance(it, socket_id);
779 uint16_t function_id = it->first;
780 auto &header = it->second;
781 sc_dt::uint64 offset = trans.get_address();
784 uint16_t old_command = header.command;
785 retrieveFunctionData(socket_id, -1);
786 header.command = (*data) & 0xffff;
787 updateCommand(function_id, old_command);
796 int bar_id = (offset - 0x10) / 4;
797 retrieveFunctionData(socket_id, bar_id);
804 header.base_address[bar_id] = *data & 0xffffffff;
805 if (size == 8 && !(offset % 8)) {
806 header.base_address[bar_id + 1] = *data >> 32;
808 updateMappings(function_id, bar_id);
813 retrieveFunctionData(socket_id, bar_id);
814 header.base_address[bar_id] = *data & 0xffffffff;
815 updateMappings(function_id, bar_id);
820template <
unsigned int BUSWIDTH,
typename TYPES>
821size_t PcieMappingInterconnect<BUSWIDTH, TYPES>::
823 tlm::tlm_generic_payload &trans)
const {
825 auto found = function_data_.find(function_id);
826 if (found == function_data_.end()) {
827 std::ostringstream os;
828 os <<
"Function id(" << function_id
829 <<
") not found for this device";
830 throw std::invalid_argument {
834 return std::distance(function_data_.begin(), found);
836 size_t address = trans.get_address();
837 for (
const auto &entry : address_id_mem_map_) {
838 auto startAddress = entry.first.first;
839 auto endAddress = entry.first.second;
840 auto id = entry.second;
842 if (address >= startAddress && address < endAddress) {
843 if (enable_base_address_subtraction) {
844 trans.set_address(address - startAddress);
849 throw std::invalid_argument {
850 "Unable to find the initiator_socket to forward the MEM transaction"
853 size_t address = trans.get_address();
854 for (
const auto &entry : address_id_io_map_) {
855 auto startAddress = entry.first.first;
856 auto endAddress = entry.first.second;
857 auto id = entry.second;
859 if (address >= startAddress && address < endAddress) {
860 if (enable_base_address_subtraction) {
861 trans.set_address(address - startAddress);
866 throw std::invalid_argument {
867 "Unable to find the initiator_socket to forward the IO transaction"
870 return function_data_.size() + bar_info_.size();
872 throw std::invalid_argument {
873 "Unsupported PCIe type"
877template <
unsigned int BUSWIDTH,
typename TYPES>
881 if (map_helper ==
nullptr) {
884 "Simics class pcie_map_helper_cpp is required."
885 "Try load the module pcie-map-helper-c++ first.");
889 if (SIM_c_get_interface(simulation_obj_,
"pcie_device") ==
nullptr) {
891 if (!SIM_object_is_configured(simulation_obj_)) {
894 "Simulation object is not configured yet, cannot get"
895 " its gasket_list attribute");
902 int gasket_count = SIM_attr_list_size(gasket_list);
903 for (
int i = 0; i < gasket_count; ++i) {
904 auto obj = SIM_attr_object(SIM_attr_list_item(gasket_list, i));
905 if (SIM_c_get_interface(obj,
"pcie_device")) {
910 if (gasket_obj_.object() ==
nullptr) {
913 "No gasket object implemented the required"
914 " pcie_device interface");
918 gasket_obj_ = simulation_obj_.object();
921 for (
const auto &fd : function_data_) {
922 auto pcie_type = std_to_attr<>(
924 auto forward_target = std_to_attr<>(
925 std::pair<std::string, ConfObjectRef>(
"forward_target",
927 auto function_id = std_to_attr<>(
928 std::pair<std::string, int>(
"function_id", fd.first));
929 attr_value_t attr = SIM_make_attr_list(3, pcie_type, forward_target,
932 auto obj_name = gasket_obj_.name() +
".port.cfg" + \
933 std::to_string(fd.first);
936 std::ignore = SIM_clear_exception();
940 SIM_attr_free(&attr);
944template <
unsigned int BUSWIDTH,
typename TYPES>
947 std::string name =
"port.cfg";
948 if (function_number_has_8bits_) {
949 name += std::to_string(device_id & 0xff);
951 name += std::to_string(device_id & 7);
953 auto map_helper = SIM_object_descendant(gasket_obj_, name.c_str());
956 "Could not find map helper object with name '%s.%s'",
957 gasket_obj_.name().c_str(), name.c_str());
962template <
unsigned int BUSWIDTH,
typename TYPES>
963size_t PcieMappingInterconnect<BUSWIDTH, TYPES>::
964validateTransaction(tlm::tlm_generic_payload &trans) {
965 PcieTlmExtension *pcie_ext =
nullptr;
966 trans.get_extension<PcieTlmExtension>(pcie_ext);
968 if (pcie_ext ==
nullptr) {
969 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
970 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
971 "PcieTlmExtension is required but not found");
975 std::ostringstream os;
976 os <<
"Received a PCIe transaction with type "
977 << pcieTypeName(pcie_ext->type);
978 if (pcie_ext->device_id_set) {
979 os <<
", " << pcieDeviceIdStr(pcie_ext->device_id);
981 os <<
", address 0x" << std::hex << trans.get_address() << std::endl;
982 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
986 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
987 "Only support following PCIe types: MEM/IO/CFG/MSG");
988 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
993 && !pcie_ext->device_id_set) {
994 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
995 "PCIe device ID ATOM is required");
996 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
1000 size_t socket_id = 0;
1002 socket_id = findSocketId(pcie_ext->type, pcie_ext->device_id & 7,
1004 }
catch (
const std::exception &e) {
1005 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, e.what());
1006 trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE);
1010 if (socket_id >= initiator_sockets_.size()) {
1012 os <<
"Initiator socket ID " << socket_id <<
" not created yet";
1013 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
1014 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
1019 interceptCfgHeaderAccess(socket_id, trans);
1025template <
unsigned int BUSWIDTH,
typename TYPES>
1026void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1027transaction_b_transport(tlm::tlm_generic_payload &trans,
1028 sc_core::sc_time &t) {
1029 trans.set_response_status(tlm::TLM_OK_RESPONSE);
1030 size_t socket_id = validateTransaction(trans);
1031 if (trans.get_response_status() == tlm::TLM_OK_RESPONSE) {
1032 initiator_sockets_.at(socket_id)->b_transport(trans, t);
1036template <
unsigned int BUSWIDTH,
typename TYPES>
1037unsigned int PcieMappingInterconnect<BUSWIDTH, TYPES>::
1038transaction_transport_dbg(tlm::tlm_generic_payload &trans) {
1039 trans.set_response_status(tlm::TLM_OK_RESPONSE);
1040 size_t socket_id = validateTransaction(trans);
1041 if (trans.get_response_status() == tlm::TLM_OK_RESPONSE) {
1042 return initiator_sockets_.at(socket_id)->transport_dbg(trans);
1051template <
unsigned int BUSWIDTH,
typename TYPES>
1052void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1053pcie_map_invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
1054 sc_dt::uint64 end_range) {
1055 pcie_map_target_socket_->invalidate_direct_mem_ptr(start_range,
1062template <
unsigned int BUSWIDTH,
typename TYPES>
1063void PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_b_transport(
1064 tlm::tlm_generic_payload &trans,
1065 sc_core::sc_time &t) {
1066 pcie_map_initiator_socket->b_transport(trans, t);
1072template <
unsigned int BUSWIDTH,
typename TYPES>
1073unsigned int PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_transport_dbg(
1074 tlm::tlm_generic_payload &trans) {
1075 return pcie_map_initiator_socket->transport_dbg(trans);
1081template <
unsigned int BUSWIDTH,
typename TYPES>
1082bool PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_get_direct_mem_ptr(
1083 tlm::tlm_generic_payload &trans,
1084 tlm::tlm_dmi &dmi_data) {
1085 return pcie_map_initiator_socket->get_direct_mem_ptr(trans, dmi_data);
1088template <
unsigned int BUSWIDTH,
typename TYPES>
1089void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1090castToTarget(sc_core::sc_object *
object, supported_target_socket_t *target) {
1091 if (
object ==
nullptr) {
1092 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
1093 "Unable to castToTarget from a nullptr");
1097 auto *tlm_target =
dynamic_cast<
1098 tlm::tlm_target_socket<BUSWIDTH, TYPES> *
>(object);
1100 target->tlm = tlm_target;
1104 auto *multi_target =
dynamic_cast<
1105 tlm_utils::multi_target_base<BUSWIDTH, TYPES> *
>(object);
1107 target->multi = multi_target;
1111 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
1112 "Unable to dynamic-cast PCIe target socket");
Definition: pcie_mapping_interconnect.h:82
void send_extension(iface::Transaction *transaction) override
Called by extension after the extension is set on the payload.
Definition: pcie_mapping_interconnect.h:87
virtual ~PcieMappingInterconnectExtensionSender()
Definition: pcie_mapping_interconnect.h:84
iface::Transaction failed_transaction_
Definition: pcie_mapping_interconnect.h:96
void send_failed(iface::Transaction *transaction) override
Called by extension if method_call invocation was missing.
Definition: pcie_mapping_interconnect.h:91
Definition: pcie_mapping_interconnect.h:106
PcieMappingInterconnect(sc_core::sc_module_name="PcieMappingInterconnect")
Definition: pcie_mapping_interconnect.h:121
void connected(uint16_t device_id)
Definition: pcie_mapping_interconnect.h:377
void before_end_of_elaboration() override
Definition: pcie_mapping_interconnect.h:334
bool enable_base_address_subtraction
Definition: pcie_mapping_interconnect.h:203
SC_HAS_PROCESS(PcieMappingInterconnect)
initiator_socket_t pcie_map_initiator_socket
IC -> Simics, forwards the upstream pcie-map transactions.
Definition: pcie_mapping_interconnect.h:198
void hotReset()
Definition: pcie_mapping_interconnect.h:407
void createCfgMapHelper()
Definition: pcie_mapping_interconnect.h:879
target_socket_t pcie_device_target_socket
Definition: pcie_mapping_interconnect.h:196
std::map< std::pair< size_t, size_t >, size_t > addressIdMemMap() const
Definition: pcie_mapping_interconnect.h:540
void connect(iface::PcieDeviceQueryInterface *pci, iface::PcieBaseAddressRegisterQueryInterface *bar, iface::PcieResetInterface *reset, ConfObjectRef o)
Called by (outer) composite class to retrieve the required information to connect the IC with the PCI...
Definition: pcie_mapping_interconnect.h:474
target_socket_t transaction_target_socket
Definition: pcie_mapping_interconnect.h:194
void disconnected(uint16_t device_id)
Definition: pcie_mapping_interconnect.h:397
sc_core::sc_in< bool > warm_reset_pin
Definition: pcie_mapping_interconnect.h:200
std::map< std::pair< size_t, size_t >, size_t > addressIdIoMap() const
Definition: pcie_mapping_interconnect.h:546
Generic extension sender initialized with a TLM2 initiator socket of TSocket type.
Definition: extension_sender.h:35
void send_extension(Transaction *transaction) override
Called by extension after the extension is set on the payload.
Definition: extension_sender.h:55
void init(TSocket *socket)
Definition: extension_sender.h:40
Transaction transaction() override
Called by extension to get a new Transaction.
Definition: extension_sender.h:49
void send_failed(Transaction *transaction) override
Called by extension if method_call invocation was missing.
Definition: extension_sender.h:58
void init(ExtensionSenderInterface *sender, tlm::tlm_generic_payload *payload)
Deprecated, use the init(ExtensionSenderInterface *sender) instead.
Definition: extension.h:45
Interface that allows the Simics glue to perform snooping and automatic connection of the device's ta...
Definition: pcie_device_query_interface.h:50
virtual std::vector< PCIeBar > getBarInfo()=0
BAR register information.
Interface required from a SystemC PCIe device in order to connect to Simics.
Definition: pcie_device_query_interface.h:29
virtual sc_core::sc_object * getMsgTargetSocket()=0
virtual sc_core::sc_object * getConfigTargetSocket()=0
virtual sc_core::sc_object * getPcieMapInitiatorSocket()=0
Extension for Simics pcie_map interface.
Definition: pcie_map_extension.h:28
Definition: pcie_device_query_interface.h:92
Class that encapsulates a generic_payload and returns it to the TransactionPool when the Transaction ...
Definition: transaction.h:31
conf_object_t * SIM_create_object(conf_class_t *NOTNULL cls, const char *name, attr_value_t attrs)
conf_object_t * SIM_get_object(const char *NOTNULL name)
attr_value_t SIM_get_attribute(conf_object_t *NOTNULL obj, const char *name)
conf_class_t * SIM_get_class(const char *NOTNULL name)
@ Log_Configuration
Definition: adapter_log_groups.h:25
pcie_type_t
Definition: pcie_type.h:22
@ PCIE_Type_Cfg
Definition: pcie_type.h:26
@ PCIE_Type_Mem
Definition: pcie_type.h:24
@ PCIE_Type_Msg
Definition: pcie_type.h:27
@ PCIE_Type_Not_Set
Definition: pcie_type.h:23
@ PCIE_Type_Other
Definition: pcie_type.h:28
@ PCIE_Type_IO
Definition: pcie_type.h:25
Reduced, stand-alone, version of the Simics map_info_t struct.
Definition: map_info.h:25
uint64_t physical_address_t
Definition: map_info.h:26