From c959344c00e1b68d95cf57e5ed7b05259359d99b Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Mon, 30 May 2022 09:43:51 +0200 Subject: [PATCH] Kernel: Add simple implementation for InterruptManagement on aarch64 This class currently hardcodes the use of the Raspberry Pi interrupt controller. --- Kernel/Arch/aarch64/Dummy.cpp | 21 -------- Kernel/Arch/aarch64/InterruptManagement.cpp | 57 +++++++++++++++++++++ Kernel/Arch/aarch64/InterruptManagement.h | 11 ++++ Kernel/CMakeLists.txt | 1 + 4 files changed, 69 insertions(+), 21 deletions(-) create mode 100644 Kernel/Arch/aarch64/InterruptManagement.cpp diff --git a/Kernel/Arch/aarch64/Dummy.cpp b/Kernel/Arch/aarch64/Dummy.cpp index 07dda5445a..ec9a1b117e 100644 --- a/Kernel/Arch/aarch64/Dummy.cpp +++ b/Kernel/Arch/aarch64/Dummy.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -137,23 +136,3 @@ void KString::operator delete(void*) extern "C" { FlatPtr kernel_mapping_base; } - -// InterruptManagement.cpp -namespace Kernel { - -u8 InterruptManagement::acquire_mapped_interrupt_number(u8) -{ - VERIFY_NOT_REACHED(); -} - -InterruptManagement& InterruptManagement::the() -{ - VERIFY_NOT_REACHED(); -} - -RefPtr InterruptManagement::get_responsible_irq_controller(u8) -{ - VERIFY_NOT_REACHED(); -} - -} diff --git a/Kernel/Arch/aarch64/InterruptManagement.cpp b/Kernel/Arch/aarch64/InterruptManagement.cpp new file mode 100644 index 0000000000..500d90fda9 --- /dev/null +++ b/Kernel/Arch/aarch64/InterruptManagement.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020, Liav A. + * Copyright (c) 2022, Timon Kruiper + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Kernel { + +static InterruptManagement* s_interrupt_management; + +bool InterruptManagement::initialized() +{ + return s_interrupt_management != nullptr; +} + +InterruptManagement& InterruptManagement::the() +{ + VERIFY(InterruptManagement::initialized()); + return *s_interrupt_management; +} + +void InterruptManagement::initialize() +{ + VERIFY(!InterruptManagement::initialized()); + s_interrupt_management = new InterruptManagement; + + the().find_controllers(); +} + +void InterruptManagement::find_controllers() +{ + // TODO: Once device tree support is in place, find interrupt controllers using that. + m_interrupt_controllers.append(new RPi::InterruptController); +} + +u8 InterruptManagement::acquire_mapped_interrupt_number(u8 interrupt_number) +{ + return interrupt_number; +} + +Vector> const& InterruptManagement::controllers() +{ + return m_interrupt_controllers; +} + +RefPtr InterruptManagement::get_responsible_irq_controller(u8) +{ + // TODO: Support more interrupt controllers + VERIFY(m_interrupt_controllers.size() == 1); + return m_interrupt_controllers[0]; +} + +} diff --git a/Kernel/Arch/aarch64/InterruptManagement.h b/Kernel/Arch/aarch64/InterruptManagement.h index 6c80429e67..775d8464b0 100644 --- a/Kernel/Arch/aarch64/InterruptManagement.h +++ b/Kernel/Arch/aarch64/InterruptManagement.h @@ -6,6 +6,8 @@ #pragma once +#include +#include #include namespace Kernel { @@ -13,10 +15,19 @@ namespace Kernel { class InterruptManagement { public: static InterruptManagement& the(); + static void initialize(); + static bool initialized(); static u8 acquire_mapped_interrupt_number(u8 original_irq); + Vector> const& controllers(); RefPtr get_responsible_irq_controller(u8 interrupt_vector); + +private: + InterruptManagement() = default; + void find_controllers(); + + Vector> m_interrupt_controllers; }; } diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index a5a7c79b50..2e52cea77c 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -417,6 +417,7 @@ else() Arch/aarch64/Dummy.cpp Arch/aarch64/Exceptions.cpp Arch/aarch64/init.cpp + Arch/aarch64/InterruptManagement.cpp Arch/aarch64/Interrupts.cpp Arch/aarch64/kprintf.cpp Arch/aarch64/MainIdRegister.cpp