27 inline uint64_t get_uint64(std::string s)
29 m_broker.lock_preset_value(s);
30 m_broker.ignore_unconsumed_preset_values(
31 [s](
const std::pair<std::string, cci::cci_value>& iv) ->
bool {
return iv.first == s; });
32 auto v = m_broker.get_preset_cci_value(s);
34 return v.get_uint64();
40 cci::cci_broker_handle m_broker;
43 cci::cci_param<uint32_t> p_pamax;
44 cci::cci_param<uint16_t> p_num_smr;
45 cci::cci_param<uint16_t> p_num_cb;
46 cci::cci_param<uint16_t> p_num_pages;
47 cci::cci_param<bool> p_ato;
48 cci::cci_param<uint8_t> p_version;
49 cci::cci_param<uint8_t> p_num_tbu;
52 sc_core::sc_vector<QemuTargetSocket<>> upstream_socket;
53 sc_core::sc_vector<QemuInitiatorSignalSocket> irq_context;
55 sc_core::sc_vector<QemuInitiatorSocket<>> downstream_socket;
58 arm_smmu(
const sc_core::sc_module_name& name, sc_core::sc_object* o)
64 , m_broker(cci::cci_get_broker())
65 , p_pamax(
"pamax", 48,
"")
66 , p_num_smr(
"num_smr", 48,
"")
67 , p_num_cb(
"num_cb", 16,
"")
68 , p_num_pages(
"num_pages", 16,
"")
69 , p_ato(
"ato",
true,
"")
70 , p_version(
"version", 0x21,
"")
71 , p_num_tbu(
"num_tbu", 1,
"")
72 , upstream_socket(
"upstream_socket", p_num_tbu,
74 , register_socket(
"mem", m_inst)
75 , irq_global(
"irq_global")
76 , irq_context(
"irq_context", p_num_cb,
78 , downstream_socket(
"downstream_socket", p_num_tbu,
80 , dma_socket(
"dma", *
this, m_inst)
84 void before_end_of_elaboration()
override
86 QemuDevice::before_end_of_elaboration();
88 m_dev.set_prop_int(
"pamax", p_pamax);
89 m_dev.set_prop_int(
"num-smr", p_num_smr);
90 m_dev.set_prop_int(
"num-cb", p_num_cb);
91 m_dev.set_prop_int(
"num-pages", p_num_pages);
92 m_dev.set_prop_bool(
"ato", p_ato);
93 m_dev.set_prop_int(
"version", p_version);
94 m_dev.set_prop_int(
"num-tbu", p_num_tbu);
102 std::string s = std::string(name()) +
".upstream_socket_" + std::to_string(
i) +
".address";
103 if (m_broker.has_preset_value(s)) {
104 m_dev.set_prop_int((
"tbu-offset-" + std::to_string(
i)).
c_str(), get_uint64(s));
108 std::string s = std::string(name()) +
".upstream_socket_" + std::to_string(
i) +
".size";
109 if (m_broker.has_preset_value(s)) {
110 m_dev.set_prop_int((
"tbu-size-" + std::to_string(
i)).
c_str(), get_uint64(s));
114 std::string s = std::string(name()) +
".tbu_sid_" + std::to_string(
i);
115 if (m_broker.has_preset_value(s)) {
116 m_dev.set_prop_int((
"tbu-sid-" + std::to_string(
i)).
c_str(), get_uint64(s));
121 dma_socket.init(m_dev,
"dma");
124 void end_of_elaboration()
override
128 QemuDevice::set_sysbus_as_parent_bus();
129 QemuDevice::end_of_elaboration();
139 irq_context[
i].init_sbd(
sbd,
i + 1);
144 virtual void initiator_customize_tlm_payload(TlmPayload&
payload)
override {}
146 virtual void initiator_tidy_tlm_payload(TlmPayload&
payload)
override {}
148 virtual sc_core::sc_time initiator_get_local_time()
override {
return sc_core::sc_time_stamp(); }
150 virtual void initiator_set_local_time(
const sc_core::sc_time&
t)
override {}
152 virtual void initiator_async_run(qemu::Cpu::AsyncJobFn
job)
override {}
void init_sbd(qemu::SysBusDevice sbd, int gpio_idx)
Initialize this socket with a QEMU SysBusDevice, and a GPIO index.
Definition qemu-initiator-signal-socket.h:173