From d76c08c9b0e2743e752a182fc1cd9a48667bf23c Mon Sep 17 00:00:00 2001 From: Liav A Date: Tue, 20 Dec 2022 06:56:19 +0200 Subject: [PATCH] Kernel: Introduce a new super class called HIDController Use the new class in HID code, because all other HID device controllers will be using this class as their parent class. Hence, we no longer keep a reference to any PS/2 device in HIDManagement and rely on HIDController derived classes to do this for us. It also means that we removed another instance of a LockRefPtr, which is designated to be removed and is replaced by the better pattern of SpinlockProtected> instead. --- Kernel/Arch/x86_64/ISABus/I8042Controller.cpp | 9 ------ Kernel/Arch/x86_64/ISABus/I8042Controller.h | 6 ++-- Kernel/Devices/HID/Controller.h | 28 +++++++++++++++++++ Kernel/Devices/HID/Management.cpp | 12 ++++---- Kernel/Devices/HID/Management.h | 9 +++--- 5 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 Kernel/Devices/HID/Controller.h diff --git a/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp b/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp index 3b80df2cb1d..e593c19b870 100644 --- a/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp +++ b/Kernel/Arch/x86_64/ISABus/I8042Controller.cpp @@ -19,15 +19,6 @@ UNMAP_AFTER_INIT NonnullLockRefPtr I8042Controller::initialize( return adopt_lock_ref(*new I8042Controller()); } -LockRefPtr I8042Controller::mouse() const -{ - return m_mouse_device; -} -LockRefPtr I8042Controller::keyboard() const -{ - return m_keyboard_device; -} - UNMAP_AFTER_INIT I8042Controller::I8042Controller() { } diff --git a/Kernel/Arch/x86_64/ISABus/I8042Controller.h b/Kernel/Arch/x86_64/ISABus/I8042Controller.h index c73997150b1..6ef1015208d 100644 --- a/Kernel/Arch/x86_64/ISABus/I8042Controller.h +++ b/Kernel/Arch/x86_64/ISABus/I8042Controller.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -84,7 +85,7 @@ protected: class PS2KeyboardDevice; class PS2MouseDevice; class HIDManagement; -class I8042Controller final : public AtomicRefCounted { +class I8042Controller final : public HIDController { friend class PS2KeyboardDevice; friend class PS2MouseDevice; @@ -133,9 +134,6 @@ public: bool irq_process_input_buffer(HIDDevice::Type); - LockRefPtr mouse() const; - LockRefPtr keyboard() const; - // Note: This function exists only for the initialization process of the controller bool check_existence_via_probing(Badge); diff --git a/Kernel/Devices/HID/Controller.h b/Kernel/Devices/HID/Controller.h new file mode 100644 index 00000000000..1d8868297c2 --- /dev/null +++ b/Kernel/Devices/HID/Controller.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class HIDManagement; +class HIDController : public AtomicRefCounted { + friend class HIDManagement; + +public: + virtual ~HIDController() = default; + +protected: + HIDController() = default; + +private: + IntrusiveListNode> m_list_node; +}; + +} diff --git a/Kernel/Devices/HID/Management.cpp b/Kernel/Devices/HID/Management.cpp index 8338b6cf86c..9c7be9ca5d6 100644 --- a/Kernel/Devices/HID/Management.cpp +++ b/Kernel/Devices/HID/Management.cpp @@ -152,13 +152,11 @@ UNMAP_AFTER_INIT ErrorOr HIDManagement::enumerate() // Note: If we happen to not have i8042 just return "gracefully" for now. if (!has_i8042_controller) return {}; - m_i8042_controller = i8042_controller; - TRY(m_i8042_controller->detect_devices()); - if (m_i8042_controller->mouse()) - m_hid_devices.append(m_i8042_controller->mouse().release_nonnull()); - - if (m_i8042_controller->keyboard()) - m_hid_devices.append(m_i8042_controller->keyboard().release_nonnull()); + if (auto result_or_error = i8042_controller->detect_devices(); result_or_error.is_error()) + return {}; + m_hid_controllers.with([&](auto& list) { + list.append(i8042_controller); + }); #endif return {}; } diff --git a/Kernel/Devices/HID/Management.h b/Kernel/Devices/HID/Management.h index c1acb1f6be9..d55eb0d7242 100644 --- a/Kernel/Devices/HID/Management.h +++ b/Kernel/Devices/HID/Management.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -61,11 +62,9 @@ private: size_t m_mouse_minor_number { 0 }; size_t m_keyboard_minor_number { 0 }; KeyboardClient* m_client { nullptr }; -#if ARCH(X86_64) - LockRefPtr m_i8042_controller; -#endif - Vector> m_hid_devices; - Spinlock m_client_lock {}; + + SpinlockProtected, LockRank::None> m_hid_controllers; + Spinlock m_client_lock; }; class KeyboardClient {