15#ifndef SIMICS_SYSTEMC_COMPOSITE_PCI_GASKET_H
16#define SIMICS_SYSTEMC_COMPOSITE_PCI_GASKET_H
18#if defined SIMICS_5_API || defined SIMICS_6_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;
65 cls->add(simics::Attribute(
67 "The PCI-bus to connect to.",
68 ATTR_CLS_VAR(C, simics_pci_)));
69 cls->add(io_memory_simics_adapter);
70 cls->add(pci_device_simics_adapter);
71 cls->add(pci_express_simics_adapter);
81template<
unsigned int BUSWIDTH = 32,
82 typename TYPES = tlm::tlm_base_protocol_types>
83class PciGasket :
public PciGasketBase,
84 public simics2tlm::IoMemoryGasketAdapter,
85 public simics2tlm::PciDeviceGasketAdapter,
86 public simics2tlm::PciExpressGasketAdapter {
88 explicit PciGasket(iface::SimulationInterface *simulation)
89 : IoMemoryGasketAdapter(&systemc_mmio_, simulation),
90 PciDeviceGasketAdapter(&systemc_pci_, simulation),
91 PciExpressGasketAdapter(&systemc_pci_express_, simulation),
92 simulation_(simulation) {
96 virtual void bus_reset() {
97 Context context(simulation_);
98 interconnect_.busReset();
99 PciDeviceGasketAdapter::bus_reset();
107 template<
typename TPciDevice>
108 void connect(TPciDevice *device) {
109 connect(
dynamic_cast<iface::PciDeviceQueryInterface *
>(device),
110 dynamic_cast<iface::BaseAddressRegisterQueryInterface *
>(
112 simulation_->simics_object());
115 void connect(iface::PciDeviceQueryInterface *pci,
116 iface::BaseAddressRegisterQueryInterface *bar,
117 ConfObjectRef gasket) {
118 ConfObjectRef o = simulation_->simics_object();
121 SIM_LOG_ERROR(gasket, Log_Configuration,
122 "The PCI device does not implement the"
123 " PciDeviceQueryInterface interface");
128 SIM_LOG_ERROR(gasket, Log_Configuration,
129 "The PCI device does not implement the"
130 " BaseAddressRegisterQueryInterface interface");
136 interconnect_.connect(pci, o);
139 simics_pci_->set_device(gasket);
140 simics_pci_->set_gasket(
141 tlm2simics::createGasket(
142 &interconnect_.pci_bus_initiator_socket, o));
148 systemc_pci_.set_gasket(
149 simics2tlm::createGasket(
150 &interconnect_.simics_target_socket, o));
151 systemc_pci_express_.set_gasket(
152 simics2tlm::createGasket(
153 &interconnect_.simics_target_socket, o));
156 interconnect_.connectConfig(bar, &systemc_mmio_, o);
159 interconnect_.connectMmio(bar, &systemc_mmio_, o);
163 iface::SimulationInterface *simulation_;
166 PciMappingInterconnect<BUSWIDTH, TYPES> interconnect_;
169 simics2tlm::IoMemory systemc_mmio_;
170 simics2tlm::PciDevice systemc_pci_;
171 simics2tlm::PciExpress systemc_pci_express_;
179 systemc::composite::PciGasketBase::initClassInternal<T>(cls);
186static_assert(
false,
"pci_express interface is deprecated. Use SIMICS_API:=6.");
void SCLCompositePciInit(...)
Definition: class_decorator.h:28
Definition: pci_bus_interface.h:24