quic/qbox
Loading...
Searching...
No Matches
plic-sifive.h
1/*
2 * This file is part of libqbox
3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 * Author: GreenSocs 2021
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#ifndef _LIBQBOX_COMPONENTS_IRQ_CTRL_PLIC_SIFIVE_H
10#define _LIBQBOX_COMPONENTS_IRQ_CTRL_PLIC_SIFIVE_H
11
12#include <string>
13#include <cassert>
14
15#include <cci_configuration>
16
17#include <libqemu-cxx/target/riscv.h>
18#include <module_factory_registery.h>
19#include <device.h>
20
21#include <ports/target.h>
22#include <ports/qemu-target-signal-socket.h>
23
24class plic_sifive : public QemuDevice
25{
26public:
27 cci::cci_param<unsigned int> p_num_sources;
28 cci::cci_param<unsigned int> p_num_priorities;
29 cci::cci_param<uint64_t> p_priority_base;
30 cci::cci_param<uint64_t> p_pending_base;
31 cci::cci_param<uint64_t> p_enable_base;
32 cci::cci_param<uint64_t> p_enable_stride;
33 cci::cci_param<uint64_t> p_context_base;
34 cci::cci_param<uint64_t> p_context_stride;
35 cci::cci_param<uint64_t> p_aperture_size;
36 cci::cci_param<std::string> p_hart_config;
37
38 QemuTargetSocket<> socket;
39 sc_core::sc_vector<QemuTargetSignalSocket> irq_in;
40
41 plic_sifive(const sc_core::sc_module_name& name, sc_core::sc_object* o)
42 : plic_sifive(name, *(dynamic_cast<QemuInstance*>(o)))
43 {
44 }
45 plic_sifive(sc_core::sc_module_name nm, QemuInstance& inst)
46 : QemuDevice(nm, inst, "riscv.sifive.plic")
47 , p_num_sources("num_sources", 0, "Number of input IRQ lines")
48 , p_num_priorities("num_priorities", 0, "Number of priorities")
49 , p_priority_base("priority_base", 0, "Base address of the priority registers")
50 , p_pending_base("pending_base", 0, "Base address of the pending registers")
51 , p_enable_base("enable_base", 0, "Base address of the enable registers")
52 , p_enable_stride("enable_stride", 0, "Size of the enable regiters")
53 , p_context_base("context_base", 0, "Base address the context registers")
54 , p_context_stride("context_stride", 0, "Size of the context registers")
55 , p_aperture_size("aperture_size", 0, "Size of the whole PLIC address space")
56 , p_hart_config("hart_config", "",
57 "HART configurations (can be U, S, H or M or "
58 "a combination of those, each HART config is "
59 "separarted by a comma) (example: \"MS,MS\" -> "
60 "two HARTs with M and S mode)")
61 , socket("mem", inst)
62 , irq_in("irq_in", p_num_sources, [](const char* n, int i) { return new QemuTargetSignalSocket(n); })
63 {
64 }
65
66 void before_end_of_elaboration() override
67 {
68 QemuDevice::before_end_of_elaboration();
69
70 m_dev.set_prop_str("hart-config", p_hart_config.get_value().c_str());
71 m_dev.set_prop_int("num-sources", p_num_sources);
72 m_dev.set_prop_int("aperture-size", p_aperture_size);
73 m_dev.set_prop_int("num-priorities", p_num_priorities);
74 m_dev.set_prop_int("priority-base", p_priority_base);
75 m_dev.set_prop_int("pending-base", p_pending_base);
76 m_dev.set_prop_int("enable-base", p_enable_base);
77 m_dev.set_prop_int("enable-stride", p_enable_stride);
78 m_dev.set_prop_int("context-base", p_context_base);
79 m_dev.set_prop_int("context-stride", p_context_stride);
80 }
81
82 void end_of_elaboration() override
83 {
84 int i;
85
86 QemuDevice::set_sysbus_as_parent_bus();
87 QemuDevice::end_of_elaboration();
88
89 qemu::SysBusDevice sbd(get_qemu_dev());
90 socket.init(qemu::SysBusDevice(m_dev), 0);
91
92 for (i = 0; i < p_num_sources; i++) {
93 irq_in[i].init(m_dev, i);
94 }
95 }
96};
97
98extern "C" void module_register();
99
100#endif
QEMU device abstraction as a SystemC module.
Definition device.h:37
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
Definition target.h:160
Definition plic-sifive.h:25
Definition libqemu-cxx.h:638