quic/qbox
Loading...
Searching...
No Matches
armv7m-nvic.h
1/*
2 * This file is part of libqbox
3 * Copyright(c) 2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#pragma once
9
10#include <cci_configuration>
11#include <libqemu-cxx/target/aarch64.h>
12
13#include <device.h>
14#include <ports/target.h>
15#include <ports/qemu-target-signal-socket.h>
16#include <ports/qemu-initiator-signal-socket.h>
17#include <module_factory_registery.h>
18
19class nvic_armv7m : public QemuDevice
20{
21protected:
22 bool before_end_of_elaboration_done;
23
24public:
25 cci::cci_param<uint32_t> p_num_irq;
26 cci::cci_param<uint8_t> p_num_prio_bits;
27 QemuTargetSocket<> socket;
28 sc_core::sc_vector<QemuTargetSignalSocket> irq_in;
30 QemuTargetSignalSocket NS_SysTick; // Non secure SysTick
31 QemuTargetSignalSocket S_SysTick; // Secure SysTick
33
34 nvic_armv7m(const sc_core::sc_module_name& name, sc_core::sc_object* o)
35 : nvic_armv7m(name, *(dynamic_cast<QemuInstance*>(o)))
36 {
37 }
38 nvic_armv7m(const sc_core::sc_module_name& n, QemuInstance& inst)
39 : QemuDevice(n, inst, "armv7m_nvic")
40 , before_end_of_elaboration_done(false)
41 , p_num_irq("num_irq", 64, "Number of external interrupts")
42 , p_num_prio_bits("num_prio_bits", 0,
43 "Number of the maximum priority bits that can be used. 0 means to use a reasonable default")
44 , socket("mem", inst)
45 , irq_in("irq_in", p_num_irq)
46 , nmi("nmi")
47 , NS_SysTick("NS_SysTick")
48 , S_SysTick("S_SysTick")
49 , irq_out("irq_out")
50 {
51 }
52
53 void before_end_of_elaboration() override
54 {
55 if (before_end_of_elaboration_done) {
56 return;
57 }
58
59 QemuDevice::before_end_of_elaboration();
60 before_end_of_elaboration_done = true;
61
62 /* add the cpu link so we can set it later with set_cpu() */
63 qemu::ArmNvic nvic(m_dev);
64 nvic.add_cpu_link();
65
66 m_dev.set_prop_int("num-irq", p_num_irq);
67 m_dev.set_prop_int("num-prio-bits", p_num_prio_bits);
68 }
69
70 void end_of_elaboration() override
71 {
72 /*
73 * At this point, the cpu link must have been set. Otherwise
74 * realize will fail.
75 *
76 * Note: the cpu is used by qemu nvic to configure the nvic
77 * depending on cpu features (See hw/intc/armv7m_nvic.c realize
78 * function in qemu code).
79 */
80 QemuDevice::set_sysbus_as_parent_bus();
81 QemuDevice::end_of_elaboration();
82
84
85 /* registers */
86 socket.init(sbd, 0);
87
88 /* interrupts */
89 for (int i = 0; i < p_num_irq; i++) {
90 irq_in[i].init(m_dev, i);
91 }
92
93 /* Output lines */
94 irq_out.init_sbd(sbd, 0);
95 nmi.init_named(m_dev, "NMI", 0);
96 NS_SysTick.init_named(m_dev, "systick-trigger", 0);
97 S_SysTick.init_named(m_dev, "systick-trigger", 1);
98 }
99};
100
101extern "C" void module_register();
QEMU device abstraction as a SystemC module.
Definition device.h:37
A QEMU output GPIO exposed as a InitiatorSignalSocket<bool>
Definition qemu-initiator-signal-socket.h:40
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
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_named(qemu::Device dev, const char *gpio_name, int gpio_idx)
Initialize this socket with a device, a GPIO namespace, and a GPIO index.
Definition qemu-target-signal-socket.h:78
Definition target.h:160
Definition armv7m-nvic.h:20
Definition aarch64.h:48
Definition libqemu-cxx.h:638