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 pcie_map_extension_.add_function(getCfgMapHelper(device_id), device_id);
438 if (sender_.failed_transaction_.payload()) {
439 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
440 "Failure to add function");
445template <
unsigned int BUSWIDTH,
typename TYPES>
446void PcieMappingInterconnect<BUSWIDTH, TYPES>::
447delFunction(uint16_t device_id) {
448 std::ostringstream os;
449 os <<
"Deleting function for device_id: "
451 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
452 pcie_map_extension_.del_function(getCfgMapHelper(device_id), device_id);
453 if (sender_.failed_transaction_.payload()) {
454 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
455 "Failure to delete function");
460template <
unsigned int BUSWIDTH,
typename TYPES>
465 if (pci ==
nullptr) {
468 "PcieDeviceQueryInterface not implemented on the device");
472 if (bar ==
nullptr) {
475 "PcieBaseAddressRegisterQueryInterface not implemented on"
480 if (reset ==
nullptr) {
482 "PcieResetInterface not implemented on the device");
499 std::set<int> functions {0};
500 for (
const auto &it : bar_info_) {
501 if (functions.find(it.function) == functions.end()) {
502 function_data_[it.function];
503 functions.insert(it.function);
504 if (it.function > 7) {
505 function_number_has_8bits_ =
true;
511 auto *initiator =
dynamic_cast<
512 tlm::tlm_initiator_socket<BUSWIDTH, TYPES> *
>(
515 pcie_map_target_socket_.bind(*initiator);
518 "object returned by getPcieMapInitiatorSocket was not"
519 " a tlm::tlm_initiator_socket.");
523 createCfgMapHelper();
526template <
unsigned int BUSWIDTH,
typename TYPES>
527std::map<std::pair<size_t, size_t>,
size_t>
529 return address_id_mem_map_;
532template <
unsigned int BUSWIDTH,
typename TYPES>
533std::map<std::pair<size_t, size_t>,
size_t>
535 return address_id_io_map_;
538template <
unsigned int BUSWIDTH,
typename TYPES>
541 if (initiator_sockets_.size() <= socket_id) {
542 std::ostringstream os;
543 os <<
"Invalid socket_id: " << socket_id;
544 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
548 tlm::tlm_generic_payload trans;
552 trans.set_data_ptr(
reinterpret_cast<unsigned char *
>(&value));
553 trans.set_data_length(4);
554 trans.set_streaming_width(4);
556 trans.set_command(tlm::TLM_READ_COMMAND);
557 trans.set_address(0x4);
559 auto ret = initiator_sockets_[socket_id]->transport_dbg(trans);
567 auto fd = function_data_.begin();
568 std::advance(fd, socket_id);
569 fd->second.command = value;
573 for (
const auto &bar : bar_info_) {
577 if (bar.function != fd->first) {
581 int expected_bar_id = bar.offset == 0x30 ? 6 : (bar.offset - 0x10) / 4;
583 if (bar_id != -1 && bar_id != expected_bar_id) {
587 trans.set_address(bar.offset);
588 initiator_sockets_[socket_id]->transport_dbg(trans);
589 fd->second.base_address[expected_bar_id] = value;
591 if (expected_bar_id == 6) {
593 PCIE_MAPPING_INTERCONNECT_TAG,
594 "Expansion ROM BAR can't support 64-bit address");
597 trans.set_address(bar.offset + 4);
598 initiator_sockets_[socket_id]->transport_dbg(trans);
599 fd->second.base_address[expected_bar_id + 1] = value;
605template <
unsigned int BUSWIDTH,
typename TYPES>
606void PcieMappingInterconnect<BUSWIDTH, TYPES>::
608 std::ostringstream os;
609 os <<
"Adding mapping of type: "
610 << pcieTypeName(type);
611 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
612 pcie_map_extension_.add_map(info, type);
613 if (sender_.failed_transaction_.payload()) {
614 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
"Failure to add map");
619template <
unsigned int BUSWIDTH,
typename TYPES>
620void PcieMappingInterconnect<BUSWIDTH, TYPES>::
624 auto it = std::find_if(
625 address_id_mem_map_.begin(),
626 address_id_mem_map_.end(),
628 const std::pair<std::pair<size_t, size_t>,
size_t> &entry) {
629 return entry.second == socket_id;
632 if (it != address_id_mem_map_.end()) {
633 base = it->first.first;
634 address_id_mem_map_.erase(it);
637 auto it = std::find_if(
638 address_id_io_map_.begin(),
639 address_id_io_map_.end(),
641 const std::pair<std::pair<size_t, size_t>,
size_t> &entry) {
642 return entry.second == socket_id;
645 if (it != address_id_io_map_.end()) {
646 base = it->first.first;
647 address_id_io_map_.erase(it);
651 if (base != 0xffffffffffffffff) {
652 std::ostringstream os;
653 os <<
"Deleting mapping of type: "
654 << pcieTypeName(type) <<
", base: 0x" << std::hex << base;
655 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
657 pcie_map_extension_.del_map(base, type);
658 if (sender_.failed_transaction_.payload()) {
659 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
"Failure to del map");
665template <
unsigned int BUSWIDTH,
typename TYPES>
666void PcieMappingInterconnect<BUSWIDTH, TYPES>::
667updateMappings(
int function_id,
int bar_id) {
668 for (
const auto &bi : bar_info_) {
669 if (function_id != -1 && bi.function != function_id) {
673 auto header = function_data_.at(bi.function);
675 int expected_bar_id = bi.offset == 0x30 ? 6 : (bi.offset - 0x10) / 4;
676 if (bar_id != -1 && bar_id != expected_bar_id) {
680 uint64_t base_address = header.base_address[expected_bar_id];
682 if (expected_bar_id == 6) {
684 PCIE_MAPPING_INTERCONNECT_TAG,
685 "Expansion ROM BAR can't support 64-bit address");
687 base_address |=
static_cast<uint64_t
>(
688 header.base_address[expected_bar_id + 1]) << 32;
692 bool enable = header.command & 1;
696 if (bi.offset == 0x30) {
697 enable = base_address & 1;
699 enable = (header.command >> 1) & 1;
702 base_address &= ~((1ULL << bi.size_bits) - 1);
703 size_t socket_id = fn_bar_id_map_.at(
704 std::make_pair(bi.function, bi.offset));
705 delMap(socket_id, type);
710 types::map_info_t info(base_address, base_address,
711 1ULL << bi.size_bits, function_id);
712 auto address_range = std::make_pair(info.base,
713 info.base + info.length);
716 address_id_mem_map_[address_range] = socket_id;
717 std::ostringstream os;
718 os <<
"Memory address for function " << bi.function
719 <<
" and bar ID " << expected_bar_id
720 <<
" in range of [0x" << std::hex << info.base
721 <<
"-0x" << info.base + info.length <<
"] maps to socket ID "
723 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
725 address_id_io_map_[address_range] = socket_id;
726 std::ostringstream os;
727 os <<
"IO address for function " << bi.function
728 <<
" and bar ID " << expected_bar_id
729 <<
" in range of [0x" << std::hex << info.base
730 <<
"-0x" << info.base + info.length <<
"] maps to socket ID "
732 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
739template <
unsigned int BUSWIDTH,
typename TYPES>
740void PcieMappingInterconnect<BUSWIDTH, TYPES>::
741updateCommand(uint16_t function_id, uint16_t old_command) {
742 if (function_data_[function_id].command != old_command) {
743 updateMappings(function_id);
747template <
unsigned int BUSWIDTH,
typename TYPES>
748void PcieMappingInterconnect<BUSWIDTH, TYPES>::
749interceptCfgHeaderAccess(
size_t socket_id,
750 tlm::tlm_generic_payload &trans) {
751 unsigned int size = trans.get_data_length();
753 if (trans.get_byte_enable_ptr() || trans.get_streaming_width() != size) {
758 if (!trans.is_write()) {
763 uint64_t *data =
reinterpret_cast<uint64_t *
>(trans.get_data_ptr());
765 auto it = function_data_.begin();
766 std::advance(it, socket_id);
767 uint16_t function_id = it->first;
768 auto &header = it->second;
769 sc_dt::uint64 offset = trans.get_address();
772 uint16_t old_command = header.command;
773 retrieveFunctionData(socket_id, -1);
774 header.command = (*data) & 0xffff;
775 updateCommand(function_id, old_command);
784 int bar_id = (offset - 0x10) / 4;
785 retrieveFunctionData(socket_id, bar_id);
792 header.base_address[bar_id] = *data & 0xffffffff;
793 if (size == 8 && !(offset % 8)) {
794 header.base_address[bar_id + 1] = *data >> 32;
796 updateMappings(function_id, bar_id);
801 retrieveFunctionData(socket_id, bar_id);
802 header.base_address[bar_id] = *data & 0xffffffff;
803 updateMappings(function_id, bar_id);
808template <
unsigned int BUSWIDTH,
typename TYPES>
809size_t PcieMappingInterconnect<BUSWIDTH, TYPES>::
811 tlm::tlm_generic_payload &trans)
const {
813 auto found = function_data_.find(function_id);
814 if (found == function_data_.end()) {
815 std::ostringstream os;
816 os <<
"Function id(" << function_id
817 <<
") not found for this device";
818 throw std::invalid_argument {
822 return std::distance(function_data_.begin(), found);
824 size_t address = trans.get_address();
825 for (
const auto &entry : address_id_mem_map_) {
826 auto startAddress = entry.first.first;
827 auto endAddress = entry.first.second;
828 auto id = entry.second;
830 if (address >= startAddress && address < endAddress) {
831 if (enable_base_address_subtraction) {
832 trans.set_address(address - startAddress);
837 throw std::invalid_argument {
838 "Unable to find the initiator_socket to forward the MEM transaction"
841 size_t address = trans.get_address();
842 for (
const auto &entry : address_id_io_map_) {
843 auto startAddress = entry.first.first;
844 auto endAddress = entry.first.second;
845 auto id = entry.second;
847 if (address >= startAddress && address < endAddress) {
848 if (enable_base_address_subtraction) {
849 trans.set_address(address - startAddress);
854 throw std::invalid_argument {
855 "Unable to find the initiator_socket to forward the IO transaction"
858 return function_data_.size() + bar_info_.size();
860 throw std::invalid_argument {
861 "Unsupported PCIe type"
865template <
unsigned int BUSWIDTH,
typename TYPES>
869 if (map_helper ==
nullptr) {
872 "Simics class pcie_map_helper_cpp is required."
873 "Try load the module pcie-map-helper-c++ first.");
877 if (SIM_c_get_interface(simulation_obj_,
"pcie_device") ==
nullptr) {
879 if (!SIM_object_is_configured(simulation_obj_)) {
882 "Simulation object is not configured yet, cannot get"
883 " its gasket_list attribute");
890 int gasket_count = SIM_attr_list_size(gasket_list);
891 for (
int i = 0; i < gasket_count; ++i) {
892 auto obj = SIM_attr_object(SIM_attr_list_item(gasket_list, i));
893 if (SIM_c_get_interface(obj,
"pcie_device")) {
898 if (gasket_obj_.object() ==
nullptr) {
901 "No gasket object implemented the required"
902 " pcie_device interface");
906 gasket_obj_ = simulation_obj_.object();
909 for (
const auto &fd : function_data_) {
910 auto pcie_type = std_to_attr<>(
912 auto forward_target = std_to_attr<>(
913 std::pair<std::string, ConfObjectRef>(
"forward_target",
915 auto function_id = std_to_attr<>(
916 std::pair<std::string, int>(
"function_id", fd.first));
917 attr_value_t attr = SIM_make_attr_list(3, pcie_type, forward_target,
920 auto obj_name = gasket_obj_.name() +
".port.cfg" + \
921 std::to_string(fd.first);
924 (void)SIM_clear_exception();
928 SIM_attr_free(&attr);
932template <
unsigned int BUSWIDTH,
typename TYPES>
935 std::string name =
"port.cfg";
936 if (function_number_has_8bits_) {
937 name += std::to_string(device_id & 0xff);
939 name += std::to_string(device_id & 7);
941 auto map_helper = SIM_object_descendant(gasket_obj_, name.c_str());
946template <
unsigned int BUSWIDTH,
typename TYPES>
947size_t PcieMappingInterconnect<BUSWIDTH, TYPES>::
948validateTransaction(tlm::tlm_generic_payload &trans) {
949 PcieTlmExtension *pcie_ext =
nullptr;
950 trans.get_extension<PcieTlmExtension>(pcie_ext);
952 if (pcie_ext ==
nullptr) {
953 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
954 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
955 "PcieTlmExtension is required but not found");
959 std::ostringstream os;
960 os <<
"Received a PCIe transaction with type "
961 << pcieTypeName(pcie_ext->type);
962 if (pcie_ext->device_id_set) {
963 os <<
", " << pcieDeviceIdStr(pcie_ext->device_id);
965 os <<
", address 0x" << std::hex << trans.get_address() << std::endl;
966 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
970 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
971 "Only support following PCIe types: MEM/IO/CFG/MSG");
972 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
977 && !pcie_ext->device_id_set) {
978 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG,
979 "PCIe device ID ATOM is required");
980 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
984 size_t socket_id = 0;
986 socket_id = findSocketId(pcie_ext->type, pcie_ext->device_id & 7,
988 }
catch (
const std::exception &e) {
989 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, e.what());
990 trans.set_response_status(tlm::TLM_ADDRESS_ERROR_RESPONSE);
994 if (socket_id >= initiator_sockets_.size()) {
996 os <<
"Initiator socket ID " << socket_id <<
" not created yet";
997 SC_REPORT_INFO(PCIE_MAPPING_INTERCONNECT_TAG, os.str().c_str());
998 trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
1003 interceptCfgHeaderAccess(socket_id, trans);
1009template <
unsigned int BUSWIDTH,
typename TYPES>
1010void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1011transaction_b_transport(tlm::tlm_generic_payload &trans,
1012 sc_core::sc_time &t) {
1013 trans.set_response_status(tlm::TLM_OK_RESPONSE);
1014 size_t socket_id = validateTransaction(trans);
1015 if (trans.get_response_status() == tlm::TLM_OK_RESPONSE) {
1016 initiator_sockets_.at(socket_id)->b_transport(trans, t);
1020template <
unsigned int BUSWIDTH,
typename TYPES>
1021unsigned int PcieMappingInterconnect<BUSWIDTH, TYPES>::
1022transaction_transport_dbg(tlm::tlm_generic_payload &trans) {
1023 trans.set_response_status(tlm::TLM_OK_RESPONSE);
1024 size_t socket_id = validateTransaction(trans);
1025 if (trans.get_response_status() == tlm::TLM_OK_RESPONSE) {
1026 return initiator_sockets_.at(socket_id)->transport_dbg(trans);
1035template <
unsigned int BUSWIDTH,
typename TYPES>
1036void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1037pcie_map_invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
1038 sc_dt::uint64 end_range) {
1039 pcie_map_target_socket_->invalidate_direct_mem_ptr(start_range,
1046template <
unsigned int BUSWIDTH,
typename TYPES>
1047void PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_b_transport(
1048 tlm::tlm_generic_payload &trans,
1049 sc_core::sc_time &t) {
1050 pcie_map_initiator_socket->b_transport(trans, t);
1056template <
unsigned int BUSWIDTH,
typename TYPES>
1057unsigned int PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_transport_dbg(
1058 tlm::tlm_generic_payload &trans) {
1059 return pcie_map_initiator_socket->transport_dbg(trans);
1065template <
unsigned int BUSWIDTH,
typename TYPES>
1066bool PcieMappingInterconnect<BUSWIDTH, TYPES>::pcie_map_get_direct_mem_ptr(
1067 tlm::tlm_generic_payload &trans,
1068 tlm::tlm_dmi &dmi_data) {
1069 return pcie_map_initiator_socket->get_direct_mem_ptr(trans, dmi_data);
1072template <
unsigned int BUSWIDTH,
typename TYPES>
1073void PcieMappingInterconnect<BUSWIDTH, TYPES>::
1074castToTarget(sc_core::sc_object *
object, supported_target_socket_t *target) {
1075 if (
object ==
nullptr) {
1076 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
1077 "Unable to castToTarget from a nullptr");
1081 auto *tlm_target =
dynamic_cast<
1082 tlm::tlm_target_socket<BUSWIDTH, TYPES> *
>(object);
1084 target->tlm = tlm_target;
1088 auto *multi_target =
dynamic_cast<
1089 tlm_utils::multi_target_base<BUSWIDTH, TYPES> *
>(object);
1091 target->multi = multi_target;
1095 SC_REPORT_ERROR(PCIE_MAPPING_INTERCONNECT_TAG,
1096 "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:867
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:528
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:462
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:534
Generic extension sender initialized with a TLM2 initiator socket of TSocket type.
Definition: extension_sender.h:35
virtual void send_failed(Transaction *transaction)
Called by extension if method_call invocation was missing.
Definition: extension_sender.h:58
void init(TSocket *socket)
Definition: extension_sender.h:40
virtual Transaction transaction()
Called by extension to get a new Transaction.
Definition: extension_sender.h:49
virtual void send_extension(Transaction *transaction)
Called by extension after the extension is set on the payload.
Definition: extension_sender.h:55
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