30 static const uint32_t NUM_PPI = 32;
33 cci::cci_param<unsigned int> p_num_cpu;
34 cci::cci_param<unsigned int> p_num_spi;
35 cci::cci_param<unsigned int> p_revision;
36 cci::cci_param<std::vector<unsigned int> > p_redist_region;
37 cci::cci_param<bool> p_has_security_extensions;
38 cci::cci_param<bool> p_has_lpi;
41 sc_core::sc_vector<QemuTargetSocket<> > redist_iface;
44 sc_core::sc_vector<QemuTargetSignalSocket> spi_in;
50 sc_core::sc_vector<sc_core::sc_vector<QemuTargetSignalSocket> > ppi_in;
53 sc_core::sc_vector<QemuInitiatorSignalSocket> irq_out;
54 sc_core::sc_vector<QemuInitiatorSignalSocket> fiq_out;
55 sc_core::sc_vector<QemuInitiatorSignalSocket> virq_out;
56 sc_core::sc_vector<QemuInitiatorSignalSocket> vfiq_out;
57 arm_gicv3(
const sc_core::sc_module_name& name, sc_core::sc_object*
o)
64 if (inst.is_kvm_enabled()) {
65 return "kvm-arm-gicv3";
73 , p_num_cpu(
"num_cpus",
num_cpus,
"Number of CPU interfaces")
74 , p_num_spi(
"num_spi", 0,
"Number of shared peripheral interrupts")
75 , p_revision(
"revision", 3,
"Revision of the GIC (3 -> v3, 4 -> v4)")
78 , p_redist_region(
"redist_region",
79 std::vector<unsigned int>(gs::cci_get_vector<unsigned int>(
80 cci::cci_get_broker(), std::string(sc_module::name()) +
".redist_region")),
81 "Redistributor regions configuration")
82 , p_has_security_extensions(
"has_security_extensions",
false,
"Enable security extensions")
83 , p_has_lpi(
"has_lpi",
false,
"Enable LPI")
84 , dist_iface(
"dist_iface", inst)
85 , redist_iface(
"redist_iface", p_redist_region.get_value().size(),
86 [&inst](
const char*
n,
int i) { return new QemuTargetSocket<>(n, inst); })
87 , spi_in(
"spi_in", p_num_spi)
88 , ppi_in(
"ppi_in_cpu", p_num_cpu,
89 [](
const char*
n,
size_t i) {
return new sc_core::sc_vector<QemuTargetSignalSocket>(
n, NUM_PPI); })
90 , irq_out(
"irq_out", p_num_cpu)
91 , fiq_out(
"fiq_out", p_num_cpu)
92 , virq_out(
"virq_out", p_num_cpu)
93 , vfiq_out(
"vfiq_out", p_num_cpu)
97 void before_end_of_elaboration()
99 QemuDevice::before_end_of_elaboration();
102 m_dev.set_prop_int(
"num-cpu", p_num_cpu);
103 m_dev.set_prop_int(
"num-irq", p_num_spi + NUM_PPI);
104 m_dev.set_prop_int(
"revision", p_revision);
107 bool has_lpi = m_inst.is_kvm_enabled() ?
false : p_has_lpi.get_value();
109 m_dev.set_prop_bool(
"has-lpi",
has_lpi);
111 m_dev.set_prop_link(
"sysmem", *(this->get_qemu_inst().get().get_system_memory()));
113 m_dev.set_prop_uint_array(
"redist-region-count", p_redist_region.get_value());
116 void end_of_elaboration()
118 QemuDevice::set_sysbus_as_parent_bus();
119 QemuDevice::end_of_elaboration();
124 dist_iface.init(
sbd, 0);
126 for (
i = 0;
i < p_redist_region.get_value().size();
i++) {
127 redist_iface[
i].init(
sbd, 1 +
i);
131 for (
i = 0;
i < p_num_spi;
i++) {
132 spi_in[
i].init(m_dev,
i);
137 for (
i = 0;
i < NUM_PPI;
i++) {
145 irq_out[
cpu].init_sbd(
sbd, p_num_cpu * 0 +
cpu);
146 fiq_out[
cpu].init_sbd(
sbd, p_num_cpu * 1 +
cpu);
147 virq_out[
cpu].init_sbd(
sbd, p_num_cpu * 2 +
cpu);
148 vfiq_out[
cpu].init_sbd(
sbd, p_num_cpu * 3 +
cpu);
151 if (m_inst.is_kvm_enabled()) {
156 assert(init &&
"Failed to find global peripheral initiator");
158 m_inst.
get().lock_iothread();
160 addr = gs::cci_get<uint64_t>(cci::cci_get_broker(), std::string(dist_iface.name()) +
".address");
162 for (
i = 0;
i < p_redist_region.get_value().size();
i++) {
163 addr = gs::cci_get<uint64_t>(cci::cci_get_broker(), std::string(redist_iface[
i].name()) +
".address");
166 m_inst.
get().unlock_iothread();
sc_core::sc_object * find_sc_obj(sc_core::sc_object *m, std::string name, bool test=false)
Helper function to find a sc_object by fully qualified name throws SC_ERROR if nothing found.
Definition cciutils.cc:18