瀏覽代碼

Kernel: Add boot parameter to determine i8042 first port translation

This can be used mainly for bare metal hardware, if the user experiences
problems with output from the PS2 keyboard.
Liav A 2 年之前
父節點
當前提交
0379742d7e

+ 4 - 0
Base/usr/share/man/man7/boot_parameters.md

@@ -67,6 +67,10 @@ has set up before booting the Kernel, don't initialize any driver.
   **`none`** - Assume there's no i8042 controller in the system. 
   **`force`** - Assume there's i8042 controller in the system.
 
+* **`i8042_first_port_translation`**  - This parameter expects **`on`** or **`off`** and is by default set to **`off`**.
+  When set to **`off`**, the kernel will not enable first PS2 port translation.
+  When set to **`on`**, the kernel will enable first PS2 port translation.
+
 * **`panic`** - This parameter expects **`halt`** or **`shutdown`**. This is particularly useful in CI contexts.
 
 * **`pci`** - This parameter expects **`ecam`**, **`io`** or **`none`**. When selecting **`none`**

+ 10 - 0
Kernel/Boot/CommandLine.cpp

@@ -131,6 +131,16 @@ UNMAP_AFTER_INIT bool CommandLine::is_early_boot_console_disabled() const
     PANIC("Unknown early_boot_console setting: {}", value);
 }
 
+UNMAP_AFTER_INIT bool CommandLine::i8042_enable_first_port_translation() const
+{
+    auto value = lookup("i8042_first_port_translation"sv).value_or("off"sv);
+    if (value == "off"sv)
+        return false;
+    if (value == "on"sv)
+        return true;
+    PANIC("Unknown i8042_enable_first_port_translation setting: {}", value);
+}
+
 UNMAP_AFTER_INIT I8042PresenceMode CommandLine::i8042_presence_mode() const
 {
     auto value = lookup("i8042_presence_mode"sv).value_or("auto"sv);

+ 1 - 0
Kernel/Boot/CommandLine.h

@@ -82,6 +82,7 @@ public:
     [[nodiscard]] bool is_pci_disabled() const;
     [[nodiscard]] bool is_legacy_time_enabled() const;
     [[nodiscard]] bool is_pc_speaker_enabled() const;
+    [[nodiscard]] bool i8042_enable_first_port_translation() const;
     [[nodiscard]] GraphicsSubsystemMode graphics_subsystem_mode() const;
     [[nodiscard]] I8042PresenceMode i8042_presence_mode() const;
     [[nodiscard]] bool is_force_pio() const;

+ 2 - 1
Kernel/Devices/HID/Management.cpp

@@ -167,7 +167,8 @@ UNMAP_AFTER_INIT ErrorOr<void> HIDManagement::enumerate()
     // Note: If we happen to not have i8042 just return "gracefully" for now.
     if (!has_i8042_controller)
         return {};
-    if (auto result_or_error = i8042_controller->detect_devices(I8042Controller::EnableKeyboardFirstPortTranslation::No); result_or_error.is_error())
+    auto i8042_enable_first_port_translation = kernel_command_line().i8042_enable_first_port_translation() ? I8042Controller::EnableKeyboardFirstPortTranslation::Yes : I8042Controller::EnableKeyboardFirstPortTranslation::No;
+    if (auto result_or_error = i8042_controller->detect_devices(i8042_enable_first_port_translation); result_or_error.is_error())
         return {};
     m_hid_serial_io_controllers.with([&](auto& list) {
         list.append(i8042_controller);