49 void end_of_elaboration()
override {}
55 QemuDevice::end_of_elaboration();
66 sc_core::sc_vector<QemuInitiatorSignalSocket> irq_out;
88 cci::cci_param<uint64_t> p_mmio_addr;
89 cci::cci_param<uint64_t> p_mmio_size;
90 cci::cci_param<uint64_t> p_mmio_high_addr;
91 cci::cci_param<uint64_t> p_mmio_high_size;
96 std::vector<Device*> devices;
99 qemu_gpex(
const sc_core::sc_module_name& name, sc_core::sc_object*
o)
106 , bus_master(
"bus_master", *
this, inst)
107 , ecam_iface(
"ecam_iface", inst)
108 , mmio_iface(
"mmio_iface", inst)
109 , mmio_iface_high(
"mmio_iface_high", inst)
110 , pio_iface(
"pio_iface", inst)
111 , irq_out(
"irq_out", 4)
112 , irq_num{ -1, -1, -1, -1 }
113 , p_mmio_addr(
"mmio_iface.address",
mmio_addr,
"Interface MMIO address")
114 , p_mmio_size(
"mmio_iface.size",
mmio_size,
"Interface MMIO size")
115 , p_mmio_high_addr(
"mmio_iface_high.address",
mmio_high_addr,
"High Interface MMIO address")
116 , p_mmio_high_size(
"mmio_iface_high.size",
mmio_high_size,
"High Interface MMIO size")
122 void add_device(Device&
dev)
124 if (m_inst !=
dev.get_qemu_inst()) {
125 SCP_FATAL(
SCMOD) <<
"PCIE device and host have to be in same qemu instance";
127 devices.push_back(&
dev);
130 void before_end_of_elaboration()
override
132 QemuDevice::before_end_of_elaboration();
134 bus_master.init(m_dev,
"bus-master");
137 void end_of_elaboration()
override
139 QemuDevice::set_sysbus_as_parent_bus();
140 QemuDevice::end_of_elaboration();
148 m_mmio_alias.init_alias(m_dev,
"mmio-alias",
mmio_mr, p_mmio_addr, p_mmio_size);
150 m_mmio_high_alias.init_alias(m_dev,
"mmio-high-alias",
mmio_mr, p_mmio_high_addr, p_mmio_high_size);
152 ecam_iface.init(
gpex, 0);
153 mmio_iface.init_with_mr(m_mmio_alias);
154 mmio_iface_high.init_with_mr(m_mmio_high_alias);
155 pio_iface.init(
gpex, 2);
157 for (
int i = 0;
i < 4;
i++) {
158 irq_out[
i].init_sbd(
gpex,
i);
160 gpex.set_irq_num(
i, irq_num[
i]);
165 for (
auto it = devices.begin();
it != devices.end(); ++
it) {
175 virtual sc_core::sc_time initiator_get_local_time()
override {
return sc_core::sc_time_stamp(); }
181 virtual void initiator_set_local_time(
const sc_core::sc_time&
t)
override {}
186 virtual void initiator_customize_tlm_payload(TlmPayload&
payload)
override {}
191 virtual void initiator_tidy_tlm_payload(TlmPayload&
payload)
override {}
196 virtual void initiator_async_run(qemu::Cpu::AsyncJobFn
job)
override {}