54 void end_of_elaboration()
override {}
60 QemuDevice::end_of_elaboration();
71 sc_core::sc_vector<QemuInitiatorSignalSocket> irq_out;
93 cci::cci_param<uint64_t> p_mmio_addr;
94 cci::cci_param<uint64_t> p_mmio_size;
95 cci::cci_param<uint64_t> p_mmio_high_addr;
96 cci::cci_param<uint64_t> p_mmio_high_size;
101 std::vector<Device*> devices;
104 qemu_gpex(
const sc_core::sc_module_name& name, sc_core::sc_object*
o)
111 , bus_master(
"bus_master", *
this, inst)
112 , ecam_iface(
"ecam_iface", inst)
113 , mmio_iface(
"mmio_iface", inst)
114 , mmio_iface_high(
"mmio_iface_high", inst)
115 , pio_iface(
"pio_iface", inst)
116 , irq_out(
"irq_out", 4)
117 , irq_num{ -1, -1, -1, -1 }
118 , p_mmio_addr(
"mmio_iface.address",
mmio_addr,
"Interface MMIO address")
119 , p_mmio_size(
"mmio_iface.size",
mmio_size,
"Interface MMIO size")
120 , p_mmio_high_addr(
"mmio_iface_high.address",
mmio_high_addr,
"High Interface MMIO address")
121 , p_mmio_high_size(
"mmio_iface_high.size",
mmio_high_size,
"High Interface MMIO size")
127 void add_device(Device&
dev)
129 if (m_inst !=
dev.get_qemu_inst()) {
130 SCP_FATAL(
SCMOD) <<
"PCIE device and host have to be in same qemu instance";
132 devices.push_back(&
dev);
135 void before_end_of_elaboration()
override
137 QemuDevice::before_end_of_elaboration();
139 bus_master.init(m_dev,
"bus-master");
142 void end_of_elaboration()
override
144 QemuDevice::set_sysbus_as_parent_bus();
145 QemuDevice::end_of_elaboration();
153 m_mmio_alias.init_alias(m_dev,
"mmio-alias",
mmio_mr, p_mmio_addr, p_mmio_size);
155 m_mmio_high_alias.init_alias(m_dev,
"mmio-high-alias",
mmio_mr, p_mmio_high_addr, p_mmio_high_size);
157 ecam_iface.init(
gpex, 0);
158 mmio_iface.init_with_mr(m_mmio_alias);
159 mmio_iface_high.init_with_mr(m_mmio_high_alias);
160 pio_iface.init(
gpex, 2);
162 for (
int i = 0;
i < 4;
i++) {
163 irq_out[
i].init_sbd(
gpex,
i);
165 gpex.set_irq_num(
i, irq_num[
i]);
170 for (
auto it = devices.begin();
it != devices.end(); ++
it) {
180 virtual sc_core::sc_time initiator_get_local_time()
override {
return sc_core::sc_time_stamp(); }
186 virtual void initiator_set_local_time(
const sc_core::sc_time&
t)
override {}
191 virtual void initiator_customize_tlm_payload(TlmPayload&
payload)
override {}
196 virtual void initiator_tidy_tlm_payload(TlmPayload&
payload)
override {}
201 virtual void initiator_async_run(qemu::Cpu::AsyncJobFn
job)
override {}