29 cci::cci_broker_handle m_broker;
32 static constexpr qemu::Target ARCH = qemu::Target::HEXAGON;
43 const std::map<std::string, Rev_t> DSP_REVS = {
46 sc_core::sc_vector<QemuTargetSignalSocket> irq_in;
53 :
QemuCpu(name, inst,
"v67-hexagon")
54 , m_broker(cci::cci_get_broker())
56 , p_cfgbase(
"config_table_addr", 0xffffffffULL,
"config table address")
57 , p_l2vic_base_addr(
"l2vic_base_addr", 0xffffffffULL,
"l2vic base address")
58 , p_qtimer_base_addr(
"qtimer_base_addr", 0xffffffffULL,
"qtimer base address")
59 , p_exec_start_addr(
"hexagon_start_addr", 0xffffffffULL,
"execution start address")
60 , p_vp_mode(
"vp_mode",
true,
"override the vp_mode for testing")
61 , p_semihosting(
"enable_semihosting",
false,
"enable semihosting for debugging/testing")
62 , p_dsp_arch(
"dsp_arch",
"v68",
"DSP arch")
63 , p_start_powered_off(
"start_powered_off",
false,
64 "Start and reset the CPU "
65 "in powered-off state")
66 , p_sched_limit(
"sched_limit",
true,
"use sched limit")
67 , p_paranoid(
"paranoid_commit_state",
false,
"enable per-packet checks")
68 , p_subsystem_id(
"subsystem_id", 0,
"subsystem id")
69 , p_hexagon_num_threads(
"hexagon_num_threads", 8,
70 "number of hexagon threads")
71 , p_isdben_trusted(
"isdben_trusted",
true,
"isdben trusted")
72 , p_isdben_secure(
"isdben_secure",
true,
"isdben secure")
73 , p_coproc(
"coproc",
"",
"coproc")
74 , p_cmdline(
"cmdline",
"",
"cmdline")
75 , p_vtcm_base_addr(
"vtcm_base_addr", 0,
"vtcm base address")
76 , p_vtcm_size_kb(
"vtcm_size_kb", 0,
"vtcm size in kb")
77 , p_num_coproc_instance(
"num_coproc_instance", 0,
"number of coproc instances")
78 , p_hvx_contexts(
"hvx_contexts", 0,
"number of HVX contexts")
79 , p_num_tlbs(
"num_tlbs", 0,
"number of Joint TLB entries")
80 , p_num_dma_tlbs(
"num_dma_tlbs", 0,
"number of DMA TLB entries")
86 for (
int i = 0;
i < irq_in.size(); ++
i) {
87 m_external_ev |= irq_in[
i]->default_event();
91 void before_end_of_elaboration()
override
93 const std::string
dsp_arch = p_dsp_arch.get_value();
94 set_qom_type(
dsp_arch +
"-hexagon-cpu");
96 QemuCpu::before_end_of_elaboration();
101 if (
rev != DSP_REVS.end()) {
106 cpu.set_prop_int(
"config-table-addr", p_cfgbase);
108 cpu.set_prop_int(
"l2vic-base-addr", p_l2vic_base_addr);
109 cpu.set_prop_int(
"qtimer-base-addr", p_qtimer_base_addr);
110 cpu.set_prop_int(
"exec-start-addr", p_exec_start_addr);
111 cpu.set_prop_bool(
"start-powered-off", p_start_powered_off);
113 cpu.set_prop_int(
"start-evb", p_exec_start_addr);
114 cpu.set_prop_bool(
"sched-limit", p_sched_limit);
115 cpu.set_prop_bool(
"virtual-platform-mode", p_vp_mode);
116 cpu.set_prop_bool(
"enable-semihosting", p_semihosting);
117 cpu.set_prop_bool(
"paranoid-commit-state", p_paranoid);
118 cpu.set_prop_int(
"subsystem-id", p_subsystem_id);
119 cpu.set_prop_int(
"thread-count", p_hexagon_num_threads);
120 cpu.set_prop_bool(
"isdben-trusted", p_isdben_trusted);
121 cpu.set_prop_bool(
"isdben-secure", p_isdben_secure);
122 cpu.set_prop_str(
"coproc", p_coproc.get_value().data());
123 cpu.set_prop_str(
"cmdline", p_cmdline.get_value().data());
124 cpu.set_prop_int(
"vtcm-base-addr", p_vtcm_base_addr);
125 cpu.set_prop_int(
"vtcm-size-kb", p_vtcm_size_kb);
126 cpu.set_prop_int(
"num-coproc-instance", p_num_coproc_instance);
127 cpu.set_prop_int(
"hvx-contexts", p_hvx_contexts);
128 if (!p_num_tlbs.is_default_value()) {
129 cpu.set_prop_int(
"jtlb-entries", p_num_tlbs);
131 if (!p_num_dma_tlbs.is_default_value()) {
132 cpu.set_prop_int(
"dma-jtlb-entries", p_num_dma_tlbs);
138 void end_of_elaboration()
override
140 QemuCpu::end_of_elaboration();
142 get_cpu_hexagon().register_reset();
144 for (
int i = 0;
i < irq_in.size(); ++
i) {
145 irq_in[
i].init(m_dev,
i);
150 cci::cci_param<uint64_t> p_cfgbase;
151 cci::cci_param<uint32_t> p_l2vic_base_addr;
152 cci::cci_param<uint32_t> p_qtimer_base_addr;
153 cci::cci_param<uint32_t> p_exec_start_addr;
154 cci::cci_param<bool> p_vp_mode;
155 cci::cci_param<bool> p_semihosting;
156 cci::cci_param<bool> p_start_powered_off;
157 cci::cci_param<bool> p_sched_limit;
158 cci::cci_param<bool> p_paranoid;
159 cci::cci_param<std::string> p_dsp_arch;
160 cci::cci_param<uint32_t> p_subsystem_id;
161 cci::cci_param<uint32_t> p_hexagon_num_threads;
162 cci::cci_param<bool> p_isdben_trusted;
163 cci::cci_param<bool> p_isdben_secure;
164 cci::cci_param<std::string> p_coproc;
165 cci::cci_param<std::string> p_cmdline;
166 cci::cci_param<uint64_t> p_vtcm_base_addr;
167 cci::cci_param<uint32_t> p_vtcm_size_kb;
168 cci::cci_param<uint32_t> p_num_coproc_instance;
169 cci::cci_param<uint32_t> p_hvx_contexts;
170 cci::cci_param<uint32_t> p_num_tlbs;
171 cci::cci_param<uint32_t> p_num_dma_tlbs;