quic/qbox
Loading...
Searching...
No Matches
cortex-r52.h
1/*
2 * This file is part of libqbox
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 * Author: GreenSocs 2021
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#pragma once
10
11#include <string>
12
13#include <cci_configuration>
14
15#include <module_factory_registery.h>
16
17#include <libqemu-cxx/target/aarch64.h>
18
19#include <arm.h>
20#include <device.h>
21#include <ports/qemu-initiator-signal-socket.h>
22#include <ports/qemu-target-signal-socket.h>
23#include <ports/target.h>
24
26{
27protected:
28 int get_psci_conduit_val() const
29 {
30 if (p_psci_conduit.get_value() == "disabled") {
31 return 0;
32 } else if (p_psci_conduit.get_value() == "smc") {
33 return 1;
34 } else if (p_psci_conduit.get_value() == "hvc") {
35 return 2;
36 } else {
37 /* TODO: report warning */
38 return 0;
39 }
40 }
41
42public:
43 cci::cci_param<bool> p_start_powered_off;
44 cci::cci_param<uint64_t> p_rvbar;
45 cci::cci_param<uint64_t> p_cntfrq_hz;
46 cci::cci_param<bool> p_has_el2;
47 cci::cci_param<std::string> p_psci_conduit;
48
53
54 QemuInitiatorSignalSocket irq_timer_phys_out;
55 QemuInitiatorSignalSocket irq_timer_virt_out;
56 QemuInitiatorSignalSocket irq_timer_hyp_out;
57 QemuInitiatorSignalSocket irq_timer_sec_out;
58
59 cpu_arm_cortexR52(const sc_core::sc_module_name& name, sc_core::sc_object* o)
60 : cpu_arm_cortexR52(name, *(dynamic_cast<QemuInstance*>(o)))
61 {
62 }
63 cpu_arm_cortexR52(sc_core::sc_module_name name, QemuInstance& inst)
64 : QemuCpuArm(name, inst, "cortex-r52-arm")
65 , p_has_el2("has_el2", true, "ARM virtualization extensions")
66 , p_rvbar("rvbar", 0ull, "Reset vector base address register value")
67 , p_cntfrq_hz("cntfrq_hz", 0ull, "CPU Generic Timer CNTFRQ in Hz")
68 , p_start_powered_off("start_powered_off", false,
69 "Start and reset the CPU "
70 "in powered-off state")
71 , p_psci_conduit("psci_conduit", "disabled",
72 "Set the QEMU PSCI conduit: "
73 "disabled->no conduit, "
74 "hvc->through hvc call, "
75 "smc->through smc call")
76 , irq_in("irq_in")
77 , fiq_in("fiq_in")
78 , virq_in("virq_in")
79 , vfiq_in("vfiq_in")
80 , irq_timer_phys_out("irq_timer_phys_out")
81 , irq_timer_virt_out("irq_timer_virt_out")
82 , irq_timer_hyp_out("irq_timer_hyp_out")
83 , irq_timer_sec_out("irq_timer_sec_out")
84 {
85 }
86
87 void before_end_of_elaboration() override
88 {
89 QemuCpuArm::before_end_of_elaboration();
90
91 qemu::CpuArm cpu(m_dev);
92
93 cpu.set_prop_bool("start-powered-off", p_start_powered_off);
94 cpu.set_prop_int("rvbar", p_rvbar);
95 cpu.set_prop_int("psci-conduit", get_psci_conduit_val());
96 if (!p_cntfrq_hz.is_default_value()) {
97 cpu.set_prop_int("cntfrq", p_cntfrq_hz);
98 }
99 }
100
101 void end_of_elaboration() override
102 {
103 QemuCpuArm::end_of_elaboration();
104
105 irq_in.init(m_dev, 0);
106 fiq_in.init(m_dev, 1);
107 virq_in.init(m_dev, 2);
108 vfiq_in.init(m_dev, 3);
109
110 irq_timer_phys_out.init(m_dev, 0);
111 irq_timer_virt_out.init(m_dev, 1);
112 irq_timer_hyp_out.init(m_dev, 2);
113 irq_timer_sec_out.init(m_dev, 3);
114 }
115};
116
117extern "C" void module_register();
Definition arm.h:14
A QEMU output GPIO exposed as a InitiatorSignalSocket<bool>
Definition qemu-initiator-signal-socket.h:40
void init(qemu::Device dev, int gpio_idx)
Initialize this socket with a device and a GPIO index.
Definition qemu-initiator-signal-socket.h:137
This class encapsulates a libqemu-cxx qemu::LibQemu instance. It handles QEMU parameters and instance...
Definition qemu-instance.h:89
A QEMU input GPIO exposed as a TargetSignalSocket<bool>
Definition qemu-target-signal-socket.h:29
void init(qemu::Device dev, int gpio_idx)
Initialize this socket with a device and a GPIO index.
Definition qemu-target-signal-socket.h:60
Definition target.h:160
Definition cortex-r52.h:26
Definition aarch64.h:16