15#ifndef SIMICS_SYSTEMC_COMPOSITE_PCI_GASKET_H
16#define SIMICS_SYSTEMC_COMPOSITE_PCI_GASKET_H
18#if defined SIMICS_6_API || defined SHOW_OBSOLETE_API
52 typedef PciGasketBase *is_composite_pci_gasket;
54 static void initClassInternal(ConfClass *cls);
57 Connector<tlm2simics::PciBus> simics_pci_;
61void PciGasketBase::initClassInternal(ConfClass *cls) {
62 static iface::IoMemorySimicsAdapter<C> io_memory_simics_adapter;
63 static iface::PciDeviceSimicsAdapter<C> pci_device_simics_adapter;
64 static iface::PciExpressSimicsAdapter<C> pci_express_simics_adapter;
70 cls->add(simics::Attribute(
72 "The PCI-bus to connect to.",
73 ATTR_CLS_VAR(C, simics_pci_)));
74 cls->add(io_memory_simics_adapter);
75 cls->add(pci_device_simics_adapter);
76 cls->add(pci_express_simics_adapter);
86template<
unsigned int BUSWIDTH = 32,
87 typename TYPES = tlm::tlm_base_protocol_types>
88class PciGasket :
public PciGasketBase,
89 public simics2tlm::IoMemoryGasketAdapter,
90 public simics2tlm::PciDeviceGasketAdapter,
91 public simics2tlm::PciExpressGasketAdapter {
93 explicit PciGasket(iface::SimulationInterface *simulation)
94 : IoMemoryGasketAdapter(&systemc_mmio_, simulation),
95 PciDeviceGasketAdapter(&systemc_pci_, simulation),
96 PciExpressGasketAdapter(&systemc_pci_express_, simulation),
97 simulation_(simulation) {
101 virtual void bus_reset() {
102 Context context(simulation_);
103 interconnect_.busReset();
104 PciDeviceGasketAdapter::bus_reset();
112 template<
typename TPciDevice>
113 void connect(TPciDevice *device) {
114 connect(
dynamic_cast<iface::PciDeviceQueryInterface *
>(device),
115 dynamic_cast<iface::BaseAddressRegisterQueryInterface *
>(
117 simulation_->simics_object());
120 void connect(iface::PciDeviceQueryInterface *pci,
121 iface::BaseAddressRegisterQueryInterface *bar,
122 ConfObjectRef gasket) {
123 ConfObjectRef o = simulation_->simics_object();
126 SIM_LOG_ERROR(gasket, Log_Configuration,
127 "The PCI device does not implement the"
128 " PciDeviceQueryInterface interface");
133 SIM_LOG_ERROR(gasket, Log_Configuration,
134 "The PCI device does not implement the"
135 " BaseAddressRegisterQueryInterface interface");
141 interconnect_.connect(pci, o);
144 simics_pci_->set_device(gasket);
145 simics_pci_->set_gasket(
146 tlm2simics::createGasket(
147 &interconnect_.pci_bus_initiator_socket, o));
153 systemc_pci_.set_gasket(
154 simics2tlm::createGasket(
155 &interconnect_.simics_target_socket, o));
156 systemc_pci_express_.set_gasket(
157 simics2tlm::createGasket(
158 &interconnect_.simics_target_socket, o));
161 interconnect_.connectConfig(bar, &systemc_mmio_, o);
164 interconnect_.connectMmio(bar, &systemc_mmio_, o);
168 iface::SimulationInterface *simulation_;
171 PciMappingInterconnect<BUSWIDTH, TYPES> interconnect_;
174 simics2tlm::IoMemory systemc_mmio_;
175 simics2tlm::PciDevice systemc_pci_;
176 simics2tlm::PciExpress systemc_pci_express_;
184 systemc::composite::PciGasketBase::initClassInternal<T>(cls);
191static_assert(
false,
"pci_express interface is deprecated. Use SIMICS_API:=6.");
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:186
void SCLCompositePciInit(...)
Definition: class_decorator.h:31