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),
177 interconnect_.connected(
id & ~0x7);
183 if (port_obj ==
nullptr) {
185 "can't disconnect from NULL");
191 "can't disconnect from '%s', currently connected"
193 SIM_object_name(port_obj),
202 interconnect_.disconnected(
id & ~0x7);
209 interconnect_.hotReset();
214 template<
typename TPcieDevice>
222 simics2tlm::createGasket(
223 &interconnect_.pcie_device_target_socket, o));
227 simics2tlm::createGasket(
228 &interconnect_.transaction_target_socket, o));
232 systemc_signal_.
set_pin(&interconnect_.warm_reset_pin,
false, o);
236 tlm2simics::createMultiGasket(
237 &interconnect_.pcie_map_initiator_socket, o));
239 tlm2simics::createMultiGasket(
240 &interconnect_.pcie_map_initiator_socket, o));
244 interconnect_.connect(
255 return interconnect_.addressIdMemMap();
259 return interconnect_.addressIdIoMap();
263 return interconnect_.enable_base_address_subtraction;
266 interconnect_.enable_base_address_subtraction = val;
273 interconnect_.createCfgMapHelper();
277 void setPcieTypeAndForwardTarget(ConfObjectRef obj) {
278 SIM_set_attribute_default(
279 SIM_object_descendant(obj,
"port.mem"),
"pcie_type",
281 SIM_set_attribute_default(
282 SIM_object_descendant(obj,
"port.mem"),
"forward_target",
283 SIM_make_attr_object(obj));
284 SIM_set_attribute_default(
285 SIM_object_descendant(obj,
"port.io"),
"pcie_type",
287 SIM_set_attribute_default(
288 SIM_object_descendant(obj,
"port.io"),
"forward_target",
289 SIM_make_attr_object(obj));
290 SIM_set_attribute_default(
291 SIM_object_descendant(obj,
"port.msg"),
"pcie_type",
293 SIM_set_attribute_default(
294 SIM_object_descendant(obj,
"port.msg"),
"forward_target",
295 SIM_make_attr_object(obj));
301 PcieMappingInterconnect<BUSWIDTH, TYPES> interconnect_;
308 simics::ConfObjectRef obj_;
316 composite::PcieGasketBase::initClassInternal<T>(cls);
Definition: connector.h:76
Provides get/set functionality for a connector attribute, typically registered by using the Connector...
Definition: connector.h:41
Utility class that handles the context switching, using RAII methodology.
Definition: context.h:33
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:207
void createCfgMapHelper()
Definition: pcie_gasket.h:272
void disconnected(conf_object_t *port_obj, uint16_t id) override
Definition: pcie_gasket.h:180
bool enableBaseAddressSubtraction() const
Definition: pcie_gasket.h:262
std::map< std::pair< size_t, size_t >, size_t > addressIdMemMap() const
Definition: pcie_gasket.h:254
void connected(conf_object_t *port_obj, uint16_t id) override
Definition: pcie_gasket.h:155
void connect(TPcieDevice *device)
Definition: pcie_gasket.h:215
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:265
std::map< std::pair< size_t, size_t >, size_t > addressIdIoMap() const
Definition: pcie_gasket.h:258
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:32
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:32
Interface to the SystemC simulation.
Definition: simulation_interface.h:27
virtual ConfObjectRef simics_object() const =0
Adapter for Simics signal interface.
Definition: transaction_simics_adapter.h:32
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:35
SignalGasketAdapter(SignalInterface *signal, iface::SimulationInterface *simulation)
Definition: signal_gasket_adapter.h:37
void set_gasket(GasketInterface::Ptr gasketInterface)
Definition: gasket_owner.h:39
Adapter for PcieDevice gasket.
Definition: pcie_device_gasket_adapter.h:33
PcieDeviceGasketAdapter(PcieDeviceInterface *pcie_device, iface::SimulationInterface *simulation)
Definition: pcie_device_gasket_adapter.h:35
Class that implements the Simics pcie_device interface and translates it into a TLM transaction.
Definition: pcie_device.h:33
Definition: pcie_transaction.h:36
Adapter for Transaction gasket.
Definition: transaction_gasket_adapter.h:33
TransactionGasketAdapter(TransactionInterface *transaction, iface::SimulationInterface *simulation)
Definition: transaction_gasket_adapter.h:35
void set_deferrable(bool enable)
Toggle code paths for deferred transactions.
Definition: transaction.h:57
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:186
conf_class_t * SIM_get_class(const char *NOTNULL name)
void SCLCompositePcieInit(...)
Definition: class_decorator.h:34
@ PCIE_Type_Mem
Definition: pcie_type.h:24
@ PCIE_Type_Msg
Definition: pcie_type.h:27
@ PCIE_Type_IO
Definition: pcie_type.h:25