28#ifndef SIMICS_SYSTEMC_COMPOSITE_PCIE_GASKET_H
29#define SIMICS_SYSTEMC_COMPOSITE_PCIE_GASKET_H
33#include <simics/cc-api.h>
73 cls->add(Attribute(
"upstream_target",
"o|n",
74 "The PCIe upstream target to connect to.",
76 cls->add(Attribute(
"address_id_mem_map",
"[[[ii]i]*]",
77 "Internal. The map from MEM address range to"
79 ATTR_GETTER(C, addressIdMemMap),
nullptr));
80 cls->add(Attribute(
"address_id_io_map",
"[[[ii]i]*]",
81 "Internal. The map from IO address range to"
83 ATTR_GETTER(C, addressIdIoMap),
nullptr));
84 cls->add(Attribute(
"enable_base_address_subtraction",
"b",
85 "If set, MEM/IO transaction will receive only the"
86 " offset to the base address. Otherwise, it receives"
87 " the whole base address + offset. Default enabled",
88 ATTR_GETTER(C, enableBaseAddressSubtraction),
89 ATTR_SETTER(C, setEnableBaseAddressSubtraction)));
90 cls->add(pcie_device_simics_adapter);
91 cls->add(transaction_simics_adapter);
92 cls->add(signal_simics_adapter);
96 if (SIM_clear_exception() != SimExc_No_Exception) {
97 std::cerr <<
"ERROR: Simics class pcie_map_helper_cpp is not"
98 <<
" registered. Please build module"
99 <<
" pcie-map-helper-c++ first."
103 SIM_register_port(*cls,
"port.mem", map_helper,
104 " The help object maps to the PCIe MEM space");
105 SIM_register_port(*cls,
"port.io", map_helper,
106 "The help object maps to the PCIe IO space");
107 SIM_register_port(*cls,
"port.msg", map_helper,
108 "The help object maps to the PCIe MSG space");
122template<
unsigned int BUSWIDTH = 32,
123 typename TYPES = tlm::tlm_base_protocol_types>
133 simulation_(simulation) {
140 simics::ConfObjectRef obj)
144 simulation_(simulation),
147 setPcieTypeAndForwardTarget(obj_);
155 void connected(conf_object_t *port_obj, uint16_t
id)
override {
158 if (port_obj ==
nullptr) {
160 "can't connect to NULL");
168 "can't connect to '%s', currently connected to '%s'",
169 SIM_object_name(port_obj),
176 interconnect_.connected(
id);
182 if (port_obj ==
nullptr) {
184 "can't disconnect from NULL");
190 "can't disconnect from '%s', currently connected"
192 SIM_object_name(port_obj),
199 interconnect_.disconnected(
id);
206 interconnect_.hotReset();
211 template<
typename TPcieDevice>
219 simics2tlm::createGasket(
220 &interconnect_.pcie_device_target_socket, o));
224 simics2tlm::createGasket(
225 &interconnect_.transaction_target_socket, o));
229 systemc_signal_.
set_pin(&interconnect_.warm_reset_pin,
false, o);
233 tlm2simics::createMultiGasket(
234 &interconnect_.pcie_map_initiator_socket, o));
236 tlm2simics::createMultiGasket(
237 &interconnect_.pcie_map_initiator_socket, o));
241 interconnect_.connect(
252 return interconnect_.addressIdMemMap();
256 return interconnect_.addressIdIoMap();
260 return interconnect_.enable_base_address_subtraction;
263 interconnect_.enable_base_address_subtraction = val;
270 interconnect_.createCfgMapHelper();
274 void setPcieTypeAndForwardTarget(ConfObjectRef obj) {
275 SIM_set_attribute_default(
276 SIM_object_descendant(obj,
"port.mem"),
"pcie_type",
278 SIM_set_attribute_default(
279 SIM_object_descendant(obj,
"port.mem"),
"forward_target",
280 SIM_make_attr_object(obj));
281 SIM_set_attribute_default(
282 SIM_object_descendant(obj,
"port.io"),
"pcie_type",
284 SIM_set_attribute_default(
285 SIM_object_descendant(obj,
"port.io"),
"forward_target",
286 SIM_make_attr_object(obj));
287 SIM_set_attribute_default(
288 SIM_object_descendant(obj,
"port.msg"),
"pcie_type",
290 SIM_set_attribute_default(
291 SIM_object_descendant(obj,
"port.msg"),
"forward_target",
292 SIM_make_attr_object(obj));
298 PcieMappingInterconnect<BUSWIDTH, TYPES> interconnect_;
305 simics::ConfObjectRef obj_;
313 composite::PcieGasketBase::initClassInternal<T>(cls);
Definition: connector.h:74
Provides get/set functionality for a connector attribute, typically registered by using the Connector...
Definition: connector.h:39
Utility class that handles the context switching, using RAII methodology.
Definition: context.h:31
Definition: pcie_gasket.h:59
Connector< tlm2simics::PcieTransaction > simics_transaction_target_
Definition: pcie_gasket.h:112
PcieGasketBase * is_composite_pcie_gasket
Definition: pcie_gasket.h:61
ConnectorProxy< tlm2simics::PcieMap > simics_pcie_map_target_
Definition: pcie_gasket.h:113
static void initClassInternal(ConfClass *cls)
Definition: pcie_gasket.h:63
Composite Pcie Gasket to help the wrapping of a SystemC PCIe (multifunction) endpoint in Simics.
Definition: pcie_gasket.h:127
void hot_reset() override
Definition: pcie_gasket.h:204
void createCfgMapHelper()
Definition: pcie_gasket.h:269
void disconnected(conf_object_t *port_obj, uint16_t id) override
Definition: pcie_gasket.h:179
bool enableBaseAddressSubtraction() const
Definition: pcie_gasket.h:259
std::map< std::pair< size_t, size_t >, size_t > addressIdMemMap() const
Definition: pcie_gasket.h:251
void connected(conf_object_t *port_obj, uint16_t id) override
Definition: pcie_gasket.h:155
void connect(TPcieDevice *device)
Definition: pcie_gasket.h:212
PcieGasket(iface::SimulationInterface *simulation, simics::ConfObjectRef obj)
Definition: pcie_gasket.h:139
PcieGasket(iface::SimulationInterface *simulation)
Definition: pcie_gasket.h:129
void setEnableBaseAddressSubtraction(const bool &val)
Definition: pcie_gasket.h:262
std::map< std::pair< size_t, size_t >, size_t > addressIdIoMap() const
Definition: pcie_gasket.h:255
Interface that allows the Simics glue to perform snooping and automatic connection of the device's ta...
Definition: pcie_device_query_interface.h:51
Interface required from a SystemC PCIe device in order to connect to Simics.
Definition: pcie_device_query_interface.h:30
Adapter for Simics pcie_device interface.
Definition: pcie_device_simics_adapter.h:30
Definition: pcie_device_query_interface.h:93
Interface providing static SR-IOV configuration to the PcieMappingInterconnect.
Definition: pcie_device_query_interface.h:124
Adapter for Simics signal interface.
Definition: signal_simics_adapter.h:30
Interface to the SystemC simulation.
Definition: simulation_interface.h:25
virtual ConfObjectRef simics_object() const =0
Adapter for Simics signal interface.
Definition: transaction_simics_adapter.h:30
void set_pin(sc_core::sc_in< bool > *target_pin, bool initial_level, const ConfObjectRef &obj)
Adapter for Signal gasket.
Definition: signal_gasket_adapter.h:33
SignalGasketAdapter(SignalInterface *signal, iface::SimulationInterface *simulation)
Definition: signal_gasket_adapter.h:35
void set_gasket(GasketInterface::Ptr gasketInterface)
Definition: gasket_owner.h:39
Adapter for PcieDevice gasket.
Definition: pcie_device_gasket_adapter.h:31
PcieDeviceGasketAdapter(PcieDeviceInterface *pcie_device, iface::SimulationInterface *simulation)
Definition: pcie_device_gasket_adapter.h:33
Class that implements the Simics pcie_device interface and translates it into a TLM transaction.
Definition: pcie_device.h:31
Definition: pcie_transaction.h:34
Adapter for Transaction gasket.
Definition: transaction_gasket_adapter.h:31
TransactionGasketAdapter(TransactionInterface *transaction, iface::SimulationInterface *simulation)
Definition: transaction_gasket_adapter.h:33
void set_deferrable(bool enable)
Toggle code paths for deferred transactions.
Definition: transaction.h:55
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:184
conf_class_t * SIM_get_class(const char *NOTNULL name)
void SCLCompositePcieInit(...)
Definition: class_decorator.h:34
@ PCIE_Type_Mem
Definition: pcie_type.h:22
@ PCIE_Type_Msg
Definition: pcie_type.h:25
@ PCIE_Type_IO
Definition: pcie_type.h:23